当前位置: 代码迷 >> Android >> Android实施shell命令(转)
  详细解决方案

Android实施shell命令(转)

热度:96   发布时间:2016-05-01 11:33:44.0
Android执行shell命令(转)

Android执行shell命令

一、方法
  1. /**?
  2. *?执行一个shell命令,并返回字符串值?
  3. *?
  4. [email protected]?
  5. *?命令名称&参数组成的数组(例如:{"/system/bin/cat",?"/proc/version"})?
  6. [email protected]?
  7. *?命令执行路径(例如:"system/bin/")?
  8. [email protected]?
  9. [email protected]?
  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》。
???????? 文件夹内容如下:

androidSystem.png?

  相关解决方案