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