設置apk只打包指定架構的so

問題描述
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 了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章