昨天踩坑Android的第三方SDK的so库目录和主项目so库目录冲突问题,记录一下。
起因是我们的的APP更新了SDK,但是测试过程中出现了打开pdf文件就会闪退的问题,真机调试之后发现报错地方在PDF相关的类进行初始化的地方,报错Java.lang.UnsatisfiedLinkError....后面跟说无法找到'libapv.so'文件,但检查主工程,发现so库目录下是包含libapv.so该库文件的。
刚好最近在看Android版本适配,想到可能是一个适配问题,于是在模拟器上进行各版本的兼容性测试,但是当程序用模拟器跑的时候,却没有出现任何异常。
后来经调试,发现第三方提供的SDK的aar文件中,libs文件夹下含有armeabi-v7a的so库文件目录,而主工程的so库只有armeabi和x86两个文件夹,没有armeabi-v7a文件夹,问题就出在这里;
Android系统会根据手机CPU的架构到不同的so库文件夹下面去找对应的so库文件,2010年后主流的手机CPU都是armeabi-v7a的架构,当程序运行时需要用到so库时,会先去armeabi-v7a目录下找,没有armeabi-v7a目录,就会去armeabi目录下找。先前提供的SDK中aar文件中不含有armeabi-v7a目录,因此libapv.so等库文件放在armeabi文件夹下可以被取到;但是新SDK的aar文件中含有armeabi-v7a目录,那么导致其与主工程合并之后,主流手机取so库文件都从armeabi-v7a目录下取了,不再去找armeabi目录下的,因此导致一些库文件在运行时无法读取到出现闪退。
而模拟器因为架构原因,一开始就读取的x86文件夹,故不会出现问题。
因此解决办法有两个,1、在主工程目录下新增armeabi-v7a目录,将so库复制一份过来,但是这样安装包apk会增大体积;2、修改SDK文件,去掉armeabi-v7a目录,换成armeabi目录;因为时间紧迫,联系第三方修改SDK来不及,因此先用方法一解决了。