Android學習系列(14)--App調試的幾個命令實踐

在Android的應用開發中,咱們會用到各類代碼調試;其實在Android的開發以後,咱們可能會碰到一些隨機的問題,如cpu太高,內存泄露等,咱們沒法簡單的進行代碼調試,咱們須要一個系統日誌等等,下面我把握工做中碰到的幾個經常使用命令和方法給你們演示實踐一下。 linux

1.logcat命令
這個命令最簡單經常使用,可查看幫助,我很少說,若是須要打印時間,加參數-v time android

adb logcat -v time

2.bugreport命令
這個命令也很是簡單,可是在實際應用中很是有用,會有從開機以後詳細的dumpsys,dumpstate和logcat信息,是一份完整的日誌記錄。對分析用戶行爲,異常信息,系統狀態有很大的參考做用。通常咱們會把bugreport導出到電腦上分析。 sql

adb bugreport > xxx.log

我再次強調,bugreport裏面包含豐富的系統和用戶信息,它是其餘不少命令輸出的結果的記錄,很是有用。 shell

3.dumpsys命令
這個查看系統信息,用的仍是比較多的. 數據庫

1
2
3
4
5
6
7
dumpsys [options]
               meminfo 顯示內存信息
               cpuinfo 顯示CPU信息
               account 顯示accounts信息
               activity 顯示全部的activities的信息
               window 顯示鍵盤,窗口和它們的關係
               wifi 顯示wifi信息

例如查看某個程序內存信息: ide

#查看應用com.tianxia.test的內存使用狀況
adb shell dumpsys meminfo com.tianxia.test

效果圖以下: 學習

裏面的信息頗有價值,尤爲對於分析內存泄露,內存溢出都有極大的做用。 優化

4.top命令
這個查看cpu信息太方便了。 ui

1
top -m 5 -t

咱們看看效果圖,其中按cpu大小列出5個進程列表。 spa

com.tianxia.test的cpu太高,會致使手機發燙。同時利用這個信息,能夠監控應用cpu的使用,以調整優化代碼。

5.配置文件local.prop
目前網上沒有查到local.prop的配置使用,工做中本人只使用過以下:

log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE

把上述文本加到/data/local.prop中,若是沒有這個文件自行建立。而後重啓手機,就能看到每一個應用詳細的查詢數據庫的sql語句信息,對於調試數據庫,分析和優化數據庫sql異常很是有用。

6.分析手機發燙
下面咱們來實踐一個例子,手機發燙太厲害,怎麼找出問題?
首先咱們寫一個程序com.tianxia.test,死循環,核心代碼以下:

1
2
3
4
5
6
7
8
@Override
public  void  onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    while(true) {
        System.currentTimeMillis();
    }
}

這個應用打開後會一直獲取系統時間,由於在主線程,確定致使應用ANR,也會一直浪費系統cpu,手機發熱,咱們運行它。
假設咱們不知道上述代碼,咱們來找到這個問題:
(1).找到發燙的應用。
使用top命令:

top -m 5 -t

一看是com.tianxia.test佔用85%的cpu,原來是這傢伙在搗鬼。進程ID是644,這個後面咱們有用。
(2).分析發燙的應用進程在幹嗎
須要用到linux下的strace命令,可是android是沒有集成這個命令的,android版本的下載地址:
http://benno.id.au/android/strace
下載完成後,上傳到手機中:
咱們adb push strace /system/bin,在模擬器上是上傳到/system/bin會報out of memory錯誤,咱們也能夠上傳到/data目錄下,若是沒有執行權限,還須要chmod 777 strace.
strace命令有不少參數,直接執行strace會顯示使用說明:


其中-p參數輸入的就是進程號,第一步中咱們找到com.tianxia.test的進程ID是644,咱們看看這個應用佔用這麼高的cpu在幹嗎?

strace -p 644

輸出以下:


它的系統調用一直是gettimeofday,一直輸出這個,顯然哪裏必定進入死循環了,並且是獲取時間的死循環,而後結合logcat和代碼,定位這段代碼(就是前面咱們給出的那段代碼了)解決這個bug。

7.採集手機的cpu運行狀況.
有時使用日誌咱們很難針對性的獲取咱們想要的信息,咱們可能須要寫一些最簡單的腳步放在手機裏面執行。
如監控cpu佔用的記錄cpu_log.sh:

# !/system/bin/sh
#這個腳步比較粗糙,是這麼個意思
file=/sdcard/cpu/cpu_info.log
rm $file
until [ 1 -gt 10000 ]
do
echo -e "\n\n\n\n\n---------------">>$file
date >> $file
top -m 5 -n 1 >> $file
sleep 3
done

每隔3s中就會把手機的cpu的信息寫到sdcard的cpu目錄下的cpu_info.log文件中,方便咱們後續分析。
 ps:使用方法是 push到data目錄下,賦予可執行權限,在shell下執行便可。

8.採集某個應用的內存數據
這個實踐和上面的腳本相似,只是命令不同我另外單獨列出來,由於這個有時候頗有用。
好比,咱們要採集com.tianxia.test的內存使用狀況,分析它是否是會內存泄露,腳步相似:

# !/system/bin/sh
#這個腳步比較粗糙,是這麼個意思
file=/sdcard/cpu/mem_info.log
rm $file
until [ 1 -gt 10000 ]
do
echo -e "\n\n\n\n\n---------------">>$file
date >> $file
dumpsys meminfo com.tianxia.test >> $file
sleep 3
done

使用方法也是同樣。

9.小結 零零碎碎的一直沒有時間整理,有經常使用的也有不經常使用的,算是一些小技巧,感受網上這方面的分享比較少,有時和朋友們談起這些調試方法,特別是龍哥,硬是要求我今天寫出來與你們分享,只好獻醜,說不定對於解決一些疑難雜症有奇效,呵呵,想到什麼寫什麼吧,想到幾個寫幾個,也是一個學習的記錄。

相關文章
相關標籤/搜索