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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章