从Android 8.0之后,Android 引入Treble机制,主要是为了解决目前Android 版本之间升级麻烦的问题,将OEM适配的部分vendor与google 对android 大框架升级的部分system部分做了分离,一旦适配了一个版本的vendor信息之后,之后的版本再进行升级时,直接升级system即可,这个就不会给OEM厂商升级带来太大的工作量,直接升级最新功能,可以解决目前市面上Android版本过来凌乱的问题。
首先Treble机制在Vendor分区中有两种模式,一个编译成so库,供System分区的进程和应用直接加载调用,两者在同一个进程中,这种叫直通式 HAL(passthrough)模式, 另外一种是直接编译成一个daemon可运行的服务,然后System分区的进程通过HwBinder的IPC通信方式来调用,两者在二个独立的进程中,这种称为绑定式HAL(Binderized )模式。
本文主要讲的是HAL(Binderized )模式。
一、main函数入口
/hardware/interface/camera/provider/2.4/default/service.cpp
主要就是defaultPassthroughServiceImplemention这个函数,虽然名字是passthrough,其实并不是上面说的直通式的。
二、LegacySupport
/system/libhidl.transport/include/hidl/LegacySupport.h
/system/libhidl.transport/LegacySupport.cpp
defaultPassthroughServiceImplemention的具体实现就在这两个文件里面了
三、ServiceManagement
/system/libhidl.transport/ServiceManagement.cpp
主要逻辑都在这个文件里面
getRawServiceInternal 的本质就是创建CameraProvider对象,返回的IBase就是CameraProvider,创建完之后将其注册到系统服务由ServiceManager管理
上面这些代码的作用就是到 /system/lib/hw 或者 /vendor/lib/hw 或者 /odm/lib/hw 这些目录下去找动态库,找什么样的动态库呢?就是根据服务的包名。
上面的fqName就是 ICameraProvider::descriptor
这要就是这段解析服务名去找库名(个人感觉很不友好,库名必须要和代码逻辑一致),sys就是找函数符号了,其实就是CameraProvider的构造函数
构造CameraProvider对象,也就是IBase
service创建好之后就通过回调注册到ServiceManager了,不做深入分析了
四、回到ICameraProvider
/hardware/interface/camera/provider/2.4/default
CameraProvider的构造大概就这么多,至于CameraDevice,CameraSession这些都是通过CameraProvider创建的
另外服务还是需要在manifest里面注册的