Android Media - dumpsys

本文介绍了使用`dumpsys media.audio_policy`命令来查看Android音频策略的详细信息,包括手机状态、强制设备输出、输出设备、输入设备、硬件模块、音效、音频路由等关键信息,帮助开发者理解音频系统的内部工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

命令:dumpsys media.audio_policy

1、mEngine->getPhoneState()

2、所有强制设备输出的状态显示(Engine::setForceUse函数所设置)

3、(mTtsOutputAvailable/mMasterMono/mConfig.getSource())

4、所有可用输出设备(mAvailableOutputDevices)【DeviceVector】

4.1、mId

4.2、mTagName

4.3、mDeviceTypeAddr【AudioDeviceTypeAddr】

mDeviceTypeAddr.mType

4.4、mEncapsulationModes、mEncapsulationMetadataTypes

4.5、mGains【AudioGains】、mProfiles【AudioProfileVector】

mGains对应的xml配置为

mProfiles对应xml配置

5、展示当前平台所有可用的输入设备(mAvailableInputDevices)

6、所有的Module(mHwModulesAll)【HwModuleCollection】

6.1、mName, mHandle, mHalVersion

6.2、mOutputProfiles【OutputProfileCollection】

6.2.1、mProfiles【AudioProfileVector】

6.2.2、mFlags、maxOpenCount、curOpenCount、maxActiveCount、curActiveCount

6.2.3、mGains【AudioGains】

6.2.4、mSupportedDevices【DeviceVector】

6.3、mInputProfiles【InputProfileCollection】

6.4、Declared devices (mDeclaredDevices)【DeviceVector】

...6.5、Dynamic devices (mDynamicDevices)【DeviceVector】

6.6、mRoutes【AudioRouteVector】

6.6.1、mType【audio_route_type_t 】

6.6.2、mSink【PolicyAudioPort】

6.6.3、mSources【PolicyAudioPortVector 】

7、所有的SwAudioOutputDescriptor (mOutputs)

8、所有的AudioInputDescriptor (mInputs)

9、所有的音效EffectDescriptor (mEffects)

10、所有AudioPatch (mAudioPatches)

11、所有AudioPolicyMix (mPolicyMixes)

12、所有SourceClientDescriptor (mAudioSources.dump)

13、(mAllowedCapturePolicies)

14、Engine (mEngine->dump)


命令:
dumpsys media.audio_policy

AudioPolicyManager: 0xf1e5a000
Command Thread: 0xf1ff3300 
Supported System Usages:
AudioCommandThread 0xf1ff3300 Dump
- Commands:
   Command Time        Wait pParam
  Last Command
   01      014581.648  0    0xf19e5440

AudioPolicyManager Dump: 0xf1e5a000
 Primary Output: 13



1、mEngine->getPhoneState()

 Phone state: AUDIO_MODE_NORMAL


2、所有强制设备输出的状态显示(Engine::setForceUse函数所设置)

 Force use for communications: 0
 Force use for media: 0
 Force use for record: 0
 Force use for dock: 8
 Force use for system: 0
 Force use for HDMI system audio: 12
 Force use for encoded surround output: 0
 Force use for vibrate ringing: 0

3、(mTtsOutputAvailable/mMasterMono/mConfig.getSource())

TTS output not available
 Master mono: off
 Config source: /vendor/etc/audio_policy_configuration.xml


4、所有可用输出设备(mAvailableOutputDevices)【DeviceVector】

mAvailableOutputDevices为DeviceVector类型,其包含了多个sp<DeviceDescriptor>实例。

class DeviceDescriptor : public DeviceDescriptorBase,
                         public PolicyAudioPort, public PolicyAudioPortConfig {
...
    std::string mTagName; // Unique human readable identifier for a device port found in conf file.
    FormatVector        mEncodedFormats;
    audio_format_t      mCurrentEncodedFormat;
};
class DeviceDescriptorBase : public AudioPort, public AudioPortConfig {...};
class AudioPort : public virtual RefBase, public virtual Parcelable {
...
    AudioGains mGains; // gain controllers
    std::string  mName;
    audio_port_type_t mType;
    audio_port_role_t mRole;
    AudioProfileVector mProfiles; // AudioProfiles supported by this port (format, Rates, Channels)
};
class PolicyAudioPort : public virtual RefBase, private HandleGenerator<audio_port_handle_t> {
...
    uint32_t mFlags; // attribute flags mask (e.g primary output, direct output...).
    sp<HwModule> mModule;     // audio HW module exposing this I/O stream
    AudioRouteVector mRoutes; // Routes involving this port
};


4.1、mId

  - id:  2


4.2、mTagName

tagName="Speaker"
  - tag name: Speaker


