欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android执行shell命令详解

程序员文章站 2023-10-19 14:28:24
一、方法复制代码 代码如下:/** * 执行一个shell命令,并返回字符串值 * * @param cmd&n...
一、方法
复制代码 代码如下:

/** 
* 执行一个shell命令,并返回字符串值 

* @param cmd 
* 命令名称&参数组成的数组(例如:{"/system/bin/cat", "/proc/version"}) 
* @param workdirectory 
* 命令执行路径(例如:"system/bin/") 
* @return 执行结果组成的字符串 
* @throws ioexception 
*/ 
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;