`
su1216
  • 浏览: 662328 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
深入入门正则表达式(jav...
浏览量:71089
E60283d7-4822-3dfb-9de4-f2377e30189c
android手机的安全问...
浏览量:127710
社区版块
存档分类
最新评论

android中dumpsys函数介绍与使用

阅读更多

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

 

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

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;
	}
}

我只会java,上面的代码还是留给大家自己阅读吧,我就不详细解释了……

如果参数个数=1,则在ServiceManager中查找注册的Service

否则查找指定的Service,并且将剩余参数传给Serivce

 

 

如果执行dumpsys命令,那么将会dump所有Service,每个Service之间会分隔开

如果dumpsys一个没有注册的Service,那么则提示找不到Service,比如:

# dumpsys adb                                                   

Can't find service: adb

 

 

 

那么我们到底都可以dump一些什么呢?

其实最简单的办法就是执行dumpsys,看看其结果,下面是我手机中执行的结果(HTCg14)

# 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的函数

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

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就是服务的名字

public static final String WIFI_P2P_SERVICE = "wifip2p";

 

 

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

@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

ServiceManager.addService("diskstats", new DiskStatsService(context));
这回大家知道去哪看源码了吧,下面是DiskStatsService的dump函数
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);
}
 
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地址

http://su1216.iteye.com/

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

 

1
1
分享到:
评论
1 楼 1025250620 2013-04-03  
写的很详细~谢谢分享~

相关推荐

    Android中dumpsys命令用法简单介绍

    在Android手机上, 通过使用adb shell命令可以进入android系统的shell, 该shell除支持一些常用的标准命令之外,还支持一些和android系统相关的其他命令, 这些命令可以打印出系统当前的状态信息。 dumpsys就是这样...

    Android 分析工具-dumpsys

    不需要打trace了,实时监控关心的关键信息的值...Android的服务基本都有dump信息,debug的利器,效率极高(相比trace和断点调试) 开发、维护人员需要经常使用并熟悉相关的表示 适时扩展dump的输出及格式,方便适时调试。

    Android脚本中写服务应用中启动服务

    Android脚本init.rc中写service,应用中启动该service

    华为手机P30的Input 的Dumpsys信息详解.txt

    本资源以华为P30为例,详解地分析dumpsys input 的信息:1 帮助用户了解dumpsys 命令; 2 分析华为P30 的输入设备以及配置文件; 3. 针对input 的参数详解;

    android启动相机三种方式

    基于android 2.3.3 三种调用相机的方式 分别为使用android自带的照相功能 指定存储目录 使用SurfaceHolder预览相机的图片

    (Mac/Linux版)Android实时显示帧率(GameBench)

    android帧率可以通过adb shell dumpsys gfxinfo packages来查看,但是需要分析log,这种特别麻烦,分享一个免root获取帧率工具。注意:.jar文件在PC上运行。

    android群雄传

    第7章 Android动画机制与使用技巧 162 7.1 Android View动画框架 163 7.1.1 透明度动画 163 7.1.2 旋转动画 163 7.1.3 位移动画 164 7.1.4 缩放动画 164 7.1.5 动画集合 164 7.2 Android属性动画分析 165 ...

    android audio 音频调试技巧

    android audio 音频调试技巧,pcm 声卡使用情况查看。dumpsys *audio*等

    android9.0ble补丁蓝牙语音遥控器支持补丁.rar

    目前通过ble hal实现从hidraw中读取遥控器语音数据,在Android框架层上就通过配置文件将ble hal导入到音频框架中,并通过绑定Android原生已有的耳麦设备来完成audio音频策略选择,通过apk检测ble连接状态,通知audio...

    cepheus_input.txt(dumpsys input信息)

    dumpsys input信息 cepheus_input.txt(小米9机器)

    Android读取本地图库与调用摄像头拍摄

    本文主要介绍如何读取Android本地图库的图片以及调用安卓的摄像头进行拍摄。 一、布局 布局比较简单,MainActviivty的布局文件只有两个按钮,一个是读取图库的,另一个是打开摄像头的,另外ResultActivity的布局只有...

    dumpsys命令1

    dumpsys命令这是安卓提供的调试命令.和名字的翻译一样,倾倒系统信息.主要用来查询系统服务的运行状态.列出所有的系统服务:adb shell dumpsys

    easy-dumpsys:输出以下adb命令的脚本:`adb shell dumpsys activity `以更小,更容易和用户友好的方式..

    easy-dumpsys:输出以下adb命令的脚本:`adb shell dumpsys activity `以更小,更容易和用户友好的方式..

    Android代码-XiaomiPJ

    title: 辅助功能 之 小米手机悬浮窗权限 date: 2016-06-02 16:19:59 categories: android ...这个方法应该有很多中,但是我只验证了一种:想到了 adb shell dumpsys activity usb链接电脑后,手动打开应用

    Android设备挂机dump日志抓取脚本bat

    使用bat脚本编写,简单,点击就能用 不要安装各种软件环境

    NDK13_C++基础:构造函数、拷贝构造函数、浅拷贝与深拷贝.zip

    adb shell 进入,命令: dumpsys meminfo 包名 MyTeacher teacher; 1 C++中 这个语句执行完毕,在当前的堆内存内 初始化并且赋值好该对象 在java中执行这个语句,只是开辟了一块内存空间,并没初始化和赋值...

    Android系统添加自己写的工具

    android/external android 使用的一些开源的模组 android/frameworks/base/cmds 一些android重要命令:am、app_proce等 实际上这些工具都是小应用。调试串口接电脑,开启控制台可以使用这些工具。如果USB连电脑,...

Global site tag (gtag.js) - Google Analytics