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

}

时间: 2024-10-26 23:20:34

Android执行shell命令详解的相关文章

Android执行shell命令详解_Android

一.方法 复制代码 代码如下: /** * 执行一个shell命令,并返回字符串值 * * @param cmd * 命令名称&参数组成的数组(例如:{"/system/bin/cat", "/proc/version"}) * @param workdirectory * 命令执行路径(例如:"system/bin/") * @return 执行结果组成的字符串 * @throws IOException */ public stati

Android adb shell 命令详解

http://www.open-open.com/lib/view/1327557366686

一天一个shell命令 linux文件操作系列-ln命令详解_linux shell

里提示一下:ubuntu的翻译很多都是字面直译,存在很多问题,所以建议大家参照我这里的解释.当然本来也是有些赶文的嫌疑,望指正. 经常在linux上操作,有在不同的目录下切换某几个固定的命令,或者修改几个固定的文件,这时候,如果能在一个目录下就操作他们,会是一件多么轻松的事情.我们来看看链接命令ln 全称 ln 全称是link 顾名思义,这是一个建立一个链接.怎么去理解呢?它的功能类似于Mac OS的别名或者Windows的快捷方式, 删除不会影响文件本身. 说明:(直接看看斜体,就行了) 链接

一天一个shell命令 linux文本操作系列-tac,rev命令详解_linux shell

说明: tac和rev没有必然联系,唯一相同的是,他们是"反派".tac其实是cat的反写,cat正常输出,那tac就倒着输出,不过从行的最后一行输出,那rev呢?rev是每行的最后一个字母到第一个字母倒序输出. 简单实例 tac命令 文件过滤分割与合并 tac命令用于将文件已行为单位的反序输出,即第一行最后显示,最后一行先显示. 语法 tac(选项)(参数) 选项 -a或--append:将内容追加到文件的末尾: -i或--ignore-interrupts:忽略中断信号. 参数 文

【Linux】定时任务crontab和at命令详解

[Linux]定时任务crontab和at命令详解 linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令. 一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装

Linux Shell脚本系列教程(二):终端打印命令详解

  这篇文章主要介绍了Linux Shell脚本系列教程(二):终端打印命令详解,本文着重讲解了echo终端打印.printf终端打印两个打印出输出命令,需要的朋友可以参考下 终端打印 终端是交互式工具,用户可以通过它与shell环境进行交互.在终端中打印文本是大多数shell脚本和工具日常需要执行的基本任务.通过终端打印,人们可以知道系统的运行状态,这对用户来说是至关重要的. echo终端打印 代码如下: echo "Welcome to Bash" echo 'Welcome to

HBase shell基础和常用命令详解

http://www.aliyun.com/zixun/aggregation/13713.html">HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务. 1. 简介 HBase是一个分布式的.面向列的

scp命令详解(全)_linux shell

svn 删除所有的 .svn文件 复制代码 代码如下: find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令+scp命令详解   名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... directory 说明:将一个档案拷贝至另一档案,或将数个档案拷贝至另一目录. 把计 -a 尽可能将档案状态.权限等资料都照原状予以复制. -r 若 sourc

linux定时执行命令crontab命令详解

循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令.   一.crond简介   crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启