图片来自http://gityuan.com/2019/03/20/android_future/
Android 8.0系统(Android Oreo简称 Android O),Google开展了计划(Project Treble),为了解决Android 系统的碎片化问题和提高系统更新的效率,减少framework 和HAL 的耦合性,进而引出了HIDL 的概念。
Treble引入后,新增了一个vendor.img,即原先的system分区,被拆分为了system分区和vendor分区,SOC及供应商的功能实现都需要放到vendor分区,这样将system和vendor相关的镜像分开,便于能方便地更新和升级system,并且不依赖vendor等底层。
在Android 8.0之前,HAL是一个个的.so库,通过dlopen来进行打开,库和Android Framework位于同一个进程,具体如下图所示。
所以,Android Framework 与Android HAL被打包成一个system.img。Framework 与HAL是紧耦合的,通过link方式使用相应的硬件相关so库。
而Android 8.0引入HIDL,把Android Framework放在system.img分区,而Vendor HAL Implemetation放在新的分区vendor.img,这样刷新的system.img 就不会影响到Vendor HAL Implemetation。达到解耦的目的。
我们来看看官方的介绍:https://source.android.google.cn/devices/architecture/hidl-cpp
对于Android 8.0之前的设备,对应图①。 对于从之前的设备升级到8.0的版本,对应图②、图③。 对于直接基于Android 8.0开发的设备,对应图④。
Legacy HALs: 旧版本,Android 8.0开始不再维护 https://source.android.google.cn/devices/architecture/hal
通常代码里面会有相应的宏定义隔离 USE_LEGACY_XXX: 比如 USE_LEGACY_LOCAL_AUDIO_HAL,USE_LEGACY_PRESENTER
也有对应的源码目录 legacy dirs: 比如./frameworks/av/media/libaaudio/src/legacy, ./kernel/drivers/usb/gadget/legacy ./hardware/qcom/audio/legacy, ./hardware/rockchip/audio/legacy_hal .....
Conventional HALs (传统HALs): deprecated in Android 8.0 .
HIDL全称为HAL interface definition language(发音为“hide-l”),分为两种模式:Passthrough(直通式)和Binderized(绑定式)。
为了兼容Android 8.0之前的版本,Android 8.0设计了Passthrough HAL,就是把传统或旧版的HALs做一层封装,所以不需要重新编写相关的HAL就能支持8.0架构。
所以接下来就继续用audio模块来看一下HIDL(Passthrough HAL)的框架。
Passthrough HIDL
以audio为例, 当编译./hardware/interfaces/audio/2.0 目录下的源码时候,会按如下规则生成对应的文件:
./hardware/interfaces/audio/2.0 目录下的源码编译后: 对应 ./out/target/product/px30_evb/system/lib/android.hardware.audio@2.0.so
./hardware/interfaces/audio/2.0/default 目录下的源码编译后: 对应 ./out/target/product/px30_evb/vendor/lib/hw/android.hardware.audio@2.0-impl.so
同时还会生成对应的可执行程序: ./out/target/product/px30_evb/vendor/bin/hw/android.hardware.audio@2.0-service 以及android.hardware.audio@2.0-service.rc文件ÿ