É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?
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.
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
Où <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.
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");
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 .