Android系统指纹无法正常工作分析
Google为了保护硬件厂商的信息,在Android中填了一层 —— HAL层。Android的HAL是比较具有通用性的,需要上层的函数对其进行加载调用,Android的HAL加载器是如何实现对不同的Hardware Module进行通用性的调用的呢?
以指纹模块举例:
openHal ---- hw_get_module
hw_get_module函数的第一个参数就是Hardware的id。Android的HAL加载器就是通过不同的Hardware id去调用不同的硬件的。
以某项目举例:上层启动指纹服务,然后到指纹的构造函数里调用openHal,在openHal里hw_get_module函数的第一个参数是fingerprint.fpc。搜索这个字符串可以看到是在fpc_legacy_hal.c里面。
hw_get_module函数调用下来是要获取动态链接库的路径(将代码编译成库,保护硬件厂商信息),并调用load函数去打开指定路径下的库文件。
在load函数里:
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_module_t *)dlsym(handle, sym);
可见是通过查找“HMI”这个导出符号,并获取地址。
查看out/target/product/下vendor/lib/hw下指纹的库文件
readelf -s *fingerprint*.so 可以看到HMI。这就是说动态库里有hw_module_t结构体,我们根据刚才的Hardware id就可以加载调用正确的硬件了。
当你的指纹不能工作时,打印log,查看问题出在哪里?指纹服务没起来?openHal 失败?库文件缺失?
指纹的兼容 就是 kernel 驱动的兼容 与 hal层的兼容。
hal层的兼容就是正确调用各自的库文件。

浙公网安备 33010602011771号