Собирать логи из системных классов - PullRequest
0 голосов
/ 07 мая 2018

Я работаю над приложением, которое использует Android MediaMuxer для записи экрана. При использовании Crashlytics у значительного числа пользователей происходит сбой «Не удалось остановить мультиплексор», но я не могу воспроизвести его локально ни на одном из моих устройств. Согласно другому вопросу , журналы MPEG4Writer, сгенерированные во время работы MediaMuxer, должны указывать источник проблемы, но так как я не могу воспроизвести его локально, мне нужно собрать эти журналы удаленно и передать их к Crashlytics.

Итак, вот моя проблема: MediaMuxer и MPEG4Writer являются системными классами, поэтому, очевидно, я не могу редактировать их, чтобы добавить строки Crashlytics.log (). Я думал о том, чтобы приложение прочитало выходные данные Logcat и сохранило все записи, содержащие MPEG4Writer, которые затем отправляются в 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. Остальные видны через logcat Android Studio, но не собраны моим кодом. Я также попробовал эту библиотеку , которая, кажется, делает то же самое, но, опять же, та же проблема, только первые 4 строки собраны. Я подозреваю, что MediaMuxer создает свой собственный процесс после этих 4 строк, и в этот момент я больше не могу читать его вывод logcat, потому что мой класс LogRetriever теперь находится в другом процессе. Так как же мне собирать эти логи? Я здесь ошибаюсь?

1 Ответ

0 голосов
/ 07 мая 2018

Так как мне собирать эти журналы?

Как правило, если вы не работаете на производителя устройства, вы не собираете эти журналы.

Во-первых, доступ к LogCat во время выполнения никогда официально не поддерживался;следовательно, неуклюжий подход "fork logcat", который вы должны использовать.

Помимо этого, вам нужно разрешение READ_LOGS, чтобы получить больше, чем вы есть.Это разрешение имеет signature|privileged|development для protectionLevel, что означает, что обычные приложения не могут иметь это разрешение.

Это из соображений конфиденциальности.READ_LOGS предоставляет вам доступ ко всем журналам LogCat, а также ко многим приложениям (и некоторым системным процессам), которые могут быть конфиденциальными.

...