一、课程导学与开发环境搭建

各位同学,欢迎来到《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系统架构,也是咱们这门课的知识体系主线:

Android Automotive 系统架构与移植知识体系 应用层 (App Layer) CarLauncher | 设置 | 地图 | 音乐 | 语音助手 Android 框架层 (Framework) CarService | VehicleManager | 音频策略 | 多窗口管理 硬件抽象层 (HAL) Vehicle HAL | Audio HAL | Camera HAL | Sensors HAL Linux 内核与驱动 (Kernel & Drivers) 设备树 | CAN驱动 | GPU驱动 | 显示驱动 | 电源管理 i.MX8QM 硬件平台 移植工作核心区域

这张图里,从下往上,就是咱们这门课要攻克的一条线。每一层我都会带你手把手配置、编译、调试。

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%。

以下是环境配置步骤:

  1. 安装必要工具包
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
  1. 安装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
  1. 安装JDK

Android 12及以上版本需要OpenJDK 11:

sudo apt install -y openjdk-11-jdk
  1. 配置Python

Android编译脚本依赖Python 3.8+:

sudo apt install -y python3 python3-pip
sudo ln -s /usr/bin/python3 /usr/bin/python
  1. 安装额外的库(针对i.MX平台)

NXP的BSP里有些专有工具,需要额外装一些库:

sudo apt install -y libssl-dev liblz4-tool device-tree-compiler \
  u-boot-tools mtd-utils

我的经验: 每次配完环境,我都习惯跑一遍 repo initrepo sync 测试一下。如果同步没问题,说明环境基本OK。别等到编译时才发现缺库,那太浪费时间了。

1.5 源码下载与编译环境搭建

源码下载,是很多新手的第一道坎。为什么?因为Android源码太大了——完整拉下来要30GB+,编译完要150GB+。所以,磁盘空间至少留200GB,建议用SSD。

咱们用的是NXP官方的Android Automotive BSP,基于Android 12。下载步骤:

  1. 创建工作目录
mkdir -p ~/imx8qm_android12
cd ~/imx8qm_android12
  1. 初始化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,别搞混了。

  1. 同步源码
repo sync -j4

-j4 表示4个线程并行下载。如果你的网络带宽够,可以改成 -j8-j16。但注意,不要开太多,否则容易被服务器限流。

避坑指南: 我曾经在同步源码时,网络断了,然后直接重新 repo sync,结果发现有些仓库没同步完整,编译时各种报错。正确的做法是:先 repo sync --force-sync,强制把所有仓库重新同步一遍。如果还不行,就删掉 .repo 目录重新来。

  1. 配置编译环境

NXP的BSP里带了一个环境配置脚本:

source setup_env.sh

这个脚本会设置 ANDROID_BUILD_TOPPATH 等环境变量。每次打开新终端,都要先 source 一下。

  1. 选择编译目标

针对i.MX8QM,编译目标一般是:

lunch evk_8qm-userdebug

userdebug 版本带root权限和调试工具,适合开发阶段。正式发布时用 user 版本。

  1. 开始编译
make -j$(nproc) 2>&1 | tee build.log

$(nproc) 会自动获取你的CPU核心数。比如8核CPU,就是 make -j8。第一次编译大概需要2~4小时,取决于你的机器配置。

编译完成后,镜像文件在 out/target/product/evk_8qm/ 目录下。主要文件有:

  • boot.img:内核+ramdisk
  • system.img:系统分区
  • vendor.img:厂商分区(驱动、HAL等)
  • u-boot.imx:Bootloader

验证编译是否成功:build.log 最后一行是不是 #### build completed successfully ####。如果是,恭喜你,环境搭好了!如果不是,别慌,看日志里的error信息,99%的情况是缺库或者环境变量没配对。

好了,这一章的内容就到这里。环境搭好了,后面咱们就可以开始真正的移植工作了。记住,环境搭建是基础中的基础,别嫌麻烦,一步一个脚印来。


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