2011-07-30 14 views
17

Tengo una aplicación que se supone que usa algunos comandos de shell para copiar un archivo de la tarjeta SD a/system/media /. Se requerirá Root, y estoy probando en un dispositivo rooteado. Estoy usando runtimes para ejecutar los comandos de shell, pero no funciona. Esto es lo que tengo para mis tiempos de ejecuciónEjecutando comandos de Shell a través de código Java en 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(); 
} 

Pero mi Logcat sólo se muestran dos de ellos no ser rechazado

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 

Los dos parecen ser los comandos sysrw y sysro, sin embargo, la aplicación seguirá pide permiso de root cuando desencaudo este código. Soy nuevo en el trabajo con root y no puedo entender cómo hacerlo funcionar.

+0

¿Puedo obtener un proyecto de trabajo de esta muestra? –

+0

Esto no funciona para mí y no recibo ninguna excepción de FileNotFound ni nada en Java. Además, SuperSU intercepta la solicitud raíz y puedo otorgarla, así sé que 'getRuntime()' está funcionando. Por alguna razón, simplemente no me permite manipular archivos en la carpeta '/ system/media'. – anon58192932

+0

Ah, parece que sysrw y sysro son comandantes desconocidos. – anon58192932

Respuesta

27

Para ejecutar comandos raíz, usted tiene que utilizar el formato 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(); 
} 

donde se pasa en una matriz de cadenas, cada cadena es un comando que debe ejecutarse. Por ejemplo:

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

Cuando lo pongo en mi onClick, dice que() String [] cmds) debería ser ;, que simplemente agrega más errores cuando lo hago. – Ben

+0

Acabo de editar mi respuesta original para mostrar un ejemplo de la matriz de cadenas que debe pasarse en – user496854

+0

A menos que lo esté haciendo mal, se está resaltando RunAsRoot y diciendo que void es un tipo no válido para RunAsRoot. He actualizado mi pregunta con el código que tengo ahora – Ben

Cuestiones relacionadas