Android筆記之:App調試的幾個命令的實踐與分析

來源:互聯網
上載者:User

在Android的應用開發中,我們會用到各種代碼調試;其實在Android的開發之後,我們可能會碰到一些隨機的問題,如cpu過高,記憶體泄露等,我們無法簡單的進行代碼調試,我們需要一個系統日誌等等,下面我把握工作中碰到的幾個常用命令和方法給大家示範實踐一下。

1.logcat命令
這個命令最簡單常用,可查看協助,我不多說,如果需要列印時間,加參數-v time

adb logcat -v time

2.bugreport命令
這個命令也非常簡單,但是在實際應用中非常有用,會有從開機之後詳細的dumpsys,dumpstate和logcat資訊,是一份完整的日誌記錄。對分析使用者行為,異常資訊,系統狀態有很大的參考作用。一般我們會把bugreport匯出到電腦上分析。

adb bugreport > xxx.log

我再次強調,bugreport裡麵包含豐富的系統和使用者資訊,它是其他很多命令輸出的結果的記錄,非常有用。

3.dumpsys命令
這個查看系統資訊,用的還是比較多的.

複製代碼 代碼如下:dumpsys [options]
meminfo 顯示記憶體資訊
cpuinfo 顯示CPU資訊
account 顯示accounts資訊
activity 顯示所有的activities的資訊
window 顯示鍵盤,視窗和它們的關係
wifi 顯示wifi資訊

例如查看某個程式記憶體資訊:複製代碼 代碼如下:#查看應用com.tianxia.test的記憶體使用量情況
adb shell dumpsys meminfo com.tianxia.test

如下:

裡面的資訊很有價值,尤其對於分析記憶體泄露,記憶體溢出都有極大的作用。

4.top命令
這個查看cpu資訊太方便了。

top -m 5 -t

我們看看,其中按cpu大小列出5個進程列表。

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,死迴圈,核心代碼如下:

複製代碼 代碼如下:@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

使用方法也是一樣。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.