android中dumpsys函数介绍与使用

dumpsys是系统中重要的函数,我们来看看它如何使用,都能dump出来一些什么东西

 

首先我们来看看dumpsys的源码,在4.1中,它在framework/native目录下面

frameworks/native/cmds/dumpsys/dumpsys.cpp

Cpp代码  收藏代码

  1. if (argc == 1) {  
  2.     services = sm->listServices();  
  3.     services.sort(sort_func);  
  4.     args.add(String16("-a"));  
  5. } else {  
  6.     services.add(String16(argv[1]));  
  7.     for (int i=2; i<argc; i++) {  
  8.         args.add(String16(argv[i]));  
  9.     }  
  10. }  
  11.   
  12. const size_t N = services.size();  
  13.   
  14. if (N > 1) {  
  15.     // first print a list of the current services  
  16.     aout << "Currently running services:" << endl;  
  17.   
  18.     for (size_t i=0; i<N; i++) {  
  19.         sp<IBinder> service = sm->checkService(services[i]);  
  20.         if (service != NULL) {  
  21.             aout << "  " << services[i] << endl;  
  22.         }  
  23.     }  
  24. }  
  25.   
  26. for (size_t i=0; i<N; i++) {  
  27.     sp<IBinder> service = sm->checkService(services[i]);  
  28.     if (service != NULL) {  
  29.         if (N > 1) {//dump多个Service时,Service信息之间的分隔  
  30.             aout << "------------------------------------------------------------"  
  31.                     "-------------------" << endl;  
  32.             aout << "DUMP OF SERVICE " << services[i] << ":" << endl;  
  33.         }  
  34.         int err = service->dump(STDOUT_FILENO, args);  
  35.         if (err != 0) {  
  36.             aerr << "Error dumping service info: (" << strerror(err)  
  37.                     << ") " << services[i] << endl;  
  38.         }  
  39.     } else {  
  40.         aerr << "Can't find service: " << services[i] << endl;  
  41.     }  
  42. }  

我只会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代码  收藏代码

  1. # dumpsys  
  2. Currently running services:  
  3.   DeviceManager3LM  
  4.   Encryption3LMService  
  5.   HtcAppUsageStatsService  
  6.   SurfaceFlinger  
  7.   accessibility  
  8.   account  
  9.   activity  
  10.   alarm  
  11.   appwidget  
  12.   audio  
  13.   backup  
  14.   battery  
  15.   batteryinfo  
  16.   bluetooth  
  17.   bluetooth_a2dp  
  18.   bluetooth_hid  
  19.   bt_fm_management  
  20.   clipboard  
  21.   connectivity  
  22.   content  
  23.   country_detector  
  24.   cpuinfo  
  25.   device_policy  
  26.   devicestoragemonitor  
  27.   diskstats  
  28.   display  
  29.   drm.drmManager  
  30.   dropbox  
  31.   entropy  
  32.   gfxinfo  
  33.   hardware  
  34.   htc_checkin  
  35.   htchardware  
  36.   htctelephony  
  37.   htctelephonyinternal  
  38.   input_method  
  39.   iphonesubinfo  
  40.   isms  
  41.   location  
  42.   media.audio_flinger  
  43.   media.audio_policy  
  44.   media.camera  
  45.   media.player  
  46.   meminfo  
  47.   mount  
  48.   netpolicy  
  49.   netstats  
  50.   network_management  
  51.   notification  
  52.   package  
  53.   permission  
  54.   phone  
  55.   power  
  56.   samplingprofiler  
  57.   search  
  58.   secfirewall  
  59.   secloader  
  60.   sensorservice  
  61.   simphonebook  
  62.   sip  
  63.   statusbar  
  64.   stub_activity  
  65.   stub_audio  
  66.   stub_iphonesubinfo  
  67.   stub_isms  
  68.   stub_location  
  69.   stub_phone  
  70.   stub_telephony.registry  
  71.   telephony.registry  
  72.   textservices  
  73.   throttle  
  74.   uimode  
  75.   usagestats  
  76.   usb  
  77.   usbnet  
  78.   userbehavior  
  79.   vibrator  
  80.   wallpaper  
  81.   wifi  
  82.   wifip2p  
  83.   window  
  84. -------------------------------------------------------------------------------  
  85. DUMP OF SERVICE DeviceManager3LM:  
  86. -------------------------------------------------------------------------------  
  87. DUMP OF SERVICE Encryption3LMService:  

