Android Dumpsys 命令&实例&原理

dumpsys 命令用法

dumpsys activity //查询AMS服务相关信息
dumpsys window //查询WMS服务相关信息
dumpsys cpuinfo //查询CPU情况
dumpsys meminfo //查询内存情况
dumpsys power //电源管理相关,包括待机休眠相关的都可以查看
dumpsys package //包管理相关
常用实例

dumpsys -l //查看系统中所有的服务
dumpsys | grep “DUMP OF SERVICE” //同 dumpsys -l 差不多
dumpsys activity s // 查看app的所有service状态
dumpsys activity b // 查看app的所有广播状态
dumpsys activity top // 查看app的界面状态
dumpsys activity oom // 查看app的oom信息
dumpsys window windows | grep -E “mCurrentFocus|mFocusedApp” --color=always //通常通过这个命令实时查,当前最顶部的activity或者窗体
dumpsys SurfaceFlinger //通过这个查看系统图层,可以看到Acitivity 栈
dumpsys |grep BroadcastRecord //查看当前系统正在进行的广播
dumpsys package com.funshion.publicity | grep version //查看安装包的版本
dumpsys meminfo -h //查看meminfo 相关内容
dumpsys package f // 查看系统的所有Features

dumpsys 原理

frameworks/native/cmds/dumpsys/dumpsys.cpp

int Dumpsys::main(int argc, char* const argv[]) {
    ...
    while (1) {
		//对参数进行解析
        switch (c) {
        case 0:
            ...
            } else if (!strcmp(longOptions[optionIndex].name, "help")) {
                usage();
                return 0;
            } 
            ...
        case 'l'://展示所有服务
            showListOnly = true;
            break;
        }
    }
	...
	//查询服务是否存在
    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]);
        }
    }

    for (size_t i = 0; i < N; i++) {
        const String16& serviceName = services[i];
        if (IsSkipped(skippedServices, serviceName)) continue;
        if (startDumpThread(serviceName, args) == OK) {
           ...
        }
    }
    return 0;
}
服务名类名功能
packagePackageManagerServicePMS相关信息
activityActivityManagerServiceAMS相关信息
packagePackageManagerServicePMS相关信息
windowWindowManagerServiceWMS相关信息
inputInputManagerServiceIMS相关信息
powerPowerManagerServicePMS相关信息
batterystatsBatterystatsService电池统计信息
batteryBatteryService电池信息
alarmAlarmManagerService闹钟信息
dropboxDropboxManagerService调试相关
procstatsProcessStatsService进程统计
cpuinfoCpuBinderCPU
meminfoMemBinder内存
gfxinfoGraphicsBinder图像
dbinfoDbBinder数据库

以上所有的服务,都可以找到dump函数的实现。
ActivityManagerService extends IActivityManager.Stub ->
IActivityManager extends IInterface ->

public interface IInterface {
    IBinder asBinder();
}

frameworks/base/core/java/android/os/Binder.java

protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter fout,
            @Nullable String[] args) {
    }

frameworks/base/core/java/android/app/Service.java

protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
        writer.println("nothing to dump");
    }

所有服务,继承了service ,并实现了dump 函数,就可以通过dumpsys 命令,查看服务的信息

那我们自己写的服务如何使用呢:

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启动之后就可以dumpsys activity service指令在命令行打印dump方法内容了:
这是什么原理呢?
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

private void doDump(FileDescriptor fd, PrintWriter pw, String[] args, boolean useProto) {
       	...
        if (opti < args.length) {
            String cmd = args[opti];
            opti++;
            if ("activities".equals(cmd) || "a".equals(cmd)) {
                synchronized (this) {
                    dumpActivitiesLocked(fd, pw, args, opti, true, dumpClient, dumpPackage);
                }
            } else if ("lastanr".equals(cmd)) {
                
            } else if ("starter".equals(cmd)) {
               
            } else if ("containers".equals(cmd)) {
              
            } else if ("recents".equals(cmd) || "r".equals(cmd)) {
               
            } else if ("binder-proxies".equals(cmd)) {
              
            } else if ("broadcasts".equals(cmd) || "b".equals(cmd)) {
                
            } else if ("broadcast-stats".equals(cmd)) {
                
            } 
            else if ("intents".equals(cmd) || "i".equals(cmd)) {
            } else if ("processes".equals(cmd) || "p".equals(cmd)) {
               
            } else if ("oom".equals(cmd) || "o".equals(cmd)) {
                
            } else if ("permissions".equals(cmd) || "perm".equals(cmd)) {
              
            } else if ("provider".equals(cmd)) {
            
            } else if ("providers".equals(cmd) || "prov".equals(cmd)) {
              
            } else if ("service".equals(cmd)) {
              	//相关的逻辑主要在这里,这里就不再展开了
            } else if ("package".equals(cmd)) {
               
            } else if ("associations".equals(cmd) || "as".equals(cmd)) {
                
            } else if ("settings".equals(cmd)) {
               
            } else if ("services".equals(cmd) || "s".equals(cmd)) {
                
            } else if ("locks".equals(cmd)) {

            } else {
               
        }
		...
    }

从上面的代码可以看到,dumpsys activity 后面还可以跟很多的参数,帮助我们查看更多的系统信息

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值