天天看點

關于Android中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檔案。

  1. C++運作時:靜态編譯 & 動态編譯
  2. 當隻有一個.so檔案,靜态編譯C++運作時是沒問題的;存在多個.so檔案,應該讓所有的.so檔案都動态連結相同的C++運作時。

(5)需要注意.so檔案位置;

(6)不應該隻提供armeabi架構的.so檔案而忽略其他ABIs的

  1. 影響函數庫的性能、相容性;
  2. 丢失轉為64位優化過的性能(ART、webview、media)
  3. 可以選擇在應用市場上傳指定的API版本的APK。

作者:AmyZYX

出處:http://www.cnblogs.com/amyzhu/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。