从系统类中收集日志

时间:2018-05-07 15:06:59

标签: android logcat crashlytics android-logcat crashlytics-android

我正在开发一款使用Android MediaMuxer录制屏幕的应用。使用Crashlytics,大量用户都有“无法停止muxer”崩溃,但我无法在我的任何设备上本地重现它。根据{{​​3}},在MediaMuxer运行时生成的MPEG4Writer日志应该指出问题的根源是什么,但由于我无法在本地重现它,我需要远程收集这些日志并将它们传递给Crashlytics

所以这是我的问题:MediaMuxer和MPEG4Writer是系统类,所以显然我无法编辑它们来添加Crashlytics.log()行。我想过让应用程序读取Logcat输出并存储包含MPEG4Writer的所有条目,如果muxer崩溃,则使用another question作为基础将其发送到Crashlytics。这是我的代码:

public class LogRetriever extends Thread {

    private static final String TAG = LogRetriever.class.getCanonicalName();
    public static ArrayList<String> logStorage = new ArrayList<>();
    private AtomicBoolean mLoggingActive = new AtomicBoolean(true);

    @Override
    public void run() {
        try {
            String[] command = new String[] { "logcat" };
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            String line;
            while (mLoggingActive.get() && ((line = bufferedReader.readLine()) != null)){
                if(line.contains("MPEG4Writer")) {
                    logStorage.add(line);
                }
            }
        }
        catch (IOException ex) {
            Log.e(TAG, "start failed", ex);
        }
    }

    public void stopLogging() {
        mLoggingActive.set(false);
    }
}

使用上面的方法,我似乎只得到MPEG4Writer生成的前四个日志行。其余的是通过Android Studio的logcat可见的,但不是我的代码收集的。我也试过this implementation似乎做了同样的事情,但同样的问题,只收集了前4行。我怀疑MediaMuxer在这4行之后创建了自己的进程,此时我无法再读取它的logcat输出,因为我的LogRetriever类现在处于不同的进程中。那么我该如何收集这些日志呢?我在这里采取了错误的做法吗?

1 个答案:

答案 0 :(得分:1)

  

那么我该如何收集这些日志?

通常,除非您是为设备制造商工作,否则您不会收集这些日志。

首先,从未正式支持在运行时访问LogCat;因此,笨重的叉子logcat&#34;你必须采取的方法。

除此之外,您需要READ_LOGS权限才能获得比您更多的权限。该权限对signature|privileged|developmentprotectionLevel,这意味着普通应用无法拥有该权限。

这是出于隐私原因。 READ_LOGS使您可以访问所有LogCat,以及许多应用程序(和一些系统进程)记录可能敏感的信息。