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

4
如何在Android应用程序出现强制关闭时获取运行时日志。我想要获取日志并将其发送到邮箱中。

你的意思是想在手机屏幕上显示日志吗? - adarsh
是的,在获取日志后,我会将其发送给开发人员进行测试。 - Atif Mahmood
3个回答

3

以下是用于收集应用程序日志的代码:

    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 4.1及更高版本上无法工作,除非仅收集您自己进程的日志,因为普通的SDK应用程序不再具有“READ_LOGS”权限。 - CommonsWare
我知道,但问题是只获取自己进程的应用程序日志。从问题中可以看出,他想在强制关闭时收集日志。 - Ali Imran
哦,我并不是在抱怨你的回答。我只是为了那些将来遇到这个问题和答案的人提到它。我没有在我的答案中提到限制,因为它已经在ACRA文档中涵盖了。 - CommonsWare

2

使用 ACRA 或相关库来捕获生产应用程序中的崩溃并处理这些报告。默认情况下,ACRA将记录材料到Google Docs电子表格中,但您可以用其他东西替换它。


1

当设备连接到USB调试时,使用adb logcat

或者

从Google Play安装aLogCat


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接