安卓項目中so庫選擇(ndk abiFilters設置,armeabi,armeabi-v7a,arm64-v8a)

背景

Android 系統本質是一個通過改造的 Linux 系統,so庫是Linux系統上使用的共享庫(相似windows上的dll)。最先,Android 系統只支持 ARMv5 的 CPU 構架,隨着 Android 系統的發展,又加入了 ARMv7 (2010), x86 (2011), MIPS (2012), ARMv8, MIPS64 和 x86_64 (2014)。每一種 CPU 構架,都定義了一種 ABI(Application Binary Interface),ABI 決定了二進制文件如何與系統進行交互。 html

image.png

安卓工程中配置支持的平臺類型

下面樣例表示支持armeabi、armeabi-v7a和arm64-v8awindows

defaultConfig {
        ndk {
            abiFilters 'armeabi','armeabi-v7a','arm64-v8a'
        }
    }
複製代碼

爲何要設置ndk的abiFilters?

其實這個能夠不設置,這樣編譯時,就會將項目裏全部依賴資源包裏的so庫都打到最終的apk裏。 bash

可是有些平臺,咱們是不須要支持的,若是不刪除的話,apk就臃腫了。若是那些so庫是咱們本身編譯出來的,那能夠直接在工程中刪除對應so文件,可是若是是第三方提供的,就很差刪除了,因此就須要使用abiFilters來過濾了。

若是須要針對不一樣的平臺出不一樣的包,能夠在productFlavors裏進行設置,可參考文章:blog.csdn.net/hknock/arti…架構

armeabi、armeabi-v7a、arm64-v8a的兼容性問題

看上上面的描述,覺得新增一個so庫文件能夠隨便根據須要適配的目錄放,就錯了。若是你有庫文件在armeabi裏有,可是armeabi-v7a目錄下沒有,那麼運行在V7a的架構時,就會出現找不到so庫文件的狀況。具體描述參照:Android 關於arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容問題spa

正確的作法

  1. 當前市面絕大多數是arm的CPU,並且都是V7架構的了,因此能夠保留armeabi或者armeabi-v7a便可。
  2. 若是僅保留armeabi-v7a,而有些第三方包未提供v7a的包,則能夠將對應armeabi包拷貝到armeabi-v7a。
  3. 若是同時保留armeabi和armeabi-v7a,則須要保證兩個目錄下的so庫文件數相同。

安卓開發技術分享: blog.csdn.net/yinxing2008… .net

相關文章
相關標籤/搜索