Android执行shell命令

一、方法
  1. /**
  2. *执行一个shell命令,并返回字符串值
  3. *
  4. *@paramcmd
  5. *命令名称&参数组成的数组(例如:{"/system/bin/cat","/proc/version"})
  6. *@paramworkdirectory
  7. *命令执行路径(例如:"system/bin/")
  8. *@return执行结果组成的字符串
  9. *@throwsIOException
  10. */
  11. publicstaticsynchronizedStringrun(String[]cmd,Stringworkdirectory)
  12. throwsIOException{
  13. StringBufferresult=newStringBuffer();
  14. try{
  15. //创建操作系统进程(也可以由Runtime.exec()启动)
  16. //Runtimeruntime=Runtime.getRuntime();
  17. //Processproc=runtime.exec(cmd);
  18. //InputStreaminputstream=proc.getInputStream();
  19. ProcessBuilderbuilder=newProcessBuilder(cmd);
  20. InputStreamin=null;
  21. //设置一个路径(绝对路径了就不一定需要)
  22. if(workdirectory!=null){
  23. //设置工作目录(同上)
  24. builder.directory(newFile(workdirectory));
  25. //合并标准错误和标准输出
  26. builder.redirectErrorStream(true);
  27. //启动一个新进程
  28. Processprocess=builder.start();
  29. //读取进程标准输出流
  30. in=process.getInputStream();
  31. byte[]re=newbyte[1024];
  32. while(in.read(re)!=-1){
  33. result=result.append(newString(re));
  34. }
  35. }
  36. //关闭输入流
  37. if(in!=null){
  38. in.close();
  39. }
  40. }catch(Exceptionex){
  41. ex.printStackTrace();
  42. }
  43. returnresult.toString();
  44. }
二、用途 执行Linux下的top、ps等命令,这些命令你也通过adb可以执行查看效果。 1 )top 命令如下:
  1. adbshell
  2. $top-h
  3. top-h
  4. Usage:top[-mmax_procs][-niterations][-ddelay][-ssort_column][-t][-h]
  5. -mnumMaximumnumberofprocessestodisplay.//最多显示多少个进程
  6. -nnumUpdatestoshowbeforeexiting.//刷新次数
  7. -dnumSecondstowaitbetweenupdates.//刷新间隔时间(默认5秒)
  8. -scolColumntosortby<cpu,vss,rss,thr>//按哪列排序
  9. -tShowthreadsinsteadofprocesses.//显示线程信息而不是进程
  10. -hDisplaythishelpscreen.//显示帮助文档
  11. $top-n1
  12. top-n1
就不把执行效果放上来了,总之结果表述如下:
  1. User35%,System13%,IOW0%,IRQ0%//CPU占用率
  2. User109+Nice0+Sys40+Idle156+IOW0+IRQ0+SIRQ1=306//CPU使用情况
  3. PIDCPU%S#THRVSSRSSPCYUIDName//进程属性
  4. xxxx%xxxxxxxxxxxxx
  5. CPU占用率:
  6. User用户进程
  7. System系统进程
  8. IOWIO等待时间
  9. IRQ硬中断时间
  10. CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数):
  11. User处于用户态的运行时间,不包含优先值为负进程
  12. Nice优先值为负的进程所占用的CPU时间
  13. Sys处于核心态的运行时间
  14. Idle除IO等待时间以外的其它等待时间
  15. IOWIO等待时间
  16. IRQ硬中断时间
  17. SIRQ软中断时间
  18. 进程属性:
  19. PID进程在系统中的ID
  20. CPU%当前瞬时所以使用CPU占用率
  21. S进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。
  22. #THR程序当前所用的线程数
  23. VSSVirtualSetSize虚拟耗用内存(包含共享库占用的内存)
  24. RSSResidentSetSize实际使用物理内存(包含共享库占用的内存)
  25. PCYOOXX,不知道什么东东
  26. UID运行当前进程的用户id
  27. Name程序名称android.process.media
  28. //ps:内存占用大小有如下规律:VSS>=RSS>=PSS>=USS
  29. //PSSProportionalSetSize实际使用的物理内存(比例分配共享库占用的内存)
  30. //USSUniqueSetSize进程独自占用的物理内存(不包含共享库占用的内存)

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

2 )执行代码
  1. //top命令
  2. publicstaticfinalString[]TOP={"/system/bin/top","-n","1"};
  3. //现在执行top-n1,我们只需要第二行(用第二行求得CPU占用率,精确数据)
  4. //第一行:User35%,System13%,IOW0%,IRQ0%//CPU占用率
  5. //第二行:User109+Nice0+Sys40+Idle156+IOW0+IRQ0+SIRQ1=306
  6. ////CPU使用情况
  7. publicstaticsynchronizedStringrun(String[]cmd){
  8. Stringline="";
  9. InputStreamis=null;
  10. try{
  11. Runtimeruntime=Runtime.getRuntime();
  12. Processproc=runtime.exec(cmd);
  13. is=proc.getInputStream();
  14. //换成BufferedReader
  15. BufferedReaderbuf=newBufferedReader(newInputStreamReader(is));
  16. do{
  17. line=buf.readLine();
  18. //前面有几个空行
  19. if(line.startsWith("User")){
  20. //读到第一行时,我们再读取下一行
  21. line=buf.readLine();
  22. break;
  23. }
  24. }while(true);
  25. if(is!=null){
  26. buf.close();
  27. is.close();
  28. }
  29. }catch(IOExceptione){
  30. e.printStackTrace();
  31. }
  32. returnline;
  33. }
  34. //获取指定应用的top命令获取的信息
  35. //PIDCPU%S#THRVSSRSSPCYUIDName//进程属性
  36. //如果当前应用不在运行则返回null
  37. publicstaticsynchronizedStringrun(String[]cmd,StringpkgName){
  38. Stringline=null;
  39. InputStreamis=null;
  40. try{
  41. Runtimeruntime=Runtime.getRuntime();
  42. Processproc=runtime.exec(cmd);
  43. is=proc.getInputStream();
  44. //换成BufferedReader
  45. BufferedReaderbuf=newBufferedReader(newInputStreamReader(is));
  46. do{
  47. line=buf.readLine();
  48. //读取到相应pkgName跳出循环(或者未找到)
  49. if(null==line||line.endsWith(pkgName)){
  50. break;
  51. }
  52. }while(true);
  53. if(is!=null){
  54. buf.close();
  55. is.close();
  56. }
  57. }catch(IOExceptione){
  58. e.printStackTrace();
  59. }
  60. returnline;
  61. }

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

更多相关文章

  1. Android——启动过程详解
  2. Android(安卓)adb setuid提权漏洞的分析
  3. android 零散笔记不定期更新 v16
  4. 2011.07.12(2)——— android Messenger 跨进程通信
  5. android IPC机制
  6. Android官方命令深入分析之Device Monitor
  7. Android命令行测试BT,WIFI,Sensor工作状态
  8. android 开发学习笔记 (一)
  9. Android(安卓)pm命令详解

随机推荐

  1. 介绍两个Android开源项目:Android显示GIF
  2. android push机制-C2DM
  3. Android(安卓)CountDownTimer实现定时器
  4. 定制Android的Home
  5. android的九宫格式实现
  6. Android系统权限和root权限
  7. Android(安卓)O指纹识别解析
  8. Android(安卓)Http请求的代码
  9. 设置Activity全屏
  10. Qt on Android(安卓)Episode 4(翻译)