背景:
在做车载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