zoukankan      html  css  js  c++  java
  • Android执行shell命令

    一、方法

     1    /** 
     2     * 执行一个shell命令,并返回字符串值 
     3     * 
     4     * @param cmd 
     5     * 命令名称&参数组成的数组(例如:{"/system/bin/cat", "/proc/version"}) 
     6     * @param workdirectory 
     7     * 命令执行路径(例如:"system/bin/") 
     8     * @return 执行结果组成的字符串 
     9     * @throws IOException 
    10     */ 
    11     public static synchronized String run(String[] cmd, String workdirectory) 
    12             throws IOException { 
    13         StringBuffer result = new StringBuffer(); 
    14         try { 
    15             // 创建操作系统进程(也可以由Runtime.exec()启动) 
    16             // Runtime runtime = Runtime.getRuntime(); 
    17             // Process proc = runtime.exec(cmd); 
    18             // InputStream inputstream = proc.getInputStream(); 
    19             ProcessBuilder builder = new ProcessBuilder(cmd); 
    20      
    21             InputStream in = null; 
    22             // 设置一个路径(绝对路径了就不一定需要) 
    23             if (workdirectory != null) { 
    24                 // 设置工作目录(同上) 
    25                 builder.directory(new File(workdirectory)); 
    26                 // 合并标准错误和标准输出 
    27                 builder.redirectErrorStream(true); 
    28                 // 启动一个新进程 
    29                 Process process = builder.start(); 
    30      
    31                 // 读取进程标准输出流 
    32                 in = process.getInputStream(); 
    33                 byte[] re = new byte[1024]; 
    34                 while (in.read(re) != -1) { 
    35                     result = result.append(new String(re)); 
    36                 } 
    37             } 
    38             // 关闭输入流 
    39             if (in != null) { 
    40                 in.close(); 
    41             } 
    42         } catch (Exception ex) { 
    43             ex.printStackTrace(); 
    44         } 
    45         return result.toString(); 
    46     } 

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

     1     adb shell 
     2     $ top -h 
     3     top -h 
     4     Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h] 
     5       -m num  Maximum number of processes to display. // 最多显示多少个进程 
     6       -n num  Updates to show before exiting. // 刷新次数 
     7       -d num  Seconds to wait between updates. // 刷新间隔时间(默认5秒) 
     8       -s col  Column to sort by <cpu,vss,rss,thr> // 按哪列排序 
     9       -t      Show threads instead of processes. // 显示线程信息而不是进程 
    10       -h      Display this help screen. // 显示帮助文档 
    11     $ top -n 1 
    12     top -n 1 

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

     1     User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率 
     2     User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情况 
     3      
     4     PID CPU% S #THR VSS RSS PCY UID Name // 进程属性 
     5     xx  xx% x   xx  xx  xx  xx  xx   xx 
     6      
     7     CPU占用率: 
     8     User    用户进程 
     9     System  系统进程 
    10     IOW IO等待时间 
    11     IRQ 硬中断时间 
    12      
    13     CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数): 
    14     User    处于用户态的运行时间,不包含优先值为负进程 
    15     Nice    优先值为负的进程所占用的CPU时间 
    16     Sys 处于核心态的运行时间 
    17     Idle    除IO等待时间以外的其它等待时间 
    18     IOW IO等待时间 
    19     IRQ 硬中断时间 
    20     SIRQ    软中断时间 
    21      
    22     进程属性: 
    23     PID 进程在系统中的ID 
    24     CPU%    当前瞬时所以使用CPU占用率 
    25     S   进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。 
    26     #THR    程序当前所用的线程数 
    27     VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) 
    28     RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存) 
    29     PCY OOXX,不知道什么东东 
    30     UID 运行当前进程的用户id 
    31     Name    程序名称android.process.media 
    32      
    33     // ps:内存占用大小有如下规律:VSS >= RSS >= PSS >= USS 
    34     // PSS  Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) 
    35     // USS  Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) 

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

     2)执行代码

     1     // top命令 
     2     public static final String[] TOP = { "/system/bin/top", "-n", "1" }; 
     3      
     4     // 现在执行top -n 1,我们只需要第二行(用第二行求得CPU占用率,精确数据) 
     5     // 第一行:User 35%, System 13%, IOW 0%, IRQ 0% // CPU占用率 
     6     // 第二行:User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 
     7     // // CPU使用情况 
     8     public static synchronized String run(String[] cmd) { 
     9         String line = ""; 
    10         InputStream is = null; 
    11         try { 
    12             Runtime runtime = Runtime.getRuntime(); 
    13             Process proc = runtime.exec(cmd); 
    14             is = proc.getInputStream(); 
    15      
    16             // 换成BufferedReader 
    17             BufferedReader buf = new BufferedReader(new InputStreamReader(is)); 
    18             do { 
    19                 line = buf.readLine(); 
    20                 // 前面有几个空行 
    21                 if (line.startsWith("User")) { 
    22                     // 读到第一行时,我们再读取下一行 
    23                     line = buf.readLine(); 
    24                     break; 
    25                 } 
    26             } while (true); 
    27      
    28             if (is != null) { 
    29                 buf.close(); 
    30                 is.close(); 
    31             } 
    32         } catch (IOException e) { 
    33             e.printStackTrace(); 
    34         } 
    35         return line; 
    36     } 
    37      
    38     // 获取指定应用的top命令获取的信息 
    39     // PID CPU% S #THR VSS RSS PCY UID Name // 进程属性 
    40     // 如果当前应用不在运行则返回null 
    41     public static synchronized String run(String[] cmd, String pkgName) { 
    42         String line = null; 
    43         InputStream is = null; 
    44         try { 
    45             Runtime runtime = Runtime.getRuntime(); 
    46             Process proc = runtime.exec(cmd); 
    47             is = proc.getInputStream(); 
    48      
    49             // 换成BufferedReader 
    50             BufferedReader buf = new BufferedReader(new InputStreamReader(is)); 
    51             do { 
    52                 line = buf.readLine(); 
    53                 // 读取到相应pkgName跳出循环(或者未找到) 
    54                 if (null == line || line.endsWith(pkgName)) { 
    55                     break; 
    56                 } 
    57             } while (true); 
    58      
    59             if (is != null) { 
    60                 buf.close(); 
    61                 is.close(); 
    62             } 
    63         } catch (IOException e) { 
    64             e.printStackTrace(); 
    65         } 
    66         return line; 
    67     } 

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

      

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

    本文出自 “-_--___---_-” 博客,请务必保留此出处http://vaero.blog.51cto.com/4350852/778139

     附件: Android执行shell命令.zip

  • 相关阅读:
    阅读笔记06
    阅读笔记05
    学习进度03
    四则运算03
    阅读笔记04
    求最大子数组值(有环版)
    合作项目02
    新的小组信息以及项目名称与介绍
    第六周进度条
    软件工程个人作业4(课堂练习&&课堂作业)
  • 原文地址:https://www.cnblogs.com/eustoma/p/4358077.html
Copyright © 2011-2022 走看看