一、课程导学与开发环境搭建
各位同学,欢迎来到《i.MX Android Automotive系统移植实战》的第一章。我是你们这门课的主讲,一个在嵌入式Linux和Android底层摸爬滚打了十几年的工程师。今天咱们不聊虚的,直接切入正题——先把“家伙事儿”备齐了,后面的仗才好打。
这一章,说白了就是“磨刀不误砍柴工”。我会带着你把i.MX8QM这个平台看清楚,把Android Automotive到底是什么搞明白,然后把你的Ubuntu开发环境、源码下载编译环境,一步不差地搭起来。嗯,这里要注意,很多同学移植到一半卡住,回头一看,都是环境没配好。我当年就吃过这个亏。
本章核心目标: 让你拿到一块i.MX8QM开发板,能顺利地把Android Automotive源码下载下来,并且编译出一个可以烧录的系统镜像。
1.1 i.MX8QM平台介绍
i.MX8QM是NXP推出的一款面向汽车、工业、高端多媒体应用的应用处理器。为什么选它做车机?因为它真的“能打”。
我个人习惯把SoC比作一个团队:i.MX8QM这个团队里,有四个Cortex-A72大核(负责重活,比如导航、3D渲染),还有四个Cortex-A53小核(处理轻量任务,比如蓝牙、传感器)。这种大小核架构,在车机上特别实用——你想想看,开车的时候,导航和音乐是刚需,但后台的OTA升级、日志上传这些,用小核跑就够了,省电又稳定。
我在项目中遇到过一个问题:某款车机在高温下频繁死机。排查到最后,发现是A72核跑得太猛,散热跟不上。后来我们把部分后台服务绑定到A53核上,问题就解决了。这就是大小核架构的实战价值。
来看一下i.MX8QM的关键特性:
| 特性 | 说明 |
|---|---|
| CPU | 4×Cortex-A72 (1.6GHz) + 4×Cortex-A53 (1.2GHz) |
| GPU | GC7000XSVX (Vivante),支持OpenGL ES 3.2、Vulkan |
| VPU | 硬件编解码,支持4Kp60 H.265/H.264 |
| 显示 | 双路MIPI-DSI、HDMI 2.0、LVDS,支持多屏异显 |
| 汽车接口 | CAN-FD、Ethernet AVB、PCIe、USB 3.0 |
| 安全 | HAB、ARM TrustZone、eFuse |
做车机移植,你至少得知道:显示走哪条路、视频硬解怎么配、CAN总线怎么通。这些后面章节都会细讲。
1.2 Android Automotive系统概述
Android Automotive,不是Android Auto。前者是一个完整的、跑在车机硬件上的操作系统;后者只是一个手机投屏方案。很多刚入行的同学容易搞混,我刚开始也犯过这个错。
Android Automotive是Google专门为汽车打造的Android版本。它去掉了手机相关的Telephony框架,加上了汽车特有的服务,比如:
- CarService:管理车辆状态、空调、车窗、座椅等
- Vehicle HAL:硬件抽象层,连接Android框架和汽车CAN总线
- Car UI Library:针对驾驶场景优化的界面组件
- 音频策略:支持多音区(导航、电话、媒体互不干扰)
说白了,Android Automotive就是一个“去掉电话、加上车轮”的Android。它的内核还是Linux,上层还是ART虚拟机,应用框架还是那套东西。所以,如果你做过Android系统移植,上手会很快。但如果你只做过App开发,那底层的东西——BSP、设备树、HAL、内核驱动——就得下点功夫了。
我的建议: 不要一上来就啃源码。先理解Android Automotive的整体架构:从Linux内核 → HAL → 系统服务 → 应用框架,每一层是干什么的、数据怎么流动。脑子里有了这张图,后面看代码才不会迷路。
下面这张图,是我自己整理的Android Automotive系统架构,也是咱们这门课的知识体系主线:
这张图里,从下往上,就是咱们这门课要攻克的一条线。每一层我都会带你手把手配置、编译、调试。
1.3 开发板硬件准备
工欲善其事,必先利其器。你需要准备以下硬件:
- i.MX8QM 开发板:推荐NXP官方的MEK板,或者第三方做的核心板+底板方案。我建议用MEK,资料全、社区活跃。
- 电源适配器:12V/3A以上,注意接口是DC圆头还是Type-C。
- USB转串口模块:比如FT232或CP2102,用来看内核启动日志。这个很重要——没有串口日志,你连系统死在哪都不知道。
- MicroSD卡(16GB以上):用来烧录系统镜像,或者做SD卡启动。
- USB Hub + 键盘鼠标:调试阶段,触摸屏驱动还没好,你得靠键盘鼠标操作。
- HDMI线 + 显示器:至少1080p分辨率,建议带触摸功能(后面调试触摸用得上)。
- 网线:用于NFS挂载根文件系统,或者adb网络调试。
避坑指南: 我曾经因为用了劣质USB转串口模块,导致串口数据丢包,查了一个星期的内核启动问题,最后发现是模块本身的问题。所以,串口模块别省钱,买FTDI原厂或者正品FT232。
1.4 Ubuntu开发环境配置
我推荐使用 Ubuntu 20.04 LTS 64位 系统。为什么?因为Android 12/13的官方编译环境就是基于这个版本验证的。你用22.04也行,但可能会遇到一些库版本不兼容的问题,到时候还得自己折腾。
我个人习惯用物理机装Ubuntu,双系统或者直接装。虚拟机也行,但编译Android源码时,磁盘IO和内存是瓶颈——虚拟机性能打7折,编译时间会多出30%~50%。
以下是环境配置步骤:
- 安装必要工具包
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
- 安装Repo工具
Android源码用Repo管理,它是一个基于Git的仓库管理工具。
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
嗯,这里要注意:如果你在墙内,上面的URL可能访问不了。可以用清华或者中科大的镜像:
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
- 安装JDK
Android 12及以上版本需要OpenJDK 11:
sudo apt install -y openjdk-11-jdk
- 配置Python
Android编译脚本依赖Python 3.8+:
sudo apt install -y python3 python3-pip
sudo ln -s /usr/bin/python3 /usr/bin/python
- 安装额外的库(针对i.MX平台)
NXP的BSP里有些专有工具,需要额外装一些库:
sudo apt install -y libssl-dev liblz4-tool device-tree-compiler \
u-boot-tools mtd-utils
我的经验: 每次配完环境,我都习惯跑一遍 repo init 和 repo sync 测试一下。如果同步没问题,说明环境基本OK。别等到编译时才发现缺库,那太浪费时间了。
1.5 源码下载与编译环境搭建
源码下载,是很多新手的第一道坎。为什么?因为Android源码太大了——完整拉下来要30GB+,编译完要150GB+。所以,磁盘空间至少留200GB,建议用SSD。
咱们用的是NXP官方的Android Automotive BSP,基于Android 12。下载步骤:
- 创建工作目录
mkdir -p ~/imx8qm_android12
cd ~/imx8qm_android12
- 初始化Repo
repo init -u https://source.codeaurora.org/external/imx/imx-manifest \
-b imx-android12.0.0_2.6.0 -m imx-android-12.0.0_2.6.0.xml
这里 -b 指定分支,-m 指定manifest文件。不同的i.MX版本对应不同的manifest,别搞混了。
- 同步源码
repo sync -j4
-j4 表示4个线程并行下载。如果你的网络带宽够,可以改成 -j8 或 -j16。但注意,不要开太多,否则容易被服务器限流。
避坑指南: 我曾经在同步源码时,网络断了,然后直接重新 repo sync,结果发现有些仓库没同步完整,编译时各种报错。正确的做法是:先 repo sync --force-sync,强制把所有仓库重新同步一遍。如果还不行,就删掉 .repo 目录重新来。
- 配置编译环境
NXP的BSP里带了一个环境配置脚本:
source setup_env.sh
这个脚本会设置 ANDROID_BUILD_TOP、PATH 等环境变量。每次打开新终端,都要先 source 一下。
- 选择编译目标
针对i.MX8QM,编译目标一般是:
lunch evk_8qm-userdebug
userdebug 版本带root权限和调试工具,适合开发阶段。正式发布时用 user 版本。
- 开始编译
make -j$(nproc) 2>&1 | tee build.log
$(nproc) 会自动获取你的CPU核心数。比如8核CPU,就是 make -j8。第一次编译大概需要2~4小时,取决于你的机器配置。
编译完成后,镜像文件在 out/target/product/evk_8qm/ 目录下。主要文件有:
boot.img:内核+ramdisksystem.img:系统分区vendor.img:厂商分区(驱动、HAL等)u-boot.imx:Bootloader
验证编译是否成功: 看 build.log 最后一行是不是 #### build completed successfully ####。如果是,恭喜你,环境搭好了!如果不是,别慌,看日志里的error信息,99%的情况是缺库或者环境变量没配对。
好了,这一章的内容就到这里。环境搭好了,后面咱们就可以开始真正的移植工作了。记住,环境搭建是基础中的基础,别嫌麻烦,一步一个脚印来。
公众号:蓝海资料掘金营,微信deep3321