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》。 文件夹内容如下:

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

更多相关文章

  1. Android下模拟按键输入
  2. 【【【常用的ubuntu第三方工具及android命令(自存档)】】】二
  3. android 命令(adb shell)进入指定模拟器或设备
  4. android获取正在运行的进程
  5. Android例子—直接通过Binder的onTransact完成跨进程通信
  6. 工作环境搭建(8) - CentOS7命令行安装Android(安卓)SDK
  7. [android]android性能测试命令行篇
  8. Windows环境下Android(安卓)源码模块下载
  9. Android下读取logcat的信息

随机推荐

  1. Android(安卓)开发环境搭建
  2. android获取版本号
  3. 关于Android的文字排版和换行问题,彻底解
  4. Android(安卓)调试错误: java.lang.Secur
  5. android 获取实际view 宽度高度
  6. Android(安卓)Post Get 示例
  7. Android(安卓)room操作数据库
  8. Android(安卓)Action
  9. Android(安卓)拦截短信配置
  10. Android蓝牙开发浅谈