干货分享:车载音频audio调试开发之dumpsys CarAudioService剖析

背景:

在做车载audio本质上是在手机的audio基础上加入了CarAudioService这个部分。具体下面这幅google官方架构图就描述的非常清楚。

CarAudioService包含了车载音频框架车载独有的相关业务,比如多音区的配置,多音区的路由,音量调节等。

所以在做车载音频开发时候经常可能会遇到一些问题,或者查询CarAudioService中的一些变量数据,这时候就需要通过如下命令:

bash 复制代码
 adb shell dumpsys car_service --services CarAudioService

来进行查询和调试。

命令输出如下:

CarAudioService的dump对应的源码部分

大家在查看dumpsys CarAudioService的输出时候,有一些输出可能不明白相关的含义,大家这个时候可以考虑去对应的源码中查询dump方法,找到对应变量方式来帮助理解整个CarAudioService,其实很多时候大家学习某个模块是否学通了,学懂了也可以尝试去看看这个模块的dump,看看你是否的狂都可以看得懂了。

packages/services/Car/service/src/com/android/car/audio/CarAudioService.java

bash 复制代码
@Override
    @ExcludeFromCodeCoverageGeneratedReport(reason = DUMP_INFO)
    public void dump(IndentingPrintWriter writer) {
        synchronized (mImplLock) {
            writer.println("*CarAudioService*");
            writer.increaseIndent();

            writer.println("Configurations:");
            writer.increaseIndent();
            writer.printf("Run in legacy mode? %b\n", runInLegacyMode());
            writer.printf("Rely on core audio for volume? %b\n", mUseCoreAudioVolume);
            writer.printf("Rely on core audio for routing? %b\n",  mUseCoreAudioRouting);
            writer.printf("Configured using audio control? %b\n", mCarAudioControlHalConfig);
            writer.printf("Audio Patch APIs enabled? %b\n", areAudioPatchAPIsEnabled());
            writer.printf("Persist master mute state? %b\n", persistMasterMuteState());
            writer.printf("Use hal ducking signals? %b\n", mUseHalDuckingSignals);
            writer.printf("Volume key event timeout ms: %d\n", mKeyEventTimeoutMs);
            if (mCarAudioConfigurationPath != null) {
                writer.printf("Car audio configuration path: %s\n", mCarAudioConfigurationPath);
            }
            writer.printf("Persist fade and balance levels? %b\n", mPersistFadeBalanceLevels);
            writer.decreaseIndent();
            writer.println();

            writer.println("Current State:");
            writer.increaseIndent();
            writer.printf("Master muted? %b\n", mAudioManagerWrapper.isMasterMuted());
            if (mCarAudioPowerListener != null) {
                writer.printf("Audio enabled? %b\n", mCarAudioPowerListener.isAudioEnabled());
            }

dump另一方面作用是某个模块有很多复杂的变量,或者较多的相关类如果记不住的话,也可以考虑每次通过dumpsys CarAudioService来辅助记忆。

下面将针对dumpsys CarAudioService输出的各个部分进行详细剖析。

CarAudioService公共变量和配置部分

bash 复制代码
** Dumping CarAudioService

*CarAudioService*
  Configurations:
    Run in legacy mode? false
    Rely on core audio for volume? false
    Rely on core audio for routing? false
    Configured using audio control? true
    Audio Patch APIs enabled? false
    Persist master mute state? true
    Use hal ducking signals? false
    Volume key event timeout ms: 3000
    Car audio configuration path: /vendor/etc/car_audio_configuration.xml
    Persist fade and balance levels? false
  
  Current State:
    Master muted? false
    Audio enabled? true
    Async init completed? true
    Async init succeeded? true
  
  Volume Group Mute Enabled? false
  Volume Group Events Enabled? true
  Use fade manager configuration? true
  Use min/max activation volume? true
  Use isolated focus for dynamic devices? false
  Allow key events to dynamic devices? false
  

这里只介绍几个核心的部分:

Run in legacy mode? false 表明它没有使用旧的手机安卓音频框架,而是采用了专为汽车设计的"Car Audio Service"新模式。

Rely on core audio for volume? false 和 Rely on core audio for routing? false 意味着音量和音频路由完全由车辆自身的硬件抽象层(HAL)和配置文件(/vendor/etc/car_audio_configuration.xml)管理,不会走软件调节音量那套,实现了与车载硬件的深度集成。

Car audio configuration path: /vendor/etc/car_audio_configuration.xml

代表当前CarAudioService的配置xml的完整路径就是 /vendor/etc/car_audio_configuration.xml。

其他的一些全局变量就不一一叙述,大家如果有用到时候可以直接代码中看看对应含义。

车载音量优先级部分

优先级配置清单‌,它定义了车辆中所有音频源的"说话顺序"------换句话说,‌当多个声音同时响起时,谁该被听见,谁该被压低‌。这不仅是技术参数,更是驾驶安全的核心设计。

优先级还展示在音量调节这块,调节音量时候,当通话和音乐播放同时进行时,会优先设置通话的音量。

priority 越小优先级越高。

注意:

你看到的 navigation(导航)优先级为 0,而 emergency(紧急)为 11 ------ 这看似矛盾,实则合理。‌导航是"主动引导",紧急是"被动触发"‌。在实际系统中,emergency 通常由硬件级中断触发,绕过软件优先级,直接强制全车广播。这里的优先级 11 是软件层的"兜底标识"。

bash 复制代码
 CarVolume
    Volume priority list version 1
    Volume key event timeout 3000 ms
    Car audio contexts priorities
      Car audio context navigation[id=2] priority 0
        Attribute: AudioAttributes: usage=USAGE_ASSISTANCE_NAVIGATION_GUIDANCE content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context call[id=5] priority 1
        Attribute: AudioAttributes: usage=USAGE_VOICE_COMMUNICATION content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
        Attribute: AudioAttributes: usage=USAGE_CALL_ASSISTANT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
        Attribute: AudioAttributes: usage=USAGE_VOICE_COMMUNICATION_SIGNALLING content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context music[id=1] priority 2
        Attribute: AudioAttributes: usage=USAGE_UNKNOWN content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
        Attribute: AudioAttributes: usage=USAGE_MEDIA content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
        Attribute: AudioAttributes: usage=USAGE_GAME content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context announcement[id=12] priority 3
        Attribute: AudioAttributes: usage=USAGE_ANNOUNCEMENT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context voice_command[id=3] priority 4
        Attribute: AudioAttributes: usage=USAGE_ASSISTANCE_ACCESSIBILITY content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
        Attribute: AudioAttributes: usage=USAGE_ASSISTANT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context call_ring[id=4] priority 5
        Attribute: AudioAttributes: usage=USAGE_NOTIFICATION_RINGTONE content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context system_sound[id=8] priority 6
        Attribute: AudioAttributes: usage=USAGE_ASSISTANCE_SONIFICATION content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context safety[id=10] priority 7
        Attribute: AudioAttributes: usage=USAGE_SAFETY content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context alarm[id=6] priority 8
        Attribute: AudioAttributes: usage=USAGE_ALARM content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context notification[id=7] priority 9
        Attribute: AudioAttributes: usage=USAGE_NOTIFICATION content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
        Attribute: AudioAttributes: usage=USAGE_NOTIFICATION_EVENT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context vehicle_status[id=11] priority 10
        Attribute: AudioAttributes: usage=USAGE_VEHICLE_STATUS content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      Car audio context emergency[id=9] priority 11
        Attribute: AudioAttributes: usage=USAGE_EMERGENCY content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null

车载AudioContext与手机通用的AudioAttributes映射关系

车载部分其实有自己的类型来表示当前的播放是什么类型的声音,车载中这些类型就是AudioContext,比如music,navigation等,其实是一个整数而已。

但是这些AudioContext其实是不被手机系统的Audio系统认可的,所以为了兼容手机那套音频系统可以认出的类型,车载AudioContext都会映射成手机中的AudioAttributes类型,比如这里的 CarAudioContext 为music ,映射到手机中就是USAGE_UNKNOWN,USAGE_MEDIA,USAGE_GAME,说白了就是车载上普通app写AudioTrack时候只可以定义好AudioAttributes,那么这个AudioAttributes比如是USAGE_MEDIA,那么车载audio中识别它就是AudioContext为music。

bash 复制代码
  CarAudioContext
    Context music id 1
      AudioAttributes: usage=USAGE_UNKNOWN content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      AudioAttributes: usage=USAGE_MEDIA content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      AudioAttributes: usage=USAGE_GAME content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context navigation id 2
      AudioAttributes: usage=USAGE_ASSISTANCE_NAVIGATION_GUIDANCE content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context voice_command id 3
      AudioAttributes: usage=USAGE_ASSISTANCE_ACCESSIBILITY content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      AudioAttributes: usage=USAGE_ASSISTANT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context call_ring id 4
      AudioAttributes: usage=USAGE_NOTIFICATION_RINGTONE content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context call id 5
      AudioAttributes: usage=USAGE_VOICE_COMMUNICATION content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      AudioAttributes: usage=USAGE_CALL_ASSISTANT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      AudioAttributes: usage=USAGE_VOICE_COMMUNICATION_SIGNALLING content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context alarm id 6
      AudioAttributes: usage=USAGE_ALARM content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context notification id 7
      AudioAttributes: usage=USAGE_NOTIFICATION content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
      AudioAttributes: usage=USAGE_NOTIFICATION_EVENT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context system_sound id 8
      AudioAttributes: usage=USAGE_ASSISTANCE_SONIFICATION content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context emergency id 9
      AudioAttributes: usage=USAGE_EMERGENCY content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context safety id 10
      AudioAttributes: usage=USAGE_SAFETY content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context vehicle_status id 11
      AudioAttributes: usage=USAGE_VEHICLE_STATUS content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null
    Context announcement id 12
      AudioAttributes: usage=USAGE_ANNOUNCEMENT content=CONTENT_TYPE_UNKNOWN flags=0x800 tags= bundle=null

多音区路由配置部分

这一块内容较多,也是车载路由最核心部分,这部分其实就是把car_audio_configuration.xml中的内容进行解析变成对象后,再被dump进行了输出。

看看car_audio_configuration.xml的内容:

所以大家如果觉得每次去看car_audio_configuration.xml比较绕的话,其实通过dumpsys看会更加直观易懂,具体dump输出的核心变量的解释可以看如下注释。

bash 复制代码
  CarAudioZone(primary zone:0) isPrimary? true ---代表主音区相关配置
    Current Config Id: 0
    Input Audio Device Addresses
      Device Address(input_bus_tone_zone_0)
      Device Address(tuner0)
      Device Address(Built-In Mic)
      Device Address(Built-In Back Mic)
    
    Audio Zone Configurations[1] 
    ---代表有多少config,1代表数量,因为有音区可能多个device,比如有喇叭也有头枕耳机,当然会有一个默认
      CarAudioZoneConfig(primary zone config:0) of zone 0 isDefault? true 
      ---展示具体的音区config情况,这里isDefault代表默认使用哪个
        Is active (true) --代表活跃选中
        Is selected (true)
        CarVolumeGroup(0) ---代表音区下面的音量组
          Name(config 0 group 0)
          Zone Id(0)
          Configuration Id(0)
          Is Muted(false)
          UserId(10)
          Persist Volume Group Mute(false)
          Step size: 100
          Gain values (min / max / default/ current): -3200 600 0 0
          Gain indexes (min / max / default / current): 0 38 32 32
          Activation gain (min index / max index / invocation type): 0 38 7
          Context: music -> Address: bus0_media_out 
          ---核心的路由部分,就是AudioContext映射到device
          Context: call_ring -> Address: bus3_call_ring_out
          Context: notification -> Address: bus6_notification_out
          CarAudioDeviceInfo Device(bus0_media_out)
          --详细解释每个device的信息
          CarAudioDeviceInfo Type(21)
            Is active (true)
            Routing with Dynamic Mix enabled (true)
            sample rate / encoding format / channel count: 48000 2 2
            Gain values (min / max / default/ current): -3200 600 0 0
          CarAudioDeviceInfo Device(bus3_call_ring_out)
          CarAudioDeviceInfo Type(21)
            Is active (true)
            Routing with Dynamic Mix enabled (true)
            sample rate / encoding format / channel count: 48000 2 2
            Gain values (min / max / default/ current): -3200 600 0 0
          CarAudioDeviceInfo Device(bus6_notification_out)
          CarAudioDeviceInfo Type(21)
            Is active (true)
            Routing with Dynamic Mix enabled (true)
            sample rate / encoding format / channel count: 48000 2 2
            Gain values (min / max / default/ current): -3200 600 0 0
          Reported reasons:
          Gain infos:
            Blocked: false
            Limited: false
            Attenuated: false
            Muted by HAL: false
          Events:
          

Audio音区的匹配关系及对应的UserId部分

每个音区都有自己的AudioZoneId,而且每个音区一般也会有对应的UserId。

bash 复制代码
UserId to Zone Mapping:
    UserId 10 mapped to zone 0
    UserId 11 mapped to zone 1
    UserId 12 mapped to zone 2
  
  Audio Zone to Occupant Zone Mapping:
    AudioZoneId 0 mapped to OccupantZoneId 0
    AudioZoneId 1 mapped to OccupantZoneId 1
    AudioZoneId 2 mapped to OccupantZoneId 2
  
  UID to Zone Mapping: //这里为null,说明这块没有设置
  

CarAudio音频的焦点部分信息

bash 复制代码
  *CarZonesAudioFocus*
    Has Focus Callback: false
    Car Zones Audio Focus Listeners:
      Zone Id: 0
        *CarAudioFocus*
          Audio Zone ID: 0
          Is focus restricted? false
          Is external focus eval enabled? false
          
          Reject Navigation on Call: false
          Current Focus Holders:
          Transient Focus Losers:
          Queued Delayed Focus: None
          Focus Events:
            2026-04-03T09:25:18.974022 - setRestrictFocus: is focus restricted false
      Zone Id: 1
        *CarAudioFocus*
          Audio Zone ID: 1
          Is focus restricted? false
          Is external focus eval enabled? false
          
          Reject Navigation on Call: false
          Current Focus Holders:
          Transient Focus Losers:
          Queued Delayed Focus: None
          Focus Events:
            2026-04-03T09:25:18.981885 - setRestrictFocus: is focus restricted false
      Zone Id: 2
        *CarAudioFocus*
          Audio Zone ID: 2
          Is focus restricted? false
          Is external focus eval enabled? false
          
          Reject Navigation on Call: false
          Current Focus Holders:
          Transient Focus Losers:
          Queued Delayed Focus: None
          Focus Events:
            2026-04-03T09:25:18.982757 - setRestrictFocus: is focus restricted false
  

原文地址及更多audio资料获取点击下面链接联系:
https://mp.weixin.qq.com/s/3MWaGy1Bm50nhlqAEI9_Cw

相关推荐
私人珍藏库2 小时前
[Android] Bilibili音乐播放器Biu安卓版,适配手机-平板-汽车
android·智能手机·电脑
雪可问春风2 小时前
insightface进行视频中人脸识别
c++·音视频
z9209810232 小时前
安卓16 手机系统 super 分区挂载读写 解锁安卓动态分区RW 逻辑分区读写 自由读写 修改分区system vendor、product
android·智能手机·安卓动态分区·解锁动态分区·分区挂载读写
ai产品老杨2 小时前
源码级开放与二次开发:基于 Spring Boot 的 AI 视频管理平台架构与 API 深度解析
spring boot·架构·音视频
风酥糖2 小时前
Android上部署Linux环境的方案总结对比
android·linux·运维
行思理2 小时前
mac终端下生成android 证书
android·macos
今夕资源网2 小时前
LANDrop 跨平台局域网文件传输工具 支持 iOS、Android、macOS、Windows、Linux、Android TV 等操作系统
android·linux·macos·跨平台·文件传输·局域网文件共享·局域网文件传输
Fleshy数模2 小时前
基于 dlib 与 OpenCV 的人脸检测实战:图片与视频场景全解析
人工智能·opencv·音视频
小彭努力中11 小时前
199.Vue3 + OpenLayers 实现:点击 / 拖动地图播放音频
前端·vue.js·音视频·openlayers·animate