调试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通信失败

十、识别率低

十一、唤醒慢

十二、指纹无法工作

相关推荐
zzywxc7871 小时前
AI 行业应用:金融、医疗、教育、制造业领域的落地案例与技术实现
android·前端·人工智能·chrome·金融·rxjava
sTone873751 小时前
android studio之外使用NDK编译生成android指定架构的动态库
android·c++
胖虎12 小时前
Android 入门到实战(三):ViewPager及ViewPager2多页面布局
android·viewpager·viewpager2
风往哪边走4 小时前
Media3在线本地视频播放器
android
激昂网络4 小时前
android kernel代码 common-android13-5.15 下载 编译
android·大数据·elasticsearch
Monkey-旭4 小时前
Android 人脸识别技术全解析
android·android 人脸识别·ml kit 实战·活体检测技术·人脸识别性能优化·人脸考勤系统·移动端人脸特征提取
vivo互联网技术5 小时前
桌面挂件不能承受之重——GIF
android·gif加载·桌面挂件
JulyYu6 小时前
Android系统保存重名文件后引发的异常解决
android·操作系统·源码
叽哥6 小时前
Kotlin学习第 2 课:Kotlin 基础语法:掌握变量、数据类型与运算符
android·kotlin·app