2022年AndroidHAL是如何被调用的[归 .pdf

上传人:Che****ry 文档编号:34878722 上传时间:2022-08-19 格式:PDF 页数:4 大小:68.60KB
返回 下载 相关 举报
2022年AndroidHAL是如何被调用的[归 .pdf_第1页
第1页 / 共4页
2022年AndroidHAL是如何被调用的[归 .pdf_第2页
第2页 / 共4页
点击查看更多>>
资源描述

《2022年AndroidHAL是如何被调用的[归 .pdf》由会员分享,可在线阅读,更多相关《2022年AndroidHAL是如何被调用的[归 .pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Android HAL 是如何被调用的Android 对硬件的调用,google 推荐使用 HAL 的方式进行调用,对于Andriod HAL 的写法,可以参考android 源码里的 hardware 目录下几个模块的模版。在看 HAL 的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,比如应用程序有main 函数,可以为加载器进行加载执行,dll 文件有 dllmain ,而对于我们自己写的动态链接库,我们可以对库中导出的任何符号进行调用。问题来了, Android中的 HAL 是比较具有通用性的,需要上层的函数对其进行加载调用, Android 的 HAL 加

2、载器是如何实现对不同的Hardware Module 进行通用性的调用的呢?带着这个疑问查看Android 源码, 会发现 Android 中实现调用HAL 是通过 hw_get_module实现的。int hw_get_module(const char *id, const struct hw_module_t *module); 这是其函数原型,id 会指定 Hardware 的 id,这是一个字符串,比如sensor的 id 是#define SENSORS_HARDWARE_MODULE_ID sensors , 如 果 找 到 了 对 应 的hw_module_t 结构体,会将其指

3、针放入*module 中。看看它的实现。 。 。 。/* Loop through the configuration variants looking for a module */ for (i=0 ; iHAL_VARIANT_KEYS_COUNT+1 ; i+) if (i HAL_V ARIANT_KEYS_COUNT) /获取 ro.hardware/ro.product.board/ro.board.platform/ro.arch等 key 的值。if (property_get(variant_keysi, prop, NULL) = 0) continue; snprint

4、f(path, sizeof(path), %s/%s.%s.so, HAL_LIBRARY_PATH, id, prop); / 如果开发板叫做mmdroid,那么这里的path就是system/lib/hw/sensor.mmdroid.so else snprintf(path, sizeof(path), %s/%s.default.so, HAL_LIBRARY_PATH, id); /默认会加载/system/lib/hw/sensor.default.so if (access(path, R_OK) continue; /* we found a library matchin

5、g this id/variant */ break; status = -ENOENT; if (i id) != 0) LOGE(load: id=%s != hmi-id=%s, id, hmi-id); status = -EINVAL; goto done; hmi-dso = handle; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 4 页 - - - - - - - - - /* success */ status = 0; done: if (sta

6、tus != 0) hmi = NULL; if (handle != NULL) dlclose(handle); handle = NULL; else LOGV(loaded HAL id=%s path=%s hmi=%p handle=%p, id, path, *pHmi, handle); /凯旋而归*pHmi = hmi; return status; 从上面的代码中,会发现一个很奇怪的宏HAL_MODULE_INFO_SYM_AS_STR,它直接被定义为了 #define HAL_MODULE_INFO_SYM_AS_STR HMI ,为何根据它就能从动态链接库中找到这个hw

7、_module_t 结构体呢?我们查看一下我们用到的hal 对应的 so 就可以了,在 linux 中可以使用readelf XX.so s 查看。Symbol table .dynsym contains 28 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000594 0 SECTION LOCAL DEFAULT 7 2: 00001104 0 SECTION LOCAL DEFAULT 13 3: 00000000 0 FUNC GLOBAL DEF

8、AULT UND ioctl 4: 00000000 0 FUNC GLOBAL DEFAULT UND strerror 5: 00000b84 0 NOTYPE GLOBAL DEFAULT ABS _exidx_end 6: 00000000 0 OBJECT GLOBAL DEFAULT UND _stack_chk_guard 7: 00000000 0 FUNC GLOBAL DEFAULT UND _aeabi_unwind_cpp_pr0 8: 00000000 0 FUNC GLOBAL DEFAULT UND _errno 9: 00001188 0 NOTYPE GLOB

9、AL DEFAULT ABS _bss_end_ 10: 00000000 0 FUNC GLOBAL DEFAULT UND malloc 11: 00001188 0 NOTYPE GLOBAL DEFAULT ABS _bss_start_ 12: 00000000 0 FUNC GLOBAL DEFAULT UND _android_log_print 13: 00000b3a 0 NOTYPE GLOBAL DEFAULT ABS _exidx_start 14: 00000000 0 FUNC GLOBAL DEFAULT UND _stack_chk_fail 15: 00001

10、188 0 NOTYPE GLOBAL DEFAULT ABS _bss_end_ 16: 00001188 0 NOTYPE GLOBAL DEFAULT ABS _bss_start 17: 00000000 0 FUNC GLOBAL DEFAULT UND memset 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 4 页 - - - - - - - - - 18: 00000000 0 FUNC GLOBAL DEFAULT UND _aeabi_uidiv

11、19: 00001188 0 NOTYPE GLOBAL DEFAULT ABS _end_ 20: 00001188 0 NOTYPE GLOBAL DEFAULT ABS _edata 21: 00001188 0 NOTYPE GLOBAL DEFAULT ABS _end 22: 00000000 0 FUNC GLOBAL DEFAULT UND open 23: 00080000 0 NOTYPE GLOBAL DEFAULT ABS _stack 24: 00001104 128 OBJECT GLOBAL DEFAULT 13 HMI 25: 00001104 0 NOTYPE

12、 GLOBAL DEFAULT 13 _data_start 26: 00000000 0 FUNC GLOBAL DEFAULT UND close 27: 00000000 0 FUNC GLOBAL DEFAULT UND free 从上面中,第24 个符号,名字就是“HMI ” ,对应于 hw_module_t 结构体。再去对照一下 HAL 的代码。/* * The COPYBIT Module */ struct copybit_module_t HAL_MODULE_INFO_SYM = common: tag: HARDW ARE_MODULE_TAG, version_majo

13、r: 1, version_minor: 0, id: COPYBIT_HARDWARE_MODULE_ID, name: QCT MSM7K COPYBIT Module, author: Google, Inc., methods: ©bit_module_methods ; 这里定义了一个名为HAL_MODULE_INFO_SYM的copybit_module_t的结构体,common 成员为 hw_module_t 类型。注意这里的HAL_MODULE_INFO_SYM变量必须为这个名字,这样编译器才会将这个结构体的导出符号变为“HMI ” , 这样这个结构体才能被dlsym函数找到!综上,我们知道了andriod HAL模块也有一个通用的入口地址,这个入口地址就是HAL_MODULE_INFO_SYM变量,通过它,我们可以访问到HAL 模块中的所有想要外部访问到的方法。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 4 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