android - 在Android应用程序中强制关闭时如何在运行时获取日志

标签 android

如何在 Android 应用程序强制关闭时在运行时获取日志。 我想获取日志并邮寄。

最佳答案

这里是一些在应用程序中收集日志的代码:

    private int MAX_LOG_MESSAGE_LENGTH = 100000;
    private String[] mFilterSpecs;
    private String mFormat;
    private String mBuffer;

private class CollectLogTask extends AsyncTask<ArrayList<String>, Void, StringBuilder> {
    @Override
    protected void onPreExecute() {

    }

    @Override
    protected StringBuilder doInBackground(ArrayList<String>... params) {
        final StringBuilder log = new StringBuilder();
        try {
            ArrayList<String> commandLine = new ArrayList<String>();
            commandLine.add("logcat");//$NON-NLS-1$
            commandLine.add("-d");//$NON-NLS-1$
            ArrayList<String> arguments = ((params != null) && (params.length > 0)) ? params[0] : null;
            if (null != arguments) {
                commandLine.addAll(arguments);
            }

            Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                log.append(line);
                log.append(LINE_SEPARATOR);
            }
        } catch (IOException e) {
            Log.e(TAG, "CollectLogTask.doInBackground failed", e);//$NON-NLS-1$
        }

        return log;
    }

    @Override
    protected void onPostExecute(final StringBuilder log) {
        if (null != log) {
            // truncate if necessary
            int keepOffset = Math.max(log.length() - MAX_LOG_MESSAGE_LENGTH, 0);
            if (keepOffset > 0) {
                log.delete(0, keepOffset);
            }

            if (mAdditonalInfo != null) {
                log.insert(0, LINE_SEPARATOR);
                log.insert(0, mAdditonalInfo);
            }
                          Log.d("printLog",log.toString());

        }
    }
}

现在像这样调用这个异步类。

    ArrayList<String> list = new ArrayList<String>();

    if (mFormat != null) {
        list.add("-v");
        list.add(mFormat);
    }

    if (mBuffer != null) {
        list.add("-b");
        list.add(mBuffer);
    }

    if (mFilterSpecs != null) {
        for (String filterSpec : mFilterSpecs) {
            list.add(filterSpec);
        }
    }

    new CollectLogTask().execute(list);

关于android - 在Android应用程序中强制关闭时如何在运行时获取日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13860967/

相关文章:

android - FirebaseMessagingService 是否在设备重启后仍然存在?

android - 方向变化增加了 TextView 的文本大小

android - 无法为图像或图片、 list 文件配置 BroadCast Receiver

android - 使用测验应用程序部署问题

java - 如何从数据库 Arraylist 在 Google map 上添加标记

android - 如何在 Android 中创建一个大的位图?

android - 在所有 Activity 之上添加一个 View

android - 在 Kotlin 协程中指定调度程序/上下文有多重要?如果你不指定它们会发生什么?

android - 在 Android 中为 AlarmManager 使用 SQL 数据库

java - 从线程访问主 Activity 中的变量