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

之前在项目中引用了百度地图的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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值