dumpsys audio是Android系统内置的音频诊断工具,通过调用AudioService的dump方法,输出系统音频服务的完整运行时状态。AudioService作为音频系统的"总控台",运行在system_server进程中,负责管理音量调节、音频焦点、设备连接等核心策略,其输出信息可直观反映音频系统的实时状态。
核心源码:/frameworks/base/services/core/java/com/android/server/audio/AudioService.java
@Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
sLifecycleLogger.dump(pw);
if (mAudioHandler != null) {
pw.println("\nMessage handler (watch for unhandled messages):");
mAudioHandler.dump(new PrintWriterPrinter(pw), " ");
} else {
pw.println("\nMessage handler is null");
}
mMediaFocusControl.dump(pw);
dumpStreamStates(pw);
dumpVolumeGroups(pw);
dumpRingerMode(pw);
dumpAudioMode(pw);
pw.println("\nAudio routes:");
pw.print(" mMainType=0x"); pw.println(Integer.toHexString(
mDeviceBroker.getCurAudioRoutes().mainType));
pw.print(" mBluetoothName="); pw.println(mDeviceBroker.getCurAudioRoutes().bluetoothName);
pw.println("\nOther state:");
pw.print(" mUseVolumeGroupAliases="); pw.println(mUseVolumeGroupAliases);
pw.print(" mVolumeController="); pw.println(mVolumeController);
mSoundDoseHelper.dump(pw);
pw.print(" sIndependentA11yVolume="); pw.println(sIndependentA11yVolume);
pw.print(" mCameraSoundForced="); pw.println(isCameraSoundForced());
pw.print(" mHasVibrator="); pw.println(mHasVibrator);
pw.print(" mVolumePolicy="); pw.println(mVolumePolicy);
pw.print(" mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported);
pw.print(" mBtScoOnByApp="); pw.println(mBtScoOnByApp);
pw.print(" mIsSingleVolume="); pw.println(mIsSingleVolume);
pw.print(" mUseFixedVolume="); pw.println(mUseFixedVolume);
pw.print(" mNotifAliasRing="); pw.println(mNotifAliasRing);
pw.print(" mFixedVolumeDevices="); pw.println(dumpDeviceTypes(mFixedVolumeDevices));
pw.print(" mFullVolumeDevices="); pw.println(dumpDeviceTypes(mFullVolumeDevices));
pw.print(" absolute volume devices="); pw.println(dumpDeviceTypes(
getAbsoluteVolumeDevicesWithBehavior(
AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE)));
pw.print(" adjust-only absolute volume devices="); pw.println(dumpDeviceTypes(
getAbsoluteVolumeDevicesWithBehavior(
AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_ADJUST_ONLY)));
pw.print(" mExtVolumeController="); pw.println(mExtVolumeController);
pw.print(" mHdmiAudioSystemClient="); pw.println(mHdmiAudioSystemClient);
pw.print(" mHdmiPlaybackClient="); pw.println(mHdmiPlaybackClient);
pw.print(" mHdmiTvClient="); pw.println(mHdmiTvClient);
pw.print(" mHdmiSystemAudioSupported="); pw.println(mHdmiSystemAudioSupported);
synchronized (mHdmiClientLock) {
pw.print(" mHdmiCecVolumeControlEnabled="); pw.println(mHdmiCecVolumeControlEnabled);
}
pw.print(" mIsCallScreeningModeSupported="); pw.println(mIsCallScreeningModeSupported);
pw.print(" mic mute FromSwitch=" + mMicMuteFromSwitch
+ " FromRestrictions=" + mMicMuteFromRestrictions
+ " FromApi=" + mMicMuteFromApi
+ " from system=" + mMicMuteFromSystemCached);
dumpAccessibilityServiceUids(pw);
dumpAssistantServicesUids(pw);
pw.print(" supportsBluetoothVariableLatency=");
pw.println(AudioSystem.supportsBluetoothVariableLatency());
pw.print(" isBluetoothVariableLatencyEnabled=");
pw.println(AudioSystem.isBluetoothVariableLatencyEnabled());
dumpAudioPolicies(pw);
mDynPolicyLogger.dump(pw);
mPlaybackMonitor.dump(pw);
mRecordMonitor.dump(pw);
pw.println("\nAudioDeviceBroker:");
mDeviceBroker.dump(pw, " ");
pw.println("\nSoundEffects:");
mSfxHelper.dump(pw, " ");
pw.println("\n");
pw.println("\nEvent logs:");
mModeLogger.dump(pw);
pw.println("\n");
sDeviceLogger.dump(pw);
pw.println("\n");
sForceUseLogger.dump(pw);
pw.println("\n");
sVolumeLogger.dump(pw);
pw.println("\n");
sMuteLogger.dump(pw);
pw.println("\n");
dumpSupportedSystemUsage(pw);
pw.println("\n");
pw.println("\nSpatial audio:");
pw.println("mHasSpatializerEffect:" + mHasSpatializerEffect + " (effect present)");
pw.println("isSpatializerEnabled:" + isSpatializerEnabled() + " (routing dependent)");
mSpatializerHelper.dump(pw);
sSpatialLogger.dump(pw);
mAudioSystem.dump(pw);
}
核心输出模块解析-仅列举部分
(一)Stream volumes:音频流音量状态
Stream volumes (device: index)
- STREAM_SYSTEM (aliased to: STREAM_RING):
Muted: false
Muted Internally: false
Min: 0
Max: 100
streamVolume:0
Current: 2 (speaker): 0, 40000000 (default): 0
Devices: speaker(2)
Volume Group: AUDIO_STREAM_SYSTEM
.....
该模块展示所有音频流类型的音量配置,每条音频流包含以下关键参数:
1、基础属性
-
STREAM_XXX:音频流类型标识,如STREAM_MUSIC(媒体音乐)、STREAM_SYSTEM(系统提示音)、STREAM_RING(铃声)等 -
aliased to: XXX:表示当前音频流无独立音量控制,与目标流共享音量配置 -
Muted: true/false:用户层面的静音状态 -
Muted Internally: true/false:AudioService内部静音状态
2、音量范围
-
Min: 0:音量调节最小值 -
Max: N:音量调节最大值(不同流类型范围不同,如STREAM_MUSIC通常为0-15或0-100) -
streamVolume: X:当前系统全局音量索引值
3、设备专属音量
-
Current: [device_code](device_name): [volume_value], ...:列出各输出设备的独立音量配置,如: -
2 (speaker): 8:扬声器(设备码2)音量为8 -
4 (headset): 10:有线耳机(设备码4)音量为10 -
80 (bt_a2dp): 7:蓝牙A2DP设备(设备码80)音量为7 -
Devices: [device_name]([device_code]):当前活跃的音频输出设备
4、音量组归属
Volume Group: XXX:音频流所属的音量组,同一组内的音频流共享音量调节逻辑
(二)Volume Groups:音量组管理
Volume Groups (device: index)
- VOLUME GROUP AUDIO_STREAM_ACCESSIBILITY:
Muted: false
Min: 1
Max: 15
Current: 2 (speaker): 6, 4 (headset): 2, 8 (headphone): 2, 80 (bt_a2dp): 2, 100 (bt_a2dp_hp): 2, 4000000 (usb_headset): 5, 20000000 (ble_headset): 2, 20000002 (ble_broadcast): 2, 40000000 (default): 6
Devices: speaker
Streams: STREAM_ACCESSIBILITY
.......
该模块展示系统中的音量组配置,每个音量组包含:
-
基础属性:
Muted、Min、Max与音频流参数含义一致 -
设备音量映射:
Current: [device_code](device_name): [volume_value], ... -
关联音频流:
Streams: STREAM_XXX, STREAM_YYY:列出归属该音量组的所有音频流类型
(三) Ringer mode:
Ringer mode:
- mode (internal) = NORMAL
- mode (external) = NORMAL
- zen mode:ZEN_MODE_OFF
- ringer mode affected streams = 0xa6 (STREAM_SYSTEM,STREAM_RING,STREAM_NOTIFICATION,STREAM_SYSTEM_ENFORCED)
- ringer mode muted streams = 0x0
- delegate = ZenModeHelper
该模块展示铃声模式信息:
1、mode (internal):内部铃声模式,包括"SILENT", "VIBRATE", "NORMAL"
2、mode (external):外部铃声模式,包括"SILENT", "VIBRATE", "NORMAL"
3、zen mode:专注模式状态,如ZEN_MODE_OFF,当前未启用免打扰模式
4、ringer mode affected streams:受影响音频流掩码:0xa6,对应以下音频流:
STREAM_SYSTEM(系统音量)STREAM_RING(铃声音量)STREAM_NOTIFICATION(通知音量)STREAM_SYSTEM_ENFORCED(强制系统音量)
这些音频流的音量会受到铃声模式变化的影响。掩码值 0xa6 的二进制表示为 10100110,对应上述四个音频流的位。
5、ringer mode muted streams:静音音频流掩码
(四)Audio mode:
Audio mode:
- Requested mode =
- Actual mode =
- Mode owner:
- Mode owner stack:
该模块展示了音频模式管理的核心信息,用于监控和调试音频模式的请求、执行和管理过程。
1、Requested mode-请求模式:表示应用程序或系统组件请求的音频模式。通常由AudioManager的setMode()方法设置,可能的值包括:MODE_NORMAL、MODE_RINGTONE、MODE_IN_CALL、MODE_IN_COMMUNICATION等,这是上层应用或系统服务希望音频系统进入的模式状态;
2、Actual mode-实际模式:表示音频系统当前实际激活的音频模式。由于系统策略或设备状态变化,可能与请求模式不一致,体现了AudioService对音频模式的最终决策结果,通常受设备连接状态、通话状态、焦点管理等因素影响;
3、Mode owner-模式所有者:标识当前拥有音频模式控制权的组件或应用,通常为最近调用setMode()的AudioManager实例,用于跟踪和管理音频模式的来源;
4、Mode owner stack:显示模式所有者的调用堆栈信息。包含调用setMode()方法的完整调用链,用于追踪音频模式变更的详细过程;
(五)Audio routes:音频路由状态
Audio routes:
mMainType=
mBluetoothName=
展示当前音频信号的传输路径,包含:
1、**mMainType(主要音频路由类型)**
- 表示音频信号的主要输出路径类型
- 以十六进制值显示,如
0x0表示默认路由 - 该值反映了系统当前选择的主要音频输出设备类型
- 可能的值包括:
0x0:默认输出设备0x2:扬声器输出0x1000:蓝牙音频输出0x4000:USB音频输出
- 通过该参数可以判断当前音频的主要输出设备类型
2、**mBluetoothName(蓝牙设备名称)**
- 显示当前连接的蓝牙音频设备名称
- 如果值为
null,表示没有连接任何蓝牙设备 - 该参数用于标识蓝牙音频路由的设备信息
- 当存在蓝牙音频连接时,会显示具体的蓝牙设备名称
(六)其他状态
Other state:
mUseVolumeGroupAliases=
mVolumeController=
mEnableCsd=
mSafeMediaVolumeState=
mSafeMediaVolumeIndex=
mSafeMediaVolumeIndex[4]=
mSafeMediaVolumeIndex[8]=
mSafeMediaVolumeIndex[128]=
mSafeMediaVolumeIndex[256]=
mSafeMediaVolumeIndex[67108864]=
mSafeMediaVolumeIndex[536870912]=
mSafeMediaVolumeIndex[536870914]=
mSafeMediaVolumeDbfs=
mMusicActiveMs=
mMcc=
mPendingVolumeCommand=
mAvrcpAbsVolSupported=
mBtScoOnByApp=
mIsSingleVolume=
mUseFixedVolume=
mFixedVolumeDevices=
mHdmiAudioSystemClient=
mHdmiPlaybackClient=
....
supportsBluetoothVariableLatency=
isBluetoothVariableLatencyEnabled=
1、**mUseVolumeGroupAliases(使用音量组别名)**
- 控制是否启用音量组别名机制
- 用于处理不同音频流的音量管理策略
- 通常为布尔值,影响音量组的映射关系
2、**mVolumeController(音量控制器)**
- 指向当前的音量控制管理器实例
- 包含音量控制界面的可见性状态
- 例如:
VolumeController(android.os.BinderProxy@260eb89,mVisible=false)表示音量控制界面当前不可见
3、**mEnableCsd(启用CSD)**
- 控制是否启用CSD(Call State Detection)功能
- 用于通话状态下的音频路由管理
- 影响音频模式的切换逻辑
4、**mSafeMediaVolumeState(安全媒体音量状态)**
- 表示当前安全媒体音量的启用状态
- 可能值包括:SAFE_MEDIA_VOLUME_DISABLED、SAFE_MEDIA_VOLUME_INACTIVE、SAFE_MEDIA_VOLUME_ACTIVE
- 用于保护用户听力安全
5、**mSafeMediaVolumeIndex(安全媒体音量索引)**
- 针对不同音频设备类型的安全音量限制值
- 为不同设备类型(如耳机、扬声器等)设置不同的安全音量阈值
- 例如:
mSafeMediaVolumeIndex表示耳机设备的安全音量索引
6、**mSafeMediaVolumeDbfs(安全媒体音量分贝值)**
- 安全媒体音量的分贝值限制
- 用于计算音频输出的安全上限
- 保护用户听力免受过大声量伤害
7、**mMusicActiveMs(音乐活跃时间)**
- 记录音乐播放的活跃时间毫秒数
- 用于音频焦点管理和功耗统计
8、**mMcc(移动国家代码)**
- 存储当前网络的移动国家代码
- 影响音频系统的区域化配置和音量策略
9、**mPendingVolumeCommand(待处理音量命令)**
- 表示待处理的音量调节命令队列
- 用于异步处理音量调整请求
- 确保音量调节的顺序性和一致性
10、**mAvrcpAbsVolSupported(支持AVRCP绝对音量)**
- 标识是否支持AVRCP绝对音量协议
- 通常为true,表示支持蓝牙设备的绝对音量控制
11、**mIsSingleVolume(是否使用单一音量模式)**
- 控制是否启用单一音量模式
- 通常为false,表示没有激活单一音量模式
12、**mUseFixedVolume(是否使用固定音量)**
- 控制是否启用固定音量模式
- 通常为false,表示没有启用固定音量
13、**mFixedVolumeDevices(固定音量设备)**
- 列出启用固定音量模式的设备类型
- 例如:
0x1000,0x800,0x200000,0x40000,0x800表示特定设备的固定音量设置
其他参数如mHdmiAudioSystemClient、mHdmiPlaybackClient等涉及HDMI音频相关配置,mBtScoOnByApp等涉及蓝牙SCO状态管理,这些参数主要用于特定音频场景的系统配置和状态跟踪。
(七)AudioDeviceBroker:设备管理状态
展示音频设备的连接与管理状态。
1、BrokerHandler.dump(消息处理器dump)
该组件负责AudioDeviceBroker的消息处理机制,主要功能包括:
- Handler实例管理 :显示
Handler (com.android.server.audio.AudioDeviceBroker$BrokerHandler)实例信息,标识音频设备Broker的消息处理线程 - 未处理消息监控:跟踪和监控未处理消息的状态,用于调试消息队列的处理流程
- 异步消息处理:确保音频设备相关的异步消息能够正确处理和分发
2、DeviceInventory.dump(设备清单dump)
该组件专门管理音频设备的清单和状态信息:
- 设备连接状态:显示当前连接的音频设备类型和状态信息
- 设备清单维护:记录所有已识别和连接的音频设备,包括设备的详细属性
- 路由策略管理:维护设备路由策略,确保音频流能够正确路由到目标设备
- 设备切换协调:处理多设备间的切换逻辑,保证设备切换的平滑性
3、BtHelper.dump(蓝牙助手dump)
该组件专门处理蓝牙音频设备相关的管理任务:
- 蓝牙设备连接管理:监控蓝牙音频设备的连接和断开状态
- 蓝牙音频路由:处理蓝牙A2DP等音频流的路由策略
- 蓝牙参数配置:管理蓝牙音频的编码格式、延迟等关键参数
- 蓝牙设备生命周期:完整管理蓝牙音频设备的整个生命周期
(八)Events log:操作事件历史
记录音频系统的关键操作事件,包括:
1、音量调整事件:
adjustSuggestedStreamVolume(sugg:USE_DEFAULT_STREAM_TYPE dir:ADJUST_RAISE flags:0x1011):音量调节操作记录setStreamVolume(stream:3, index:10, flags:0x0):设置特定流音量记录
2、设备连接事件:
-
device connected: 4 (headset):设备连接记录 -
device disconnected: 80 (bt_a2dp):设备断开记录
3、焦点变更事件:
-
audio focus request from com.example.music:音频焦点请求记录 -
audio focus lost by com.example.navi:音频焦点丢失记录