出现的问题:
No pending exception expected: java.lang.NoSuchMethodError: no static method "Lcom/baidu/vis/unified/license/AndroidLicenser;.getDeviceId(Landroid/content/Context;)Ljava/lang/String;" 2020-11-24 11:59:08.395 18597-19185/? A/zygote64: runtime.cc:531] at int com.baidu.vis.unified.license.AndroidLicenser.nativeFaceAuthFromFile(android.content.Context, java.lang.String, java.lang.String, boolean, int) (:-2) 2020-11-24 11:59:08.395 18597-19185/? A/zygote64: runtime.cc:531] at com.baidu.vis.unified.license.AndroidLicenser$a com.baidu.vis.unified.license.AndroidLicenser.a(android.content.Context, java.lang.String, java.lang.String, boolean, int) (:-1) 2020-11-24 11:59:08.395 18597-19185/? A/zygote64: runtime.cc:531] at void com.baidu.idl.main.facesdk.FaceAuth$a.run() (:-1) 2020-11-24 11:59:08.395 18597-19185/? A/zygote64: runtime.cc:531] at void com.baidu.idl.main.facesdk.b$c.run() (:-1)
问题描述:
使用百度的人脸识别库做一个flutter的插件,集成Android的时候出现的这个问题。一开始debug模式下调试没问题,完成之后,依赖到项目中突然报错了。
问题分析:
从报错的log来看,主要是因为缺少了类,而这些类所在的资源包就是所引入的so文件及aar文件,所以,解决的思路就比较清晰了:确认资源包是否被正常引入,是否引入成功,同时涉及到so文件引入的时候,SO结构的配置是否正确,还有一个需要注意的是,缺少的类是否被release编译的时候混淆了。接下来一步步确认,理论上一共是能解决问题的。
问题解决:
首先,从报错的表面来看,是因为缺少了百度人脸识别库的资源包出现的问题。所以,先检查了libs目录下的so包,aar包等资源是否引入,引入的方式是否正确;
然后,按照以上方式引入,依赖到项目中,release编译,得到release包,以解压缩形式打开apk,看看资源文件(如所需要的so文件)是否被编译进apk中;
通过解压发现,找不到的类对应的so文件已经被编译进去了,但是运行的时候无法找到对应的类;紧接着,怀疑是不是设备的SO结构没有支持,所以就检查了在项目中的gradle文件关于SO的配置;
检查之后发现SO的配置也没有问题;最后,通过之前踩过的坑,判断出还有一种可能是:对应的so包下的类被混淆了,所以,就把找不到的类在混淆文件中排除
最后,终于把问题解决了。
问题总结:
遇到类似的问题,一般可以从以下几方面入手:
1.检查资源文件引入是否正确;
2.解压apk文件,看看缺少的类所在的资源包是否被编译进去;
3.检查gradle文件中的SO结构配置是否与sdk或者集成要求的一致;
4.尝试在混淆文件中将缺少的类或者包或者方法排除。
以上是个人遇到的问题及解决问题过程中一些分析,不一定正确,仅供参考。不足之处,欢迎大神指出。