dumpsys命令功能很強大,能dump系統服務的各種狀態,非常有必要熟悉該命令的用法以及含義。
一、 dumpsys命令
1.1 服務列表
不同的Android系統版本支持的命令有所不同,可通過下面命令查看當前手機所支持的dump服務,先進入adb shell,再執行如下命令:dumpsys
-l
。 這些服務名或許你並看不出其調用的哪個服務,那麼這時可以通過下面指令:service list
。
表一:
服務名 | 類名 | 功能 |
---|---|---|
activity | ActivityManagerService | AMS相關信息 |
package | PackageManagerService | PMS相關信息 |
window | WindowManagerService | WMS相關信息 |
input | InputManagerService | IMS相關信息 |
power | PowerManagerService | PMS相關信息 |
batterystats | BatterystatsService | 電池統計信息 |
battery | BatteryService | 電池信息 |
alarm | AlarmManagerService | 鬧鐘信息 |
dropbox | DropboxManagerService | 調試相關 |
procstats | ProcessStatsService | 進程統計 |
cpuinfo | CpuBinder | CPU |
meminfo | MemBinder | 內存 |
gfxinfo | GraphicsBinder | 圖像 |
dbinfo | DbBinder | 數據庫 |
表二:
服務名 | 功能 |
---|---|
SurfaceFlinger | 圖像相關 |
appops | app使用情況 |
permission | 權限 |
processinfo | 進程服務 |
batteryproperties | 電池相關 |
audio | 查看聲音信息 |
netstats | 查看網絡統計信息 |
diskstats | 查看空間free狀態 |
jobscheduler | 查看任務計劃 |
wifi | wifi信息 |
diskstats | 磁盤情況 |
usagestats | 用戶使用情況 |
devicestoragemonitor | 設備信息 |
。。。 | 。。。 |
未完待續…
1.2 查詢服務
通過下面命令可打印具體某一項服務:dumpsys <service>
,其中便是前面表格中的服務名,比如:
dumpsys cpuinfo //打印一段時間進程的CPU使用百分比排行榜
dumpsys meminfo -h //查看dump內存的幫助信息
dumpsys package <packagename> //查看指定包的信息
系統服務非常之多,那麼接下來將重點說說其中之一:dumpsys activity
用法.
二、 Activity
dumpsys activity [options] [cmd]
下面分別說說options和cmd有哪些可選值
2.1 options
options可選值:
-a
:dump所有;-c
:dump客戶端;-p [package]
:dump指定的包名;-h
:輸出幫助信息;
dumpsys activity
等價於依次輸出下面7條指令:
dumpsys activity intents
dumpsys activity broadcasts
dumpsys activity providers
dumpsys activity services
dumpsys activity recents
dumpsys activity activities
dumpsys activity processes
2.2 cmd
cmd可選值
cmd | 解釋 | 縮寫 |
---|---|---|
activities | activity狀態 | a |
broadcasts | 廣播 | b |
intents | pending intent狀態 | i |
processes | 進程 | p |
oom | 內存溢出 | o |
services | Service狀態 | s |
service | service狀態(Client端) | |
providers | ContentProvider狀態 | prov |
provider | ContentProvider狀態(Client端) | |
associations | tracked app associations | as |
permissions | URI permission grant state | perm |
package | package相關信息 | |
all | 所有的activities信息 | |
recents | recent activity狀態 | r |
top | top activity信息 | |
write | 將狀態持久化到存儲區 | |
track-associations | 使能association tracking | |
untrack-associations | 禁止和清空association tracking |
- cmd:上表加粗項是指直接跟
包名
,另外services和providers還可以跟組件名
; - 縮寫:基本都是cmd首字母或者前幾個字母,用cmd和縮寫是等效: dumpsys activity broadcasts dumpsys activity b //等效
三、場景
下面以新浪微博App作爲實例,由於輸出結果較多,每個場景截圖只挑選部分重要的信息。
場景1:查詢某個App所有的Service狀態
dumpsys activity s com.sina.weibo
解讀:
- Service類名爲
com.morgoo.droidplugin.PluginManagerService
; - 運行在進程pid=
7220
,進程名爲com.sina.weibo
,uid=10094
; - 通過bindService連接該服務的進程pid=
7306
,進程名爲com.sina.weibo:PluginP03
。
當然還有packageName,baseDir(apk路徑),dataDir(apk數據路徑),createTime等各種信息。另外,新浪微博採用的是360開源的Android插件機制(com.morgoo.droidplugin
),主要用於hotfix等功能。
場景2:查詢某個App所有的廣播狀態
dumpsys activity s com.sina.weibo
解讀:
- android.intent.action.SCREEN_ON代表手機亮屏廣播;
- 接收該廣播的receiver有很多個,其中一個所在進程爲pid=
7220
,進程名爲com.sina.weibo
場景3:查詢某個App所有的Activity狀態
輸出結果較多,尤其是View Hierarchy
,下面截取部分:
dumpsys activity a com.sina.weibo
解讀:
- 格式:TaskRecord{Hashcode #TaskId Affinity UserId=0 Activity個數=1};所以上圖信息解析後就是TaskId=
1802
,Affinity=com.sina.weibo
,當前Task中Activity個數爲1。 - effectiveUid爲當前task所屬Uid,mCallingUid爲調用者Uid=u0a94,mCallingPackage爲調用者包名,這裏是
com.sina.weibo
; - realActivity:task中的已啓動的Activity組件名
com.sina.weibo/.SplashActivity
。
場景4:查詢某個App的進程狀態
dumpsys activity p com.sina.weibo
- 格式:ProcessRecord{Hashcode pid:進程名/uid},進程pid=7306,進程名爲
com.sina.weibo:PluginP03
,uid=10094. - 該進程中還有Services,Connections, Providers, Receivers,可以看出該進程是沒有Activity的進程。
其他
還有很多場景,會用到不同的參數,這裏就不再一一列舉,建議大家多去嘗試,慢慢地就更加熟練,再比如:
dumpsys activity top //當前界面app狀態
dumpsys activity oom //進程oom狀態