由于dump service的log实在太长,我就截取了最前面的“Currently running services”和两个Service的dump信息

为什么DeviceManager3LM和Encryption3LMService后面没有内容?这和Service的内部实现有关,也许它只是写了一个空的dump函数,也许有什么其他条件。

这个问题一会再说,我们先看看这些Service都是在哪注册的

其中大部分Service都是在SystemServer中的main函数里注册的,它调用了一个叫init2的函数

Java代码  收藏代码

  1. public static final void init2() {  
  2.     Slog.i(TAG, "Entered the Android system server!");  
  3.     Thread thr = new ServerThread();  
  4.     thr.setName("android.server.ServerThread");  
  5.     thr.start();  
  6. }  

init2非常简单,所有任务都交给新线程ServerThread来处理

 

在ServerThread的run函数中,注册了系统大部分的Service,有兴趣的同学可以看看这部分代码

这部分代码有点长(大概800行),因为它一直重复这建立各种Service,然后注册,输出log

比如下面的WifiP2pService

Java代码  收藏代码

  1. try {  
  2.     Slog.i(TAG, "Wi-Fi P2pService");  
  3.     wifiP2p = new WifiP2pService(context);  
  4.     ServiceManager.addService(Context.WIFI_P2P_SERVICE, wifiP2p);  
  5. } catch (Throwable e) {  
  6.     reportWtf("starting Wi-Fi P2pService", e);  
  7. }  

其中WIFI_P2P_SERVICE就是服务的名字

Java代码  收藏代码

  1. public static final String WIFI_P2P_SERVICE = "wifip2p";  

 

 

当执行dumpsys wifip2p的时候,并没有任何输出,为什么呢?我们看看WifiP2pService的代码

Java代码  收藏代码

  1. @Override  
  2. protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {  
  3.     if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)  
  4.             != PackageManager.PERMISSION_GRANTED) {  
  5.         pw.println("Permission Denial: can't dump WifiP2pService from from pid="  
  6.                 + Binder.getCallingPid()  
  7.                 + ", uid=" + Binder.getCallingUid());  
  8.         return;  
  9.     }  
  10. }  

现在似乎可以理解为什么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代码  收藏代码

  1. ServiceManager.addService("diskstats", new DiskStatsService(context));  

这回大家知道去哪看源码了吧,下面是DiskStatsService的dump函数

Java代码  收藏代码

  1. protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {  
  2.     ……  
  3.     reportFreeSpace(Environment.getDataDirectory(), "Data", pw);  
  4.     reportFreeSpace(Environment.getDownloadCacheDirectory(), "Cache", pw);  
  5.     reportFreeSpace(new File("/system"), "System", pw);  
  6. }  

 

Java代码  收藏代码

  1. private void reportFreeSpace(File path, String name, PrintWriter pw) {  
  2.     try {  
  3.         StatFs statfs = new StatFs(path.getPath());  
  4.         long bsize = statfs.getBlockSize();  
  5.         long avail = statfs.getAvailableBlocks();  
  6.         long total = statfs.getBlockCount();  
  7.         if (bsize <= 0 || total <= 0) {  
  8.             throw new IllegalArgumentException(  
  9.                     "Invalid stat: bsize=" + bsize + " avail=" + avail + " total=" + total);  
  10.         }  
  11.   
  12.         pw.print(name);  
  13.         pw.print("-Free: ");  
  14.         pw.print(avail * bsize / 1024);  
  15.         pw.print("K / ");  
  16.         pw.print(total * bsize / 1024);  
  17.         pw.print("K total = ");  
  18.         pw.print(avail * 100 / total);  
  19.         pw.println("% free");  
  20.     } catch (IllegalArgumentException e) {  
  21.         pw.print(name);  
  22.         pw.print("-Error: ");  
  23.         pw.println(e.toString());  
  24.         return;  
  25.     }  
  26. }  

大家肯定还对其他的Service感兴趣,比如notification!

之前我的一篇关于android安全的文章提到过用dumpsys notification能作些什么

android手机root后的安全问题 (二)

 

 

 

 

 

 

转贴请保留以下链接

本人blog地址

http://su1216.iteye.com/

http://blog.csdn.net/su1216/

 

 

 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值