2011-07-30 16 views
17

Mam aplikację, która powinna użyć niektórych poleceń powłoki, aby skopiować plik z sdcard do/system/media /. Będzie wymagał rootowania, a ja testuję na zrootowanym urządzeniu. Używam środowiska wykonawczego do wykonywania poleceń powłoki, ale to nie działa. Oto co mam na moje czasy pracyUruchamianie poleceń powłoki za pomocą kodu Java na Androida?

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(); 
} 

Ale moja logcat pokazuje tylko dwa z nich nie uzyskiwanie odrzucony

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 

Ci dwaj spojrzeniem być polecenia sysrw i sysro, jednak aplikacja nadal prosi o uprawnienia root'a po uruchomieniu tego kodu. Jestem nowy w pracy z root-ami i nie mogę się zorientować, jak to uruchomić.

+0

Czy mogę uzyskać działający projekt tego przykładu? –

+0

To nie działa dla mnie i nie otrzymuję żadnych wyjątków FileNotFound ani niczego w Javie. Ponadto SuperSU przechwytuje żądanie roota i jestem w stanie go przyznać, więc wiem, że działa funkcja 'getRuntime()'. Z jakiegoś powodu po prostu nie pozwala mi manipulować plikami w folderze '/ system/media'. – anon58192932

+0

Ah wygląda na to, że sysrw i sysro są nieznanymi komendantami. – anon58192932

Odpowiedz

27

Aby uruchomić polecenia administratora, trzeba użyć formatu 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(); 
} 

gdzie przechodzą w tablicy łańcuchów, każdy łańcuch jest polecenie, które musi być wykonane. Na przykład:

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

Kiedy umieszczam to w moim onClick, to mówi, że() wokół (String [] cmds) powinno być; s, które po prostu dodaje więcej błędów, kiedy to robię. – Ben

+0

Właśnie edytowałem swoją oryginalną odpowiedź, aby pokazać przykład tablicy łańcuchów, która musi zostać przekazana w – user496854

+0

Jeśli nie robię tego źle, to podświetlenie RunAsRoot i stwierdzenie, że void jest nieprawidłowym typem dla RunAsRoot. Zaktualizowałem swoje pytanie za pomocą kodu, który mam teraz – Ben