Android dumpsys命令的使用方法

0x01 查看dumpsys支持哪些服务: adb shell dumpsys -l

列出dumpsys支持的服务名字,例如(仅列出几个,全部服务有100多个)

$ adb shell dumpsys -l
Currently running services:
  accessibility
  account
  activity
  alarm
  cpuinfo
  isms
  location
  meminfo
  mount
  nfc
  notification
  package
  permission
  phone
  power
  window

0x02 查看dump某个具体服务的用法:adb shell dumpsys <服务名> -h

这个<服务名>就是adb shell dumpsys -l打印出来的名字,是必须遵守大小写的。

例如, adb shell dumpsys package -h

Android4.4.2中的dumpsys package -h
$ adb shell dumpsys package -h
Package manager dump options:
  [-h] [-f] [cmd] ...
    -f: print details of intent filters
    -h: print this help
  cmd may be one of:
    l[ibraries]: list known shared libraries
    f[ibraries]: list device features
    r[esolvers]: dump intent resolvers
    perm[issions]: dump permissions
    pref[erred]: print preferred package settings
    preferred-xml [--full]: print preferred package settings as xml
    prov[iders]: dump content providers
    p[ackages]: dump installed packages
    s[hared-users]: dump shared user IDs
    m[essages]: print collected runtime messages
    v[erifiers]: print package verifier info
    <package.name>: info about given package
    k[eysets]: print known keysets

Android6.0.1中的dumpsys package -h
$ adb shell dumpsys package -h
Package manager dump options:
  [-h] [-f] [--checkin] [cmd] ...
    --checkin: dump for a checkin
    -f: print details of intent filters
    -h: print this help
  cmd may be one of:
    l[ibraries]: list known shared libraries
    f[ibraries]: list device features
    k[eysets]: print known keysets
    r[esolvers]: dump intent resolvers
    perm[issions]: dump permissions
    permission [name ...]: dump declaration and use of given permission
    pref[erred]: print preferred package settings
    preferred-xml [--full]: print preferred package settings as xml
    prov[iders]: dump content providers
    p[ackages]: dump installed packages
    s[hared-users]: dump shared user IDs
    m[essages]: print collected runtime messages
    v[erifiers]: print package verifier info
    d[omain-preferred-apps]: print domains preferred apps
    i[ntent-filter-verifiers]|ifv: print intent filter verifier info
    version: print database version info
    write: write current settings now
    installs: details about install sessions
    check-permission <permission> <package> [<user>]: does pkg hold perm?
    <package.name>: info about given package
    installs: details about install sessions

例如,adb shell dumpsys activity -h

$ adb shell 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.

例如,查看某个权限:
adb shell dumpsys package -h可知,查看权限可以用:adb shell dumpsys package permissions
这会列举出手机中所有的权限。

如果只查看某一个权限可以使用adb shell dumpsys package permission <权限名>。注意这里的permission是不带s的。如果没有此选项说明手机版本比较旧了。

0x03 附dumpsys的源码

dumpsys 的代码在frameworks/native/cmds/dumpsys/dumpsys.cpp。

int main(int argc, char* const argv[])
{
    signal(SIGPIPE, SIG_IGN);
    sp<IServiceManager> sm = defaultServiceManager();
    fflush(stdout);

    Vector<String16> services;
    Vector<String16> args;
    bool showListOnly = false;
    // 只有一个参数,即执行dumpsys -l,这时只是调用listServices()获取服务列表
    if ((argc == 2) && (strcmp(argv[1], "-l") == 0)) {
        showListOnly = true;
    }
    // argc == 1表示如果没有加任何参数,即只是执行dumpsys
    // showListOnly表示执行dumpsys -l
    // 这两种情况会获取服务列表
    if ((argc == 1) || showListOnly) {
        services = sm->listServices();
        services.sort(sort_func);
        args.add(String16("-a"));
    } else {
    // 如果有2个或2个以上参数,即执行dumpsys <argv1> <argv2> ...
    // 这时<argv1>被认为是服务名,即listServices()列出的名字
    // <argv2>及之后的参数作为service->dump的参数
        services.add(String16(argv[1]));
        for (int i=2; i<argc; i++) {
            args.add(String16(argv[i]));
        }
    }

    const size_t N = services.size();

    if (N > 1) {
        // first print a list of the current services
        aout << "Currently running services:" << endl;

        for (size_t i=0; i<N; i++) {
            sp<IBinder> service = sm->checkService(services[i]);
            if (service != NULL) {
                aout << "  " << services[i] << endl;
            }
        }
    }

    if (showListOnly) {//如果只有-l参数,则到此就返回了。
        return 0;
    }

    // 执行到此,要么dumpsys没有参数,这时services中包含了所有的服务名,即将调用所有服务的dump()方法
    // 要么dumpsys有多个参数,例如dumpsys package -h

    for (size_t i=0; i<N; i++) {
        sp<IBinder> service = sm->checkService(services[i]); // dumpsys的第一个参数就是checkService的参数,要注意大小写。
        if (service != NULL) {
            if (N > 1) {
                aout << "------------------------------------------------------------"
                        "-------------------" << endl;
                aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
            }
            int err = service->dump(STDOUT_FILENO, args); //调用指定service的dump方法,例如ActivityManagerService的dump()或者PackageManagerService的dump()方法
            if (err != 0) {
                aerr << "Error dumping service info: (" << strerror(err)
                        << ") " << services[i] << endl;
            }
        } else {
            aerr << "Can't find service: " << services[i] << endl;
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值