背景:
各个厂商开发基于Android系统的设备,底层硬件相关的驱动或一些底层的功能由厂商(vendor)开发。
在Android 8.0之前,厂商开发的模块以动态库的方式提供,直接被framework调用(被native直接调用或者Java模块通过jni调用,总之是直接依赖)。
带来的问题,给Android系统升级带来麻烦,如果厂商不提供新版Android的支持,已有设备就无法使用新版Android系统。
为了解耦Android系统和供应商开发模块之间的依赖:
1)引入HAL层,让framework不直接依赖于vendor开发的二进制接口,二者根据需要依赖LL-NDK、VNDK、VNDK-SP,并借助aidl和binder机制实现解耦。
2)通过划分Android系统分区和vendor分区实现隔离,便利系统升级。升级系统的时候可以分别升级,比如升级Android系统,不影响供应商开发的模块。
VNDK是专门选择的一些接口稳定的库,framework和HAL都可以放心的依赖这些库,系统升级保证这些库提供的接口不变(头文件和二进制调用接口)。
稍微展开一些,实现方式:
1)引入隔离层HAL(hardware abstract layer),让vendor模块和底层框架没有之间依赖,vendor模块通过HAL使用底层的功能,vendor模块只能依赖于同层级的native库。
2)HAL开发:VNDK是开发HAL工具。
3)HAL接口定义:使用AIDL(旧版是HIDL)描述HAL提供的函数接口。
4)HAL实现框架:hwbinder,结合AIDL,借助底层binder机制,实现vendor模块和底层模块的通信,同时满足效率目标。
5)用设备树叠加解决硬件驱动匹配:device tree overlay。简单的说,Android提供一个标准系统和驱动(dt),厂商提供dto,覆盖部分驱动dt,适配特定设备硬件。其中Android系统dt是主版本,通过SOC id来匹配设备;厂商提供的dt通过board id来匹配设备。
并且dt和dto在不同的分区,Android系统升级不影响厂商的dto。
6)sepolicy overlay,根据需要覆盖系统原有的sepolicy,定制HAL所需的sepolicy。