4.3、mDeviceTypeAddr【AudioDeviceTypeAddr】


mDeviceTypeAddr.mType

  - type: AUDIO_DEVICE_OUT_SPEAKER


4.4、mEncapsulationModes、mEncapsulationMetadataTypes

  - supported encapsulation modes: 0  
  - supported encapsulation metadata types: 0



4.5、mGains【AudioGains】、mProfiles【AudioProfileVector】


mGains对应的xml配置为

 <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER">
     <gains>
         <gain name="gain_1" mode="AUDIO_GAIN_MODE_JOINT"
               minValueMB="-10000"
               maxValueMB="0"
               defaultValueMB="-6000"
               stepValueMB="100"/>
     </gains>
 </devicePort>


mProfiles对应xml配置

AudioPort::dump(dst, spaces, verbose);

- Available output devices:
  Device 1:
  - id:  2
  - tag name: Speaker
  - type: AUDIO_DEVICE_OUT_SPEAKER
  - supported encapsulation modes: 0  - supported encapsulation metadata types: 0  - Profiles:
      Profile 0:[dynamic format][dynamic channels][dynamic rates]
  - gains:
    Gain 1:
    - mode: 00000001
    - channel_mask: 00000000
    - min_value: -10000 mB
    - max_value: 0 mB
    - default_value: -6000 mB
    - step_value: 100 mB
    - min_ramp_ms: 0 ms
    - max_ramp_ms: 0 ms



5、展示当前平台所有可用的输入设备(mAvailableInputDevices)

- Available input devices:
  Device 1:
  - id: 46
  - tag name: USB-Audio - USB Audio Device
  - type: AUDIO_DEVICE_IN_USB_HEADSET
  - supported encapsulation modes: 0  - supported encapsulation metadata types: 0  - address: card=1;device=0;
  - name: USB-Audio - USB Audio Device
  - Profiles:
      Profile 0:[dynamic format]
          - format: AUDIO_FORMAT_PCM_16_BIT
          - sampling rates:44100, 48000
          - channel masks:0x000c, 0x0010, 0x80000001
  Device 2:
  - id: 12
  - tag name: HDMI In
  - type: AUDIO_DEVICE_IN_AUX_DIGITAL|AUDIO_DEVICE_IN_HDMI
  - supported encapsulation modes: 0  - supported encapsulation metadata types: 0  - Profiles:
      Profile 0:[dynamic format][dynamic channels][dynamic rates]
      Profile 1:
          - format: AUDIO_FORMAT_PCM_16_BIT
          - sampling rates:8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
          - channel masks:0x000c, 0x0010
  - gains:
    Gain 1:
    - mode: 00000001
    - channel_mask: 00000000
    - min_value: -10000 mB
    - max_value: 0 mB
    - default_value: -6000 mB
    - step_value: 100 mB
    - min_ramp_ms: 0 ms
    - max_ramp_ms: 0 ms
  Device 3:
  - id: 17
  - tag name: Built-In Mic
  - type: AUDIO_DEVICE_IN_BUILTIN_MIC
  - supported encapsulation modes: 0  - supported encapsulation metadata types: 0  - address: top
  - Profiles:
      Profile 0:
          - format: AUDIO_FORMAT_PCM_32_BIT
          - sampling rates:8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
          - channel masks:0x000c, 0x0010, 0x0030
      Profile 1:
          - format: AUDIO_FORMAT_PCM_32_BIT
          - sampling rates:16000
          - channel masks:0x000c, 0x0010



6、所有的Module(mHwModulesAll)【HwModuleCollection】


mHwModulesAll为HwModuleCollection类型,其包含了多个sp<HwModule>实例。
所有xml中配置的module模块 contains all modules declared in the config

/vendor/etc/audio_policy_configuration.xml
a2dp_audio_policy_configuration.xml
usb_audio_policy_configuration.xml
r_submix_audio_policy_configuration.xml
hearing_aid_audio_policy_configuration.xml
HW Modules dump:



以Module 1 primary为例,其他module相同

class HwModule : public RefBase {
    const String8 mName; // base name of the audio HW module (primary, a2dp ...)
    audio_module_handle_t mHandle;
    OutputProfileCollection mOutputProfiles; // output profiles exposed by this module
    InputProfileCollection mInputProfiles;  // input profiles exposed by this module
    uint32_t mHalVersion; // audio HAL API version
    DeviceVector mDeclaredDevices; // devices declared in audio_policy configuration file.
    DeviceVector mDynamicDevices; /**< devices that can be added/removed at runtime (e.g. rsbumix)*/
    AudioRouteVector mRoutes;
    PolicyAudioPortVector mPorts;
};
void HwModule::dump(String8 *dst) const



