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 分区内。这种架构存在三个致命缺陷:
- 升级耦合严重: 每次 OTA 更新 system 分区时,必须同时验证 vendor 内容,导致 SoC 厂商的改动阻塞 Google 安全补丁发布。
- 碎片化加剧: 不同设备使用不同 HAL 版本,system 镜像无法通用,GSI 方案无法落地。
- 分区大小浪费: 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 存储布局中的位置及其内部关键目录:
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 文件。