http://www.cnblogs.com/qianxudetianxia/archive/2012/05/14/2497073.html
在Android的應用開發中,我們會用到各種代碼調試;其實在Android的開發之後,我們可能會碰到一些隨機的問題,如cpu過高,內存泄露等,我們無法簡單的進行代碼調試,我們需要一個系統日誌等等,下面我把握工作中碰到的幾個常用命令和方法給大家演示實踐一下。
1.logcat命令
這個命令最簡單常用,可查看幫助,我不多說,如果需要打印時間,加參數-v time
1
|
adb
logcat -v time |
2.bugreport命令
這個命令也非常簡單,但是在實際應用中非常有用,會有從開機之後詳細的dumpsys,dumpstate和logcat信息,是一份完整的日誌記錄。對分析用戶行爲,異常信息,系統狀態有很大的參考作用。一般我們會把bugreport導出到電腦上分析。
1
|
adb
bugreport > xxx. log |
我再次強調,bugreport裏面包含豐富的系統和用戶信息,它是其他很多命令輸出的結果的記錄,非常有用。
3.dumpsys命令
這個查看系統信息,用的還是比較多的.
1
2
3
4
5
6
7
|
dumpsys
[options] meminfo
顯示內存信息 cpuinfo
顯示CPU信息 account
顯示accounts信息 activity
顯示所有的activities的信息 window
顯示鍵盤,窗口和它們的關係 wifi
顯示wifi信息 |
例如查看某個程序內存信息:
1
2
|
#查看應用com.tianxia.test的內存使用情況 adb
shell dumpsys meminfo com.tianxia.test |
效果圖如下:
裏面的信息很有價值,尤其對於分析內存泄露,內存溢出都有極大的作用。
4.top命令
這個查看cpu信息太方便了。
1
|
top
-m 5 -t |
我們看看效果圖,其中按cpu大小列出5個進程列表。
com.tianxia.test的cpu過高,會導致手機發燙。同時利用這個信息,可以監控應用cpu的使用,以調整優化代碼。
- adb shell
- $ top -h
- top -h
- Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
- -m num Maximum number of processes to display. // 最多顯示多少個進程
- -n num Updates to show before exiting. // 刷新次數
- -d num Seconds to wait between updates. // 刷新間隔時間(默認5秒)
- -s col Column to sort by <cpu,vss,rss,thr> // 按哪列排序
- -t Show threads instead of processes. // 顯示線程信息而不是進程
- -h Display this help screen. // 顯示幫助文檔
- $ top -n 1
- top -n 1
- User 35%, System 13%, IOW 0%, IRQ 0% // CPU佔用率
- User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情況
- PID CPU% S #THR VSS RSS PCY UID Name // 進程屬性
- xx xx% x xx xx xx xx xx xx
- CPU佔用率:
- User 用戶進程
- System 系統進程
- IOW IO等待時間
- IRQ 硬中斷時間
- CPU使用情況(指一個最小時間片內所佔時間,單位jiffies。或者指所佔進程數):
- User 處於用戶態的運行時間,不包含優先值爲負進程
- Nice 優先值爲負的進程所佔用的CPU時間
- Sys 處於核心態的運行時間
- Idle 除IO等待時間以外的其它等待時間
- IOW IO等待時間
- IRQ 硬中斷時間
- SIRQ 軟中斷時間
- 進程屬性:
- PID 進程在系統中的ID
- CPU% 當前瞬時所以使用CPU佔用率
- S 進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。
- #THR 程序當前所用的線程數
- VSS Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
- RSS Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
- PCY OOXX,不知道什麼東東
- UID 運行當前進程的用戶id
- Name 程序名稱android.process.media
- // ps:內存佔用大小有如下規律:VSS >= RSS >= PSS >= USS
- // PSS Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
- // USS Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)
5.配置文件local.prop
目前網上沒有查到local.prop的配置使用,工作中本人只使用過如下:
1
|
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命令:
1
|
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在幹嘛?
1
|
strace
-p 644 |
輸出如下:
它的系統調用一直是gettimeofday,一直輸出這個,顯然哪裏一定進入死循環了,而且是獲取時間的死循環,然後結合logcat和代碼,定位這段代碼(就是前面我們給出的那段代碼了)解決這個bug。
7.採集手機的cpu運行情況.
有時使用日誌我們很難針對性的獲取我們想要的信息,我們可能需要寫一些最簡單的腳步放在手機裏面執行。
如監控cpu佔用的記錄cpu_log.sh:
1
2
3
4
5
6
7
8
9
10
11
|
#
!/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的內存使用情況,分析它是不是會內存泄露,腳步類似:
1
2
3
4
5
6
7
8
9
10
11
|
#
!/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 |
使用方法也是一樣。