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

相关推荐
帅得不敢出门5 小时前
MTK Android11获取真实wifi mac地址
android·mtk
成都大菠萝5 小时前
2-2-16 快速掌握Kotlin-泛型扩展函数
android
I'm Jie5 小时前
Gradle 多模块依赖集中管理方案,Version Catalogs 详解(Kotlin DSL)
android·java·spring boot·kotlin·gradle·maven
BoomHe5 小时前
Android 13 (API 33)开发自己的 Settings ,如何配置 WiFi BT 权限
android
城东米粉儿5 小时前
ConcurrentHashMap实现原理 笔记
android
佳哥的技术分享6 小时前
System.setProperty vs adb setprop (Android SystemProperties)
android·adb
Channing Lewis7 小时前
mysql.connector.errors.OperationalError: 1040 (08004): Too many connections
数据库·mysql·adb
Railshiqian7 小时前
通过adb命令获取某个window或View/子View的绘制内容并输出为png图片的方法
android·adb·dump view
XI锐真的烦7 小时前
新手该如何选择 Android 开发框架?
android