Android筆記之:App調(diào)試的幾個命令的實踐與分析
在Android的應(yīng)用開發(fā)中,我們會用到各種代碼調(diào)試;其實在Android的開發(fā)之后,我們可能會碰到一些隨機的問題,如cpu過高,內(nèi)存泄露等,我們無法簡單的進行代碼調(diào)試,我們需要一個系統(tǒng)日志等等,下面我把握工作中碰到的幾個常用命令和方法給大家演示實踐一下。
1.logcat命令
這個命令最簡單常用,可查看幫助,我不多說,如果需要打印時間,加參數(shù)-v time
adb logcat -v time
2.bugreport命令
這個命令也非常簡單,但是在實際應(yīng)用中非常有用,會有從開機之后詳細的dumpsys,dumpstate和logcat信息,是一份完整的日志記錄。對分析用戶行為,異常信息,系統(tǒng)狀態(tài)有很大的參考作用。一般我們會把bugreport導(dǎo)出到電腦上分析。
adb bugreport > xxx.log
我再次強調(diào),bugreport里面包含豐富的系統(tǒng)和用戶信息,它是其他很多命令輸出的結(jié)果的記錄,非常有用。
3.dumpsys命令
這個查看系統(tǒng)信息,用的還是比較多的.
dumpsys [options]
meminfo 顯示內(nèi)存信息
cpuinfo 顯示CPU信息
account 顯示accounts信息
activity 顯示所有的activities的信息
window 顯示鍵盤,窗口和它們的關(guān)系
wifi 顯示wifi信息
例如查看某個程序內(nèi)存信息:
#查看應(yīng)用com.tianxia.test的內(nèi)存使用情況
adb shell dumpsys meminfo com.tianxia.test
效果圖如下:

里面的信息很有價值,尤其對于分析內(nèi)存泄露,內(nèi)存溢出都有極大的作用。
4.top命令
這個查看cpu信息太方便了。
top -m 5 -t
我們看看效果圖,其中按cpu大小列出5個進程列表。

com.tianxia.test的cpu過高,會導(dǎo)致手機發(fā)燙。同時利用這個信息,可以監(jiān)控應(yīng)用cpu的使用,以調(diào)整優(yōu)化代碼。
5.配置文件local.prop
目前網(wǎng)上沒有查到local.prop的配置使用,工作中本人只使用過如下:
log.tag.SQLiteStatements=VERBOSE log.tag.SQLiteTime=VERBOSE
把上述文本加到/data/local.prop中,如果沒有這個文件自行創(chuàng)建。然后重啟手機,就能看到每個應(yīng)用詳細的查詢數(shù)據(jù)庫的sql語句信息,對于調(diào)試數(shù)據(jù)庫,分析和優(yōu)化數(shù)據(jù)庫sql異常非常有用。
6.分析手機發(fā)燙
下面我們來實踐一個例子,手機發(fā)燙太厲害,怎么找出問題?
首先我們寫一個程序com.tianxia.test,死循環(huán),核心代碼如下:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
while(true) {
System.currentTimeMillis();
}
}
這個應(yīng)用打開后會一直獲取系統(tǒng)時間,因為在主線程,肯定導(dǎo)致應(yīng)用ANR,也會一直浪費系統(tǒng)cpu,手機發(fā)熱,我們運行它。
假設(shè)我們不知道上述代碼,我們來找到這個問題:
(1).找到發(fā)燙的應(yīng)用。
使用top命令:
top -m 5 -t

一看是com.tianxia.test占用85%的cpu,原來是這家伙在搗鬼。進程ID是644,這個后面我們有用。
(2).分析發(fā)燙的應(yīng)用進程在干嘛
需要用到linux下的strace命令,但是android是沒有集成這個命令的,android版本的下載地址:
http://benno.id.au/android/strace
下載完成后,上傳到手機中:
我們adb push strace /system/bin,在模擬器上是上傳到/system/bin會報out of memory錯誤,我們也可以上傳到/data目錄下,如果沒有執(zhí)行權(quán)限,還需要chmod 777 strace.
strace命令有很多參數(shù),直接執(zhí)行strace會顯示使用說明:

其中-p參數(shù)輸入的就是進程號,第一步中我們找到com.tianxia.test的進程ID是644,我們看看這個應(yīng)用占用這么高的cpu在干嘛?
strace -p 644
輸出如下:

它的系統(tǒng)調(diào)用一直是gettimeofday,一直輸出這個,顯然哪里一定進入死循環(huán)了,而且是獲取時間的死循環(huán),然后結(jié)合logcat和代碼,定位這段代碼(就是前面我們給出的那段代碼了)解決這個bug。
7.采集手機的cpu運行情況.
有時使用日志我們很難針對性的獲取我們想要的信息,我們可能需要寫一些最簡單的腳步放在手機里面執(zhí)行。
如監(jiān)控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文件中,方便我們后續(xù)分析。
ps:使用方法是 push到data目錄下,賦予可執(zhí)行權(quán)限,在shell下執(zhí)行即可。
8.采集某個應(yīng)用的內(nèi)存數(shù)據(jù)
這個實踐和上面的腳本類似,只是命令不一樣我另外單獨列出來,因為這個有時候很有用。
比如,我們要采集com.tianxia.test的內(nèi)存使用情況,分析它是不是會內(nèi)存泄露,腳步類似:
# !/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
使用方法也是一樣。
相關(guān)文章
Android Studio之Debug運行期代碼植入的方法
這篇文章主要介紹了Android Studio之Debug運行期代碼植入的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Android Handler 機制實現(xiàn)原理分析
本文主要介紹 Android Handle機制實現(xiàn)的原理,這里整理了詳細的關(guān)于Handler的資料以及工作流程和實際應(yīng)用,有興趣的小伙伴可以參考下2016-08-08
Android編程自定義對話框(Dialog)位置及大小的方法
這篇文章主要介紹了Android編程自定義對話框(Dialog)位置及大小的方法,涉及Android對話框的定義、功能、屬性及布局相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Android?Flutter實現(xiàn)精靈圖的使用詳解
在游戲開發(fā)中,精靈圖會將一個人物所有動作放置在一張圖片中,通過坐標(biāo)定位選取其中一張圖展示。本文就來教你如何使用精靈圖,感興趣的可以了解一下2022-08-08
Android日期選擇器對話框DatePickerDialog使用詳解
這篇文章主要為大家詳細介紹了Android日期選擇器對話框DatePickerDialog的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Android 兩個Service的相互監(jiān)視實現(xiàn)代碼
這篇文章主要介紹了Android 兩個Service的相互監(jiān)視實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10

