当前位置:   article > 正文

Android Dumpsys 命令&实例&原理_dumpsys activity service

dumpsys activity service

dumpsys 命令用法

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
服务名类名功能
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();
}
  • 1
  • 2
  • 3

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

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

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

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

所有服务,继承了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");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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 {
               
        }
		...
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/537561?site
推荐阅读
相关标签
  

闽ICP备14008679号