【AOSP】Android Dump 信息快速定位方法

在 Android Framework 开发中,要找到某个类中 dump() 信息输出对应的 adb 命令,大部分拥有 dump() 方法的类,通常是某个系统服务的一部分,或者被某个系统服务所持有,dumpsys面向系统服务(System Service) 的。

【AOSP】Android Dump 信息快速定位方法

  • [1. 寻找 Service 注册名称](#1. 寻找 Service 注册名称)
  • [2. 查看 `adb shell dumpsys -l` (List)](#2. 查看 adb shell dumpsys -l (List))
  • [3. 查看类的调用链(代码追踪法)](#3. 查看类的调用链(代码追踪法))
    • [3.1 逆向溯源调用链演示示例](#3.1 逆向溯源调用链演示示例)
  • [4. 万能 Grep 法(暴力搜索)](#4. 万能 Grep 法(暴力搜索))
  • [5. 常见类与命令的对应关系](#5. 常见类与命令的对应关系)
  • [6. 利用 `dumpsys <service> -h` 查看子参数](#6. 利用 dumpsys <service> -h 查看子参数)

1. 寻找 Service 注册名称

如果这个类本身就是一个系统服务(继承自 Binder 或实现了 IBinder 接口),你需要找到它在 ServiceManager 中注册的名字。

搜索关键字: 在代码中搜索 addService(publishBinderService(
示例: 如果你在看 AlarmManagerService.java,你会发现:

java 复制代码
// 在 SystemServer.java 或 Service 内部
publishBinderService(Context.ALARM_SERVICE, mService);

对应的 Context.ALARM_SERVICE 常量通常是 "alarm",所以命令就是:adb shell dumpsys alarm,可以在 Context 找到常用的大部分的 Service 对应名。

java 复制代码
// android.content.Context.java

@StringDef(suffix = { "_SERVICE" }, value = {
        POWER_SERVICE,
        //@hide: POWER_STATS_SERVICE,
        WINDOW_SERVICE,
        LAYOUT_INFLATER_SERVICE,
        ACCOUNT_SERVICE,
        ACTIVITY_SERVICE,
        ALARM_SERVICE,
        NOTIFICATION_SERVICE,
        ACCESSIBILITY_SERVICE,
        CAPTIONING_SERVICE,
        KEYGUARD_SERVICE,
        LOCATION_SERVICE,
        HEALTHCONNECT_SERVICE,
        //@hide: COUNTRY_DETECTOR,
        SEARCH_SERVICE,
        SENSOR_SERVICE,
        SENSOR_PRIVACY_SERVICE,
        STORAGE_SERVICE,
        STORAGE_STATS_SERVICE,
        WALLPAPER_SERVICE,
        VIBRATOR_MANAGER_SERVICE,
        VIBRATOR_SERVICE,
        //@hide: STATUS_BAR_SERVICE,
        THREAD_NETWORK_SERVICE,
        CONNECTIVITY_SERVICE,
        PAC_PROXY_SERVICE,
        VCN_MANAGEMENT_SERVICE,
        //@hide: IP_MEMORY_STORE_SERVICE,
        IPSEC_SERVICE,
        VPN_MANAGEMENT_SERVICE,
        TEST_NETWORK_SERVICE,
        //@hide: UPDATE_LOCK_SERVICE,
        //@hide: NETWORKMANAGEMENT_SERVICE,
        NETWORK_STATS_SERVICE,
        //@hide: NETWORK_POLICY_SERVICE,
        WIFI_SERVICE,
        WIFI_AWARE_SERVICE,
        WIFI_P2P_SERVICE,
        WIFI_SCANNING_SERVICE,
        //@hide: LOWPAN_SERVICE,
        //@hide: WIFI_RTT_SERVICE,
        //@hide: ETHERNET_SERVICE,
        WIFI_RTT_RANGING_SERVICE,
        NSD_SERVICE,
        AUDIO_SERVICE,
        AUDIO_DEVICE_VOLUME_SERVICE,
        AUTH_SERVICE,
        FINGERPRINT_SERVICE,
        //@hide: FACE_SERVICE,
        BIOMETRIC_SERVICE,
        MEDIA_ROUTER_SERVICE,
        TELEPHONY_SERVICE,
        TELEPHONY_SUBSCRIPTION_SERVICE,
        CARRIER_CONFIG_SERVICE,
        EUICC_SERVICE,
        //@hide: MMS_SERVICE,
        TELECOM_SERVICE,
        CLIPBOARD_SERVICE,
        INPUT_METHOD_SERVICE,
        TEXT_SERVICES_MANAGER_SERVICE,
        TEXT_CLASSIFICATION_SERVICE,
        APPWIDGET_SERVICE,
        //@hide: VOICE_INTERACTION_MANAGER_SERVICE,
        //@hide: BACKUP_SERVICE,
        REBOOT_READINESS_SERVICE,
        ROLLBACK_SERVICE,
        DROPBOX_SERVICE,
        //@hide: DEVICE_IDLE_CONTROLLER,
        //@hide: POWER_WHITELIST_MANAGER,
        DEVICE_POLICY_SERVICE,
        UI_MODE_SERVICE,
        DOWNLOAD_SERVICE,
        NFC_SERVICE,
        BLUETOOTH_SERVICE,
        //@hide: SIP_SERVICE,
        USB_SERVICE,
        LAUNCHER_APPS_SERVICE,
        //@hide: SERIAL_SERVICE,
        //@hide: HDMI_CONTROL_SERVICE,
        INPUT_SERVICE,
        DISPLAY_SERVICE,
        //@hide COLOR_DISPLAY_SERVICE,
        USER_SERVICE,
        RESTRICTIONS_SERVICE,
        APP_OPS_SERVICE,
        ROLE_SERVICE,
        //@hide ROLE_CONTROLLER_SERVICE,
        CAMERA_SERVICE,
        //@hide: PLATFORM_COMPAT_SERVICE,
        //@hide: PLATFORM_COMPAT_NATIVE_SERVICE,
        PRINT_SERVICE,
        CONSUMER_IR_SERVICE,
        //@hide: TRUST_SERVICE,
        TV_INTERACTIVE_APP_SERVICE,
        TV_INPUT_SERVICE,
        //@hide: TV_TUNER_RESOURCE_MGR_SERVICE,
        //@hide: NETWORK_SCORE_SERVICE,
        USAGE_STATS_SERVICE,
        MEDIA_SESSION_SERVICE,
        MEDIA_COMMUNICATION_SERVICE,
        BATTERY_SERVICE,
        JOB_SCHEDULER_SERVICE,
        PERSISTENT_DATA_BLOCK_SERVICE,
        //@hide: OEM_LOCK_SERVICE,
        MEDIA_PROJECTION_SERVICE,
        MIDI_SERVICE,
        RADIO_SERVICE,
        HARDWARE_PROPERTIES_SERVICE,
        //@hide: SOUND_TRIGGER_SERVICE,
        SHORTCUT_SERVICE,
        //@hide: CONTEXTHUB_SERVICE,
        SYSTEM_HEALTH_SERVICE,
        //@hide: INCIDENT_SERVICE,
        //@hide: INCIDENT_COMPANION_SERVICE,
        //@hide: STATS_COMPANION_SERVICE,
        COMPANION_DEVICE_SERVICE,
        VIRTUAL_DEVICE_SERVICE,
        CROSS_PROFILE_APPS_SERVICE,
        //@hide: SYSTEM_UPDATE_SERVICE,
        //@hide: TIME_DETECTOR_SERVICE,
        //@hide: TIME_ZONE_DETECTOR_SERVICE,
        PERMISSION_SERVICE,
        LIGHTS_SERVICE,
        LOCALE_SERVICE,
        //@hide: PEOPLE_SERVICE,
        //@hide: DEVICE_STATE_SERVICE,
        //@hide: SPEECH_RECOGNITION_SERVICE,
        UWB_SERVICE,
        MEDIA_METRICS_SERVICE,
        //@hide: ATTESTATION_VERIFICATION_SERVICE,
        //@hide: SAFETY_CENTER_SERVICE,
        DISPLAY_HASH_SERVICE,
        CREDENTIAL_SERVICE,
        DEVICE_LOCK_SERVICE,
        VIRTUALIZATION_SERVICE,
        GRAMMATICAL_INFLECTION_SERVICE,
        SECURITY_STATE_SERVICE,
       //@hide: ECM_ENHANCED_CONFIRMATION_SERVICE,
        CONTACT_KEYS_SERVICE,
})

2. 查看 adb shell dumpsys -l (List)

如果你大概知道这个类属于哪个模块,但不确定具体的服务名,可以直接列出系统中所有已注册的服务:

bash 复制代码
adb shell dumpsys -l

这会输出一个超长的列表,如 activity, window, package, battery 等。你可以通过模糊匹配找到相关的服务。

3. 查看类的调用链(代码追踪法)

如果这个类不是顶级服务(例如 Task, ActivityRecord, WindowState),那么它的 dump 方法一定是被其"父级"持有的。

方法: 在 IDE(如 AOSP 源码树或 Android Studio)中,右键点击该类的 dump 方法,选择 "Find Usages"
示例:

  • ActivityRecord.dump() 会被 Task.dump() 调用。
  • Task.dump() 会被 TaskDisplayArea.dump() 调用。
  • 最终你会追踪到 ActivityTaskManagerService.dump()
  • 对应的命令就是:adb shell dumpsys activity (或 activity containers)。

3.1 逆向溯源调用链演示示例

对于像 FaceDownDetector 这种非系统服务类 (即它没有直接在 ServiceManager 注册,而是作为某个 Service 的成员变量),要找到对应的 adb 命令,最科学的方法是**"逆向溯源调用链"**。

1. 寻找谁持有了这个类的实例 (Find Usages)

在 IDE(如 Android Studio 或 Sourcegraph)中,搜索 new FaceDownDetector 或者查看它所在的包名。

  • FaceDownDetector 位于 com.android.server.power 包下。
  • 通过搜索发现,它被 PowerManagerService 所持有。

2. 寻找该类的 dump 方法在哪里被调用

在代码中搜索 mFaceDownDetector.dump(。在 PowerManagerService.java 中,你会找到类似这样的代码:

java 复制代码
// PowerManagerService.java 内部
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    // ... 前面有很多其他信息的 dump
    if (mFaceDownDetector != null) {
        mFaceDownDetector.dump(pw); // 关键点:这里调用了你看到的那个方法
    }
    // ...
}

3. 确定 PowerManagerService 注册的服务名

现在你知道它是通过 PowerManagerServicedump 输出的,你需要知道 PowerManagerService 对应的 dumpsys 名字。

  1. 查看 PowerManagerServiceonStart 方法或构造函数。
  2. 寻找 publishBinderService(Context.POWER_SERVICE, ...)
  3. Context.POWER_SERVICE 对应的字符串是 "power"

结论: 基础命令是 adb shell dumpsys power

4. 确认是否需要加参数(进阶)

有些服务(如 poweractivity)为了防止输出太多,会根据参数过滤输出。

  • 观察 PowerManagerService.dump 的逻辑。如果它直接写在 dump 方法的主流程里,不带任何 if 参数判断,那么直接执行 adb shell dumpsys power 就能看到。
  • 如果搜索结果太多,你可以用 grep 过滤你在 FaceDownDetector.java 中看到的那个唯一的字符串头:
bash 复制代码
adb shell dumpsys power | grep -A 15 "FaceDownDetector:"

-A 15 表示显示匹配行后的 15 行,因为该类的 dump 输出有多行

bash 复制代码
adb shell dumpsys power | sed -n '/FaceDownDetector:/,/^$/p'

打印从包含 FaceDownDetector: 的那一行开始,到下一个空行结束之间的所有内容(包含起止行)

5. 总结:万能公式

如果你拿到一个类 X.java,不知道怎么 dump:

  1. 搜引用 :在源码里搜 X mXnew X(,看哪个 Service 类引用了它。
  2. 搜调用 :在那个 Service 类里搜 mX.dump(,确认它确实在 Service 的 dump 流程中。
  3. 查服务名 :查看该 Service 注册时用的字符串常量(通常在 SystemServer.java 或该 Service 的 onStart 中)。
  4. 执行命令adb shell dumpsys <服务名>

4. 万能 Grep 法(暴力搜索)

如果你已经连上了真机或模拟器,可以直接在所有 dumpsys 输出中搜索类名,看看它出现在哪个段落:

bash 复制代码
# 假设你想找类 DisplayContent 的 dump 信息
adb shell dumpsys | grep -C 20 "DisplayContent"

注意:这个命令执行很慢,因为会倾倒所有系统信息。

5. 常见类与命令的对应关系

以下是开发中最常涉及的类及其对应的 dumpsys 命令:

类名所在模块 对应的常用命令 备注
ActivityManagerService / ActivityRecord adb shell dumpsys activity 包含 activities, services, processes 等
WindowManagerService / WindowState adb shell dumpsys window 包含 windows, displays, tokens
PackageManagerService adb shell dumpsys package 包信息、权限
InputMethodManagerService adb shell dumpsys input_method 输入法状态
DisplayManagerService adb shell dumpsys display 屏幕、亮度等
PowerManagerService adb shell dumpsys power 电量、休眠锁
BatteryService adb shell dumpsys battery 电池详情
NotificationManagerService adb shell dumpsys notification 通知记录
ConnectivityService adb shell dumpsys connectivity 网络连接

查看 SystemUI 中的 dump 信息可以直接使用:adb shell dumpsys activity service com.android.systemui,这个是 SystemUI 中全局定义的一个接口。

java 复制代码
/**
 * Implemented by classes who want to be in:
 *   {@code adb shell dumpsys activity service com.android.systemui}
 *
 * @see DumpManager
 */
public interface Dumpable {

    /**
     * Called when it's time to dump the internal state
     * @param pw Where to write your dump to.
     * @param args Arguments.
     */
    void dump(@NonNull PrintWriter pw, @NonNull String[] args);
}

6. 利用 dumpsys <service> -h 查看子参数

很多大型服务(如 activity, window)支持子参数,只输出特定类的信息。

  • 输入 adb shell dumpsys activity -h 可以看到它支持 activities, processes, services 等。
  • 输入 adb shell dumpsys window -a 可以输出该服务下所有对象的详细 dump(包括子类)。

相关参考:
【AOSP】Android Dump 开发与调试指南

相关推荐
LeeeX!几秒前
YOLOv13全面解析与安卓平台NCNN部署实战:超图视觉重塑实时目标检测的精度与效率边界
android·深度学习·yolo·目标检测·边缘计算
dongdeaiziji12 分钟前
Android 图片预加载和懒加载策略
android
一起养小猫1 小时前
Flutter for OpenHarmony 实战:科学计算器完整开发指南
android·前端·flutter·游戏·harmonyos
帅得不敢出门1 小时前
Android定位RK编译的system.img比MTK大350M的原因
android·framework·策略模式
darkb1rd2 小时前
三、PHP字符串处理与编码安全
android·安全·php
qinyia2 小时前
在Ubuntu 22.04.5 LTS上安装MySQL 8并设置root密码的完整协作流程
mysql·ubuntu·adb
STCNXPARM11 小时前
Android camera之硬件架构
android·硬件架构·camera
2501_9445255412 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
松☆14 小时前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
_李小白15 小时前
【Android 美颜相机】第二十三天:GPUImageDarkenBlendFilter(变暗混合滤镜)
android·数码相机