android abi

Application Binary Interface
ABI定義了函數庫的調用、應用的二進制文件(尤其是.so)如何運行在相應的系統平台上等細節。
Android目前支持以下七種ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。

android's cpu

Android目前有以下七種cpu架構:ARMv5、ARMv7、ARMv8、x86、x86_64、MIPS和MIPS64。

ARM 是指 Advanced RISC Machine 是一個32位元精簡指令集(RISC)處理器架構,其廣泛地使用在許多嵌入式系統設計。
RISC stand for Reduced Instruction Set Computing

cpu架構對應最優abi

CPU架構 最優ABI
ARMv5 armeabi
ARMv7 armeabi-v7a
ARMv8 arm64-v8a
x86 x86
x86_64 x86_64
MIPS mips
MIPS64 mips64

應用程式安裝到設備時,只有該設備的CPU架構支持的最優 so庫才會被安裝

如:x86架構的設備支持x86、armeabi-v7a和armeabi等ABI。
但優先級從高到低依次為x86、armeabi-v7a、armeabi。
系統會根據此順序尋找首個可用的最優的so庫,找到則結束。
  • x86設備包含ARM模擬層,能夠很好地運行ARM類型的so庫,但並不保證100%不發生Crash。
  • 64位設備(arm64-v8a, x86_64, mips64)能夠運行32位的so庫。但是以32位模式運行時,會丟失專為64位優化過的性能特徵(ART, WebView, Media, etc.)。

so庫使用

理論上應該為每個ABI目錄提供對應的so庫。但是Android支持7種ABI,若全部支持,必然導致APK包過大。
* 一般只保留armeabi、armeabi-v7a這兩個ABI的so庫。

  • mips/mips64:極少用於手機,可忽略。
  • x86/x86_64:x86架構的手機的市場佔有率很低,約為1%左右。而且x86架構都包含ARM模擬層,兼容ARM類型的ABI。
  • arm64-v8a:64位ARM架構。可用32位模式運行armeabi-v7a和armeabi。
  • armeabi-v7a:截止於2017年2月,目前主流版本AMRv7。
  • armeabi:老版本ARMv5,但仍需要兼容。

結論

  1. 為了減小apk體積,只保留armeabi和armeabi-v7a兩個目錄,並保證這兩個目錄中so庫數量一致。
  2. 對只提供armeabi版本的第三方so庫,原樣複製一份到armeabi-v7a目錄中

Link:
https://www.jianshu.com/p/170f65439844
https://www.jianshu.com/p/f23df3aa342c
http://david740204.pixnet.net/blog/post/412169557-android-studio裡自定android.mk和application.mk

Cross toolchains

由於嵌入式系統先天上的限制(有限的記憶體大小、處理器的效能、系統可能沒有螢幕顯示相關訊息等等),在嵌入式系統內執行compiler、assembler 等開發工具有時是不可能的。因此,軟體開發工具必須能提供跨平台編譯的功能,才能符合實際的需求。

Build machine:the machine builds cross toolchains
Host machine:the machine cross toolchains will execute on
Target machine:the machine cross toolchains will produce outputs for

tags: note