引言
作为一个 Android 开发人员,so 对于我们来讲是极其常见的,各种大厂的 SDK 中都包含着各种各样的 so,而 so 也是 apk 瘦身的重要一环,减少 so 平台的数量,可以极大限度的减少 apk 的大小。
Android 中的 so
先看一张官方的图:
可以将 so 分为以下几种:
- armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈
- armeabi-v7a: ARM v7 目前主流版本
- arm64-v8a: 64 位支持
- mips / mips64 极少用于手机,可以直接忽略
- x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的
Android Studio 中如何引用 so
- 在 main 目录下创建 jniLibs 文件夹,将相应的 so 库存放进去。
- 在相应的 module 下的 gradle 中进行配置
android{
repositories {
flatDir {
dirs 'libs'
}
}
}
同步项目即可。
如何选择 so
先不说原理,我们可以看看大厂是怎么做的。
先看看 TIM
再看看淘宝
从 Tim 和淘宝的 apk 包中可以看到,两个都只是保留了 armeabi 平台的 lib,所以我们也可以直接参照大厂的做法只保留 armeabi 平台,其它的暂时可以不考虑,因为我们也做不到兼容全平台。
如何过滤
直接在 gradle 中配置即可
buildTypes{
release{
...
ndk {
abiFilters "armeabi" // 保留这种架构的CPU
}
...
}
}
一般情况下是在打包的时候指定 so,但是也有特殊情况,需要 debug 模式下过滤,同上,直接在 debug 中配置即可。
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
后续敬请期待!
免为其难的关注一下公众号吧!!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于