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层的兼容就是正确调用各自的库文件。

posted @ 2019-11-04 15:11    阅读(546)  评论(0)    收藏  举报