dumpsys是系统中重要的函数,我们来看看它如何使用,都能dump出来一些什么东西
首先我们来看看dumpsys的源码,在4.1中,它在framework/native目录下面
frameworks/native/cmds/dumpsys/dumpsys.cpp
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;
- }
- }
我只会java,上面的代码还是留给大家自己阅读吧,我就不详细解释了……
如果参数个数=1,则在ServiceManager中查找注册的Service
否则查找指定的Service,并且将剩余参数传给Serivce
如果执行dumpsys命令,那么将会dump所有Service,每个Service之间会分隔开
如果dumpsys一个没有注册的Service,那么则提示找不到Service,比如:
# dumpsys adb
Can't find service: adb
我们先来看下有哪些service可以看dump
先进入adb shell , dumpsys | grep "DUMP OF SERVICE"就可以看哪些service可以dump
那么我们到底都可以dump一些什么呢?
其实最简单的办法就是执行dumpsys,看看其结果,下面是我手机中执行的结果(HTCg14)
Log代码
- # dumpsys
- Currently running services:
- DeviceManager3LM
- Encryption3LMService
- HtcAppUsageStatsService
- SurfaceFlinger
- accessibility
- account
- activity
- alarm
- appwidget
- audio
- backup
- battery
- batteryinfo
- bluetooth
- bluetooth_a2dp
- bluetooth_hid
- bt_fm_management
- clipboard
- connectivity
- content
- country_detector
- cpuinfo
- device_policy
- devicestoragemonitor
- diskstats
- display
- drm.drmManager
- dropbox
- entropy
- gfxinfo
- hardware
- htc_checkin
- htchardware
- htctelephony
- htctelephonyinternal
- input_method
- iphonesubinfo
- isms
- location
- media.audio_flinger
- media.audio_policy
- media.camera
- media.player
- meminfo
- mount
- netpolicy
- netstats
- network_management
- notification
- package
- permission
- phone
- power
- samplingprofiler
- search
- secfirewall
- secloader
- sensorservice
- simphonebook
- sip
- statusbar
- stub_activity
- stub_audio
- stub_iphonesubinfo
- stub_isms
- stub_location
- stub_phone
- stub_telephony.registry
- telephony.registry
- textservices
- throttle
- uimode
- usagestats
- usb
- usbnet
- userbehavior
- vibrator
- wallpaper
- wifi
- wifip2p
- window
- -------------------------------------------------------------------------------
- DUMP OF SERVICE DeviceManager3LM:
- -------------------------------------------------------------------------------
- DUMP OF SERVICE Encryption3LMService:
由于dump service的log实在太长,我就截取了最前面的“Currently running services”和两个Service的dump信息
为什么DeviceManager3LM和Encryption3LMService后面没有内容?这和Service的内部实现有关,也许它只是写了一个空的dump函数,也许有什么其他条件。
这个问题一会再说,我们先看看这些Service都是在哪注册的
其中大部分Service都是在SystemServer中的main函数里注册的,它调用了一个叫init2的函数
Java代码
- public static final void init2() {
- Slog.i(TAG, "Entered the Android system server!");
- Thread thr = new ServerThread();
- thr.setName("android.server.ServerThread");
- thr.start();
- }
init2非常简单,所有任务都交给新线程ServerThread来处理
在ServerThread的run函数中,注册了系统大部分的Service,有兴趣的同学可以看看这部分代码
这部分代码有点长(大概800行),因为它一直重复这建立各种Service,然后注册,输出log
比如下面的WifiP2pService
Java代码
- try {
- Slog.i(TAG, "Wi-Fi P2pService");
- wifiP2p = new WifiP2pService(context);
- ServiceManager.addService(Context.WIFI_P2P_SERVICE, wifiP2p);
- } catch (Throwable e) {
- reportWtf("starting Wi-Fi P2pService", e);
- }
其中WIFI_P2P_SERVICE就是服务的名字
Java代码
- public static final String WIFI_P2P_SERVICE = "wifip2p";
当执行dumpsys wifip2p的时候,并没有任何输出,为什么呢?我们看看WifiP2pService的代码
Java代码
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
- != PackageManager.PERMISSION_GRANTED) {
- pw.println("Permission Denial: can't dump WifiP2pService from from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid());
- return;
- }
- }
现在似乎可以理解为什么dumpsys wifip2p的时候没有输出了
我们再来看一个简单的例子
# dumpsys diskstats
Latency: 5ms [512B Data Write]
Data-Free: 362888K / 1161104K total = 31% free
Cache-Free: 116756K / 120900K total = 96% free
System-Free: 133036K / 806284K total = 16% free
Java代码
- ServiceManager.addService("diskstats", new DiskStatsService(context));
这回大家知道去哪看源码了吧,下面是DiskStatsService的dump函数
Java代码
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- ……
- reportFreeSpace(Environment.getDataDirectory(), "Data", pw);
- reportFreeSpace(Environment.getDownloadCacheDirectory(), "Cache", pw);
- reportFreeSpace(new File("/system"), "System", pw);
- }
Java代码
- private void reportFreeSpace(File path, String name, PrintWriter pw) {
- try {
- StatFs statfs = new StatFs(path.getPath());
- long bsize = statfs.getBlockSize();
- long avail = statfs.getAvailableBlocks();
- long total = statfs.getBlockCount();
- if (bsize <= 0 || total <= 0) {
- throw new IllegalArgumentException(
- "Invalid stat: bsize=" + bsize + " avail=" + avail + " total=" + total);
- }
- pw.print(name);
- pw.print("-Free: ");
- pw.print(avail * bsize / 1024);
- pw.print("K / ");
- pw.print(total * bsize / 1024);
- pw.print("K total = ");
- pw.print(avail * 100 / total);
- pw.println("% free");
- } catch (IllegalArgumentException e) {
- pw.print(name);
- pw.print("-Error: ");
- pw.println(e.toString());
- return;
- }
- }
大家肯定还对其他的Service感兴趣,比如notification!
之前我的一篇关于android安全的文章提到过用dumpsys notification能作些什么
转贴请保留以下链接
本人blog地址
Android 性能分析工具dumpsys的使用
http://www.open-open.com/lib/view/open1405061994872.html
Android提供的dumpsys工具可以用于查看感兴趣的系统服务信息与状态,手机连接电脑后可以直接命令行执行adb shell dumpsys 查看所有支持的Service但是这样输出的太多,可以通过dumpsys | grep "DUMP OF SERVICE" 仅显示主要的Service的信息
一、列出dumpsys所有支持命令
> adb shell
$ dumpsys | grep "DUMP OF SERVICE"
以下是在三星S3手机上的输出信息
C:\Windows\System32>adb shell
shell@m:/ $ dumpsys | grep "DUMP OF SERVICE"
dumpsys | grep "DUMP OF SERVICE"
DUMP OF SERVICE AtCmdFwd:
DUMP OF SERVICE CustomFrequencyManagerService:
DUMP OF SERVICE DirEncryptService:
DUMP OF SERVICE Exynos.HWCService:
DUMP OF SERVICE Exynos.IPService:
DUMP OF SERVICE FMPlayer:
DUMP OF SERVICE LEDService:
DUMP OF SERVICE SecTVOutService:
DUMP OF SERVICE SurfaceFlinger:
DUMP OF SERVICE TvoutService_C:
DUMP OF SERVICE accessibility:
DUMP OF SERVICE account:
DUMP OF SERVICE activity:
DUMP OF SERVICE alarm:
DUMP OF SERVICE android.security.keystore:
DUMP OF SERVICE application_policy:
DUMP OF SERVICE appops:
DUMP OF SERVICE appwidget:
DUMP OF SERVICE audio:
DUMP OF SERVICE backup:
DUMP OF SERVICE battery:
DUMP OF SERVICE batteryinfo:
DUMP OF SERVICE bluetooth_manager:
DUMP OF SERVICE bluetooth_secure_mode_manager:
DUMP OF SERVICE clipboard:
DUMP OF SERVICE clipboardEx:
DUMP OF SERVICE commontime_management:
DUMP OF SERVICE connectivity:
DUMP OF SERVICE container_service:
DUMP OF SERVICE content:
DUMP OF SERVICE country_detector:
DUMP OF SERVICE cpuinfo:
DUMP OF SERVICE dbinfo:
DUMP OF SERVICE device_policy:
DUMP OF SERVICE devicestoragemonitor:
DUMP OF SERVICE diskstats:
DUMP OF SERVICE display:
DUMP OF SERVICE dreams:
DUMP OF SERVICE drm.drmManager:
DUMP OF SERVICE dropbox:
DUMP OF SERVICE edmnativehelper:
DUMP OF SERVICE enterprise_license_policy:
DUMP OF SERVICE enterprise_policy:
DUMP OF SERVICE entropy:
DUMP OF SERVICE gfxinfo:
DUMP OF SERVICE hardware:
DUMP OF SERVICE harmony_eas_service:
DUMP OF SERVICE input:
DUMP OF SERVICE input_method:
DUMP OF SERVICE iphonesubinfo:
DUMP OF SERVICE isms:
DUMP OF SERVICE license_log_service:
DUMP OF SERVICE location:
DUMP OF SERVICE lock_settings:
DUMP OF SERVICE log_manager_service:
DUMP OF SERVICE mdm.remotedesktop:
DUMP OF SERVICE media.audio_flinger:
DUMP OF SERVICE media.audio_policy:
DUMP OF SERVICE media.camera:
DUMP OF SERVICE media.player:
DUMP OF SERVICE meminfo:
DUMP OF SERVICE motion_recognition:
DUMP OF SERVICE mount:
DUMP OF SERVICE multiwindow:
DUMP OF SERVICE netpolicy:
DUMP OF SERVICE netstats:
DUMP OF SERVICE network_management:
DUMP OF SERVICE nfc:
DUMP OF SERVICE nfccontroller:
DUMP OF SERVICE notification:
DUMP OF SERVICE package:
DUMP OF SERVICE permission:
DUMP OF SERVICE phone:
DUMP OF SERVICE phone_restriction_policy:
DUMP OF SERVICE phoneext:
DUMP OF SERVICE power:
DUMP OF SERVICE remoteinjection:
DUMP OF SERVICE samplingprofiler:
DUMP OF SERVICE samsung.smartfaceservice:
DUMP OF SERVICE scheduling_policy:
DUMP OF SERVICE search:
DUMP OF SERVICE sec_analytics:
DUMP OF SERVICE secontroller:
DUMP OF SERVICE sensorservice:
DUMP OF SERVICE serial:
DUMP OF SERVICE servicediscovery:
DUMP OF SERVICE simphonebook:
DUMP OF SERVICE sip:
DUMP OF SERVICE statusbar:
DUMP OF SERVICE telephony.registry:
DUMP OF SERVICE textservices:
DUMP OF SERVICE tvoutservice:
DUMP OF SERVICE uimode:
DUMP OF SERVICE updatelock:
DUMP OF SERVICE usagestats:
DUMP OF SERVICE usb:
DUMP OF SERVICE user:
DUMP OF SERVICE vibrator:
DUMP OF SERVICE voip:
DUMP OF SERVICE wallpaper:
DUMP OF SERVICE wfd:
DUMP OF SERVICE wifi:
DUMP OF SERVICE wifi_policy:
DUMP OF SERVICE wifip2p:
DUMP OF SERVICE window:
二、具体命令如何查看帮助
从上面可以看出Service非常多,“DUMP OF SERVICE”关键字后面的单词都可以直接通过 dumpsys + 单词 查看相关信息,具体每一个如何使用有一种通用的查看帮助的办法。
查看每一个命令的使用帮助,以下以meminfo 为例演示:
shell@m:/ $ dumpsys meminfo -h
dumpsys meminfo -h
meminfo dump options: [-a] [--oom] [process]
-a: include all available information for each process.
--oom: only show processes organized by oom adj.
If [process] is specified it can be the name or
pid of a specific process to dump.
三、一些关键命令解释
名字 | 功能 |
account | 显示accounts信息 |
activity | 显示所有的activities的信息 |
cpuinfo | 显示CPU信息 |
window | 显示键盘,窗口和它们的关系 |
wifi | 显示wifi信息 |
batteryinfo $package_name | 电量信息及CPU 使用时长 |
package packagename | 获取安装包信息 |
usagestats | 每个界面启动的时间 |
statusbar | 显示状态栏相关的信息 |
meminfo | 内存信息(meminfo $package_name or $pid 使用程序的包名或者进程id显示内存信息) |
diskstats | 磁盘相关信息 |
battery | 电池信息 |
alarm | 显示Alarm信息 |
activity - 使用adb shell dumpsys检测Android的Activity任务栈
window - 通过adb shell dumpsys命令获取当前应用的component
statusbar - 找出广告通知属于哪个应用
dumpsys statusbar | grep notification=Notification
四、参考资料
Dumpsys (官方文档)
How to discover memory usage of my application in Android
android中dumpsys函数介绍与使用 (代码分析)
来自:http://blog.csdn.net/androiddevelop/article/details/37689339