dumpsys audio指令详解

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 
.......

该模块展示系统中的音量组配置,每个音量组包含:

  1. 基础属性:MutedMinMax与音频流参数含义一致

  2. 设备音量映射:Current: [device_code](device_name): [volume_value], ...

  3. 关联音频流: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,表示没有激活单一音量模式

1‌2、**mUseFixedVolume(是否使用固定音量)**‌

  • 控制是否启用固定音量模式
  • 通常为false,表示没有启用固定音量

1‌3、**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:音频焦点丢失记录

相关推荐
YF02112 小时前
Android微信机器人ClawBot如何配置语音播放音乐
android·人工智能
lq12332102 小时前
FFmpeg Batch AV Converter v3.2.8 视频批量转换工具
ffmpeg·音视频
Likeadust2 小时前
私有化音视频系统EasyDSS助力远程办公新模式
音视频
dualven_in_csdn2 小时前
EMQX 开启 **MySQL + password_based** 认证
android·数据库·mysql
牢七2 小时前
RuoYi-v4.2 前缀
android
光影少年2 小时前
开发RN项目时,如何调试iOS真机、Android真机?常见调试问题排查?
android·前端·react native·react.js·ios
ai产品老杨3 小时前
打破品牌壁垒:基于 GB28181 与 RTSP 协议融合的企业级视频统一接入方案
音视频
Black蜡笔小新3 小时前
国标GB28181视频平台EasyCVR设备在线却无通道?先查TCP/UDP协议设置!
tcp/ip·udp·音视频
十六年开源服务商3 小时前
WordPress并发量优化实战:2026运维指南
android·运维