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

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

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

4 ответа

Решение

Вы можете получить разрешение на рутированном устройстве, выполнив команду 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 не требуется.

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


РЕДАКТИРОВАТЬ: Оказывается, что 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). Который на самом деле позволяет пользователям предоставлять это разрешение для любого приложения. Корень не требуется.

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

Я обошел это на рутированном устройстве, вызвав logcat с помощью su и чтение из стандартного выхода

... .getRuntime().exec("su -c logcat -d");

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

Другие вопросы по тегам