READ_LOGS разрешение на Jelly Bean (API 16)

Поскольку Android Jelly Bean не поддерживаетразрешение на чтение журналов (в соответствии сэто видео Google IO 2012 а такжеэтот тоже ), я хотел бы знать, возможно ли для корневых устройств (или некорневых устройств) быть в состоянии обойти это ограничение и иметь возможность читать журналы.

Как я могу это сделать? Мне действительно нужно сделать приложение системным приложением или достаточно рутовать?

 Chris Stratton13 июл. 2012 г., 00:29
Невозможно быть системным приложением, если у вас нет ключа производителя или root-устройства.
 android developer31 авг. 2012 г., 10:10
вся система логов. вот почему я говорю, что если нужен рут (или системное приложение), пусть будет так.
 P.T.17 июл. 2012 г., 09:25
Вы хотите читать журналы своего приложения или журналы всей системы?
 Ran14 июл. 2012 г., 17:13
кажется, все еще работает на эмуляторе. кто-нибудь тестировал read_logs на реальном устройстве с JB?
 android developer14 июл. 2012 г., 19:44
Это потому, что я не мог понять, что вы имели в виду. Извини . я действительно не хотел вас расстраивать.

Ответы на вопрос(4)

димости получения корневых разрешений. Вы можете использовать удаленную отладку. Взгляните на открытый исходный кодприложение rootcat без root.

 android developer05 июл. 2016 г., 14:51
Как это сделать?
 android developer05 июл. 2016 г., 09:08
Интересно. Он использует инструмент adb при подключении к ПК для обеспечения удаленного доступа. Но тогда что это делает? Само приложение подключается к этому порту, а потом просто читает с него как-нибудь? как?
 05 июл. 2016 г., 22:50
Через сетевое подключение к «локальному хосту» на телефоне. Когда вы включаете удаленную отладку, телефон начинает прослушивать TCP-соединения. Теперь вы можете подключиться к порту, который он прослушивает, и использовать протокол ADB для отправки команд, включая команду для чтения журналов.
 05 июл. 2016 г., 14:33
Да, приложение подключается к локальному демону adb на телефоне и напрямую читает журналы.
 06 июл. 2016 г., 12:14
Это в MainActivity. Реальная реализация протокола - это библиотека adblib.

EDIT: Оказывается, чтоadb shell pm grant работает только на эмуляторах. Производственные устройства не позволяютshell предоставлять и отзывать необязательные разрешения.

Вам не нужно иметь root. Единственное, что вам нужно, чтобы включить READ_LOGS для несистемных приложений, это установить Android SDK.

В основном вам нужно позвонить:

adb shell pm grant <pkg.name> android.permission.READ_LOGS

куда<pkg.name> имя пакета вашего приложения. Это возможно, потому что READ_LOGS - это не только «система» разрешение, но также «разработка» разрешение (этот термин введен в JB). Который на самом деле позволяет пользователям предоставлять это разрешение для любого приложения. Корень не требуется.

Более подробная информация доступна в этомнить гугл групп с комментариями от Дайан Хэкборн.

 04 мая 2016 г., 18:23
Пропустит ли приложение, использующее этот код, фильтр вредоносного спама в Google Play?
 27 апр. 2016 г., 16:26
Только эмуляторы! Я просто установил это на своем Nexus 6, и у меня нет рута!
 android developer17 июл. 2012 г., 11:40
интересно . когда вы вызываете эту команду, она покажет что-нибудь конечному пользователю? Вы проверяли это на версии JB?
 android developer31 авг. 2012 г., 10:01
так нет возможности читать логи даже на корневых устройствах? наверняка есть способ, нет?
 17 июл. 2012 г., 12:15
Да, я проверял это. Он ничего не показывает конечному пользователю. Это, скорее, вещь для разработчиков, а не для обычных пользователей.
Решение Вопроса

выполнив команду pm grant из своего приложения. Вероятно, после этого вам придется перезапустить приложение, чтобы изменения вступили в силу:

String pname = getPackageName();
String[] CMDLINE_GRANTPERMS = { "su", "-c", null };
if (getPackageManager().checkPermission(android.Manifest.permission.READ_LOGS, pname) != 0) {
    Log.d(TAG, "we do not have the READ_LOGS permission!");
    if (android.os.Build.VERSION.SDK_INT >= 16) {
        Log.d(TAG, "Working around JellyBeans 'feature'...");
        try {
            // format the commandline parameter
            CMDLINE_GRANTPERMS[2] = String.format("pm grant %s android.permission.READ_LOGS", pname);
            java.lang.Process p = Runtime.getRuntime().exec(CMDLINE_GRANTPERMS);
            int res = p.waitFor();
            Log.d(TAG, "exec returned: " + res);
            if (res != 0)
                throw new Exception("failed to become root");
        } catch (Exception e) {
            Log.d(TAG, "exec(): " + e);
            Toast.makeText(context, "Failed to obtain READ_LOGS permission", Toast.LENGTH_LONG).show();
        }
    }
} else
    Log.d(TAG, "we have the READ_LOGS permission already!");

Этот код должен вызываться из вашего onCreate (). Как только разрешение предоставлено, больше никаких полномочий root не требуется.

P.S: p.waitFor () блокирует приложение Superuser, задерживая запуск вашего приложения и потенциально вызывая ANR.

 08 июн. 2013 г., 12:22
это работает на некорневых устройствах?
 08 июн. 2013 г., 15:45
Этот подходrequires корень. Если вы бежитеpm grant ... безsu, вы получите следующий вывод:Operation not allowed: java.lang.SecurityException: Neither user 100xx nor current process has android.permission.GRANT_REVOKE_PERMISSIONS. GRANT_REVOKE_PERMISSIONS также является системным уровнем, поэтому вы не можете требовать его в манифесте.
 04 июн. 2014 г., 00:11
этот код должен выполняться вне потока пользовательского интерфейса ... Лучший подход - использовать AsyncTask и показать диалог onPreExecute, чтобы пользователь знал, что приложение выполняет задачу.
 android developer29 сент. 2012 г., 00:28
похоже отлично работает (проверено на galaxy s3 с андроидом 4.1.1). нужно было только помнить, чтобы установить targetSdk в 16. Спасибо огромное . Вы также знаете, как включить gps, используя root? если так, пожалуйста, ответьте здесь:stackoverflow.com/questions/11373234/…

su и чтение из стандартного выхода

... .getRuntime().exec("su -c logcat -d");
 android developer14 мая 2013 г., 22:41
это более короткая версия первого ответа:stackoverflow.com/a/12642918/878126 , но это должно работать тоже.

Ваш ответ на вопрос