1. 课程导入

在 Android 系统集成工作中,分区(Partition)是最基础也最容易被忽视的概念之一。很多开发者在遇到开机卡 Logo、OTA 升级失败、GMS 认证不通过、驱动无法加载等问题时,往往第一时间去查代码逻辑,却忽略了问题的根源可能在于镜像被放错了分区。理解 Android 分区体系,尤其是 Vendor 分区的定义与作用,是打通系统集成任督二脉的第一步。

一、为什么 Android 需要分区

Android 设备本质上是一块 eMMC 或 UFS 存储芯片,加上若干外设。如果所有内容都堆在一个大分区里,会带来三个致命问题:一是升级粒度粗,改一个驱动就要重刷整个系统;二是权限边界模糊,应用层代码可能误改底层固件;三是认证与安全无法落地,Google 的 AVB 校验、Treble 兼容性测试都需要明确的镜像边界。因此 Android 从早期版本开始就采用多分区布局,把 Bootloader、内核、系统框架、厂商驱动、用户数据等按职责切分到不同分区中。

随着 Android 8.0 Project Treble 的引入,分区体系发生了一次结构性变革:原本集中在 system 分区中的厂商相关代码被剥离出来,形成独立的 vendor 分区。这一变化让 Google 的通用系统镜像(GSI)与芯片厂商、ODM 的定制代码解耦,使系统升级不再强依赖厂商适配。

二、Android 分区体系全景

一个典型的 Android 设备分区布局可以按功能划分为四个层次:引导层、系统层、厂商层和数据层。下图展示了各分区之间的层级关系与职责归属。

Android 分区体系层次结构 从引导到数据,各分区职责分明、边界清晰 引导层 Bootloader boot 内核 + ramdisk init_boot 通用 ramdisk dtbo 设备树覆盖 vbmeta AVB 校验元数据 系统层 AOSP 通用 system 框架 + 系统应用 system_ext 系统扩展组件 product 产品定制层 odm ODM 定制 厂商层 Vendor 专属 vendor HAL + 驱动 + 固件 vendor_boot 厂商 ramdisk vendor_dlkm 厂商内核模块 数据层 用户与持久化 userdata 用户数据 metadata 加密元数据 persist 传感器校准 misc 启动控制 Vendor 分区是 Treble 架构的核心边界:向上通过 HIDL/AIDL 与 system 通信,向下直接管理芯片外设与驱动

从上图可以看到,vendor 分区位于厂商层的核心位置,它向上通过 HIDL/AIDL 接口与 system 分区中的框架通信,向下直接管理芯片外设、驱动和固件。这种设计让 system 分区可以独立于厂商代码进行升级,也让厂商代码有了明确的存放边界。

三、Vendor 分区的定义与作用

Vendor 分区是 Android 8.0 引入的、用于存放芯片厂商与设备厂商专属代码的独立分区。它的核心作用可以归纳为四点:

  • 承载 HAL 实现:Camera、Audio、Bluetooth、Sensors 等硬件抽象层的具体实现代码都放在 vendor 分区中,通过标准接口向上暴露能力。
  • 存放驱动与固件:内核模块、外设固件、校准数据等与具体硬件强相关的二进制文件,统一由 vendor 分区管理。
  • 实现系统与厂商解耦:system 分区只保留 AOSP 通用代码,vendor 分区保留厂商定制,两者通过稳定的接口契约协作,使 GSI 可以跨设备运行。
  • 满足合规与认证要求:GMS 认证、CTS/VTS 测试都要求厂商代码与系统代码边界清晰,vendor 分区正是这一要求的物理落地。

关键理解:Vendor 分区不是“厂商随便放东西的地方”,而是一个有明确接口规范、有 AVB 校验、有版本兼容性要求的受控分区。放错内容会导致 VTS 失败或 OTA 升级异常。

四、核心分区职责对照清单

下表整理了 Android 主要分区的职责、典型内容与归属方,便于在集成工作中快速定位镜像归属。

分区名 主要职责 典型内容 归属方
boot 启动内核与通用 ramdisk kernel、generic ramdisk AOSP / 芯片厂
vendor_boot 厂商专属 ramdisk 与内核模块 vendor ramdisk、DLKM 芯片厂 / ODM
system Android 框架与系统应用 framework、SystemUI、Settings AOSP
vendor HAL 实现、驱动、固件 camera HAL、audio HAL、firmware 芯片厂 / ODM
vendor_dlkm 厂商可加载内核模块 wlan.ko、touch.ko 芯片厂 / ODM
odm ODM 定制内容 定制配置、区域化组件 ODM
product 产品差异化内容 产品应用、覆盖配置 品牌方
userdata 用户数据与运行时状态 应用数据、数据库 运行时生成

五、典型场景:一个摄像头驱动该放哪里

假设你是一名系统集成工程师,需要为一款新机型适配摄像头。你拿到了芯片厂提供的摄像头驱动和 HAL 实现,应该把它们放到哪个分区?

  1. 摄像头 HAL 的 .so 库和对应的 manifest.xml 接口声明,放入 vendor/lib64/hw/ 与 vendor/etc/vintf/。
  2. 摄像头固件文件(如 .bin)放入 vendor/firmware/。
  3. 如果驱动以内核模块形式提供,放入 vendor_dlkm/lib/modules/。
  4. 摄像头相关的权限配置 .rc 文件放入 vendor/etc/init/。

如果误把 HAL 库放进 system/lib64/,会直接导致 VTS 测试报错,因为 system 分区不允许包含厂商私有实现。这就是理解分区边界的实际价值。

常见误区:很多初学者认为“只要功能能跑,放哪个分区都一样”。实际上,Android 的 AVB 校验、SELinux 策略、VTS 测试都会检查分区内容归属。放错分区可能在开发阶段不报错,但在认证或 OTA 阶段集中爆发。

六、本课程学习目标与整体框架

本课程围绕 Vendor 分区与系统集成展开,学习目标包括:

  • 掌握 Android 分区体系的整体结构与各分区职责边界。
  • 理解 Vendor 分区在 Treble 架构中的角色与接口机制。
  • 能够独立完成 vendor 镜像的配置、编译与烧录。
  • 掌握 VINTF、SELinux、AVB 等与 vendor 分区强相关的集成技术。
  • 具备排查 vendor 分区相关启动、升级、认证问题的能力。

课程整体分为四个阶段:基础认知(分区体系、Vendor 定义)、构建与配置(BoardConfig、vendor 镜像生成)、集成与调试(HAL 接口、VINTF、SELinux)、验证与排障(VTS、OTA、常见故障分析)。后续章节将沿着这条主线逐步深入,从分区表配置一直走到量产验证。

# 查看设备当前分区布局(adb 环境)
adb shell ls -l /dev/block/by-name/
# 典型输出示例
# boot        -> /dev/block/sda1
# vendor      -> /dev/block/sda5
# vendor_boot -> /dev/block/sda6
# vendor_dlkm -> /dev/block/sda7
# system      -> /dev/block/sda3
# userdata    -> /dev/block/sda12

掌握分区体系,是后续所有集成工作的地基。当你能准确说出“这个文件属于哪个分区、为什么属于这个分区”时,系统集成中的大部分困惑都会迎刃而解。