您的位置:首页 > 运维架构 > Shell

Android执行shell命令

2013-01-12 23:50 429 查看
http://vaero.blog.51cto.com/4350852/778139

 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; 


三、后记

         这次相关的仅有的那个工程好像不能放上来了==。

 

         好吧,把我当时整理的一点点相关资料放附件了:包含《Android系统》文件夹和《深入研究java.lang.ProcessBuilder类.doc》。

         文件夹内容如下:



 

         ps:现在有个可以看的小工程了,请移至《Android
VNC Server New》!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: