2011-07-12 11 views
3

Aux fins de la surveillance utilisation de la batterie, etc. J'ai le code qui exécute quelques appels dumpsys, lit et analyse la sortie pour extraire des données que je suis intéressé par.Android Non Octroi Dump Permission

dumpsys batterie, Tous les et dumpsys puissance tous me donner un message d'erreur pour la sortie comme "Permission Denial: ne peut pas vider le service de la batterie de pid ..." En outre, lorsque l'application est lancée, il y a un élément dans le journal étiqueté avec "PackageManager" statingNot accordant l'autorisation android.permissionDUMP au paquet .... (protectionLevel = 3 ...) "

Cependant, dumpsys cpuinfo et dumpsys netstat fonctionnent et me donnent la sortie correcte, ce qui semble être incohérent.

Je suis capable de générer batterie de décharges et similaires à partir du shell ADB, mais quand j'essaye de l'appeler par programme cela ne fonctionne pas.

J'ai essayé de l'utiliser sur un téléphone HTC Nexus One ainsi que sur l'émulateur et d'obtenir les mêmes résultats pour chacun. La chose étrange est que ce code a fonctionné sur mon Nexus One il y a un jour (avant que je mette à jour de 2.2 à 2.3), et maintenant il ne fonctionne pas. Est-ce dû à la mise à niveau?

Un exemple du code que je suis en train de courir est la suivante:

 String command = "dumpsys battery"; 
    try { 
     String s = null; 
     Process process = Runtime.getRuntime().exec(command); 


      BufferedReader stdInput = new BufferedReader(new 
        InputStreamReader(process.getInputStream())); 

       BufferedReader stdError = new BufferedReader(new 
        InputStreamReader(process.getErrorStream())); 

       // read the output from the command 
       System.out.println("Here is the standard output of the command:\n"); 
       while ((s = stdInput.readLine()) != null) { 
        System.out.println(s); 
       } 

       // read any errors from the attempted command 
       System.out.println("Here is the standard error of the command (if any):\n"); 
       while ((s = stdError.readLine()) != null) { 
        System.out.println(s); 
       } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Comment puis-je obtenir les dumpsys pour me donner la sortie correcte programme et comment j'obtenir l'autorisation de décharge être accordée?

* Le Nexus One est pas enracinée et je voudrais obtenir ce travail sans avoir à enraciner dans le cadre de mon projet

Nous vous remercions pour votre aide

Répondre

6

applications régulières ne peuvent pas obtenir la permission DUMP . Il est réservé aux applications système.

0

Si votre téléphone a été enraciné, 'activité dumpsys' travaillera sur Android2.3:

private static void dumpIT0(String sCmd) { 
    try { 
     String s = null; 
     String command = "su -c " + sCmd; 
     Process process = Runtime.getRuntime().exec(command); 

     BufferedReader stdInput = new BufferedReader(new InputStreamReader(
       process.getInputStream())); 

     BufferedReader stdError = new BufferedReader(new InputStreamReader(
       process.getErrorStream())); 

     // read the output from the command 
     System.out.println("Here is the standard output of the command:\n"); 
     while ((s = stdInput.readLine()) != null) { 
      System.out.println(s); 
     } 

     // read any errors from the attempted command 
     System.out.println("Here is the standard error of the command (if any):\n"); 
     while ((s = stdError.readLine()) != null) { 
      System.out.println(s); 
     } 
    } catch (IOException e) { 
     Log.e(TAG, "IOException: " + e); 
    } 
} 
sCmd = "dumpsys activity"; 
1

android.permission.Dump est protégé par le système, la signature et les niveaux de protection d'autorisation de développement. La ligne 1993 de the source vous montre ceci. Si votre APK est signé avec le cert de framework, se trouve dans le répertoire priv-app, ou debuggable (voir ci-dessous), vous pouvez utiliser le service pm pour accorder l'autorisation, sinon le code empêche spécifiquement ce que vous demandez (ligne 2624 de source).

Des fichiers APK débogables peuvent être créés en définissant l'attribut débogable sur un buildType via build.gradle. Exemple de DSL Android:

android { 
    ... 
    buildTypes { 
     debug { 
      debuggable true 
      ... 
     } 
     quality_assurance { 
      debuggable true 
     } 
    ... 
} 
Questions connexes