2. 车载显示基础

说实话,车载座舱开发的环境搭建,跟普通手机App开发还真不太一样。我刚开始接触这个领域时,以为装个Android Studio就能直接开干,结果折腾了两天才把模拟器跑起来。嗯,这里面的坑,我帮你一个一个填上。

2.1 Android Studio 的“车载特调”配置

你手头的Android Studio,如果是2021年之后的版本,基本都能用。但有几个关键配置,我建议你手动确认一下。

核心要点:车载开发依赖 Android SDK Platform 29+ 和 Android Auto API。别用太老的SDK版本,有些车载API在API 28以下根本找不到。

2.1.1 SDK Manager 里的必装项

打开SDK Manager,除了你常用的那几个系统镜像,下面这几项必须勾上:

组件名称 版本要求 用途说明
Android SDK Platform 29 ≥ 29 车载系统基础API,很多座舱应用最低要求
Android SDK Platform 30 ≥ 30 支持多屏显示、Car API 扩展
Android Auto API 最新稳定版 车载投影与驾驶模式核心库
Intel x86 Atom_64 System Image 对应API级别 模拟器加速运行,必装
Google Play Services 最新版 地图、语音等车载服务依赖

我个人习惯把 Show Package Details 勾上,把每个版本下的所有子项都展开看看。有一次我发现某个API 30的镜像缺少了车载模拟器皮肤,就是因为没展开看细节。

2.1.2 Gradle 与 JDK 版本匹配

车载项目通常依赖较新的Gradle插件。我建议你用 Gradle 7.4+ 配合 JDK 11。JDK 8虽然也能编译,但有些车载库的字节码版本已经升上去了,强行用JDK 8会报 Unsupported class file major version 错误。

// 项目级 build.gradle 示例
buildscript {
    ext.kotlin_version = '1.8.0'
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.4.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

注意:如果你用的是Apple Silicon芯片的Mac,记得在 gradle.properties 里加上 android.useAndroidX=true 和 android.jetifier.ignorelist=car,否则车载库的依赖解析会出问题。我踩过这个坑,折腾了整整一个下午。

2.2 车载SDK安装:不只是“下一步”那么简单

车载SDK不是Google官方直接提供的,它通常来自芯片厂商(比如高通、瑞萨、恩智浦)或者Tier 1供应商。安装方式分两种,我分别说一下。

2.2.1 从AOSP源码编译的SDK

如果你在车厂工作,大概率会拿到一个 sdk_addon.zip 或者 car_sdk.zip。解压后,里面有一个 add-ons 目录。你需要把它复制到Android SDK的 add-ons 目录下。

# 假设你的Android SDK路径在 ~/Android/Sdk
cp -r ./car_sdk/add-ons/addon-car_sdk-google-29 ~/Android/Sdk/add-ons/

然后,在项目的 build.gradle 里引用这个add-on:

android {
    compileSdkVersion 29
    // 关键:指定使用车载add-on
    useAddOn 'addon-car_sdk-google-29'
}

为什么这么做?因为车载API(比如 android.car.*)不在标准SDK里,必须通过add-on注入。我记得第一次编译时忘了加 useAddOn,结果所有Car API都报红,那种感觉……嗯,你懂的。

2.2.2 通过Maven仓库集成

有些厂商把SDK发布到了私有Maven仓库。你需要在 settings.gradle 里添加仓库地址:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        // 厂商私有仓库
        maven { url 'https://maven.xxx.com/repository/car-sdk/' }
    }
}

然后在 build.gradle 里直接依赖:

dependencies {
    implementation 'com.android.car:car:1.0.0'
    implementation 'com.android.car:car-cluster:1.0.0'
}

小技巧:如果你不确定SDK是否安装成功,可以在终端执行 adb shell dumpsys package 看看有没有 com.android.car 相关的包。或者直接在代码里写一句 import android.car.Car;,不报红就说明成了。

2.3 模拟器环境搭建:让车载系统跑在PC上

车载模拟器跟手机模拟器最大的区别在于——它需要模拟 多屏显示 和 方向盘控制。普通模拟器默认只有一个屏幕,这显然不够用。

2.3.1 创建车载模拟器AVD

在AVD Manager里,点击 Create Virtual Device,然后选择 Automotive 分类。你会看到几个预设的车载设备模板:

  • Automotive Wide (1024p):横屏中控,适合仪表盘+中控双屏模拟
  • Automotive Large (720p):竖屏中控,适合后座娱乐系统
  • Automotive Ultra Wide (1600p):带鱼屏,适合全景显示

我建议你选 Automotive Wide,因为它最接近真实座舱的屏幕比例。系统镜像选 API 30 或 API 31 的 Google APIs 版本,不要选 Google Play 版本——车载模拟器不需要Play商店,反而会拖慢启动速度。

2.3.2 多屏显示配置

模拟器启动后,默认只有一个屏幕。要模拟双屏,你需要修改AVD的配置文件。找到 ~/.android/avd/你的AVD名称.avd/config.ini,添加以下内容:

