Android执行shell命令
一、方法
- /**?
- *?执行一个shell命令,并返回字符串值?
- *?
- [email protected]?
- *?命令名称&参数组成的数组(例如:{"/system/bin/cat",?"/proc/version"})?
- [email protected]?
- *?命令执行路径(例如:"system/bin/")?
- [email protected]?
- [email protected]?
- */?
- public?static?synchronized?String?run(String[]?cmd,?String?workdirectory)?
- ????????throws?IOException?{?
- ????StringBuffer?result?=?new?StringBuffer();?
- ????try?{?
- ????????//?创建操作系统进程(也可以由Runtime.exec()启动)?
- ????????//?Runtime?runtime?=?Runtime.getRuntime();?
- ????????//?Process?proc?=?runtime.exec(cmd);?
- ????????//?InputStream?inputstream?=?proc.getInputStream();?
- ????????ProcessBuilder?builder?=?new?ProcessBuilder(cmd);?
- ?
- ????????InputStream?in?=?null;?
- ????????//?设置一个路径(绝对路径了就不一定需要)?
- ????????if?(workdirectory?!=?null)?{?
- ????????????//?设置工作目录(同上)?
- ????????????builder.directory(new?File(workdirectory));?
- ????????????//?合并标准错误和标准输出?
- ????????????builder.redirectErrorStream(true);?
- ????????????//?启动一个新进程?
- ????????????Process?process?=?builder.start();?
- ?
- ????????????//?读取进程标准输出流?
- ????????????in?=?process.getInputStream();?
- ????????????byte[]?re?=?new?byte[1024];?
- ????????????while?(in.read(re)?!=?-1)?{?
- ????????????????result?=?result.append(new?String(re));?
- ????????????}?
- ????????}?
- ????????//?关闭输入流?
- ????????if?(in?!=?null)?{?
- ????????????in.close();?
- ????????}?
- ????}?catch?(Exception?ex)?{?
- ????????ex.printStackTrace();?
- ????}?
- ????return?result.toString();?
- }?
二、用途
???????? 执行Linux下的top、ps等命令,这些命令你也通过adb可以执行查看效果。
? ? ? ???1)top命令如下:
- adb?shell?
- $?top?-h?
- top?-h?
- Usage:?top?[-m?max_procs]?[-n?iterations]?[-d?delay]?[-s?sort_column]?[-t]?[-h]?
- ??-m?num??Maximum?number?of?processes?to?display.?//?最多显示多少个进程?
- ??-n?num??Updates?to?show?before?exiting.?//?刷新次数?
- ??-d?num??Seconds?to?wait?between?updates.?//?刷新间隔时间(默认5秒)?
- ??-s?col??Column?to?sort?by?<cpu,vss,rss,thr>?//?按哪列排序?
- ??-t??????Show?threads?instead?of?processes.?//?显示线程信息而不是进程?
- ??-h??????Display?this?help?screen.?//?显示帮助文档?
- $?top?-n?1?
- top?-n?1?
?
???????? 就不把执行效果放上来了,总之结果表述如下:
- User?35%,?System?13%,?IOW?0%,?IRQ?0%?//?CPU占用率?
- User?109?+?Nice?0?+?Sys?40?+?Idle?156?+?IOW?0?+?IRQ?0?+?SIRQ?1?=?306?//?CPU使用情况?
- ?
- PID?CPU%?S?#THR?VSS?RSS?PCY?UID?Name?//?进程属性?
- xx??xx%?x???xx??xx??xx??xx??xx???xx?
- ?
- CPU占用率:?
- User????用户进程?
- System??系统进程?
- IOW?IO等待时间?
- IRQ?硬中断时间?
- ?
- CPU使用情况(指一个最小时间片内所占时间,单位jiffies。或者指所占进程数):?
- User????处于用户态的运行时间,不包含优先值为负进程?
- Nice????优先值为负的进程所占用的CPU时间?
- Sys?处于核心态的运行时间?
- Idle????除IO等待时间以外的其它等待时间?
- IOW?IO等待时间?
- IRQ?硬中断时间?
- SIRQ????软中断时间?
- ?
- 进程属性:?
- PID?进程在系统中的ID?
- CPU%????当前瞬时所以使用CPU占用率?
- S???进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数。?
- #THR????程序当前所用的线程数?
- VSS?Virtual?Set?Size?虚拟耗用内存(包含共享库占用的内存)?
- RSS?Resident?Set?Size?实际使用物理内存(包含共享库占用的内存)?
- PCY?OOXX,不知道什么东东?
- UID?运行当前进程的用户id?
- Name????程序名称android.process.media?
- ?
- //?ps:内存占用大小有如下规律:VSS?>=?RSS?>=?PSS?>=?USS?
- //?PSS??Proportional?Set?Size?实际使用的物理内存(比例分配共享库占用的内存)?
- //?USS??Unique?Set?Size?进程独自占用的物理内存(不包含共享库占用的内存)?
? ? ? ???在附件Android系统->android top.txt文件内,自个总结的。
? ? ? ? ?2)执行代码
- //?top命令?
- public?static?final?String[]?TOP?=?{?"/system/bin/top",?"-n",?"1"?};?
- ?
- //?现在执行top?-n?1,我们只需要第二行(用第二行求得CPU占用率,精确数据)?
- //?第一行:User?35%,?System?13%,?IOW?0%,?IRQ?0%?//?CPU占用率?
- //?第二行:User?109?+?Nice?0?+?Sys?40?+?Idle?156?+?IOW?0?+?IRQ?0?+?SIRQ?1?=?306?
- //?//?CPU使用情况?
- public?static?synchronized?String?run(String[]?cmd)?{?
- ????String?line?=?"";?
- ????InputStream?is?=?null;?
- ????try?{?
- ????????Runtime?runtime?=?Runtime.getRuntime();?
- ????????Process?proc?=?runtime.exec(cmd);?
- ????????is?=?proc.getInputStream();?
- ?
- ????????//?换成BufferedReader?
- ????????BufferedReader?buf?=?new?BufferedReader(new?InputStreamReader(is));?
- ????????do?{?
- ????????????line?=?buf.readLine();?
- ????????????//?前面有几个空行?
- ????????????if?(line.startsWith("User"))?{?
- ????????????????//?读到第一行时,我们再读取下一行?
- ????????????????line?=?buf.readLine();?
- ????????????????break;?
- ????????????}?
- ????????}?while?(true);?
- ?
- ????????if?(is?!=?null)?{?
- ????????????buf.close();?
- ????????????is.close();?
- ????????}?
- ????}?catch?(IOException?e)?{?
- ????????e.printStackTrace();?
- ????}?
- ????return?line;?
- }?
- ?
- //?获取指定应用的top命令获取的信息?
- //?PID?CPU%?S?#THR?VSS?RSS?PCY?UID?Name?//?进程属性?
- //?如果当前应用不在运行则返回null?
- public?static?synchronized?String?run(String[]?cmd,?String?pkgName)?{?
- ????String?line?=?null;?
- ????InputStream?is?=?null;?
- ????try?{?
- ????????Runtime?runtime?=?Runtime.getRuntime();?
- ????????Process?proc?=?runtime.exec(cmd);?
- ????????is?=?proc.getInputStream();?
- ?
- ????????//?换成BufferedReader?
- ????????BufferedReader?buf?=?new?BufferedReader(new?InputStreamReader(is));?
- ????????do?{?
- ????????????line?=?buf.readLine();?
- ????????????//?读取到相应pkgName跳出循环(或者未找到)?
- ????????????if?(null?==?line?||?line.endsWith(pkgName))?{?
- ????????????????break;?
- ????????????}?
- ????????}?while?(true);?
- ?
- ????????if?(is?!=?null)?{?
- ????????????buf.close();?
- ????????????is.close();?
- ????????}?
- ????}?catch?(IOException?e)?{?
- ????????e.printStackTrace();?
- ????}?
- ????return?line;?
- }?
?
?
三、后记
???????? 这次相关的仅有的那个工程好像不能放上来了==。
?
? ? ? ???好吧,把我当时整理的一点点相关资料放附件了:包含《Android系统》文件夹和《深入研究java.lang.ProcessBuilder类.doc》。
???????? 文件夹内容如下:
?