【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 开发与调试指南

相关推荐
my_power5201 小时前
车载安卓面试题汇总
android
csj501 小时前
安卓基础之《(15)—内容提供者(1)在应用之间共享数据》
android
yeziyfx2 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
2501_915918413 小时前
只有 Flutter IPA 文件,通过多工具组合完成有效混淆与保护
android·flutter·ios·小程序·uni-app·iphone·webview
robotx3 小时前
AOSP 设置-提示音和振动 添加一个带有开关(Switch)的设置项
android
青莲8433 小时前
RecyclerView 完全指南
android·前端·面试
青莲8433 小时前
Android WebView 混合开发完整指南
android·前端·面试
龙之叶4 小时前
【Android Monkey源码解析三】- 运行解析
android
KevinWang_5 小时前
Android 的 assets 资源和 raw 资源有什么区别?
android
码农幻想梦6 小时前
2021Android从零入门到实战(慕课网官方账号)
android