最近做android的1个功能就是调用shell命令来进行1些系统级别的操作,比如说是关机开机之类的,现在总结1下具体的用法和遇到的坑(基于我所用到的,没用到的我就不说了)
(1)
Runtime.getRuntime().exec("ls");
这是最简单的1种,你输入后就可以就会履行ls命令,如果要取得输出的话可以这样写
Process p = Runtime.getRuntime().exec("ls");
String data = null;
BufferedReader ie = new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String error = null;
while ((error = ie.readLine()) != null
&& !error.equals("null")) {
data += error + "
";
}
String line = null;
while ((line = in.readLine()) != null
&& !line.equals("null")) {
data += line + "
";
}
Log.v("ls", data);
(2)
但是我所要写的需要通过root权限来履行,比如说重启的reboot命令,履行这个的话用普通的身份去履行的话是不会成功的,会报permission denyed,那我们如何才能履行呢,大家都知道adb shell吧,1般root过的机子都能够通过su来取得管理员权限,但是没root过的话就不能了,这就需要把机子进行root了。
root后履行以下命令
Process proc = Runtime.getRuntime().exec(new String[]{"su", reboot});
但是!!!!这个命令貌似不是所有的机子都可以用的,反正我就是遇到这样的坑,从报错信息中可以看到,su和reboot是连起来履行的,所以会解析成su reboot,这样的话会产生1个问题,su 加上 reboot后reboot会被解析成su的命令参数,我们打1下su -help可以看到su的所有参数,明显可以看出reboot不能直接跟在su后面,所以后来我发现1种可以运行的命令以下:
Process proc = Runtime.getRuntime().exec(su -c reboot);
这样机子就可以通过root权限履行重启命令了。
(3)
但当我们遇到这样的需求呢!要求运行的shell命令以下
<pre name="code" class="java">Process proc = Runtime.getRuntime().exec(su -c "ls /data");
经过测试,虽然这段代码中的命令在adb shell中能够完善运行,但是放到android的java程序中就跪了。。。在android程序中貌似会把/data"当作su的1段参数致使命令1直履行毛病,无奈,弄了好久能没能弄出来,因而就改变了实现方法,用第4种方法去实现了。
(4)
第4种方法也是无奈之举,大家谁有更好的建议欢迎提出。
这类方法就是将所要履行的命令写成1个shell脚本,然后,在程序中调用这个shell脚本,
我把命令写成shell脚本放在了手机的目录中,然后按以下方式调用就成功了。
Process proc = Runtime.getRuntime().exec("su -s sh -c /data/initcommand.sh");
注意,这里面有和上面相同的问题,如果不加里面的-c参数的话还是会把后面的文件当作su的参数,固然-c也能够改成-s,这样就可以履行initcommand.sh脚本了,如果不行试试将脚本改成777权限。