# 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%E8%A3%A1%E8%87%AA%E5%AE%9Aandroid.mk%E5%92%8Capplication.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`