Android中使用代码执行shell命令

jopen 10年前

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[1024];      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 num Maximum number of processes to display. // 最多显示多少个进程      -n num Updates to show before exiting. // 刷新次数      -d num Seconds to wait between updates. // 刷新间隔时间(默认5秒)      -s col Column to sort by <cpu,vss,rss,thr> // 按哪列排序      -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 // 进程属性      xx xx% x xx xx xx xx xx 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      // PSS Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)      // USS Unique 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;      } 
</div> </div>