<b>Android</b><b>執行</b><b>shell</b><b>指令</b>
<b>一、方法</b>
/**
* 執行一個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();
}
<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 <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等待時間以外的其它等待時間
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檔案内,自個總結的。
<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,如需轉載請自行聯系原作者