1.1 Vendor 分区的作用与历史演变

Vendor 分区是 Android 系统从 8.0 (Oreo) 开始引入的独立分区,用于存放硬件抽象层 (HAL)、固件、内核模块以及设备专属配置。它的出现解决了长期以来 system 分区“一区包办”导致的碎片化与升级困难问题。

1.1.1 Vendor 分区的作用

作用维度 具体说明
硬件抽象层 (HAL) 部署 存放 *.so 格式的 HAL 实现库,如 camera.vendor.so、audio.vendor.so,供框架通过 HIDL / AIDL 调用。
固件与内核模块 包含 WiFi/BT/NFC 固件 (.fw)、设备树叠加层 (.dtbo)、内核驱动模块 (.ko)。
设备专属配置 提供 media_codecs.xml、audio_policy.conf、sensors 校准参数等硬件相关配置文件。
系统分区解耦 使 system 分区成为纯通用 Android 框架镜像,不同设备只需替换 vendor 分区即可适配。
关键理解: Vendor 分区是 SoC 厂商(如 Qualcomm、MTK)与 OEM 定制硬件的“专属领地”,Google 的通用系统映像 (GSI) 依赖 vendor 分区实现跨设备兼容。

1.1.2 历史演变:从 system 分区分离的原因

在 Android 7.x 及更早版本中,所有 HAL、驱动、配置都打包在 system 分区内。这种架构存在三个致命缺陷:

  1. 升级耦合严重: 每次 OTA 更新 system 分区时,必须同时验证 vendor 内容,导致 SoC 厂商的改动阻塞 Google 安全补丁发布。
  2. 碎片化加剧: 不同设备使用不同 HAL 版本,system 镜像无法通用,GSI 方案无法落地。
  3. 分区大小浪费: system 分区必须为所有可能的硬件预留空间,实际利用率低。

Android 8.0 引入 Treble 架构,将 vendor 从 system 中剥离,形成 system + vendor 双分区模型。后续 Android 10 进一步引入 product 分区,但 vendor 始终是硬件定制的核心载体。

演进时间线: Android 7.x 及之前 → 单 system 分区;Android 8.x-9.x → system + vendor 双分区;Android 10+ → system + vendor + product 多分区。

1.1.3 分区挂载点与文件系统类型

Vendor 分区在 Android 启动阶段由 init 进程根据 fstab 配置挂载。以下是标准挂载参数:

属性 典型值 说明
挂载点 /vendor 所有 vendor 文件通过此路径访问
块设备 /dev/block/by-name/vendor 通过分区表名称引用
文件系统类型 ext4 / erofs / f2fs ext4 最通用;erofs 为只读压缩;f2fs 用于闪存优化
挂载选项 ro,barrier=1 生产环境通常只读挂载
dm-verity verify 启用完整性校验,防止分区被篡改

以下是一个典型的 fstab 条目示例:

/dev/block/by-name/vendor   /vendor   ext4   ro,barrier=1    wait,verify,slotselect,avb
注意: 在 Android 12+ 中,Google 推荐使用 erofs 作为 vendor 分区文件系统,以节省空间并提升随机读取性能。如果设备使用 f2fs,必须确保内核支持对应驱动。

1.1.4 Vendor 分区结构示意图

下图展示了 Vendor 分区在 Android 存储布局中的位置及其内部关键目录:

Vendor 分区在 Android 存储布局中的位置 boot 内核 + ramdisk system Android 框架 vendor HAL + 驱动 + 固件 product OEM 定制 /vendor 分区内部结构 /vendor/lib HAL 共享库 (*.so) /vendor/firmware 固件文件 (*.fw) /vendor/etc 硬件配置文件 /vendor/lib64 64位 HAL 库 /vendor/bin HAL 可执行程序 /vendor/overlay 资源叠加层 挂载点:/vendor | 文件系统:ext4/erofs | 挂载选项:ro,barrier=1 | dm-verity:verify

1.1.5 常见问题排查要点

  • 分区挂载失败: 检查 fstab 中 vendor 的块设备路径是否正确,以及内核是否支持对应文件系统(如 erofs 需要 CONFIG_EROFS_FS)。
  • HAL 库找不到: 确认 /vendor/lib 或 /vendor/lib64 中存在目标 HAL 库,且 SELinux 上下文为 vendor_file 类型。
  • 固件加载异常: 使用 ls -lZ /vendor/firmware/ 检查文件权限与安全上下文,确保 init.rc 中 firmware 服务能读取该目录。
  • 分区空间不足: 使用 df -h /vendor 查看使用率,若超过 90% 需考虑清理无用驱动或切换 erofs 压缩文件系统。
调试命令: adb shell mount | grep vendor 可实时查看 vendor 分区挂载状态;adb shell ls -al /vendor 列出所有 vendor 文件。