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;
}
复制代码 代码如下:
/**
* 执行一个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;
}