在 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 注册的服务名
现在你知道它是通过 PowerManagerService 的 dump 输出的,你需要知道 PowerManagerService 对应的 dumpsys 名字。
- 查看
PowerManagerService的onStart方法或构造函数。 - 寻找
publishBinderService(Context.POWER_SERVICE, ...)。 Context.POWER_SERVICE对应的字符串是"power"。
结论: 基础命令是 adb shell dumpsys power。
4. 确认是否需要加参数(进阶)
有些服务(如 power 或 activity)为了防止输出太多,会根据参数过滤输出。
- 观察
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:
- 搜引用 :在源码里搜
X mX或new X(,看哪个 Service 类引用了它。 - 搜调用 :在那个 Service 类里搜
mX.dump(,确认它确实在 Service 的dump流程中。 - 查服务名 :查看该 Service 注册时用的字符串常量(通常在
SystemServer.java或该 Service 的onStart中)。 - 执行命令 :
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(包括子类)。