在Android应用中执行shell脚本

时间:2011-10-16 01:42:25

标签: android linux shell command root

原谅我,我不是Linux的核心程序员。这是我第一次做任何linux编码,对我来说很光。

所以我在这里阅读了很多关于这个主题的帖子,而且我无法弄清楚我的代码发生了什么。基本上,我正在尝试创建个人资料应用程序。该设备已植根并包含BusyBox。我编写了一个linux脚本,根据登录的用户交换/ data和/ cache分区。

当我从ADB执行此脚本时,它完美运行。我认为在应用程序中实现它会相当容易。

#sp登录用户名密码

Android使用新配置文件重新初始化,一切都很好。这就是我在Android中所拥有的:

Log.v("Profiles", "sp login " + user + " " + password);
Process process = Runtime.getRuntime().exec("sp login " + user + " " + password);

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
    output.append(buffer, 0, read);
}
reader.close();
process.waitFor();
Log.v("Profiles", output.toString());

唯一记录的是我在实际脚本中的“回声”。我没有看到该脚本中执行的命令的任何结果。例如,在ADB中运行时,所有mount命令和我正在做的不同事情都有输出。这些都不在输出字符串中输出。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你需要执行" su"对于将执行shell脚本的进程。

否则,即使设备已经植根,此过程也没有root权限。

以下代码是您参考的示例。

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

       // read the output from the command
       String s = null;
       while ((s = stdInput.readLine()) != null) {
           System.out.println(s);
       }
    }catch(Exception e){
        Log.e(LOG_TAG, "RunAsRoot exec failed");
    }

}