Android SDK ABI 兼容策略

Android 開發 SDK 時應該注意的關於 ABI 的兼容策略

參考android

https://www.jianshu.com/p/d2119b3880d8
https://developer.android.google.cn/ndk/guides/abis架構

ABI

ABI 是 Application binary interface,應用程序二進制接口的縮寫.ide

不一樣的 Android 手機使用不一樣的 CPU,進而支持不一樣的指令集。 CPU 與指令集的每種組合都有專屬的應用二進制界面,即 ABI。 ABI 能夠很是精確地定義應用的機器代碼在運行時如何與系統交互。 您必須爲應用要使用的每一個 CPU 架構指定 ABI。性能

ABI 的指定是在代碼的編譯階段進行的,咱們使用的各類靜態庫、動態庫,就是支持某個 ABI 的。因此咱們在集成不少第三方庫的時候,教程會讓咱們把 so 放到指定的文件夾中,文件夾命名其實就是 ABI 的名字。ui

好比高德地圖:google

「使用自定義配置,將下載文件的 armeabi 文件夾複製到 libs 目錄,若是有這個目錄,請將下載的 so 庫複製到這個目錄」3d

Android 支持的 ABI 以下表:code

在 Android Studio 裏能夠經過下面的配置設置工程支持的 ABI:blog

ndk {
    // 設置支持的SO庫架構
    abiFilters 'armeabi-v7a','armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}

主流的ABI架構

  1. armeabi: 第5代、第6代的ARM處理器,早期的手機用的比較多。
  2. armeabi-v7a: 第7代及以上的 ARM 處理器。2011年之後的生產的大部分Android設備都使用它。
  3. arm64-v8a: 第8代、64位ARM處理器,不多設備,三星 Galaxy S6是其中之一。
  4. x86: 平板、模擬器用得比較多。
  5. x86_64: 64位的平板。

ABI 兼容策略

正常來說,咱們應該爲每種 ABI 提供對應的 so 文件,可是實際場景中每每沒有這麼作,緣由通常有如下幾點:教程

  1. 項目體積會比較大。
  2. 庫的源碼每每不是本身維護的,因此有些庫,沒有某種 ABI 下的文件。(使用了不少 C++ 庫的狀況常見)
  3. 硬件和 Rom 是本身定製的,不須要適配那麼多 CPU。(Android 智能設備常見這種狀況)

若是咱們不可以爲全部架構都提供全部對應的 so,兼容工做就十分重要了。在作 SDK 開發的時候,因爲 SDK 支持的 ABI 和 宿主工程支持的 ABI 可能有多種組合,因此尤爲要搞明白 ABI 是如何工做的

重要原則:

  1. CPU 大都像前兼容,好比 ARMv7 的 CPU 除了支持 armeabi-v7a,也支持 armeabi,ARMv8 的 CPU 支持 armeabi,armeabi-v7a,arm64-v8a 三種 ABI。
  2. 系統優先選擇對應 ABI 文件夾下的 so,好比 ARMv7 的設備,會優先選擇 armeabi-v7a 下的 so 進行加載。若是文件夾存在,且 so 存在,則正常加載;若是了文件夾存在,so不存在,則運行時崩潰;若是文件夾不存在,則會去 armeabi 文件夾下找 so。具體流程用下面流程圖表示:
  3. 使用了兼容的 so ,雖然通常不會出現 Crash,可是可能有性能損失。
  4. 對於每一個 ABI 下的so,要麼所有支持,要不都不支持。

把一些 case 彙總到表格:

能夠看到,若是 SDK 支持 armeabi、armeabi-v7a、arm64-v8a 的話,幾乎能夠覆蓋所有場景,Android 手機助手也正是採用了表格中的第4行的情形,由於一些庫沒有 armeabi 架構的支持包,因此最終使用了這種方式。

相關文章
相關標籤/搜索