当前位置: 首页 > news >正文

安卓sensor框架6-sensor—services

安卓代码在线阅读推荐:

https://xrefandroid.com/android-16.0.0_r2/xref/frameworks/native/services/sensorservice/

app->Sensormanager->ServiceSmanager->SensorServices->SensorHal->Driver->sensor

继续上一级的讨论,本次讨论SensorServices

Android SensorService 初始化:

1:SystemServer 初始化的时候,初始化 SensorService;

2:SensorService 创建 SensorDevice 对象,SensorDevice 是 hal 层的操作函数集;

3:SensorDevice 会得到系统支持 sensor 的个数及 Sensor 操作接口;

4:SensorServer 将系统支持的 sensor 添加 sensorlist 中;

5:根据系统反馈创建虚拟 sensor;

6:等待连接,启动线程分发数据;


安卓-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.cpp

voidSensorService::onFirstRef() { 首先实例化一个SensorDevice SensorDevice&dev(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 or'd 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测获取的动态库的句柄或者可以理解为一个被分装的函数操作集;

请思考:如何下发上层下发的控制命令,以及如何获取底层数据上传到上层?

http://www.jsqmd.com/news/620332/

相关文章:

  • 低代码革命:是程序员的解放,还是末日的开端?
  • ArcGIS新手必看:用‘镶嵌至新栅格’搞定不同分辨率DEM的无缝拼接(附像素类型避坑点)
  • Storm-1175黑客组织在漏洞披露24小时内部署Medusa勒索软件
  • CSL编辑器完整指南:学术研究者的文献样式定制解决方案
  • 【初阶数据结构】指针串联的自由之链: 链表
  • 终极指南:如何使用tiny11builder快速打造轻量级Windows 11系统
  • 营销自动化数据驱动 - 多源数据 OLAP 架构演进噬
  • 12.RAG/Agent系统升级:基于session的会话状态管理与多轮对话隔离
  • PyCharm 强强联手:2026 年本地 IDE 连接 AI 的全攻略 (DeepSeek/Copilot/GPT)
  • 实时行情系统设计:从协议选择到高可用架构,再到数据源选型略
  • 通信失败?MicroROS网络配置全攻略,90%的人都踩过这个坑!
  • AI编程助手Copilot之后,下一个颠覆性工具是什么?
  • AI工程化之生成式UI A2UI(三)
  • FreakStudio碌
  • 元宇宙中的软件开发:新瓶装旧酒,还是新大陆?
  • 一次失败的实验:让我知道了U-Boot的重要性
  • ArUco码学习
  • 终极解决方案:3种高效方法修复Kindle电子书封面不显示问题
  • 国家中小学智慧教育平台电子课本解析工具:快速获取教材资源的完整方案
  • 智能家居网络安全指南:政府来源的跨国评述
  • AI agent 学习笔记
  • 【openclaw实用Skill】openhue 技能
  • 如何解决Zotero PDF Translate自动翻译失效的实战指南
  • CodeMagicianT陕
  • 深度学习-
  • 终极指南:如何用Nucleus Co-Op实现一台电脑多人分屏游戏
  • 2026年4月硅微粉生产厂家推荐,玻璃纤维布/环氧树脂/石墨粉/氢氧化钙/硅微粉/石英粉/硅酸钾,硅微粉厂家怎么选择 - 品牌推荐师
  • 初稿ai率太高,要怎么降AI?这五个方法亲测有效
  • 如何授予对象权限_GRANT SELECT ON表名赋权查询操作
  • CSS如何设置元素圆角_掌握border-radius属性的高级用法