webentwicklung-frage-antwort-db.com.de

READ_LOGS-Berechtigung für Jelly Bean (API 16)

Da Android Jelly Bean die Berechtigung " logs reading" nicht unterstützt (laut diesem Google io 2012-Video und auch dieses ), würde ich gerne wissen, ob Es ist möglich, dass gerootete Geräte (oder nicht gerootete Geräte) diese Einschränkung umgehen und die Protokolle lesen können.

Wie mache ich das? Muss ich die App wirklich zu einer System-App machen, oder reicht das Rooten aus?

21

Sie können die Berechtigung für ein gerootetes Gerät erhalten, indem Sie den Befehl pm grant von Ihrer App aus ausführen. Wahrscheinlich müssen Sie die App danach neu starten, damit die Änderung wirksam wird:

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!");

Dieser Code sollte von Ihrem onCreate () aus aufgerufen werden. Sobald die Berechtigung erteilt wurde, sind keine weiteren Stammkräfte erforderlich.

P.S: p.waitFor () blockiert die Superuser-App, wodurch der Start der App verzögert wird und möglicherweise eine ANR verursacht wird.

27
ge0rg

EDIT: Es stellt sich heraus, dass adb Shell pm grant nur für Emulatoren funktioniert. Produktionsgeräte erlauben nicht, dass Shell optionale Berechtigungen erteilt und widerrufen wird.


Sie brauchen keine Wurzel zu haben. Um READ_LOGS für Nicht-Systemanwendungen aktivieren zu können, müssen Sie lediglich das Android SDK installieren. 

Grundsätzlich müssen Sie anrufen:

adb Shell pm grant <pkg.name> Android.permission.READ_LOGS

Dabei steht <pkg.name> für den Paketnamen Ihrer Anwendung. Dies ist möglich, da es sich bei READ_LOGS nicht nur um eine "System" -Berechtigung, sondern auch um eine "Entwicklungs" -Berechtigung (dieser Begriff wurde in JB eingeführt). Dadurch können Benutzer diese Berechtigung tatsächlich jeder Anwendung erteilen. Keine Wurzel erforderlich.

Weitere Informationen finden Sie in diesem Google Groups-Thread mit Kommentaren von Dianne Hackborn.

22
inazaruk

Ich habe dies auf einem gerooteten Gerät umgangen, indem ich logcat mit su aufgerufen habe und aus stdout gelesen habe

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

Es gibt eine andere Möglichkeit, auf alle Protokolle zuzugreifen, ohne dass Rootberechtigungen erforderlich sind. Sie können Remote-Debugging verwenden. Schauen Sie sich die Open Source rootless Logcat App an.

0
Anton Tananaev