Collect logs from system classes

荒凉一梦 提交于 2019-12-02 21:13:35

问题


I'm working on an app that uses Android's MediaMuxer for recording the screen. Using Crashlytics, a significant number of users have the "Failed to stop the muxer" crash, but I can't reproduce it locally on any of my devices. According to another question, the MPEG4Writer logs generated while MediaMuxer is running should indicate what the source of the problem is, but since I'm unable to reproduce it locally, I need to collect those logs remotely and pass them over to Crashlytics.

So here's my problem: MediaMuxer and MPEG4Writer are system classes, so obviously I can't edit them to add Crashlytics.log() lines. I've thought of having the app read the Logcat output and storing all entries containing MPEG4Writer, which are then sent to Crashlytics if the muxer crashes, using this implementation as a base. Here's my code:

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);
    }
}

Using the above method, I only seem to get the first four log lines generated by MPEG4Writer. The rest are visible through Android Studio's logcat, but aren't collected by my code. I've also tried this library which seems to do the same thing, but again, same problem, only the first 4 lines are collected. I suspect that MediaMuxer is creating its own process after those 4 lines, at which point I can no longer read its logcat output because my LogRetriever class is now in a different process. So how am I supposed to collect those logs? Am I taking the wrong approach here?


回答1:


So how am I supposed to collect those logs?

Generally, unless you are working for a device manufacturer, you don't collect those logs.

First, accessing LogCat at runtime has never been officially supported; hence, the clunky "fork logcat" approach that you have to take.

Beyond that, you need the READ_LOGS permission to get more than what you are. That permission has signature|privileged|development for the protectionLevel, meaning that ordinary apps cannot hold that permission.

This is for privacy reasons. READ_LOGS gives you access to all of LogCat, and lots of apps (and some system processes) log information that may be sensitive.



来源:https://stackoverflow.com/questions/50217299/collect-logs-from-system-classes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!