1. 程式人生 > >Android執行命令列命令(獲取系統Logcat)

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