随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、博主微信(guyun297890152)、QQ技术交流群(183198395)。

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 // 按哪列排序
  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. }

转自:http://vaero.blog.51cto.com/4350852/778139

更多相关文章

  1. 浅析android通过jni控制service服务程序的简易流程
  2. Android(安卓)bluetooth介绍(四): a2dp connect流程分析
  3. Android(安卓)命令行编译、打包生成apk文件
  4. Ionic 运行报错No resource identifier found for attribute 'ap
  5. 修改android系统和watchdog的延时
  6. 2011年Android(安卓)Camera学习笔记之一
  7. 使用sencha cmd创建android应用
  8. Android(安卓)Calendar使用过程中遇到的问题
  9. [置顶] Android(安卓)跨进程通信Aidl的使用及注意事项

随机推荐

  1. 使用JNA从java崩溃VM调用c,有人能告诉我为
  2. java socket项目打包成可运行的JAR包!!!!
  3. 如何将mysql中的数据插入组合框中?
  4. Java的Char的简单工具类CharUtil2.0
  5. 使用JSP的fmt标签实现国际化支持
  6. 什么案例需要Java中的同步方法访问?
  7. 来自.Net的Zipped Streams问题并从Java读
  8. Java记录 -88- 利用反射机制调用对象的私
  9. java客户端调用 https 的webservice
  10. Java基础小常识(4)