3. Vendor分区详解
在Android系统集成的语境中,Vendor分区并不是一个简单的“存放厂商文件的目录”,而是Android从“整机强耦合”走向“框架与硬件解耦”的关键结构性设计。理解Vendor分区,必须同时理解它为什么出现、它与system分区如何分工、VNDK与Vendor接口如何约束边界,以及Treble项目如何改变了整个系统升级模型。
一、历史背景:为什么需要Vendor分区
在Android 8.0之前,system分区与厂商硬件适配代码高度混合。芯片厂商的HAL实现、驱动配置、专有库、甚至部分框架定制都直接放入system分区。结果是:Google每发布一次Android大版本,芯片厂商和OEM都必须把大量私有代码重新移植、重新编译、重新验证,导致新版本适配周期长、成本高、碎片化严重。
这种模式的核心问题是接口不稳定。框架层与厂商实现之间没有明确契约,任何一方改动都可能破坏另一方。于是Android 8.0引入Treble项目,把原本混在system中的厂商相关部分剥离到独立的vendor分区,并规定两者之间通过稳定接口通信。这样,system分区可以独立升级,vendor分区保持相对稳定,从而实现“框架升级不依赖厂商重新编译全部代码”。
二、Vendor分区与system分区的解耦
解耦的本质是职责分离。system分区承载Android框架、系统应用、系统库和Google服务等通用部分;vendor分区承载与具体硬件平台强相关的部分,例如HAL实现、厂商专有库、固件、硬件配置、内核模块等。两者通过定义良好的接口进行交互,而不是直接互相引用内部实现。
在运行时,Android通过VNDK和Vendor接口来约束这种交互。VNDK是一组被允许同时被system和vendor使用的系统库集合,它保证了框架与厂商代码之间共享库的稳定性。Vendor接口则包括HAL接口、HIDL/AIDL接口以及部分稳定AIDL接口,它们定义了vendor向system暴露的能力边界。
三、VNDK与Vendor接口:解耦的“契约”
VNDK全称Vendor Native Development Kit,它并不是一个开发工具包,而是一组被允许同时被system和vendor使用的系统库。在Treble之前,厂商代码可以直接链接system中的任意库;Treble之后,只有VNDK中的库才允许被vendor使用,并且这些库的ABI必须保持稳定。
Vendor接口则更偏向“能力暴露”。厂商通过HAL接口向system提供硬件能力,例如相机HAL、音频HAL、传感器HAL等。Android 8到Android 10主要使用HIDL,Android 11之后逐步转向AIDL HAL。无论哪种形式,核心思想都是:接口稳定、版本可查、实现可替换。
| 对比维度 | system 分区 | vendor 分区 |
|---|---|---|
| 主要内容 | 框架、系统应用、系统库、Google服务 | HAL实现、厂商库、固件、硬件配置 |
| 升级方式 | 可独立OTA升级 | 通常随硬件平台保持稳定 |
| 接口约束 | 通过VNDK和Vendor接口访问vendor能力 | 必须实现稳定HAL/AIDL接口 |
| 与硬件关系 | 弱相关,通用性强 | 强相关,平台专属 |
| 典型路径 | /system、/system_ext | /vendor、/odm |
四、Treble项目的影响与集成实践
Treble项目对Android系统集成的影响是深远的。首先,它把“Android版本升级”和“芯片平台适配”拆成了两个相对独立的问题。Google可以更快推送新框架,芯片厂商只需保证vendor实现符合稳定接口即可。其次,它引入了Vendor Interface版本概念,系统在启动时会检查vendor接口版本是否匹配,不匹配则可能拒绝启动或降级运行。
在实际集成中,常见操作包括查看vendor分区内容、确认VNDK版本、检查HAL接口声明等。例如:
# 查看 vendor 分区挂载与内容
adb shell mount | grep vendor
adb shell ls -l /vendor/lib64/hw/
# 查看 VNDK 版本
adb shell getprop ro.vndk.version
# 查看 Vendor Interface 版本
adb shell getprop ro.vendor.api_level
# 查看已注册的 HAL 服务
adb shell lshal | head -40
五、常见误区与复盘
- 误区一:vendor分区就是“厂商随便放东西的地方”。实际上vendor分区中的库和接口必须遵守VNDK和Vendor接口约束,不能随意链接system私有库。
- 误区二:解耦后system和vendor完全无关。两者仍然通过稳定接口强关联,接口版本不匹配会导致启动失败或功能异常。
- 误区三:只要把文件放进vendor分区就能解耦。解耦的关键是接口稳定和依赖边界清晰,而不是物理位置。
- 误区四:Treble只影响新设备。老设备升级到Android 8.0以上时,同样需要满足Treble要求,否则无法通过兼容性测试。
复盘来看,Vendor分区的价值不在于“多了一个分区”,而在于它把Android系统集成从“整机强耦合”推进到“框架与硬件契约化协作”。理解VNDK、Vendor接口和Treble的关系,是后续进行系统裁剪、OTA升级、HAL适配和兼容性排障的基础。