Gradle 使用技巧(二) - SO/NDK過濾

傲寒遙發表於2018-08-24

引言

作為一個Android開發人員,so對於我們來講是極其常見的,各種大廠的SDK中都包含著各種各樣的so,而so也是apk瘦身的重要一環,減少so平臺的數量,可以極大限度的減少apk的大小。

Android 中的so

先看一張官方的圖:

ABI

可以將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

  1. 在main目錄下建立jniLibs資料夾,將相應的so庫存放進去。

jinLibs

  1. 在相應的module下的gradle中進行配置
android{
	repositories {
			flatDir {
				dirs 'libs'
			}
		}
}
複製程式碼

同步專案即可。

如何選擇so

先不說原理,我們可以看看大廠是怎麼做的。

先看看 TIM

Tim

再看看淘寶

淘寶

從Tim和淘寶的apk包中可以看到,兩個都只是保留了armeabi平臺的lib,所以我們也可以直接參照大廠的做法只保留armeabi平臺,其它的暫時可以不考慮,因為我們也做不到相容全平臺。

如何過濾

直接在gradle中配置即可

buildTypes{
	release{
		...
		ndk {
                abiFilters "armeabi" // 保留這種架構的CPU
            }
		...
	}
}
複製程式碼

過濾so

一般情況下是在打包的時候指定so,但是也有特殊情況,需要debug模式下過濾,同上,直接在debug中配置即可。

ndk {
	abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
複製程式碼

後續敬請期待! 免為其難的關注一下公眾號吧!!

生活實在是太苦啦

FullScreenDeveloper

相關文章