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通信失败
十、识别率低
十一、唤醒慢
十二、指纹无法工作