1、Android系統目前支持的CPU架構:ARMv5、ARMv7、x86、MIPS、ARMv8、MIPS64、x86_64,每一種都關聯著一個ABI(Application Binary Interface) 2、ABI:定義了二進位文件(尤其是.so文件)如何運行在相應系統平臺上,包括使用的指令 ...
1、Android系統目前支持的CPU架構:ARMv5、ARMv7、x86、MIPS、ARMv8、MIPS64、x86_64,每一種都關聯著一個ABI(Application Binary Interface) 2、ABI:定義了二進位文件(尤其是.so文件)如何運行在相應系統平臺上,包括使用的指令集、記憶體對齊、可用的系統函數庫。Android系統上,每一個CPU架構對應一個ABI。 3、Native Lib Monitor(https://play.google.com/store/apps/details?id=com.xh.nativelibsmonitor.app)—— 查看手機上安裝的APK使用哪些.so文件,以及.so文件來源於哪些函數庫或者框架。 4、設置支持多於一種的ABI (1)通過模擬層實現 —— 最好針對特定平臺提供相應平臺的二進位包,運行時候可以少一個模擬層,從而得到更好的性能。 (2)通過 Build.SUPPORTED_ABIS得到根據偏好排序的設備支持的ABI列表。 (3)Android包管理器安裝APK時,如果在對應的lib/ABI目錄存在.so文件,會自動選擇APK包中為對應系統ABI預編譯好的.so文件。 5、重要法則 (1)應該儘可能的提供轉為每個ABI優化過的.so文件,但要麼全部支持,要麼都不支持,不應該混合著用。當一個應用安裝在設備上,只有該設備支持的CPU架構對應的.so文件會被安裝。 (2)當你引入一個.so文件,不止影響到CPU架構。 (3)NDK平臺是向前相容,而不是向後相容的。推薦使用app的minSdkVersion對應的編譯平臺。引入一個預編譯好的.so文件,需要檢查它編譯使用的平臺版本。 (4)不能混合使用不同C++運行時編譯的.so文件。
- C++運行時:靜態編譯 & 動態編譯
- 當只有一個.so文件,靜態編譯C++運行時是沒問題的;存在多個.so文件,應該讓所有的.so文件都動態鏈接相同的C++運行時。
- 影響函數庫的性能、相容性;
- 丟失轉為64位優化過的性能(ART、webview、media)
- 可以選擇在應用市場上傳指定的API版本的APK。