2011-07-30 6 views
17

J'ai une application qui est supposée utiliser des commandes shell pour copier un fichier de la carte SD vers/system/media /. Il faudra root, et je suis en train de tester sur un appareil enraciné. J'utilise des runtimes pour exécuter les commandes du shell, mais ça ne marche pas. Voici ce que j'ai mes runtimesExécuter des commandes Shell via le code java sur Android?

public void RunAsRoot{String[] commands = {"sysrw", "rm /data/local/bootanimation.zip", "sysro"};{ 
    Process p = Runtime.getRuntime().exec("su"); 
    DataOutputStream os = new DataOutputStream(p.getOutputStream());    
    for (String tmpCmd : commands) { 
    os.writeBytes(tmpCmd+"\n"); 
    }   
    os.writeBytes("exit\n"); 
    os.flush(); 
} 

Mais mon logcat montre que deux d'entre eux ne se rejeté

07-30 03:14:11.112: WARN/su(3593): request rejected (10047->0 /system/bin/sh) 
07-30 03:14:11.132: DEBUG/su(3592): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh 
07-30 03:14:11.152: WARN/su(3594): request rejected (0->0 /system/bin/sh) 
07-30 03:14:11.182: WARN/su(3595): request rejected (0->0 /system/bin/sh) 
07-30 03:14:11.202: WARN/su(3596): request rejected (0->0 /system/bin/sh) 
07-30 03:14:11.242: DEBUG/su(3597): 10047 com.bba.stormdroid executing 0 /system/bin/sh using shell /system/bin/sh : sh 

Ces deux semblent être les commandes de sysrw et sysro, mais l'application encore demande l'autorisation root lorsque je déclenche ce code. Je suis nouveau à travailler avec des choses root et je n'arrive pas à comprendre comment faire fonctionner ça.

+0

puis-je obtenir un projet de travail de cet échantillon? –

+0

Cela ne fonctionne pas pour moi et je ne reçois aucune exception FileNotFound ou quoi que ce soit en Java. De plus, SuperSU intercepte la requête root et je peux l'accorder pour que je sache que 'getRuntime()' fonctionne. Pour une raison quelconque, il ne me laissera pas manipuler des fichiers dans le dossier '/ system/media'. – anon58192932

+0

Ah, il semble que sysrw et sysro sont des commandes inconnues. – anon58192932

Répondre

27

Pour exécuter des commandes root, vous devez utiliser le format flllowing:

public void RunAsRoot(String[] cmds){ 
      Process p = Runtime.getRuntime().exec("su"); 
      DataOutputStream os = new DataOutputStream(p.getOutputStream());    
      for (String tmpCmd : cmds) { 
        os.writeBytes(tmpCmd+"\n"); 
      }   
      os.writeBytes("exit\n"); 
      os.flush(); 
} 

où vous passez dans un tableau de chaînes, chaque chaîne étant une commande qui doit être exécutée. Par exemple:

String[] commands = {"sysrw", "rm /data/local/bootanimation.zip", "sysro"}; 
+0

Quand je le mets dans mon onClick, il est dit que le() cmds() de around() doit être., Ce qui ajoute juste plus d'erreurs quand je le fais. – Ben

+0

Je viens d'éditer ma réponse originale pour montrer un exemple du tableau de chaînes qui doit être passé en – user496854

+0

À moins que je ne me trompe, il met en évidence RunAsRoot et dit que void est un type invalide pour RunAsRoot. J'ai mis à jour ma question avec le code que j'ai maintenant – Ben

Questions connexes