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

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

    例如,`meminfo`服务就是在`ActivityManagerService`的`setSystemProcess`函数中注册的,它用于提供内存使用情况的详细数据。 `dumpsys meminfo`命令用于查看应用的内存使用情况,包括PSS(Proportional Set Size)...

    调试跟踪Android Framework源代码 实例

    4. **使用Tracer for Android**:这是Android提供的一种性能分析工具,可以跟踪特定函数的调用时间,帮助找出性能瓶颈。通过`atrace -z`命令可以实时追踪,`atrace --async_start`和`atrace --async_stop`用于开始和...

    Android input设备注册发送key

    在Android系统中,输入设备(Input Device)是用户与设备交互的重要途径,涵盖了触摸屏、键盘、鼠标等各种形式。为了使这些设备能在Android系统中正常工作,开发者需要进行相应的注册和配置。本篇将深入探讨如何在...

    android分析工具说明书.rar

    "android分析工具说明书.rar"这个压缩包很可能是提供了一份详尽的指南,介绍了如何使用各种Android分析工具来分析程序内存、监控对象属性变化等关键任务。 一、Android分析工具介绍 1. **Android Studio Profiler*...

    Android内存检测

    在源码中,可以查看到与内存分配、释放和垃圾收集相关的函数,如`malloc()`、`free()`和GC相关的触发条件。通过阅读和理解这些源码,开发者可以更精确地了解内存分配的过程,从而找出潜在的内存泄漏问题。 接下来,...

    Android APK性能测试 procrank等工具

    在Android应用开发中,性能测试是确保应用质量的关键环节,特别是在资源有限的移动设备上。本文将深入探讨如何使用`procrank`等工具进行APK的性能测试,包括CPU使用率、进程内存占用等方面的检测。 一、Android APK...

    Android 屏幕刷新率分析

    代码实现中,我们可以使用 Choreographer.getInstance().postFrameCallback() 方法来注册 VSYNC 信号回调监听,当 VSYNC 信号返回时,会执行 doFrame 回调函数。 在 doFrame 方法中,我们统计每秒内的执行次数,...

    Python获取android设备cpu和内存占用情况

    在本文中,我们将深入探讨如何使用Python通过ADB(Android Debug Bridge)来获取Android设备上特定应用的CPU和内存占用情况。这个过程对于Android应用的性能分析、优化以及故障排查至关重要。 首先,要实现这个功能,...

    traceview测试的源码module

    1. **启用TraceView**:要在应用中收集`.trace`文件,可以在代码中使用`android.os.Debug.startMethodTracing()`来启动追踪,然后在适当的位置使用`android.os.Debug.stopMethodTracing()`来停止。此外,也可以在ADB...

    platform-tools.zip

    在Android应用开发过程中,开发者需要安装和使用这些工具来构建、调试和发布应用程序。下面将详细介绍其中包含的一些关键工具及其用途。 1. **adb (Android Debug Bridge)**:这是一个多功能命令行工具,用于连接...

    init、zygote、system-server、watchdog分析

    3. **system-server**:Android系统中重要的守护进程之一,负责管理与协调各种系统服务。 4. **watchdog**:监视系统服务运行状态的守护进程,如果发现某些服务挂掉会自动重启这些服务,保证了系统的稳定性。 #### ...

    《自拍教程61》Python adb反复启动退出高德地图App

    通过以上介绍,我们可以了解到如何使用Python结合adb命令对Android应用进行自动化测试,尤其适用于解决偶发性问题的重现和压力测试。在实际工作中,可以根据具体需求调整脚本,适应不同的测试场景。

    WhiteListDemo

    打开相应功能页面,调用命令行 adb shell dumpsys activity top 查看页面信息 新建 xxxOperation 类,继承 DefaultOperation 类,完善代码 WhiteListManager 类构造函数中注册自己的 xxxOperation 类 MainActivity ...

    adb取安卓模拟器点击坐标-易语言

    在Android开发和测试中,`adb (Android Debug Bridge)` 是一个强大的命令行工具,用于与连接的设备进行通信。在本教程中,我们将探讨如何使用ADB来获取安卓模拟器的点击坐标,并通过易语言(E Language)实现相关...

    使用python+poco+夜神模拟器进行自动化测试实例

    - 如果遇到Python中的adb版本与夜神模拟器中的adb版本不一致的问题,可以使用更高版本的adb替换低版本的adb。 - 可以创建批处理文件自动化地复制编译好的版本,并将其安装到夜神模拟器中,进一步提高自动化程度。 ...

    python+adb+monkey实现Rom稳定性测试详解

    可以使用Python的`subprocess.Popen()`函数执行`logcat`命令,监控日志输出。此外,为了检测黑屏问题,还需要定时获取CPU和内存信息,这可以通过执行`dumpsys meminfo`和`cpuinfo`命令实现。 测试结果展示了这种...

Global site tag (gtag.js) - Google Analytics