Разрешение READ_LOGS на желе Bean (api 16)

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

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

Ответ 1

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

Ответ 2


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). Что фактически позволяет пользователям предоставлять это разрешение любому приложению. Не требуется root.

Более подробная информация доступна в этом разделе групп google с комментариями от Dianne Hackborn.

Ответ 3

У меня есть это на корневом устройстве, вызывая logcat с su и чтение из stdout

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

Ответ 4

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