Android dumpsys简介与Android常用命令
dumpsys命令功能很强大,能dump系统服务的各种状态,非常有必要熟悉该命令的用法以及含义。
dumpsys命令可以显示手机中所有应用程序的信息,并且也会给出现在手机的状态。
直接执行adb shell dumpsys
会显示所有信息。
1.1 dumpsys命令用法
可通过dumpsys命令查询系统服务的运行状态(对象的成员变量属性值),命令格式:dumpsys 服务名
, 例如:
dumpsys activity //查询AMS服务相关信息,相当于 ActivityManagerService.dump() dumpsys window //查询WMS服务相关信息 dumpsys cpuinfo //查询CPU情况 dumpsys meminfo //查询内存情况
重点信息:dumpsys activity 等价于 ActivityManagerService.dump()。 同理其他的命令也是类似的方式。
可查询的服务有很多,可通过下面任一命令查看当前系统所支持的dump服务:
adb shell dumpsys -l
adb shell service list
1.2 系统服务
表一:
服务名 类名 功能
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 数据库
表二:
服务名 功能
SurfaceFlinger 图像相关
appops app使用情况
permission 权限
processinfo 进程服务
batteryproperties 电池相关
audio 查看声音信息
netstats 查看网络统计信息
diskstats 查看空间free状态
jobscheduler 查看任务计划
wifi wifi信息
diskstats 磁盘情况
usagestats 用户使用情况
devicestoragemonitor 设备信息
… …
1.3 源码
frameworks/native/cmds/dumpsys/dumpsys.cpp
部分源码:
if (argc == 1) { services = sm->listServices(); services.sort(sort_func); args.add(String16("-a")); } else { 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; } } } for (size_t i=0; i<N; i++) { sp<IBinder> service = sm->checkService(services[i]); if (service != NULL) { if (N > 1) {//dump多个Service时,Service信息之间的分隔 aout << "------------------------------------------------------------" "-------------------" << endl; aout << "DUMP OF SERVICE " << services[i] << ":" << endl; } int err = service->dump(STDOUT_FILENO, args); if (err != 0) { aerr << "Error dumping service info: (" << strerror(err) << ") " << services[i] << endl; } } else { aerr << "Can't find service: " << services[i] << endl; } }
执行dumpsys命令,那么将会dump所有Service,每个Service之间会分隔开
如果dumpsys一个没有注册的Service,那么则提示找不到Service,比如:
# dumpsys adb
Can't find service: adb
1.4 Graphics 相关
adb shell dumpsys |grep GLES adb shell dumpsys glxinfo adb shell dumpsys SurfaceFlinger |grep vsync adb shell dumpsys SurfaceFlinger |grep refresh-rate adb shell dumpsys SurfaceFlinger | grep -i phase
1.5 其他常用命令
$ adb shell getprop ro.bootimage.build.fingerprint
#查看build版本信息
$ adb shell getprop
#打印所有prop信息,可以在里面搜自己想要的
1.6 App启动、卸载等相关常用命令
$ adb shell pm list packages |grep <app_key_words> #查询app的package name
#eg: adb shell pm list packages |grep Yuanshen,获取结果为: com.miHoYo.Yuanshen $ adb shell dumpsys package <packageName> |grep Main #查询app的MainActivity name #获取结果一般为以下格式,以原神为例:#com.miHoYo.Yuanshen/com.miHoYo.GetMobileInfo.MainActivity $ adb shell am start -n <ActivityName> #命令行启动app $ adb uninstall <packageName> #卸载apk $ adb shell settings put global <var_name> <var_value> #修改全局变量 #eg: adb shell settings put global enable_gpu_debug_layers 1
#移除全局变量
$ adb shell settings delete global gpu_debug_layers_gles
1.7 Android属性的设置、修改和删除:
1.getprop/setprop属性
adb shell setprop <属性名称> value 其中,<属性名称>是要设置/修改的属性的名称。 eg: adb shell setprop ro.build.version.release2 "my_version" 这个命令将设置/修改名为ro.build.version.release2的属性值为"my_version"。 请注意,执行此命令需要具有root权限。另外有些系统属性是被保护的,无法修改。并且setprop的属性一旦设置了,只能修改,无法删除。
adb shell getprop ro.build.version.release2
# 查看属性ro.build.version.release2的值
2.除了setprop和getprop,还有在settings设置属性(或者说值)的情况:
adb shell settings put global enable_gpu_debug_layers 1
#设置settings中的enable_gpu_debug_layers值为1
adb shell settings get global enable_gpu_debug_layers
#查阅settings中的enable_gpu_debug_layers的值
adb shell settings delete global enable_gpu_debug_layers
# 删除setting中该属性的值
几种特殊的属性:
1.ro.属性,它表示只读属性,它一旦被设置就不能被修改;
2.net.属性,顾名思义,就是与网络相关的属性,net.属性中有一个特殊的属性:net.change,它记录了每一次最新设置和更新的net.属性,也就是每次设置和更新net.属性时则会自动的更新net.change属性,net.change属性的value就是这个被设置或者更新的net属性的name。例如我们更新了属性net.bt.name的值,由于net有属性发生了变化,那么属性服务就会自动更新net.change,将其值设置为net.bt.name。
3.persist.属性,以文件的形式保存在/data/property路径下。persist.属性由于将其保存在了用户空间中,所以在property_init中是不能对其更新的,只能将其更新过程交给用户来处理。
4.ctl.属性,虽然是以属性的形式来进行设置,其实它的目的是为了启动或关闭它指定的service
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果。
1.8 Android屏幕旋转命令:
adb shell settings put system accelerometer_rotation 0 #关闭根据重力加速旋转屏幕 adb shell settings put system accelerometer_rotation 1 #打开根据重力加速旋转屏幕
adb shell settings put system user_rotation 0
#恢复到默认旋转位置
adb shell settings put system user_rotation 1
#旋转90度
adb shell settings put system user_rotation 2
#旋转180度
adb shell settings put system user_rotation 3
#旋转270度
adb shell dumpsys window policy --rotation #dump rotation信息
1.9 强制GPU合成图层而不是DPU
adb shell setprop vendor.hwc.force_to_gpu 1 #与vendor指定的android property属性控制逻辑有关,不固定
1.10 保持屏幕常亮
adb shell svc power stayon true # 屏幕将保持常亮状态,直到你执行关闭命令或断开连接,需注意权限要求和电池消耗问题
参考链接:
https://www.jianshu.com/p/01c5ffa19e96
https://www.jb51.net/article/107568.htm
https://www.iteye.com/blog/su1216-1729648