hw.displayRegion.0.width = 1280
hw.displayRegion.0.height = 720
hw.displayRegion.0.density = 213
hw.displayRegion.1.width = 1280
hw.displayRegion.1.height = 720
hw.displayRegion.1.density = 213
hw.displayRegion.1.xOffset = 1280
hw.displayRegion.1.yOffset = 0

重启模拟器后,你会看到两个并排的屏幕。嗯,这里要注意:xOffset 必须等于第一个屏幕的宽度,否则两个屏幕会重叠。

避坑指南:我曾经在配置双屏时,把 density 设成了320,结果第二个屏幕的UI全部错位。后来发现,车载屏幕的density通常用 213(对应mdpi)或 160,别用太高。

2.3.3 模拟方向盘与CAN信号

车载模拟器自带一个 Extended Controls 面板(模拟器右侧的“…”按钮)。在里面你可以模拟:

  • 方向盘按键:音量加减、上一曲/下一曲、语音唤醒
  • 车辆信号:车速、转向灯、车门状态
  • 空调控制:温度、风量、模式

这些信号会通过 android.car.VehicleProperty 接口传递给应用。你可以在代码里监听这些属性变化,验证你的座舱应用是否响应正确。

2.4 真机调试环境搭建:从电脑到车机

模拟器终究是模拟器,真机调试才是最终战场。但车机跟手机不一样,它通常没有USB调试开关,甚至没有屏幕给你点。

2.4.1 开启车机ADB调试

大部分车机在工程模式下可以开启ADB。具体操作因厂商而异,但通用方法是:

  1. 进入 设置 → 系统 → 关于本机
  2. 连续点击 版本号 7次,直到提示“已进入开发者模式”
  3. 返回 系统 → 开发者选项,打开 USB调试

如果车机没有屏幕(比如只有仪表盘),你需要通过 串口 或 网络ADB 连接。我曾经遇到过一台车机,USB调试死活打不开,最后发现是车机固件把ADB功能锁了。解决办法是刷一个开放版固件,或者用 adb connect 车机IP:5555 通过网络连接。

2.4.2 网络ADB连接

车机通常通过Wi-Fi或以太网连接。确保电脑和车机在同一个局域网内,然后执行:

# 先通过USB连接一次,开启网络ADB端口
adb tcpip 5555

# 断开USB,通过网络连接
adb connect 192.168.1.100:5555

# 验证连接
adb devices

输出应该显示 192.168.1.100:5555 device。如果显示 offline,检查一下车机防火墙是否放行了5555端口。

重要提醒:网络ADB连接不稳定时,日志会频繁断开重连。我建议你准备一根 5米以上的USB线,真机调试时优先用有线连接。网络ADB只适合做快速验证。

2.4.3 车载日志过滤技巧

车机日志比手机多得多,因为除了App日志,还有大量系统服务、CAN总线、多媒体框架的日志。直接 adb logcat 会刷屏。我常用的过滤方式:

# 只看车载相关日志
adb logcat -s CarService

# 按优先级过滤,只看错误和警告
adb logcat *:W

# 保存日志到文件,方便事后分析
adb logcat -v threadtime > car_log.txt

我个人习惯把 CarService、CarInputService、VehicleHal 这三个tag的日志单独保存。大部分车载问题,看这三个tag就能定位。

2.5 本章知识体系总览

下面这张图,帮你把整个开发环境搭建的脉络理清楚。从工具链到运行环境,每一步都有对应的配置要点。

车载Android座舱开发环境搭建总览 Android Studio Gradle + JDK 11 SDK Manager 车载SDK Add-on Car API / Auto API Maven私有仓库 模拟器环境 Automotive Wide AVD 双屏显示配置 Extended Controls 真机调试环境 USB调试 / 网络ADB 工程模式开启 日志过滤技巧 Logcat 日志分析 / 性能监控 提示:模拟器适合UI验证和功能开发,真机调试必须用于性能测试和硬件交互验证

2.6 常见问题与快速排查

搭建过程中,你可能会遇到下面这些问题。我把它们列出来,方便你对照排查。

问题现象 可能原因 解决方案
模拟器启动黑屏 缺少GPU加速或系统镜像不完整 检查HAXM是否安装,重新下载系统镜像
Car API 编译报红 未正确引用车载add-on 确认 useAddOn 配置,检查SDK路径
真机ADB连接不上 驱动未安装或车机ADB被锁 安装车机USB驱动,尝试网络ADB
双屏显示重叠 xOffset 配置错误 确保第二个屏幕的 xOffset 等于第一个屏幕宽度
日志刷屏找不到关键信息 未使用tag过滤 用 -s CarService 或 *:W 过滤

最后说一句:环境搭建这件事,一次配好,后面能省很多时间。我建议你把每一步的配置截图保存下来,或者写个脚本一键配置。下次换电脑或者重装系统时,你会感谢现在的自己。