引言
作為一個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"
}
複製程式碼
後續敬請期待! 免為其難的關注一下公眾號吧!!