上一篇讲了自定义 Gradle 插件,进入一个全新场景——车载开发。Android Automotive OS(AAOS)是 Google 推出的车机系统,和手机 Android 是不同形态:屏幕更大、交互靠触摸+语音+按键、无网络时也要能用。开发体验差别很大。
AAOS 是什么
AAOS 是给车载信息娱乐系统(IVI)用的 OS,运行在车机的中控屏上。和 Android Auto(投屏)不同,它是独立运行的系统:
本文只聊 AAOS 原生应用开发。
AAOS 应用的三种形态
<!-- AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-feature
android:name="android.software.type.automotive"
android:required="true" />
<application
android:appCategory="audio"
android:theme="@style/AutomotiveTheme">
<!-- 应用代码 -->
</application>
</manifest>
App 分类通过 android:appCategory 决定:
com.android.application plugin 的 manifest 块声明:
android {
defaultConfig {
// 标记为 automotive 应用
manifestPlaceholders["automotiveAppCategory"] = "audio"
}
productFlavors {
create("mobile") {
dimension = "default"
}
create("automotive") {
dimension = "default"
}
}
}
androidComponents {
onVariants(selector().withBuildType("debug")) { variant ->
// ...
}
}
实际工程更常用 :app 和 :automotive_app 两个 module 分别打包。
Car App Library
AAOS 的核心 UI 库是 Car App Library(androidx.car.app)——专门为车机设计的 widget 体系。和手机 Compose 不同,它要求"驾驶安全":
class MyCarAppService : CarAppService() {
override fun createHostValidator(): HostValidator =
HostValidator.Builder(applicationContext)
.addAllowedHosts(R.array.hosts_allowlist_sample)
.build()
override fun onCreateSession(): Session = MySession()
}
class MySession : Session() {
override fun onCreateScreen(intent: Intent): Screen = MyHomeScreen(carContext)
}
class MyHomeScreen(carContext: CarContext) : Screen(carContext) {
override fun onGetTemplate(): Template = Template(
headerTemplate = Header.Builder()
.setTitle("我的音乐")
.build(),
contentTemplate = ListTemplate.Builder()
.setSingleList(
List.Builder()
.addItem(
Item.Builder()
.setTitle("播放列表 1")
.setOnClickListener { /* ... */ }
.build()
)
.build()
)
.build()
)
}
Car App Library 提供的 Template:
注意:所有 button 必须在 ListTemplate/GridTemplate 里,不能自定义 layout。
屏幕约束
车机屏幕分辨率差异大,要做适配:
// res/layout/automotive 目录放车机专用布局
// res/values/automotive.xml
<resources>
<!-- 车机特定的间距 -->
<dimen name="content_padding">40dp</dimen>
<dimen name="title_font_size">28sp</dimen>
</resources>
常见车机分辨率:
驾驶安全考虑,禁止视频在行驶中播放:
// 检查是否处于停车状态
val drivingState = carContext.getCarService(CarDrivingStateService::class.java)
.currentDrivingState
if (drivingState == CarDrivingStateService.DRIVING_STATE_MOVING) {
// 隐藏视频按钮
}
硬件能力
车机有手机没有的传感器和硬件:
// 车辆状态监听
val carInfoService = carContext.getCarService(CarInfoManager::class.java)
// 车速
val speed = carInfoService.getProperty(
VehiclePropertyIds.PERF_VEHICLE_SPEED,
VehicleAreaType.VEHICLE_AREA_TYPE_GLOBAL
)
// 油量/电量
val energyLevel = carInfoService.getProperty(
if (isEv) VehiclePropertyIds.EV_BATTERY_LEVEL
else VehiclePropertyIds.FUEL_LEVEL
).value.value as Float
常见车机硬件:
GPS
蓝牙电话
倒车雷达
空调控制(部分车型开放 API)
方向盘按键(KEYCODE_VOLUME_UP、KEYCODE_SEARCH)
处理方向盘按键
override fun onKeyEvent(event: KeyEvent): Boolean {
return when (event.keyCode) {
KeyEvent.KEYCODE_VOLUME_UP -> {
// 自定义音量 + 处理
true
}
KeyEvent.KEYCODE_SEARCH -> {
// 语音助手
true
}
else -> false
}
}
性能考量
车机硬件参差不齐,比手机弱:
中端车机 CPU:骁龙 625 级别
GPU 经常只能用基本能力
内存普遍只有 2-4GB
启动时间 2-3 秒算正常
优化建议:
避免阻塞主线程:车机更敏感,ANR 阈值更低
少用 emoji、矢量图:车机 GPU 弱
关注 IVI 硬件加速:强制开启
android:hardwareAccelerated="true"场景化加载:进入隧道、停车场时屏幕闪烁很多,预加载资源
模拟器开发
Google 提供 AAOS 模拟器,但启动慢:
emulator -avd Automotive_14_inch_API_34 -no-snapshot
需要在 Android Studio 安装 AAOS 系统镜像:
SDK Manager → SDK Tools → Android Automotive Intel x86 Atom System Image
创建新设备类型:Pixel 5 Automotive
注意:AAOS 模拟器只能用 x86,不能用 ARM
商业机会
车载场景的应用生态还在早期:
流媒体(网易云、QQ 音乐、Bilibili 都在做)
充电桩(蔚来、特来电)
智能家居联动
儿童教育(后排屏)
出行服务(打车、租车)
对应门槛:OEM 厂商认证(每家车厂审核标准不一样)、依赖特定车辆数据(私有 API)、生命周期长(车型 5-7 年)。
小结
AAOS 是 Android 工程师能切入的全新赛道。门槛在于:
理解驾驶安全规范
用 Car App Library 而非 Compose
处理车辆硬件和外部状态变化
适配各种车机硬件
回报是:需求多、岗位稀缺、薪资水平高于普通 Android 开发。
下一篇进入 Android 14/15 新特性深度解析,了解平台最新的能力演进。