古城热线 发表于 2018-8-16 12:57:46

Android执行shell命令

  Android执行shell命令

一、方法  


[*]/**
[*] * 执行一个shell命令,并返回字符串值
[*] *
[*] * @param cmd
[*] * 命令名称&参数组成的数组(例如:{"/system/bin/cat", "/proc/version"})
[*] * @param workdirectory
[*] * 命令执行路径(例如:"system/bin/")
[*] * @return 执行结果组成的字符串
[*] * @throws IOException
[*] */
[*]public static synchronized String run(String[] cmd, String workdirectory)
[*]      throws IOException {
[*]    StringBuffer result = new StringBuffer();
[*]    try {
[*]      // 创建操作系统进程(也可以由Runtime.exec()启动)
[*]      // Runtime runtime = Runtime.getRuntime();
[*]      // Process proc = runtime.exec(cmd);
[*]      // InputStream inputstream = proc.getInputStream();
[*]      ProcessBuilder builder = new ProcessBuilder(cmd);
[*]
[*]      InputStream in = null;
[*]      // 设置一个路径(绝对路径了就不一定需要)
[*]      if (workdirectory != null) {
[*]            // 设置工作目录(同上)
[*]            builder.directory(new File(workdirectory));
[*]            // 合并标准错误和标准输出
[*]            builder.redirectErrorStream(true);
[*]            // 启动一个新进程
[*]            Process process = builder.start();
[*]
[*]            // 读取进程标准输出流
[*]            in = process.getInputStream();
[*]            byte[] re = new byte;
[*]            while (in.read(re) != -1) {
[*]                result = result.append(new String(re));
[*]            }
[*]      }
[*]      // 关闭输入流
[*]      if (in != null) {
[*]            in.close();
[*]      }
[*]    } catch (Exception ex) {
[*]      ex.printStackTrace();
[*]    }
[*]    return result.toString();
[*]}
  

二、用途
         执行Linux下的top、ps等命令,这些命令你也通过adb可以执行查看效果。
         1)top命令如下:  


[*]adb shell
[*]$ top -h
[*]top -h
[*]Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
[*]-m numMaximum number of processes to display. // 最多显示多少个进程
[*]-n numUpdates to show before exiting. // 刷新次数
[*]-d numSeconds to wait between updates. // 刷新间隔时间(默认5秒)
[*]-s colColumn to sort by// 按哪列排序
[*]-t      Show threads instead of processes. // 显示线程信息而不是进程
[*]-h      Display this help screen. // 显示帮助文档
[*]$ top -n 1
[*]top -n 1
  


         就不把执行效果放上来了,总之结果表述如下:  


[*]User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率
[*]User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情况
[*]
[*]PID CPU% S #THR VSS RSS PCY UID Name // 进程属性
[*]xxxx% x   xxxxxxxxxx   xx
[*]
[*]CPU占用率:
[*]User    用户进程
[*]System系统进程
[*]IOW IO等待时间
[*]IRQ 硬中断时间
[*]
[*]CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数):
[*]User    处于用户态的运行时间,不包含优先值为负进程
[*]Nice    优先值为负的进程所占用的CPU时间
[*]Sys 处于核心态的运行时间
[*]Idle    除IO等待时间以外的其它等待时间
[*]IOW IO等待时间
[*]IRQ 硬中断时间
[*]SIRQ    软中断时间
[*]
[*]进程属性:
[*]PID 进程在系统中的ID
[*]CPU%    当前瞬时所以使用CPU占用率
[*]S   进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
[*]#THR    程序当前所用的线程数
[*]VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
[*]RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
[*]PCY OOXX,不知道什么东东
[*]UID 运行当前进程的用户id
[*]Name    程序名称android.process.media
[*]
[*]// ps:内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
[*]// PSSProportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
[*]// USSUnique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
  

  在附件Android系统->android top.txt文件内,自个总结的。

         2)执行代码  

  


[*]// top命令
[*]public static final String[] TOP = { "/system/bin/top", "-n", "1" };
[*]
[*]// 现在执行top -n 1,我们只需要第二行(用第二行求得CPU占用率,精确数据)
[*]// 第一行:User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率
[*]// 第二行:User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306
[*]// // CPU使用情况
[*]public static synchronized String run(String[] cmd) {
[*]    String line = "";
[*]    InputStream is = null;
[*]    try {
[*]      Runtime runtime = Runtime.getRuntime();
[*]      Process proc = runtime.exec(cmd);
[*]      is = proc.getInputStream();
[*]
[*]      // 换成BufferedReader
[*]      BufferedReader buf = new BufferedReader(new InputStreamReader(is));
[*]      do {
[*]            line = buf.readLine();
[*]            // 前面有几个空行
[*]            if (line.startsWith("User")) {
[*]                // 读到第一行时,我们再读取下一行
[*]                line = buf.readLine();
[*]                break;
[*]            }
[*]      } while (true);
[*]
[*]      if (is != null) {
[*]            buf.close();
[*]            is.close();
[*]      }
[*]    } catch (IOException e) {
[*]      e.printStackTrace();
[*]    }
[*]    return line;
[*]}
[*]
[*]// 获取指定应用的top命令获取的信息
[*]// PID CPU% S #THR VSS RSS PCY UID Name // 进程属性
[*]// 如果当前应用不在运行则返回null
[*]public static synchronized String run(String[] cmd, String pkgName) {
[*]    String line = null;
[*]    InputStream is = null;
[*]    try {
[*]      Runtime runtime = Runtime.getRuntime();
[*]      Process proc = runtime.exec(cmd);
[*]      is = proc.getInputStream();
[*]
[*]      // 换成BufferedReader
[*]      BufferedReader buf = new BufferedReader(new InputStreamReader(is));
[*]      do {
[*]            line = buf.readLine();
[*]            // 读取到相应pkgName跳出循环(或者未找到)
[*]            if (null == line || line.endsWith(pkgName)) {
[*]                break;
[*]            }
[*]      } while (true);
[*]
[*]      if (is != null) {
[*]            buf.close();
[*]            is.close();
[*]      }
[*]    } catch (IOException e) {
[*]      e.printStackTrace();
[*]    }
[*]    return line;
[*]}
  


三、后记
         这次相关的仅有的那个工程好像不能放上来了==。
         好吧,把我当时整理的一点点相关资料放附件了:包含《Android系统》文件夹和《深入研究java.lang.ProcessBuilder类.doc》。
         文件夹内容如下:


         ps:现在有个可以看的小工程了,请移至《Android VNC Server New》!

页: [1]
查看完整版本: Android执行shell命令