×

安卓程序中调用 linux 命令

96
追风917 595a1b60 08f6 4beb 998f 2bf55e230555
2016.03.23 20:39* 字数 508

博客: 安卓之家
微博: 追风917
CSDN: 蒋朋的家
简书: 追风917

景色无边

在研究串口 jni 开发的时候,遇到了这样一段代码:

    Process su;
    su = Runtime.getRuntime().exec("/system/bin/su");
    String cmd = "chmod 666 " + device.getAbsolutePath() + "\n"
            + "exit\n";
    su.getOutputStream().write(cmd.getBytes());

这段代码相当于执行了三个 linux 命令:

$ /system/bin/su    //获取超级权限
# chmod 666 文件名  //改变文件属性
# exit              //退出超级权限

由此开启了安卓程序中调用 linux 命令的序幕。

调用方法


  1. 在 JDK 1.5 之前使用 Runtime 的 exec 方法执行 linux 命令

  2. 在 JDK 1.5 之后,可以使用 ProcessBuilder 的 start 方法执行 linux 命令

两者都被用来创建一个操作系统进程(执行命令行操作),并返回 Process 类的一个实例,该实例是子进程,并且没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过 Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream() 方法重定向给它的父进程了。ProcessBuilder 提供的功能更加丰富,能够设置设置工作目录、环境变量等

1 Runtime

该类的使用,开头已经涉及了,那是单个命令的执行操作,如果命令带参数或者有组合命令,还是这么操作吗?

现在有这个需求:切换到 /dev 目录并查看设备详情

这个组合在 linux 命令行可以这么写:

$ cd /dev && ls -l

直接用上面的操作:

$ Process p = Runtime.getRuntime().exec("cd /dev && ls -l");

事实证明这样是不可行的。

那么该如何操作呢,我们可以看到 exec 方法有好几个重载方法,可以用 String 数组来完成一系列操作:

    String cmd = "cd /dev && ls -l";
    Process p = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd});

这样就可以了。

2 ProcessBuilder

    ProcessBuilder pb = new ProcessBuilder("ls", "-l");  
    pb.directory(new File("/dev"));  //切换到工作目录 /dev
    Map<String, String> map = pb.environment();  // 得到进程生成器的环境 变量,这个变量可以自己修改
    Process p = pb.start(); 

github 上找到了个安卓应用,可以执行 linux 命令行:Android-Terminal-Emulator

长这样:

Android-Terminal-Emulator

好了,今天就到这里了。

分享是一种美德,更是一种生活方式!!

也许你会说我是一个梦想者,但我不是唯一的一个。

悦分享,越快乐_

欢迎交流,转载请注明出处,谢谢!

Android
Web note ad 1