6.1、mName, mHandle, mHalVersion

- HW Module 1:
  - name: primary (mName)
  - handle: 10  (mHandle)
  - version: 3.0  (mHalVersion)



6.2、mOutputProfiles【OutputProfileCollection】


mOutputProfiles为OutputProfileCollection类型,其包含了多个sp<IOProfile>实例。

  - outputs:


这里以HDMI OUT设备获取profile为例,HDMI OUT当前支持了compress offload,direct output,mmap_no_irq_out_dynamic 3种典型类别的profile。

class IOProfile :
<think>好的,我现在需要帮助用户了解Android中的MediaServer组件,包括它的功能架构和常见问题。首先,我需要回忆一下Android系统架构的基本知识。Android系统分为应用层、应用框架层、本地库和运行时环境层、硬件抽象层(HAL)以及Linux内核层。MediaServer应该属于系统服务的一部分,可能位于应用框架层或本地库层。 根据用户提供的引用资料,特别是引用[3]和[4],里面提到了Android的IPC机制,如Binder、Socket、Handler,以及Native Service的实现。MediaServer可能是一个Native Service,因为它处理多媒体相关的底层功能,比如音频、视频的编解码和播放。Native Service通常运行在Runtime层,通过Binder与上层应用通信。 接下来,我需要确定MediaServer的功能架构。可能它由多个子模块组成,比如AudioFlinger用于音频处理,SurfaceFlinger用于图形渲染,CameraService用于摄像头管理。这些服务可能通过Binder机制提供给应用框架层调用。同时,MediaServer需要与HAL层交互,直接操作硬件驱动,比如音频驱动或摄像头驱动。 关于常见问题,用户可能遇到服务崩溃、资源泄漏、兼容性问题或性能问题。例如,引用[1]提到Android设备种类繁多,硬件差异大,可能导致兼容性问题。此外,引用[2]提到不同内核版本的支持,旧版内核可能影响MediaServer的稳定性或功能。 我需要确保回答结构清晰,分点说明功能架构和常见问题,并引用提供的资料来支持观点。同时,要使用中文,数学公式按照要求使用$...$或$$...$$格式,但在这里可能用不上。最后生成相关问题,引导用户进一步学习。</think>### Android MediaServer 功能架构及常见问题 #### 一、MediaServer 功能架构 MediaServer 是 Android 系统中负责多媒体处理的核心服务组件,属于 **Native Service** 层,直接运行于 Runtime 环境中[^4]。其架构主要分为以下模块: 1. **核心服务模块** - **AudioFlinger**:管理音频设备、混音和音频流处理。 - **SurfaceFlinger**:负责图形合成的显示服务,管理图层叠加与渲染。 - **CameraService**:控制摄像头硬件及数据流。 - **MediaPlayerService**:提供音视频播放、编解码等基础能力。 2. **通信机制** - 通过 **Binder IPC** 与上层应用框架交互(如 MediaPlayer API)[^3]。 - 调用 **HAL 层驱动**(如 `audio.primary`、`gralloc`)操作硬件设备[^1]。 3. **依赖关系** - 基于 Linux 内核的 ALSA(音频)、DRM(显示)等子系统[^2]。 - 需要兼容不同硬件厂商的 HAL 实现。 #### 二、常见技术问题及解决方案 1. **服务崩溃(ANR/崩溃日志)** - **原因**:HAL 驱动兼容性问题或资源泄漏(如未释放 Camera 句柄)。 - **排查**:通过 `logcat` 查看 `mediaserver` 标签的日志,检查 Binder 调用栈。 2. **音频/视频播放异常** - **示例**:播放卡顿或杂音。 - **分析**: - 确认 HAL 层是否正常(如 `/dev/snd/` 设备权限)。 - 使用 `dumpsys media.audio_flinger` 检查音频流状态。 3. **兼容性问题** - **场景**:特定设备上 SurfaceFlinger 无法合成图层。 - **解决**:验证内核版本是否满足 LTS 要求(如 ≥4.19)[^2],或检查 GPU 驱动兼容性。 4. **性能瓶颈** - **优化**: - 减少 Binder 调用次数,改用批处理操作。 - 调整 AudioFlinger 的线程优先级(`/proc/[pid]/sched`)。 #### 三、关键代码逻辑示例 ```cpp // MediaServer 的主入口(frameworks/av/media/mediaserver/main_mediaserver.cpp) int main(int argc, char** argv) { sp<ProcessState> proc(ProcessState::self()); sp<IServiceManager> sm = defaultServiceManager(); // 注册核心服务 AudioFlinger::instantiate(); SurfaceFlinger::instantiate(); CameraService::instantiate(); // 启动 Binder 线程池 ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值