(原创文章,转载请大家注明出处,谢谢)
做Android开发的同学都知道,
不管是Android Studio还是Eclipse ,在libs文件夹下面
根据我们的需要,可以产生armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64
这些文件夹,并在里面存放.so文件。这些神秘的文件实际上都是abi,Android系统上,每一个CPU架构对应一个ABI,大家可以搜下相关的资料,研究下这块的具体原理。我今天分享的是另一个东西。
事情是这样的,最近app成功集成了阿里百川sdk,然后,只要编译,那么百度sdk相关代码就闪退了!
日—— 了—— 狗——了!
集成之前,app没什么问题,集成之后,只要启动app,就直接闪退,因为百度sdk在application里面有
相关的初始化,而现在初始化的代码找不到了!经过分析,本质上是百度放在libs下面的.so文件找不到了。
为什么呢? 因为编译阿里百川之后,它会自动在libs生成
armeabi,armeabi-v7a,x86,arm64-v8a,x86_64五个文件夹,并分别放入libsgmain.so
但是app在集成阿里百川之前,还集成了百度地图、讯飞、友盟、微信、微博等等,然而所有这些sdk的.so文件,都统一放在了armeabi文件里面;也就是说,app里面没有存放其他4个文件夹(armeabi-v7a,x86,arm64-v8a,x86_64)的so文件。
那么问题就来了,一旦编译成功,那么app就会crash,比如微信的libmsc.so只存在armeabi里面, 而阿里百川sdk生成的4个文件夹里面并没有libmsc.so, 那么如果程序调用到这个文件夹,因为找不到这个文件,就会直接崩溃。
表述能力有限,希望大家能理解,只有抱歉了。
那么如何解决这个问题呢? 有2中方法
第一种,手动新建这5个文件夹,并在每个文件夹里面都放入.so文件,就是说百度要去开发者平台,
下载sdk,找到这5种.so文件,然后分别复制到app到libs相对应的文件下面。当然微信也是,微博也是。
这样是能解决问题的,但是感觉挺累。
第二种,通过代码限制阿里百川,只让它生成app之前就有的armeabi文件夹,那么就不会有这种问题
在build.gradle文件里面,具体代码如下,
sourceSets {
main {
jniLibs.srcDirs:['libs']
}}
android {
splits {
abi {
enable true
reset()
include 'armeabi'
universalApk false
}
}
}
最后,问题圆满解决。