android sh 指令_Android执行shell命令详解

一、方法

/**

* 执行一个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  // 按哪列排序

-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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值