在安卓應用的測試過程中,遇到 Crash 或者 ANR 后,想必大家都會通過 adb logcat 命令來抓取日志定位問題。如果直接使用 logcat 命令的話,默認抓取出的 log 文件包含安卓運行時產生的所有日志,給快速定位問題增加了時間成本。
這個問題可以通過一個簡單的 Shell 腳本來解決,依然只有區區 20 行左右的代碼。
腳本的編寫思路是這樣的:
1、通過 date 命令獲取當前時間並賦值給變量 "DATE",格式為 "year/month/day/hour/minutes/second"。這個時間戳可以用來給輸出的 log 文件命名,每次運行腳本都是不同的時間點,從而達到區分 log 文件的目的;
2、通過 read 命令讀取包名;
3、通過 read 命令讀取日志的優先級(V/D/I/W/E/F/S),通常,我們需要的是 E(Error)級別的日志,也就是應用運行時產生的錯誤信息;
4、運行 adb logcat 命令,將第 3 步中的優先級(priority)作為輸入參數來過濾日志,縮小輸出日志的大小和范圍;
5、運行 adb logcat 命令,不添加篩選條件,輸出全部日志以防萬一(參考第 7 步);
6、Crash 的信息存在於 log 文件中,而 ANR 的問題則需要 traces 文件。通過 adb pull 命令可將手機中的 /data/anr/traces.txt 文件取出;
7、運行 adb logcat -c 命令。每次獲取 log 文件后,清空日志,保持測試機日志環境的干凈,方便下次遇到問題后的日志獲取和問題定位。
以下為編寫好的腳本:
#!/bin/bash
DATE=$(date "+%Y%m%d%H%M%S")
# 讀取包名
echo -n "Please enter the package name:"
read package_name
# 日志級別:V/D/I/W/E/F/S
echo -n "Please enter the priority of log:"
read priority
# log命令
adb logcat -d -v long "AndroidRuntime:${priority}" "*:S" > ~/Desktop/logg/${package_name}${DATE}.log
adb logcat -d -v threadtime > ~/Desktop/logg/${package_name}${DATE}_all.log
# anr日志
adb pull /data/anr/traces.txt ~/Desktop/logg/
# 清空日志
adb logcat -c
運行示例:
-> ./grab_log.sh
Please enter the package name:com.baidu.minivideo
Please enter the priority of log:E
/data/anr/traces.txt: 1 file pulled.
歡迎關注微信公眾號“測試開發Stack”,更多原創文章第一時間發布!