Android Service dump使用
阿新 • • 發佈:2018-11-12
dumpsys是Android用來檢視後臺Service狀態的工具,在我們分析除錯問題時,非常好用,避免每次修改都要加log然後編譯。
可以藉助這個命令列出當前有哪些service可以進行dump分析
# dumpsys | grep "DUMP OF SERVICE"
DUMP OF SERVICE SurfaceFlinger:
DUMP OF SERVICE accessibility:
DUMP OF SERVICE account:
DUMP OF SERVICE activity:
...
直接dumpsys 某個service打出的資訊量很大,可以有選擇性的新增一些引數進行過濾
具體引數可以通過執行dumpsys activity -h
# dumpsys activity -h Activity manager dump options: [-a] [-c] [-h] [cmd] ... cmd may be one of: a[ctivities]: activity stack state b[roadcasts] [PACKAGE_NAME] [history [-s]]: broadcast state i[ntents] [PACKAGE_NAME]: pending intent state p[rocesses] [PACKAGE_NAME]: process state o[om]: out of memory management prov[iders] [COMP_SPEC ...]: content provider state provider [COMP_SPEC]: provider client-side state s[ervices] [COMP_SPEC ...]: service state service [COMP_SPEC]: service client-side state package [PACKAGE_NAME]: all state related to given package all: dump all activities top: dump the top activity cmd may also be a COMP_SPEC to dump activities. COMP_SPEC may be a component name (com.foo/.myApp), a partial substring in a component name, a hex object identifier. -a: include all available server state. -c: include client state. # dumpsys activity s <package> // 檢視app的所有service狀態 # dumpsys activity b <package> // 檢視app的所有廣播狀態 # dumpsys activity top // 檢視app的介面狀態 # dumpsys activity oom // 檢視app的oom資訊
當然要這麼使用是有前提的, 得先在ServiceManager中addService後才可以進行dump。然而ServiceManager是@hide的, 基於sdk開發的app找不到ServiceManager類。。。
接下來進入主題,開發Android對Service類肯定不陌生,但Service類自帶dump方法可能都沒用到過(我也是最近才用到), App只需要繼承Service後重寫dump方法就可以進行dumpsys列印了, 完美解決了呼叫不到ServiceManager的煩惱。
public class TestService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
writer.println("Test dump");
}
}
service啟動之後就可以在命令列列印dump方法內容了。
# dumpsys activity service TestService
SERVICE com.calvin.bubbletest/.TestService 419d5cb0 pid=27775
Client:
Test dump
如果有重名的Service會都打印出來,如CallStatusService
# dumpsys activity service CallStatusService
SERVICEcom.calvin.bubbletest/com.calvin.bubbletest.call.CallStatusService 41ad3bb8 pid=13795
Client:
nothing to dump
SERVICE com.calvin.bubbletest.phone/.service.CallStatusService 419662b8 pid=13713
Client:
nothing to dump
也可以把Service的包名類名加上,這樣就只會列印對應的Service資訊了
# dumpsys activity service com.calvin.bubbletest.phone/.service.CallStatusService
SERVICE com.calvin.bubbletest.phone/.service.CallStatusService 419662b8 pid=13713
Client:
nothing to dump