码迷,mamicode.com
首页 > 移动开发 > 详细

在android程序中调用shell命令与脚本

时间:2015-01-02 23:45:19      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:shell   脚本   android   root   

最近做android的一个功能就是调用shell命令来进行一些系统级别的操作,比如说是关机开机之类的,现在总结一下具体的用法以及遇到的坑(基于我所用到的,没用到的我就不说了)


(1)

Runtime.getRuntime().exec("ls");

这是最简单的一种,你输入后就能就会执行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 + "\n";
                }
                String line = null;
                while ((line = in.readLine()) != null
                       && !line.equals("null")) {
                    data += line + "\n";
                }

                Log.v("ls", data);


(2)

但是我所要写的需要通过root权限来执行,比如说重启的reboot命令,执行这个的话用普通的身份去执行的话是不会成功的,会报permission denyed,那我们如何才能执行呢,大家都知道adb shell吧,一般root过的机子都能够通过su来获得管理员权限,但是没root过的话就不能了,这就需要把机子进行root了。

root后执行如下命令

Process proc = Runtime.getRuntime().exec(new String[]{"su", reboot});

但是!!!!这个命令貌似不是所有的机子都可以用的,反正我就是遇到这样的坑,从报错信息中可以看到,su和reboot是连起来执行的,所以会解析成su reboot,这样的话会产生一个问题,su 加上 reboot后reboot会被解析成su的命令参数,我们打一下su -help可以看到su的所有参数,明显可以看出reboot不能直接跟在su后面,所以后来我发现一种可以运行的命令如下:


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的一段参数导致命令一直执行错误,无奈,搞了好久能没能搞出来,于是就改变了实现方法,用第四种方法去实现了。


(4)

第四种方法也是无奈之举,大家谁有更好的建议欢迎提出。

这种方法就是将所要执行的命令写成一个shell脚本,然后,在程序中调用这个shell脚本,

我把命令写成shell脚本放在了手机的目录中,然后按如下方式调用就成功了。


 Process proc = Runtime.getRuntime().exec("su -s sh  -c /data/initcommand.sh");

注意,这里面有和上面相同的问题,如果不加里面的-c参数的话还是会把后面的文件当做su的参数,当然-c也可以改成-s,这样就能执行initcommand.sh脚本了,如果不行试试将脚本改成777权限。

在android程序中调用shell命令与脚本

标签:shell   脚本   android   root   

原文地址:http://blog.csdn.net/u012457196/article/details/42346081

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!