Android執行命令列命令(獲取系統Logcat)
Android執行命令列命令
一、通過ProcessBuilder
1 String[] args = {"pm", "install", "-r", filePath};
2 ProcessBuilder processBuilder = new ProcessBuilder(args);
3 process = processBuilder.start(); 建立一個程序
4 errIs = process.getErrorStream();
inIs = process.getInputStream();
二、用 Runtime
// 獲取執行時物件
Runtime.getRuntime()
Runtime.getRuntime().exec();
Process exec();
開啟一個單獨的子程序中執行 cmd 命令
JVM會啟動一個子程序,該程序會與JVM程序建立三個管道連線:標準輸入,標準輸出和標準錯誤流
可以對其進行destroy waitFor 輸入輸出程序的流的操作
process.waitFor();
int waitFor()
將導致當前程序等待,直到該物件的執行緒結束,才返回呼叫
返回值:表示的子執行緒的退出值 0為正常退出
程序阻塞風險:
呼叫 waitFor() 方法 主執行緒等待子執行緒執行完 才會繼續執行主執行緒
若 子程序不斷輸出資訊 但是 主執行緒 並沒有進行 InputStream和ErrorStream的獲取 則Buffer會滿
這時 子執行緒不能繼續寫資料 也會掛起 而主執行緒 等待不了子執行緒的結束 因此都在等待 造成死鎖
解決:
在waitfor之前,單獨啟兩個額外的執行緒,分別用於處理InputStream和ErrorStream就可以
最好還是開設子執行緒去操作 避免主執行緒阻塞
一、獲取系統Logcat
1 加許可權:android.permission.READ_LOGS
不過4.1以上的手機需要signature|system|development 即 系統簽名軟體包|系統程式|開發者模式通過ADB方式連線
才能獲取到系統的Logcat日誌
2 執行shell命令:
try {
ArrayList commandLine = new ArrayList();
commandLine.add( "logcat");
// 使用該引數可以讓logcat獲取日誌完畢後終止程序
commandLine.add( "-d");
// 列印設定
commandLine.add( "-v");
commandLine.add( "time");
// 輸出檔案設定
commandLine.add( "-f");如果使用commandLine.add(">");是不會寫入檔案,必須使用-f的方式
commandLine.add( "/sdcard/log/logcat.txt");
Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()]));
BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream()), 1024);
String line = bufferedReader.readLine();
while ( line != null) {
log.append(line);
log.append("\n")
}
} catch ( IOException e) {
}
3 常見logcat 命令:
adb logcat
(1)指定 logcat 的日誌輸出格式 用adb logcat -v xxx:
“time”格式 : “日期 時間 優先順序 / 標籤 (程序ID) : 程序名稱 : 日誌資訊 “, 使用adb logcat -v time 命令
“long”格式:” [ 日期 時間 程序ID : 執行緒ID 優先順序 / 標籤] 日誌資訊 “, 輸出以上提到的所有的頭資訊, 使用adb logcat -v long 命令
“raw”格式 : 只輸出日誌資訊, 不附加任何其他 資訊, 如 優先順序 標籤 時間等
“thread”格式 : ” 優先順序 ( 程序ID : 執行緒ID) 標籤 : 日誌內容 ”
“tag”格式 : ” 優先順序 / 標籤 : 日誌資訊”
“brief”格式 : 這是預設的日誌格式” 優先順序 / 標籤 (程序ID) : 日誌資訊
(2)清空日誌快取資訊 : 使用 adb logcat -c 命令
(3)檢視日誌緩衝區資訊 : 使用 adb logcat -g
可以檢視 system main 和 crash 的buffer大小
如main 有256kb
(4)載入日誌緩衝區 : 使用 adb logcat -b 緩衝區型別
緩衝區型別:
system緩衝區 - 與系統相關的日誌資訊
radio緩衝區 - 廣播電話相關的日誌資訊
events緩衝區 - 事件相關的日誌資訊
main緩衝區 - 預設的緩衝區
(5)輸出最近的日誌
adb logcat -t 5
最近5條日誌 並且不會阻塞
(6)將快取日誌輸出並退出
adb logcat -d
(7)輸出日誌到指定位置儲存
adb locat -d -f 路徑
(8)日誌過濾列印
[:priority]
TAG是標籤
priority是日誌等級 如 V D I W E
如:adb logcat 10 *:E
並且是可以同時設定多個過濾器的
(9)修改logcat快取區大小
logcat -G 1M
adb可以 但是命令不知道可以不可以
記得進行定期清除日誌操作
logcat命令查詢:
https://developer.android.com/studio/command-line/logcat?hl=zh-cn
https://blog.csdn.net/tumuzhuanjia/article/details/39555445