调试android 指纹遇到的坑

Android8以后版本

一、指纹服务不能自动

指纹服务fingerprintd(biometrics fingerprintservice),可以手动起来,但是在init.rc中无法启动。

解决办法:

1.抓取开机时kernel log ,确认我们的启动指纹服务的init.rc 文件有被init.cpp加载进来,如图所示

注: push 进去的init.rc 要跟目录里面的其他权限保持一致,指纹的init.rc 文件在系统目录:vendor/etc/init

2.不论SELinux策略是否关闭,你都需要写好你的te文件。

3.请用adb shell ls -lZ 查看你的 service 文件,看下文件类型是不是同你在te文件file_contexts里面注册的文件类型一样,如图所示

二、指纹服务不能回调给framework

framework调用IBiometricsFingerprint接口enumedate方法时,指纹服务fingerprintd 的enumedate方法能够被调用

但是我们回调notify(&message) 时候,framework中的回调函数onEnumerate()不能执行。

解决办法:

在你的biometrics fingerprint service te 文件里面用vndbinder_use(xx) 代替 binder_use(xx),如下图所示

xx指你的biometrics fingerprint service

三、enroll时候报错

在hal层成功加载之后,进入到enroll界面。发现还没有录入,就自动退出enroll界面。

framework 在enroll 之前会调用 enumedate(),cancel(),pre_enroll() 等函数,如果这些函数,没执行成功,或者return 一个错误的值。

就enroll 不了。

解决方法:

实现上述的函数,按照要求,返回或者回调相关的值。

四、enumedate()函数策略问题

此函数是枚举 所有的指纹模板。需要你一个一个回调给framework

1.指纹id为0时候,需要gid = 0;fid = 0;remaining_templates = 0

2.当指纹id不为0的时候,需要把gid ,fid,remaining_templates 报上去

当时最后一个模板的时候,remaining_templates要为0

五、SELinux

android 8.0 SELinux 发生了比较大的变化,目前SELinux 编译出来,会生成在两个目录:

1.system/etc/sepolicy

2.vendor/etc/sepolicy

编译SELinux 不能像以前那样只编译bootimage.目前编译bootimage 是生成不了Selinux 文件的,

暂时只能想到全部编译的方法。

检验SeLinux 是否编译到的办法:

1.android 8.0之前,可以看下这out/project/obj/sepolicy_interdaiates/policy.conf这个文件里面有没有

自己书写的selinux 规则

2.android 8.0之后,看下system/etc/sepolicy或者vendor/etc/sepolicy 有没有自己书写的selinux 规则

六、从源码中关闭SELinux安全策略

代码位置:/system/core/init/init.cpp

修改selinux_is_enforcing() 函数为下面

static bool selinux_is_enforcing(void){

return false; //force set selinux permissive.

if (ALLOW_PERMISSIVE_SELINUX) {

return selinux_status_from_cmdline() == SELINUX_ENFORCING;

}

return true;

}

七、app加载jni编译出来的.so报错问题

如果你app是在系统编译,然后你install安装的,很容易出现此问题

1.报错大概具体如下:

java.lang.UnsatisfiedLinkError: dlopen failed: library "xx.so"

("/system/lib/xx.so") needed or dlopened by

"/system/lib/libnativeloader.so" is not accessible for the namespace

"classloader-namespace"at java.lang.Runtime.loadLibrary0(Runtime.java:977)

at java.lang.System.loadLibrary(System.java:1602)

原因:android 7.0,发生一些行为变更,app不能调用系统的私有.so 文件。只能调用系统的公有.so

解决方案:

把自己jni生成的.so 放在/system/etc/public.libraries.txt 或者/vendor/etc/public.libraries.txt中去。

然后把public.libraries.txt push 进去

八、CST 指纹测试失败

九、SPI通信失败

十、识别率低

十一、唤醒慢

十二、指纹无法工作

相关推荐
2501_915106324 小时前
如何查看手机使用记录:Android和iOS设备全面指南
android·ios·智能手机·小程序·uni-app·iphone·webview
nee~6 小时前
Android设备USB连接转无线操作(windows)
android·windows
sun0077006 小时前
android上ethernet和wifi共存
android
青莲8437 小时前
Android Jetpack - 3 LiveData
android·前端
小蜜蜂嗡嗡8 小时前
flutter namespace问题
android·flutter
Cat God 0078 小时前
MySQL-查漏补缺版(六:MySQL-优化)
android·数据库·mysql
QING6188 小时前
Jetpack Compose Brush API 简单使用实战 —— 新手指南
android·kotlin·android jetpack
Swizard9 小时前
别让 AI 假装在工作:Android "Vibe Coding" 的生存指南
android·java·vibe coding
电饭叔9 小时前
《python语言程序设计》2018版--第8章14题利用字符串输入作为一个信用卡号之一(Luhn算法解释)
android·java·python
QING61810 小时前
Jetpack Compose Brush API 详解 —— 新手指南
android·kotlin·android jetpack