Android的 so檔案 ABI和CPU的關係

2021-09-20 06:31:13 字數 3933 閱讀 2191

你也可以檢視我的其他同類文章,也會讓你有一定的收貨

關於abi的知識,我整理這兩篇部落格,相信會對你有幫助

abi和cpu關係的疑難雜症

android的.so檔案、abi和cpu的關係

早期的android系統幾乎只支援armv5的cpu架構,你知道現在它支援多少種嗎?

android系統目前支援以下七種不同的cpu架構:armv5,armv7 (從2023年起),x86 (從2023年起),mips (從2023年起),armv8,mips64和x86_64 (從2023年起),每一種都關聯著乙個相應的abi。

android應用支援的abi取決於apk中位於lib/abi目錄中的.so檔案,其中abi可能是上面說過的七種abi中的一種。

但最好是針對特定平台提供相應平台的二進位製包,這種情況下執行時就少了乙個模擬層(例如x86裝置上模擬arm的虛擬層),從而得到更好的效能(歸功於最近的架構更新,例如硬體fpu,更多的暫存器,更好的向量化等)。

我們可以通過build.supported_abis得到根據偏好排序的裝置支援的abi列表。但你不應該從你的應用程式中讀取它,因為android包管理器安裝apk時,會自動選擇apk包中為對應系統abi預編譯好的.so檔案,

abi(橫向)和cpu(縱向)

armeabi

armeabi-v7a

arm64-v8a

mips

mips64

x86x86_64

armv5

支援armv7

支援支援

armv8

支援支援

支援mips

支援mips64

支援支援

x86支援(3)

支援(2)

支援(1)

x86_64

支援支援支援

不同的abi,針對不同的cpu架構有不同的優先權

例如:x86裝置上,libs/x86目錄中如果存在.so檔案的話,會被安裝,如果不存在,則會選擇armeabi-v7a中的.so檔案,如果也不存在,則選擇armeabi目錄中的.so檔案。

x86裝置能夠很好的執行arm型別函式庫,但並不保證100%不發生crash,特別是對舊裝置。

64位裝置(arm64-v8a, x86_64, mips64)能夠執行32位的函式庫,但是以32位模式執行,在64位平台上執行32位版本的art和android元件,將丟失專為64位優化過的效能(art,webview,media等等)。

處理.so檔案時有一條簡單卻並不知名的重要法則。

你應該盡可能的提供專為每個abi優化過的.so檔案,你不應該混合著使用(不能就裝對不同cpu架構的so檔案,放在同乙個abi目錄下)。你應該為每個abi目錄提供對應的.so檔案。

這也意味著當你引入乙個預編譯好的.so檔案時,你需要檢查它被編譯所用的平台版本。

.so檔案可以依賴於不同的c++執行時,靜態編譯或者動態載入。

混合使用不同版本的c++執行時可能導致很多奇怪的crash,是應該避免的。

問題:解決方案:

重新編譯我們的.so檔案使其支援缺失的abis

也可以設定ndk.abifilters顯示指定支援的abis

拓展:aar壓縮包中位於jni/abi目錄中(.so檔案會自動包含到引用aar壓縮包的apk中)

最終apk檔案中的lib/abi目錄中

以減少apk包大小為由是乙個錯誤的藉口,因為你也可以選擇在應用市場上傳指定abi版本的apk,生成不同abi版本的apk可以在build.gradle中如下配置:

參考:談談android的so

你也可以檢視我的其他同類文章,也會讓你有一定的收貨

關於abi的知識,我整理這兩篇部落格,相信會對你有幫助

abi和cpu關係的疑難雜症

android的.so檔案、abi和cpu的關係

早期的android系統幾乎只支援armv5的cpu架構,你知道現在它支援多少種嗎?

android系統目前支援以下七種不同的cpu架構:armv5,armv7 (從2023年起),x86 (從2023年起),mips (從2023年起),armv8,mips64和x86_64 (從2023年起),每一種都關聯著乙個相應的abi。

