1. 程式人生 > >Android Service dump使用

Android Service dump使用

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