你也可以檢視我的其他同類文章,也會讓你有一定的收貨
關於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 {
...
splits {
abi {
enable true
reset()
參考:
談談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 檔...