问题来了,Android中的HAL是比较具有通用性的,需要上层的函数对其进行加载调用,Android的
HAL加载器是如何实现对不同的Hardware Module进行通用性的调用的呢?
带着这个疑问查看Android源码,会发现Android中实现调用HAL是通过hw_get_module实现的。
1.Camera 服务启动流程概览
cameraserver 与 provider 这两个进程启动、初始化的调用逻辑,如下图
总体逻辑顺序:
provider 进程启动,注册;
cameraserver 进程启动,注册,初始化;
cameraserver 获取远端 provider(此时实例化 CameraProvider 并初始化)。
上图中,实线箭头是调用关系。左边是 cameraserver 进程中的动作,右边则是 provider 进程中的
动作,它们之间通过 ICameraProvider 联系在了一起,而这个东西与 HIDL 相关,我们可以不用关
心它的实现方式。
由图可见:
Cameraserver 一侧,Cameraservice 类依旧是主体。它通过 CameraProviderManager 来管理对
CameraProvider 的操作。此处初始化的最终目的是连接上 CameraProvider。
provider 一侧,最终主体是 CameraProvider。初始化最终目的是得到一个 mModule(Camera 模
块),通过它可以直接与 HAL 接口定义层进行交互。
2.获取camx模块接口
路径:android\hardware\interfaces\camera\provider\2.4\default\LegacyCameraProviderImpl_2_4.cpp
通过hw_get_module接口获取camera模块入口结构体。
#define CAMERA_HARDWARE_MODULE_ID "camera"
step1
注意:rawModule类型为camera_module_t,被强制转换为hw_module_t类型去获取结构体。原因
是camera_module_t的第一个成员变量即为hw_module_t类型,所以地址相同,获取到该成员变量
地址即获取整个结构体地址。
bool LegacyCameraProviderImpl_2_4::initialize() {
camera_module_t *rawModule;
int err = hw_get_module(CAMERA_HARDWARE_MODULE_