分享到:
点击次数:333  更新时间:2016-10-11 16:24:04  【打印此页】  【关闭
澳门新濠天地娱乐场澳门新濠天地娱乐定制
当前位置:主页 > 新闻动态 > 技术交流 > Android中使用代码执行shell命令

Android中使用代码执行shell命令

责任编辑:admin 发布时间:2016-11-11 09:18 浏览次数:

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