百度人脸识别组件与mmkv冲突问题解决方案

最近碰到项目需要实现人脸识别的需求,之前对百度人脸的离线采集sdk做了一些封装形成组件化模块,本想着直接将整个模块集成到项目中,更换一下授权文件和id授权id简单快速,结果却遇到新的问题

问题1 More than one file was found with OS independent path ‘lib/arm64-v8a/libc++_shared.so’.

编译时直接爆红,根据报错信息应该是项目中有多个模块依赖中的so都依赖到lib/arm64-v8a/libc++_shared.so这个文件了 先用pickFirst排掉重复依赖

packagingOptions {
          
   
//加上这些代码  More than one file was found with OS independent path lib/x86/libc++_shared.so
//            pickFirst libc++_shared.so
            pickFirst lib/armeabi-v7a/libc++_shared.so
            pickFirst lib/arm64-v8a/libc++_shared.so
        }

问题2 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol “__emutls_get_address” referenced by “/data/app/com.epoint.workarea.szjs.zhgd.fangyangjituan-R-M7819VAQfiLZO-t-8mdw==/lib/arm/libmmkv.so”…

编译不报错了,运行闪退继续报错 问题已经很明确了 定位到so文件,lib/arm/libmmkv.so无法找到符号 “__emutls_get_address” 结合上一个报错信息,个人推测应该是百度人脸识别的so和mmkv的so产生了冲突,应该是编译生成so文件时ndk的版本不同,导致代码中某个符号在不同版本中解析不出来报错。 然后去百度人脸官网提交了工单询问有没有解决办法,客服很耐心的解答说这和我们没关系,我们没有解决方案哦 只能去github上找mmkv的issues找了一圈,发现有人有相同的问题,而mmkv维护者给了解决方案使用最新版的mmkv:1.2.13

最终解决方案

找到依赖mmkv的模块排掉mmkv,依赖1.2.31版本mmkv

api("com.xxxx.xxx:xxxxx:1.1.0", {
          
   
        exclude module: "mmkv"
    })
    implementation com.tencent:mmkv:1.2.13

运行测试百度采集功能正常

经验分享 程序员 微信小程序 职场和发展