web-dev-qa-db-ja.com

AndroidでJavaコードを介してシェルコマンドを実行しますか?

いくつかのシェルコマンドを使用してファイルをSDカードから/ system/media /にコピーすることになっているアプリがあります。それはrootを必要とします、そして私はroot化されたデバイスでテストしています。ランタイムを使用してシェルコマンドを実行していますが、機能していません。これが私のランタイム用に持っているものです

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

しかし、私のlogcatは、そのうちの2つだけが拒否されないことを示しています

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

これらの2つはsysrwコマンドとsysroコマンドのように見えますが、このコードをトリガーすると、アプリはルート権限を要求します。私はrootのものを扱うのは初めてで、これを機能させる方法がわからないようです。

17
Ben

ルートコマンドを実行するには、次の形式を使用する必要があります。

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

ここで、文字列の配列を渡します。各文字列は、実行する必要のあるコマンドです。例えば:

String[] commands = {"sysrw", "rm /data/local/bootanimation.Zip", "sysro"};
26
user496854