web-dev-qa-db-fra.com

Autorisation READ_LOGS sur Jelly Bean (api 16)

Étant donné qu'Android Jelly bean ne prend pas en charge la autorisation de lecture des journaux (selon cette vidéo de Google 2012 } et celle-ci aussi ), j'aimerais savoir si Il est possible que des périphériques enracinés (ou des périphériques non-enracinés) puissent contourner cette restriction et pouvoir lire les journaux.

Comment je fais ça? Dois-je vraiment faire de l'application une application système ou est-ce que l'enracinement est suffisant?

21
android developer

Vous pouvez obtenir l'autorisation sur un périphérique racine en exécutant la commande pm grant à partir de votre application. Vous devrez probablement redémarrer l'application après cela pour que le changement prenne effet, cependant:

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

Ce code doit être appelé depuis votre onCreate (). Une fois l'autorisation accordée, plus aucun pouvoir racine n'est requis.

P.S: Les blocs p.waitFor () de l’application Super-utilisateur retardent le démarrage de votre application et peuvent éventuellement provoquer un ANR.

27
ge0rg

EDIT: Il s'avère que adb Shell pm grant ne fonctionne que sur les émulateurs. Les périphériques de production n'autorisent pas Shell à accorder et révoquer des autorisations facultatives.


Vous n'avez pas besoin d'avoir de racine. La seule chose dont vous avez besoin pour activer READ_LOGS dans des applications non-système consiste à installer Android SDK. 

En gros, vous devez appeler:

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

<pkg.name> est le nom du package de votre application. Cela est possible car READ_LOGS n'est pas seulement une autorisation "système", mais également une autorisation "de développement" (ce terme est introduit dans JB). Ce qui permet aux utilisateurs d'accorder cette autorisation à n'importe quelle application. Aucune racine requise.

Plus d'informations sont disponibles dans ce Google Groupes avec les commentaires de Dianne Hackborn.

22
inazaruk

J'ai contourné ce problème sur un périphérique root en appelant logcat avec su et en lisant à partir de stdout

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

Il existe un autre moyen d'accéder à tous les journaux sans avoir besoin d'autorisations root. Vous pouvez utiliser le débogage à distance. Jetez un coup d’œil à l’application open source sans racine Logcat .

0
Anton Tananaev