博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android执行shell命令
阅读量:6278 次
发布时间:2019-06-22

本文共 5907 字,大约阅读时间需要 19 分钟。

一、方法

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 
// 按哪列排序 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:现在有个可以看的小工程了,请移至《》!

本文出自 “” 博客,请务必保留此出处

 附件:

转载地址:http://wsyva.baihongyu.com/

你可能感兴趣的文章
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《第一桶金怎么赚——淘宝开店创业致富一册通》一一第1章 创业梦想,怎样起步...
查看>>
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
《Exchange Server 2010 SP1/SP2管理实践》——2.4 部署外部网络环境
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
《计算广告:互联网商业变现的市场与技术》一第一部分 在线广告市场与背景...
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>