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.