參考android
https://www.jianshu.com/p/d2119b3880d8
https://developer.android.google.cn/ndk/guides/abis架構
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 提供對應的 so 文件,可是實際場景中每每沒有這麼作,緣由通常有如下幾點:教程
若是咱們不可以爲全部架構都提供全部對應的 so,兼容工做就十分重要了。在作 SDK 開發的時候,因爲 SDK 支持的 ABI 和 宿主工程支持的 ABI 可能有多種組合,因此尤爲要搞明白 ABI 是如何工做的
重要原則:
把一些 case 彙總到表格:
能夠看到,若是 SDK 支持 armeabi、armeabi-v7a、arm64-v8a 的話,幾乎能夠覆蓋所有場景,Android 手機助手也正是採用了表格中的第4行的情形,由於一些庫沒有 armeabi 架構的支持包,因此最終使用了這種方式。