Как я могу заставить logcat на своем устройстве показывать журналы из всех процессов

Я пытаюсь написать приложение, которое читает все журналы на моем устройстве. У меня есть архитектура клиент/сервис, и я вижу сообщения журналов как с клиентского, так и с сервисным процессами, но я не вижу сообщений из каких-либо других приложений на телефоне (я вижу другие сообщения, используя logcat на рабочем столе).

Нужен ли мне корень?

Фрагменты кода

манифеста

<uses-permission android:name="android.permission.READ_LOGS" />

Журнал чтения

Runtime.getRuntime().exec("logcat -c").waitFor();

Process process = Runtime.getRuntime().exec("logcat -v long *:*");
BufferedReader reader = 
    new BufferedReader(new InputStreamReader(process.getInputStream()));
while (true) {
    String nextLine = reader.readLine();
    if (!nextLine.contains("LogWatcher-D")) {
        Log.w("LogWatcher-D", "See: " + nextLine);
    }

    // Process line
}

Ответ 1

В Android 4.1+ вы можете получать доступ только к сообщениям журнала, зарегистрированным в вашем процессе, если только вы не держите разрешение READ_LOGS. Это разрешение требует, чтобы ваше приложение было подписано одним и тем же ключом подписки, который подписывал прошивку устройства или что ваше приложение установлено на системном разделе.

Ответ 2

Чтобы программно читать журналы из других приложений, вам необходимо назначить один и тот же файл: sharedUserId во всех файлах манифеста apks.

Ответ 3

Существует еще один способ доступа ко всем журналам для всех приложений без root. Он требует включения удаленной отладки. Посмотрите открытое исходное приложение без корневого Logcat.