參考鏈接
- 超詳細的dubug教程
- Android Studio 調(diào)試技巧
- Android中開發(fā)需要的高效助推的命令總結(jié)
- Android adb shell am 命令介紹
- adb shell dumpsys 命令用法
- AMS之dumpsys篇
debug 技巧
關(guān)于android studio的debug技巧,前面的兩篇參考文章已經(jīng)寫的特別好了,也沒必要再寫一次了,主要就記錄一下debug的關(guān)鍵概念和快捷鍵。至于如何debug,就請參考前面兩篇文章。
工具欄介紹

too.png
| 名稱 | 作用 | 備注 | 快捷鍵 |
|---|---|---|---|
| show Execution Point | 定位到當前正在調(diào)試的位置 | 無備注 | alt+F10 |
| step over | 單步跳過 | 一步一步執(zhí)行,遇到方法會直接執(zhí)行方法,然后進入下一步,不會進入方法內(nèi)容 | F8 |
| step into | 單步跳入 | 單步向下執(zhí)行,如果當前是自定義方法,hi進入方法內(nèi)部,系統(tǒng)方法則不進入方法內(nèi)部 | F7 |
| Force step into | 強制單步跳入 | 與單步跳入不同的是,不管什么方法他都會進入 | Alt + Shfit + F7 |
| step out | 單步跳出 | 與單步跳入相對,表示從方法體中跳出,回到進入方法的位置,以繼續(xù)斷點 | shfit + F8 |
| run to cursor | 執(zhí)行到光標處 | 直接從當前位置運行到光標處,但是能被中間的斷點攔截。 | alt + F9 |
| Evalyate Exoression | 計算表達式 | 支持在點點過程中,通過直接賦值或者表達式方式,修改任意表倆個的值。 | alt+F8 |
上圖從左往右看,名稱和作用如下表所示。
| 名稱 | 作用 | 備注 | 快捷鍵 |
|---|---|---|---|
| show Execution Point | 定位到當前正在調(diào)試的位置 | 無備注 | alt+F10 |
| step over | 單步跳過 | 一步一步執(zhí)行,遇到方法會直接執(zhí)行方法,然后進入下一步,不會進入方法內(nèi)容 | F8 |
| step into | 單步跳入 | 單步向下執(zhí)行,如果當前是自定義方法,hi進入方法內(nèi)部,系統(tǒng)方法則不進入方法內(nèi)部 | F7 |
| Force step into | 強制單步跳入 | 與單步跳入不同的是,不管什么方法他都會進入 | Alt + Shfit + F7 |
| step out | 單步跳出 | 與單步跳入相對,表示從方法體中跳出,回到進入方法的位置,以繼續(xù)斷點 | shfit + F8 |
| run to cursor | 執(zhí)行到光標處 | 直接從當前位置運行到光標處,但是能被中間的斷點攔截。 | alt + F9 |
| Evalyate Exoression | 計算表達式 | 支持在點點過程中,通過直接賦值或者表達式方式,修改任意表倆個的值。 | alt+F8 |
| 快捷鍵 | 功能 | 說明 |
|---|---|---|
| 右擊斷點 | 為斷點設置執(zhí)行條件,或打印信息 | 只能針對本斷點生效 |
| alt + 單擊 | 查看斷點時變量的值 | 無 |
| ctrl+alt+F8 | 為斷點添加執(zhí)行條件,或打印信息 | 這個可以對所有的斷點生效 |
再加來幾個快捷鍵。
| 快捷鍵 | 功能 | 說明 |
|---|---|---|
| 右擊斷點 | 為斷點設置執(zhí)行條件,或打印信息 | 只能針對本斷點生效 |
| alt + 單擊 | 查看斷點時變量的值 | 無 |
| ctrl+alt+F8 | 為斷點添加執(zhí)行條件,或打印信息 | 這個可以對所有的斷點生效 |
工具篇
uiautorviewer
可以通過這個工具快速定位到UI控件的ID,并通過ID快速找到相應的邏輯。
DDMS
可以利用ddms這個工具,實現(xiàn)截屏,查看線程和堆信息,日志信息,進程,廣播狀態(tài)信息,模擬來電,呼叫和短信等功能。
具體使用方法參考這里https://developer.android.com/studio/profile/monitor.html
命令篇
adb shell am
| 命令 | 作用 | 備注 | 示例 |
|---|---|---|---|
am start -n <package name>/<ativity name> |
啟動acivity | -n 表示以組件式啟動,還可以 |
am start -a android.settings.INPUT_METHOD_SETTINGS//使用Action方式打開系統(tǒng)設置-輸入法設置 |
am start -a -n --es extra "hello" --ei pid 10 <package name>/<ativity name> |
待參數(shù)的啟動activity | --es 表示帶string,--ei 表示整型數(shù)據(jù),都是以鍵值對的形式 | am start -a -n --es extra "hello" --ei pid 10 com.reoger.app/com.example.cm.myapplication.NextActivity |
am broadcast -a <action> |
啟動廣播 | 還可以通過--user指定用戶發(fā)送廣播 |
com.android.broadcast.test |
am broadcast -a <action> --es <key> <value> |
帶信息的發(fā)送廣播 | --es表示字符串,還有--ez(布爾值)等多種類型數(shù)據(jù),都是以鍵值對的形式 | am broadcast -a com.android.broadcast.test --es adb_extra "hello" |
am startservice <package name>/<service name> |
啟動服務 | 可以通過--user<USER_ID>指定啟動的用戶 |
am startservice com.reoger.app/com.example.cm.myapplication.MyService |
am force-stop <package name> |
關(guān)閉指定包名的應用程序 | 無 | am force-stop com.reoger.app |
am kill <package name> |
殺死與應該程序包想關(guān)聯(lián)的所有進程,但只會殺死安全進程 | 可以通過--user <USER_ID>指定用戶 |
am kill com.reoger.app |
am kill -all |
殺死全部的后臺進程 | 無 | am kill -all |
am 就是activity manager的簡稱,可以用于啟動activity、打開或關(guān)閉進程、發(fā)送廣播等操作。
關(guān)于具體的命令,可以參考這里http://blog.csdn.net/soslinken/article/details/50245865.
然后,這里就記錄常用的adb shell am命令。
[注:這里默認省略了adb shell]
| 命令 | 作用 | 備注 | 示例 |
|---|---|---|---|
am start -n <package name>/<ativity name> |
啟動acivity | -n 表示以組件式啟動,還可以 |
am start -a android.settings.INPUT_METHOD_SETTINGS//使用Action方式打開系統(tǒng)設置-輸入法設置 |
am start -a -n --es extra "hello" --ei pid 10 <package name>/<ativity name> |
待參數(shù)的啟動activity | --es 表示帶string,--ei 表示整型數(shù)據(jù),都是以鍵值對的形式 | am start -a -n --es extra "hello" --ei pid 10 com.reoger.app/com.example.cm.myapplication.NextActivity |
am broadcast -a <action> |
啟動廣播 | 還可以通過--user指定用戶發(fā)送廣播 |
com.android.broadcast.test |
am broadcast -a <action> --es <key> <value> |
帶信息的發(fā)送廣播 | --es表示字符串,還有--ez(布爾值)等多種類型數(shù)據(jù),都是以鍵值對的形式 | am broadcast -a com.android.broadcast.test --es adb_extra "hello" |
am startservice <package name>/<service name> |
啟動服務 | 可以通過--user<USER_ID>指定啟動的用戶 |
am startservice com.reoger.app/com.example.cm.myapplication.MyService |
am force-stop <package name> |
關(guān)閉指定包名的應用程序 | 無 | am force-stop com.reoger.app |
am kill <package name> |
殺死與應該程序包想關(guān)聯(lián)的所有進程,但只會殺死安全進程 | 可以通過--user <USER_ID>指定用戶 |
am kill com.reoger.app |
am kill -all |
殺死全部的后臺進程 | 無 | am kill -all |
詳情參考這里:http://blog.csdn.net/soslinken/article/details/50245865
adb shell pm
pm即是 package manager的簡稱,可以用于安裝應用、查詢應用信息、系統(tǒng)權(quán)限、控制應用。
| 命令 | 作用 | 備注 | 示例 |
|---|---|---|---|
pm list packages [options] [fileter] |
打印所有已經(jīng)安裝的應用的包名 | options 常用的有-3 表示只顯示第三方應用的包名,filter表示按名字篩選 |
pm list packages -e 顯示可用的應用和包名 |
pm list permission [options] [group] |
打印權(quán)限 |
-g表示按組列出,-s表示簡短打印 |
pm list permission-groups 打印所有已知的權(quán)限組 |
grant <package_name> <permission> |
授予應用權(quán)限 | 必須android 6.0及以上的設備 | grant com.reoger.app android.permission.WRITE_EXTERNAL_STORAGE |
revoke <package_name> <permission> |
撤銷應用權(quán)限 | 必須android 6.0及以上的設備 | revoke com.reoger.app android.permission.WRITE_EXTERNAL_STORAGE |
pm clear <package name> |
清除應用數(shù)據(jù) | 無 | pm clear com.reoger.app |
pm enable <package or component> |
使得packaege或componet可用 | 只針對第系統(tǒng)應用 | pm enable com.reoger.app |
pm hide <package or component> |
隱藏package或componet | 被隱藏應用在管理中變得不可見,桌面圖標也會消失 | pm hide com.reoger.app |
pm unhide <package or component> |
取消隱藏package或componet | 桌面圖標需要重新添加 | pm unhide com.reoger.app |
詳情請參考這里:https://www.cnblogs.com/JianXu/p/5380882.html
adb shell dumysys
| 命令 | 作用 |
|---|---|
dumpsys cpuinfo |
查看CPU信息 |
dumpsys activity |
查看一大堆信息,包括activity、broadcasts、providers、permissions等等信息 |
dumpsys activity top |
獲取當前android系統(tǒng)中與用戶交互的activity的詳細信息 |
dumpsys activity activities |
顯示當前所有運行的任務棧,可以與管道- grep XXX結(jié)合使用,用于篩選我們需要的任務棧 |
dumpsys activity meminfo <package name> |
顯示應用內(nèi)存使用的情況 |
dumpsys activity package <package name> |
顯示apk的信息 |
| option | 含義 |
|---|---|
| -a | 包括所有可用server狀態(tài) |
| -c | 包括client狀態(tài),即app端情況 |
| -p package | 限定輸出指定包名 |
其中的dumpsys activity [options] [WHAT]參數(shù)可選如下:
| option | 含義 |
|---|---|
| -a | 包括所有可用server狀態(tài) |
| -c | 包括client狀態(tài),即app端情況 |
| -p package | 限定輸出指定包名 |
| WHAT | 解釋 | 對應源碼 |
|---|---|---|
| a[ctivities] | activity狀態(tài) | dumpActivitiesLocked() |
| b[roadcasts] [PACKAGE_NAME] | broadcast狀態(tài) | dumpBroadcastsLocked() |
| s[ervices] [COMP_SPEC …] | service狀態(tài) | newServiceDumperLocked().dumpLocked |
| prov[iders] [COMP_SPEC …] | content provider狀態(tài) | dumpProvidersLocked() |
| p[rocesses] [PACKAGE_NAME] | 進程狀態(tài) | dumpProcessesLocked() |
| o[om] | 內(nèi)存管理 | dumpOomLocked() |
| i[ntents] [PACKAGE_NAME] | pending intent狀態(tài) | dumpPendingIntentsLocked() |
| r[ecents] | 最近activity | dumpRecentsLocked() |
| perm[issions] | URI授權(quán)情況 | dumpPermissionsLocked() |
| all | 所有activities信息 | dumpActivity() |
| top | 頂部activity信息 | dumpActivity() |
| package | package相關(guān)信息 | dump() |