安卓sensor框架6-sensor—services

张开发
2026/4/10 22:27:48 15 分钟阅读

分享文章

安卓sensor框架6-sensor—services
安卓代码在线阅读推荐https://xrefandroid.com/android-16.0.0_r2/xref/frameworks/native/services/sensorservice/app-Sensormanager-ServiceSmanager-SensorServices-SensorHal-Driver-sensor继续上一级的讨论本次讨论SensorServicesAndroid SensorService 初始化1SystemServer 初始化的时候初始化 SensorService2SensorService 创建 SensorDevice 对象SensorDevice 是 hal 层的操作函数集3SensorDevice 会得到系统支持 sensor 的个数及 Sensor 操作接口4SensorServer 将系统支持的 sensor 添加 sensorlist 中5根据系统反馈创建虚拟 sensor6等待连接启动线程分发数据安卓-sensorsServices框架因为要通过sensormanger-servicesmager-sensorservices-调用那么SensorServices是何时加入servicesManger中的首先在sensorSsevices这个类申明的时候已经继承了如下三个类其中binderservices的实现如下可以看到在sesnorservices类初始化的时候就已经通过bingder机制将自己添加到services_manager中所以后面就可以通过sensormanger-servicesmager-sensorservices-hal....framwork/base/services/java/com/android/server/SystemServer.java如上图可以看到其实就是实例化一个servicesservices具体如何实例化SensorServices/frameworks/native/services/sensorservice/SensorService.cppvoidSensorService::onFirstRef() { 首先实例化一个SensorDevice SensorDevicedev(SensorDevice::getInstance()) 。。。。 } /frameworks/native/services/sensorservice/ SensorDevice.cpp以下过程是snesorservices获取hal层的动态库的过程hw_get_modules 这个函数在如下文件中该函数其他模块通用如camer audio等这段代码是Android HAL硬件抽象层中经典的动态加载 HAL 模块实现出自 hardware/libhardware/hardware.c作用是加载 .so 动态库并校验、返回硬件模块结构体。 下面逐行清晰解析 整体功能 用 dlopen 打开指定路径的 HAL 动态库.so 用 dlsym 查找固定符号 HAL_MODULE_INFO_SYM 校验模块 ID 是否匹配 成功则返回模块结构体失败则清理并返回错误 /** 57 * Load the file defined by the variant and if successful 58 * return the dlopen handle and the hmi. 59 * return 0 success, !0 failure. 60 */ 61 static int load(const char *id, 要加载的 HAL 模块 ID如 gralloc、camera 等 62 const char *path,.so 库文件路径 63 const struct hw_module_t **pHmi)输出参数成功后指向加载好的 hw_module_t 64 { 65 int status; 66 void *handle; 67 struct hw_module_t *hmi; 68 69 /* 70 * load the symbols resolving undefined symbols before 71 * dlopen returns. Since RTLD_GLOBAL is not ord in with 72 * RTLD_NOW the external symbols will not be global 73 */ 74 handle dlopen(path, RTLD_NOW); 加载时立即解析所有符号不延迟 81 82 /* Get the address of the struct hal_module_info. */ 83 const char *sym HAL_MODULE_INFO_SYM_AS_STR;//是宏展开为字符串 HMI 84 hmi (struct hw_module_t *)dlsym(handle, sym); 85 // 每个 HAL 库必须导出一个固定名称的全局结构体 //struct hw_module_t HAL_MODULE_INFO_SYM { ... }; 91 /* Check that the id matches */ 92 if (strcmp(id, hmi-id) ! 0) {//确保加载的库确实是请求的那个模块类型防止加载错库。 93 ALOGE(load: id%s ! hmi-id%s, id, hmi-id); 94 status -EINVAL; 95 goto done; 96 } 97 98 hmi-dso handle;//保存句柄并标记成功,把 dlopen 得到的句柄存在模块结构体里后续卸载时用 99 100 /* success */ 101 status 0; 102 103 done: 104 if (status ! 0) { 105 hmi NULL; 106 if (handle ! NULL) { 107 dlclose(handle); 108 handle NULL; 109 } 110 } else { 111 ALOGV(loaded HAL id%s path%s hmi%p handle%p, 112 id, path, *pHmi, handle); 113 } 114 115 *pHmi hmi; 返回统一的 HAL 模块接口 116 117 return status; 118 }上述代码最终会从hal获得一个module的动态库也就是一个sensor的操作handle 句柄函数集如上图就是最终从hal测获取的动态库的句柄或者可以理解为一个被分装的函数操作集请思考如何下发上层下发的控制命令以及如何获取底层数据上传到上层

更多文章