問題描述
Android 使用多個包含 .so 的第三方庫,應(yīng)用崩潰。日志顯示找不到 xxx.so。
問題分析
現(xiàn)在很多第三方庫都是通過aar方式引用的,里面也包含了 .so 庫。這些so會被編譯進(jìn)apk的lib文件夾下。apk解壓后可能類似下面:
這里寫圖片描述
手機(jī)在使用這些so時,會先根據(jù)自身的CPU加載自己優(yōu)先支持的架構(gòu)的庫,如果發(fā)現(xiàn)架構(gòu)對應(yīng)的文件夾存在,則會將該文件夾下的 so 推入 apk 安裝目錄的lib文件夾下。例如:armeabi-v7a 的手機(jī)優(yōu)先支持 armeabi-v7a,如果armeabi-v7a不存在,則會加載 armeabi 。如果在armeabi-v7a文件夾存在,但是 so 庫不全,就會報(bào)錯。
問題解決
遇到這種情況,可以優(yōu)先嘗試補(bǔ)全對應(yīng)的 .so ,如果行不通,就需要移除 apk 中的 armeabi-v7a 文件夾,讓手機(jī)加載 armeabi 的庫。
通過 aar 方式依賴的庫,很多 .so 庫會直接包含在 aar包內(nèi),我們無法更改他們,但是可以通過 gradle 設(shè)置最終輸出到 apk 的的 so。
在 app 的 build.gradle 中指定位置添加如下代碼:
android {
//省略...
defaultConfig{
ndk{
//輸出armeabi的so
abiFilters "armeabi"
}
}
//省略...
}
設(shè)置完后,重新編譯下 apk,可以看到 apk/lib 中只包含 armeabi 了。