您的位置:首页 > 移动开发 > Android开发

怎么去掉工程中无用的so包(Realm的坑)

2016-07-01 15:10 676 查看
之前在项目中引用了百度地图的SDK,按照官方文档来操作,把所有的so包全都拷贝到libs文件夹下,结果app蹭的一下多了好几M,后来项目快上线的时候,经理就说,这个app怎么这么大呢,想办法压缩一下。没办法,只能硬着头皮搞啰。

后来,在网上找了好多减少apk大小的教程。基本上都提到了只保留一个armeabi文件夹下的so包。

然后我删掉了其他文件夹的so包,然后一运行,哈哈,真的小了3M左右,而且运行没有任何问题。

不过我没高兴多久,过了几天,在我同事的手机上,直接崩溃了,错误是百度SDK初始化异常。找不到so包,后来又只好找度娘呗,但找了好多资料,都是说不影响的。

后来找到一篇文章,说只要保证工程下只有一个armeabi目录就没有问题。

后来我在各种jar包中找so包,嘿,还真让我找到了。

然后删掉so包,在运行在同事手机上还是直接闪退。

后来尝试各种方法,不下20次。

后来干脆新建工程,只留下armeabi文件夹,果然可以。

接下来,我又开始了漫长的代码迁移工作,等到迁移完成一运行,又闪退了。

我开始怀疑人生了,这尼玛到底咋回事。

后来,我一步一步的迁移代码,终于让我找到了罪魁祸首Realm

由于我使用的是Realm1.0的,展开jar包是看不到so文件的,当初我也正是被这一点蒙蔽了。

后来我仔细找才终于找到realm的全部so包。

上图大家看



整整10M啊,我的天,压缩以后也还有好几M呢。

好了,找到原因了,那到底应该如何解决呢。

接下来应该算是重点了,在大神的指点下,我发现realm的官方文档中有这样一段话:



android{
splits {
abi {
enable true
reset()
include 'armeabi'
universalApk false//是否要打包一个通用的apk
}
}
}


在项目module的build.gradle加上这段代码就可以只打包armeabi了。

千万不要以为这段代码只对Realm有效噢,对所有的类似问题都是有效的。

如果需要添加多个架构,但只想生成一个apk的可以把上面那段代码删掉,在defaultConfig中添加abi过滤即可。

defaultConfig {
...
ndk {
abiFilters 'armeabi','armeabi-v7a'
}
}


理论上来说其他几种架构都是支持armeabi中so包的,不过有时候也可能会出现一些问题。在一些比较老的设备上,可能会出现未知的Crash,如果你的app对大小没有要求,对兼容性要求非常严格,可以不考虑这种方案。

删掉其他so包,具体会有什么影响,可以参考这篇文章

最后,对文章中提到的内容有任何疑问,欢迎加群讨论:283272067
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sdk so包 armeabi realm android