2. Android系统架构演进

在Android早期版本中,系统框架与硬件厂商的实现代码高度耦合。Framework层、HAL层、内核驱动往往由同一套源码树编译,厂商修改HAL接口时,必须同步修改Framework,甚至修改AOSP公共代码。这种“一锅端”的构建方式导致两个严重后果:一是系统升级极其困难,Google发布新版本后,厂商需要把大量私有补丁重新移植到新代码上;二是碎片化严重,同一代Android版本在不同设备上的行为差异巨大。Treble项目正是为解决这一结构性问题而提出。

核心原理:Treble的分区化与接口稳定化

Treble的核心思想可以概括为“分区解耦 + 接口稳定”。它把原本混在一起编译的Android系统拆分为三个逻辑部分:

  • System分区:包含AOSP框架、系统服务、应用框架等,由Google主导,可独立升级。
  • Vendor分区:包含SoC厂商和OEM提供的HAL实现、固件、驱动配置,随设备出厂固化。
  • VINTF(Vendor Interface):位于两者之间的“契约层”,用XML描述Vendor与System之间可用的接口、版本和依赖关系。

在Treble之前,HAL接口是“直连”的:Framework直接调用厂商提供的.so库,接口签名一旦变化,双方必须同时修改。Treble之后,HAL被抽象为稳定的HIDL(后演进为AIDL)接口,System通过Binder化调用访问Vendor实现,双方只依赖VINTF中声明的接口清单,不再依赖具体实现。

Treble 分区化解耦架构 System 分区(Google 主导,可独立升级) Framework / System Server AMS / PMS / WMS Native 服务 SurfaceFlinger / AudioFlinger HAL Client 代理 通过 Binder 调用 HAL VINTF 查询 接口清单校验 VINTF 契约层(Vendor Interface) manifest.xml(Vendor 声明) matrix.xml(System 需求) 兼容性校验 / 版本匹配 Vendor 分区(SoC / OEM 提供,随设备固化) Camera HAL android.hardware.camera @2.4 / @3.2 Audio HAL android.hardware.audio @5.0 / @7.0 Display HAL android.hardware.graphics @2.0 / @3.0 内核驱动 /dev / sysfs 固件配置 声明需求 校验实现 Binder 化调用

方法流程:从源码耦合到接口契约

Treble的落地不是简单“分目录”,而是一套完整的工程流程。下面以Camera HAL为例,说明从旧架构迁移到Treble架构的关键步骤:

  1. 接口定义:在hardware/interfaces/camera/下用HIDL或AIDL定义接口,如ICameraProvider.hal,明确方法签名、数据类型和版本号。
  2. Vendor实现:SoC厂商在vendor/目录下实现该接口,生成对应的HAL服务,并在manifest.xml中声明“我支持camera@2.4”。
  3. System需求声明:AOSP在matrix.xml中声明“Framework需要camera@2.4及以上”。
  4. 启动时校验:init进程在启动HAL服务前,通过VINTF校验manifest与matrix是否匹配,不匹配则拒绝启动并记录日志。
  5. 运行时调用:Framework通过Binder获取ICameraProvider代理,调用厂商实现,双方不再直接链接.so。

关键点:VINTF不是“可选项”,而是启动时的强制校验。如果Vendor声明的接口版本低于System要求,设备可能无法正常启动Camera服务,甚至卡在开机阶段。

案例场景:一次OTA升级中的VINTF校验失败

假设某设备出厂时Vendor分区声明了android.hardware.audio@5.0,而新System镜像要求audio@7.0。OTA升级后,init在解析VINTF时发现matrix中要求的7.0在manifest中不存在,于是:

# 典型日志片段
init: VINTF check failed for android.hardware.audio@7.0::IDevicesFactory
init: Required interface not found in vendor manifest
init: Cannot start vendor.audio-hal-2-0

此时音频服务无法启动,系统可能无声或通话异常。解决方式有两种:一是厂商在Vendor分区补充audio@7.0实现并更新manifest;二是System侧通过compatibility_matrix.xml放宽版本要求,但这会牺牲新特性。实际项目中,前者是正解,后者只用于过渡。

误区与复盘:Treble不是“万能解耦”

很多初学者认为“有了Treble,Vendor和System就完全无关了”。这是误解。Treble解耦的是编译依赖和接口调用方式,但两者仍通过VINTF、Binder、内核驱动、共享内存等机制紧密协作。以下常见误区值得警惕:

误区 实际情况 后果
Vendor可以随意改接口 接口版本必须与matrix匹配 开机校验失败,服务无法启动
System升级不需要Vendor配合 新System可能要求更高HAL版本 OTA后功能缺失或无法开机
VINTF只是文档,不影响运行 init在启动阶段强制校验 配置错误直接导致启动失败
所有HAL都必须Binder化 部分低延迟HAL仍可用直通模式 误用Binder可能增加延迟

复盘建议:在适配新平台时,先执行adb shell dumpsys android.hardware.camera.provider或查看/vendor/etc/vintf/manifest.xml,确认Vendor实际声明的接口版本,再对照System的compatibility_matrix.xml,提前发现版本缺口,避免到开机阶段才暴露问题。

从Treble到VINTF,Android完成了一次架构层面的“契约化”转型。分区化让System和Vendor可以独立演进,VINTF则用机器可校验的XML把双方的约定固化下来。理解这一演进背景,是后续掌握Vendor接口适配、manifest编写和兼容性排查的基础。