天天看點

Android執行shell指令

 <b>Android</b><b>執行</b><b>shell</b><b>指令</b>

<b>一、方法</b>

/** 

* 執行一個shell指令,并傳回字元串值 

* @param cmd 

* 指令名稱&amp;參數組成的數組(例如:{"/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(); 

<b>二、用途</b>

         執行Linux下的top、ps等指令,這些指令你也通過adb可以執行檢視效果。

         <b>1</b><b>)top</b><b>指令如下:</b>

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 &lt;cpu,vss,rss,thr&gt; // 按哪列排序 

  -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等待時間以外的其它等待時間 

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 &gt;= RSS &gt;= PSS &gt;= USS 

// PSS  Proportional Set Size 實際使用的實體記憶體(比例配置設定共享庫占用的記憶體) 

// USS  Unique Set Size 程序獨自占用的實體記憶體(不包含共享庫占用的記憶體) 

         在附件Android系統-&gt;android top.txt檔案内,自個總結的。

         <b>2</b><b>)執行代碼</b>

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

        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; 

            // 讀取到相應pkgName跳出循環(或者未找到) 

            if (null == line || line.endsWith(pkgName)) { 

<b>三、後記</b>

         這次相關的僅有的那個工程好像不能放上來了==。

         好吧,把我當時整理的一點點相關資料放附件了:包含《Android系統》檔案夾和《深入研究java.lang.ProcessBuilder類.doc》。

         檔案夾内容如下:

<a href="http://down.51cto.com/data/2359794" target="_blank">附件:http://down.51cto.com/data/2359794</a>

     本文轉自winorlose2000 51CTO部落格,原文連結:http://blog.51cto.com/vaero/778139,如需轉載請自行聯系原作者

繼續閱讀