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;
}
服务名 类名 功能
package PackageManagerService PMS相关信息
activity ActivityManagerService AMS相关信息
package PackageManagerService PMS相关信息
window WindowManagerService WMS相关信息
input InputManagerService IMS相关信息
power PowerManagerService PMS相关信息
batterystats BatterystatsService 电池统计信息
battery BatteryService 电池信息
alarm AlarmManagerService 闹钟信息
dropbox DropboxManagerService 调试相关
procstats ProcessStatsService 进程统计
cpuinfo CpuBinder CPU
meminfo MemBinder 内存
gfxinfo GraphicsBinder 图像
dbinfo DbBinder 数据库

以上所有的服务,都可以找到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 后面还可以跟很多的参数,帮助我们查看更多的系统信息

你可能感兴趣的:(android,java)