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

猜你喜欢

转载自blog.csdn.net/u011897062/article/details/83987256