1. 课程导入

在Android设备量产与定制化开发中,产品配置与镜像构建是连接硬件设计、系统定制与最终出厂固件的关键环节。无论是手机、平板、车机、电视盒子还是IoT终端,只要涉及Android系统,就离不开一套可复现、可追溯、可量产的构建体系。本课程将围绕Android构建系统(以Soong、Kati、Ninja、Make为核心)展开,帮助你从零建立“配置—编译—打包—验证”的完整能力。

本课程的学习目标可以概括为三句话:
1. 能读懂并修改Android产品配置(Product Configuration),理解设备、产品、变体之间的关系;
2. 能独立完成一次Android系统镜像的构建、打包与刷机验证;
3. 能定位并解决构建过程中常见的配置冲突、依赖缺失与分区错误。

一、核心概念:从源码到镜像的“三层映射”

Android构建体系中最容易混淆的是“设备”“产品”“变体”三个概念。它们并不是同一层级的东西,而是从硬件到软件、从通用到具体的三层映射关系。

  • 设备(Device):对应具体硬件平台,例如高通SM8650、联发科天玑9300。设备配置通常放在device/<vendor>/<device>目录,描述芯片、内核、分区表、HAL等硬件相关信息。
  • 产品(Product):对应一款可销售的具体机型,例如“Pixel 8 Pro”“某品牌旗舰A”。产品配置放在device/<vendor>/<product>,它继承设备配置,并定义应用集、语言、默认属性、签名方式等。
  • 变体(Variant):对应同一产品的不同构建类型,例如user、userdebug、eng。变体决定调试权限、日志级别和可刷写性。

理解这三层关系后,再看构建命令lunch就不会觉得神秘:它本质上是在选择“产品+变体”的组合,并加载对应的配置树。

二、整体知识框架:配置、构建、镜像、验证四条主线

本课程的知识框架可以拆成四条主线,它们彼此依赖,构成一个闭环。

主线核心内容关键产物
产品配置AndroidProducts.mk、BoardConfig.mk、device.mk、产品继承与覆盖可被lunch识别的产品条目
构建系统Soong、Blueprint、Kati、Ninja、Make的协作关系编译中间件与模块产物
镜像打包system、vendor、boot、super、userdata等分区镜像生成可刷写的img文件与OTA包
验证与排障刷机、启动日志、分区校验、构建错误定位可运行设备与问题修复记录

这四条主线不是线性顺序,而是反复迭代。实际工作中,你往往先改配置,再构建,发现镜像异常,回头再改配置。因此,建立“配置影响构建、构建决定镜像、镜像验证配置”的因果意识,比死记命令更重要。

三、方法流程:一次标准构建的完整路径

下面给出一个典型的Android源码构建流程,后续章节会逐项展开。

# 1. 初始化构建环境
source build/envsetup.sh

# 2. 选择产品与变体
lunch aosp_device_userdebug

# 3. 清理与准备(可选)
make installclean

# 4. 开始构建
make -j$(nproc) otapackage

# 5. 查看产物
ls out/target/product/<device>/

其中lunch是配置入口,make是构建入口,otapackage是打包目标。真正决定“编译什么、怎么编译”的,是AndroidProducts.mk、BoardConfig.mk和device.mk这三个文件。它们分别回答:有哪些产品可选、硬件怎么配置、软件包怎么组装。

建议在第一次构建时使用userdebug变体,它既有root权限,又保留接近正式版的运行行为,最适合学习和调试。

四、实战路线图:从“能编译”到“能量产”

本课程共30章,整体路线图如下:

  1. 入门阶段(第1-6章):理解构建系统架构、目录结构、lunch机制、产品配置继承关系。
  2. 配置阶段(第7-14章):掌握BoardConfig、device.mk、产品覆盖、属性系统、分区表配置。
  3. 构建阶段(第15-22章):深入Soong/Blueprint、模块定义、依赖管理、编译优化与增量构建。
  4. 镜像与验证阶段(第23-30章):镜像打包、super分区、OTA、刷机验证、常见故障排查与量产注意事项。

每一章都会围绕一个可操作的目标展开,最终你会拥有一个属于自己的产品配置,并能独立构建出可刷写的系统镜像。

五、案例场景:一个真实的产品配置需求

假设你所在团队要基于AOSP为某款平板开发定制系统,需求包括:预装三个自研应用、默认中文、关闭调试日志、支持A/B无缝升级、使用自定义开机动画。这个需求看似简单,但涉及产品配置、应用集成、属性覆盖、分区布局和OTA打包多个环节。

你需要做的是:在device/<vendor>/<product>下新增产品条目,在device.mk中通过PRODUCT_PACKAGES加入应用,通过PRODUCT_PROPERTY_OVERRIDES设置默认语言和日志级别,在BoardConfig.mk中配置A/B分区和super分区大小,最后用make otapackage生成可升级的OTA包。这个过程正是本课程要训练的核心能力。

六、常见误区与复盘

初学者最容易犯的三个错误:
1. 把设备配置和产品配置混在一起,导致多机型复用困难;
2. 直接修改AOSP原生文件,而不是通过产品覆盖,导致升级后丢失;
3. 忽略变体差异,用eng变体验证后直接出user版本,结果权限或日志行为不一致。

复盘方法很简单:每次构建失败或镜像异常,都记录“改了哪个文件、期望什么、实际什么、根因是什么”。坚持记录,你会发现自己对构建系统的理解速度会明显加快。

Android 产品配置与镜像构建 · 知识框架 配置 → 构建 → 镜像 → 验证 的闭环关系 产品配置 AndroidProducts.mk BoardConfig.mk device.mk 构建系统 Soong / Blueprint Kati / Ninja Make 目标 镜像打包 system / vendor boot / super OTA 包 验证 刷机 启动日志 分区校验 验证结果反馈,迭代修改配置 实战路线图(30章) 入门阶段 第1-6章 · 架构与lunch 配置阶段 第7-14章 · 产品与分区 构建阶段 第15-22章 · Soong与依赖 镜像与验证 第23-30章 · OTA与排障

这张图把本课程的核心对象、依赖方向和迭代关系放在同一视野中:配置决定构建输入,构建产出镜像,镜像通过验证后反馈回配置。后续每一章,你都会在这张图上找到自己的位置。