Administrator
发布于 2026-08-25 / 20 阅读
0
0

系列文章《Android 工程师的 100 篇进阶笔记》第 57 篇:Android Automotive OS:车机应用的全新赛道

上一篇讲了自定义 Gradle 插件,进入一个全新场景——车载开发。Android Automotive OS(AAOS)是 Google 推出的车机系统,和手机 Android 是不同形态:屏幕更大、交互靠触摸+语音+按键、无网络时也要能用。开发体验差别很大。

AAOS 是什么

AAOS 是给车载信息娱乐系统(IVI)用的 OS,运行在车机的中控屏上。和 Android Auto(投屏)不同,它是独立运行的系统:

类型

形态

App 类型

Android Auto

投屏到车机

Auto 模块,运行在手机

AAOS

车机原生

Automotive APK,安装到车机

AAOS + CarPlay

多系统共存

双系统支持

本文只聊 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 决定:

category

用途

audio

音乐、播客、有声书

video

视频(仅停车时可用)

messaging

短信类(安全驾驶相关)

navigation

导航

productivity

时钟、日历

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:

Template

用途

MapTemplate

显示地图

ListTemplate

列表(最常用)

GridTemplate

网格(适合图标选择)

PaneTemplate

左右分栏

SignInTemplate

登录

MessageTemplate

提示

TabTemplate

标签页

注意:所有 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>

常见车机分辨率:

形态

分辨率

DPI

中控竖屏

1080x1920

320

中控横屏

1920x720

240

一体机横屏

2880x1080

240

驾驶安全考虑,禁止视频在行驶中播放:

// 检查是否处于停车状态
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 秒算正常

优化建议:

  1. 避免阻塞主线程:车机更敏感,ANR 阈值更低

  2. 少用 emoji、矢量图:车机 GPU 弱

  3. 关注 IVI 硬件加速:强制开启 android:hardwareAccelerated="true"

  4. 场景化加载:进入隧道、停车场时屏幕闪烁很多,预加载资源

模拟器开发

Google 提供 AAOS 模拟器,但启动慢:

emulator -avd Automotive_14_inch_API_34 -no-snapshot

需要在 Android Studio 安装 AAOS 系统镜像:

  1. SDK Manager → SDK Tools → Android Automotive Intel x86 Atom System Image

  2. 创建新设备类型:Pixel 5 Automotive

  3. 注意:AAOS 模拟器只能用 x86,不能用 ARM

商业机会

车载场景的应用生态还在早期:

  • 流媒体(网易云、QQ 音乐、Bilibili 都在做)

  • 充电桩(蔚来、特来电)

  • 智能家居联动

  • 儿童教育(后排屏)

  • 出行服务(打车、租车)

对应门槛:OEM 厂商认证(每家车厂审核标准不一样)、依赖特定车辆数据(私有 API)、生命周期长(车型 5-7 年)。

小结

AAOS 是 Android 工程师能切入的全新赛道。门槛在于:

  1. 理解驾驶安全规范

  2. 用 Car App Library 而非 Compose

  3. 处理车辆硬件和外部状态变化

  4. 适配各种车机硬件

回报是:需求多、岗位稀缺、薪资水平高于普通 Android 开发。

下一篇进入 Android 14/15 新特性深度解析,了解平台最新的能力演进。


评论