5、Car App Library入门:什么是Car App Library、核心组件介绍、依赖配置、第一个Car App示例。

好,咱们今天聊聊Car App Library。说实话,这个库是我在车载开发中用得最多的东西。你想想看,Android Automotive OS虽然是个完整的系统,但车机屏幕和手机屏幕差别太大了——旋钮操作、方向盘按键、大屏分屏,这些场景手机应用根本不会遇到。Car App Library就是Google专门为这些场景准备的开发工具包。

什么是Car App Library

Car App Library,简称CAL,是一套Android Jetpack的扩展库。它的目标很明确:让开发者能用标准Android组件,构建出符合车机交互规范的应用。

我刚开始接触车载开发时,以为直接写个普通Android应用就能跑。结果一上车机,按钮太小点不到,列表滚动不流畅,分屏模式下布局全乱套。嗯,这就是没有用CAL的后果。

CAL主要解决了三个问题:

  • 交互适配:把触摸操作自动映射成旋钮、方向盘按键操作
  • UI规范:提供符合车机设计规范的组件,比如大按钮、高对比度文字
  • 分屏支持:自动适配不同屏幕尺寸和分屏模式

核心要点:Car App Library不是替代Android SDK,而是在其之上做了一层车机适配。你的业务逻辑还是用标准Android写法,只是UI层换成CAL组件。

核心组件介绍

CAL的组件体系,说白了就是一套专门为车机定制的UI工具箱。我挑几个最常用的给你讲讲。

CarAppService

这是所有CAL应用的入口。它不像普通Activity那样直接启动界面,而是通过Service的方式运行。车机系统会通过绑定Service来获取你的应用内容。

class MyCarAppService : CarAppService() {
    override fun onCreateSession(): Session {
        return MySession()
    }
}

class MySession : Session() {
    override fun onCreateScreen(intent: Intent): Screen {
        return MyScreen()
    }
}

我在项目中遇到过一个问题:忘记在AndroidManifest.xml里声明这个Service。结果应用装上去,车机根本识别不到。你记得加上这个:

<service
    android:name=".MyCarAppService"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.car.app.CarAppService" />
    </intent-filter>
</service>

Screen

Screen对应普通Android里的Activity或Fragment。但它更轻量,生命周期也更简单。每个Screen负责一个页面内容。

CarText、CarIcon、ActionStrip

这些是CAL的基础UI组件。CarText会自动调整字号和对比度,CarIcon会适配车机主题,ActionStrip则是操作栏——你想想看,车机上没有返回键,全靠ActionStrip提供导航。

ListTemplate、GridTemplate、PaneTemplate

这是CAL提供的三种布局模板:

模板 适用场景 我常用的地方
ListTemplate 列表型内容,如联系人、设置项 音乐播放列表、电话通讯录
GridTemplate 网格型内容,如应用图标、快捷操作 主界面快捷卡片、媒体分类
PaneTemplate 分栏布局,左侧导航右侧内容 设置页面、多级菜单

我的建议:刚开始学CAL,先死磕ListTemplate。它最常用,也最容易上手。我带的几个新人,都是从ListTemplate开始,一周内就能写出可用的车机应用。

依赖配置

配置依赖其实很简单。在build.gradle里加上一行就行。但有个坑——版本号要跟你的AndroidX版本匹配。

dependencies {
    implementation "androidx.car.app:app:1.3.0"
}

我曾经因为版本号写错,编译过了但运行时崩溃。查了半天,发现是1.2.0和1.3.0的API有差异。建议你直接用最新稳定版,去Google的Release Notes里查。

另外,别忘了在AndroidManifest里声明车机功能:

<uses-feature
    android:name="android.hardware.type.automotive"
    android:required="true" />

这行代码告诉系统:我这个应用只能在车机上运行。如果你不加,应用可能在手机上也能安装,但跑起来会出各种奇怪问题。

第一个Car App示例

好,咱们动手写一个最简单的CAL应用。就一个页面,显示"Hello, Automotive OS"。

先创建CarAppService:

class HelloCarService : CarAppService() {
    override fun onCreateSession(): Session {
        return HelloSession()
    }
}

class HelloSession : Session() {
    override fun onCreateScreen(intent: Intent): Screen {
        return HelloScreen()
    }
}

再创建Screen,用ListTemplate展示内容:

class HelloScreen : Screen() {
    override fun onGetTemplate(): Template {
        val listBuilder = ListTemplate.Builder()
        val row = Row.Builder()
            .setTitle("Hello, Automotive OS")
            .addText("这是我的第一个Car App")
            .build()
        listBuilder.addRow(row)
        return listBuilder.build()
    }
}

最后别忘了在AndroidManifest里注册Service和声明车机特性。编译安装后,车机应用列表里就会出现你的应用。

注意:CAL应用不能在普通手机上调试。你需要用Android Automotive模拟器,或者直接跑在车机上。我刚开始不知道,在手机上折腾了半天,结果应用根本启动不了。

这里我画了一张CAL的核心架构图,帮你理清各个组件的关系:

Car App Library 核心架构 CarAppService 应用入口,继承自Service Session 管理生命周期,创建Screen Screen 页面内容,返回Template Template(ListTemplate / GridTemplate / PaneTemplate) 系统启动时 绑定Service后 创建页面时 渲染界面时

这张图展示了CAL应用从启动到界面渲染的完整流程。你仔细看,每个层级只负责一件事:CarAppService负责注册,Session负责管理,Screen负责内容,Template负责布局。这种分层设计,说白了就是为了让代码更清晰、更容易维护。

好了,这就是CAL的入门内容。你把这个示例跑起来,就算正式踏入车载开发的大门了。后面我们会深入每个组件的细节,到时候再聊。


公众号:蓝海资料掘金营,微信deep3321