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