android應用支援的abi取決於apk中位於lib/abi目錄中的.so檔案,其中abi可能是上面說過的七種abi中的一種。

但最好是針對特定平台提供相應平台的二進位製包,這種情況下執行時就少了乙個模擬層(例如x86裝置上模擬arm的虛擬層),從而得到更好的效能(歸功於最近的架構更新,例如硬體fpu,更多的暫存器,更好的向量化等)。

我們可以通過build.supported_abis得到根據偏好排序的裝置支援的abi列表。但你不應該從你的應用程式中讀取它,因為android包管理器安裝apk時,會自動選擇apk包中為對應系統abi預編譯好的.so檔案,

abi(橫向)和cpu(縱向)

armeabi

armeabi-v7a

arm64-v8a

mips

mips64

x86x86_64

armv5

支援armv7

支援支援

armv8

支援支援

支援mips

支援mips64

支援支援

x86支援(3)

支援(2)

支援(1)

x86_64

支援支援支援

不同的abi,針對不同的cpu架構有不同的優先權

例如:x86裝置上,libs/x86目錄中如果存在.so檔案的話,會被安裝,如果不存在,則會選擇armeabi-v7a中的.so檔案,如果也不存在,則選擇armeabi目錄中的.so檔案。

x86裝置能夠很好的執行arm型別函式庫,但並不保證100%不發生crash,特別是對舊裝置。

64位裝置(arm64-v8a, x86_64, mips64)能夠執行32位的函式庫,但是以32位模式執行,在64位平台上執行32位版本的art和android元件,將丟失專為64位優化過的效能(art,webview,media等等)。

處理.so檔案時有一條簡單卻並不知名的重要法則。

你應該盡可能的提供專為每個abi優化過的.so檔案,你不應該混合著使用(不能就裝對不同cpu架構的so檔案,放在同乙個abi目錄下)。你應該為每個abi目錄提供對應的.so檔案。

這也意味著當你引入乙個預編譯好的.so檔案時,你需要檢查它被編譯所用的平台版本。

.so檔案可以依賴於不同的c++執行時,靜態編譯或者動態載入。

混合使用不同版本的c++執行時可能導致很多奇怪的crash,是應該避免的。

問題:解決方案:

重新編譯我們的.so檔案使其支援缺失的abis

也可以設定ndk.abifilters顯示指定支援的abis

拓展:aar壓縮包中位於jni/abi目錄中(.so檔案會自動包含到引用aar壓縮包的apk中)

最終apk檔案中的lib/abi目錄中

以減少apk包大小為由是乙個錯誤的藉口,因為你也可以選擇在應用市場上傳指定abi版本的apk,生成不同abi版本的apk可以在build.gradle中如下配置:

參考:談談android的so

Android的 so檔案 ABI和CPU的關係

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!你也可以檢視我的其他同類文章,也會讓你有一定的收貨 關於abi的知識,我整理這兩篇部落格,相信會對你有幫助 abi和cpu關係的疑難雜症 android的.so檔案 abi和cpu的關係 早期的android系統幾乎只支援armv5的cpu架構,你...

Android的 so檔案 ABI和CPU的關係

你也可以檢視我的其他同類文章,也會讓你有一定的收貨 關於abi的知識,我整理這兩篇部落格,相信會對你有幫助 abi和cpu關係的疑難雜症 android的.so檔案 abi和cpu的關係 早期的android系統幾乎只支援armv5的cpu架構,你知道現在它支援多少種嗎?android系統目前支援以...

Android 的 so 檔案載入機制

nativelibrarydirectories 表示應用自身存放 so 檔案的目錄位址,影響著 so 檔案的載入流程 primarycpuabi 表示應用應該執行在哪種 abi 上,如 armeabi v7a 它影響著應用是執行在 32 位還是 64 位的程序上,進而影響到尋找系統指定的 so 檔...