以root身份运行本机android可执行文件

时间:2011-10-11 15:58:40

标签: java android executable root

有谁知道怎么做? 这是我的代码:

try {
            Process p = Runtime.getRuntime().exec("su");
            p.waitFor();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            Process p = Runtime.getRuntime().exec(
                    "/system/bin/netcfg > /sdcard/netcfg.txt");
            p.waitFor();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
}

是的,我知道我没有进行任何测试,看看用户是否真的接受了超级用户对话框,但这只是对我自己的测试。

3 个答案:

答案 0 :(得分:1)

这不是你的完整解决方案,但这是我前一段时间尝试的一些代码。它可以运行任意命令(代码在这里使用ls)。从屏幕截图中可以看到,超级用户对话框会弹出ls

enter image description here

我最初尝试做的是打开一个带有sh的shell,然后在该shell中运行命令,以便每次只显示初始sh超级用户对话框。我看过似乎这样做的应用程序,但我仍然不确定它是如何完成的。我怀疑这也是你正在寻找的,但至少使用这段代码你可以运行命令。 :)

无论如何,这是代码。将它粘贴到一个骨架Android应用程序中它应该可以工作。

public class ShellCommandTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final StringBuilder log = new StringBuilder();
    try{
        ArrayList<String> commandLine = new ArrayList<String>();
        commandLine.add("su");
        commandLine.add("-c");
        commandLine.add("ls");

        Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));

        for (String command : commandLine){
            Log.i("SU_Test", command);
        }

        String line;
        while ((line = bufferedReader.readLine()) != null){ 
            log.append(line);
            log.append("\n"); 
        }
    } 
    catch (IOException e){
        Log.e("SU_Test", "Fail: " + e.getMessage());
    } 
    Log.i("SU_Test", log.toString());
}
祝你好运!

答案 1 :(得分:0)

刚刚测试过,它不适用于Nexus S,OS 2.3.6。

<强>更新

您的手机已根植su应该有效。您看到的问题是密码对话框未显示。这似乎适用于一些有根的手机,但可能是自定义固件的功能。

您可以做的是启动su进程,通过对话框询问用户密码,然后将其输出到su进程。

 Process process = new ProcessBuilder()
   .command("su", "android.com")
   .redirectErrorStream(true)
   .start();

// Dialog for asking pass here
OutputStream out = process.getOutputStream();
out.write(password);

答案 2 :(得分:-1)

我从来没有尝试过自己,但是如果没有su权限,你可以在没有su权限的应用程序中做su这样的东西。所以我想你需要做的第一件事是为你的应用程序请求su权限:

// arbitrary number of your choosing
final int SUPERUSER_REQUEST = 2323; 

// superuser request
Intent intent = new Intent("android.intent.action.superuser"); 

// tell Superuser the name of the requesting app
intent.putExtra("name", "Shell"); 

// tel Superuser the name of the requesting package
intent.putExtra("packagename", "koushikdutta.shell"); 

// make the request!
startActivityForResult(intent, SUPERUSER_REQUEST);

然后你可以:

Runtime.getRuntime().exec("su -c <your privileged command here>");

(从http://forum.xda-developers.com/showpost.php?p=2954887&postcount=7复制)