1. 程式人生 > >Android:ABI和CPU關係

Android:ABI和CPU關係

轉載請標明出處:http://blog.csdn.net/xx326664162/article/details/51167849 文章出自:薛瑄的部落格

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

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

ABI和CPU關係的疑難雜症 
Android的.so檔案、ABI和CPU的關係

在這裡非常感激騰訊bugly的“Bugly-Android_符號表-Jalen”,對我有很多啟發和幫助

ABI和CPU的重要知識
1、 大部分cpu都支援多於一種的ABI。 
2、 當一個應用安裝在裝置上,只有該裝置支援的CPU架構對應的.so檔案會被安裝。

3、

ABI目錄(橫向)和cpu(縱向)    armeabi    armeabi-v7a    arm64-v8a    mips    mips64    x86    x86_64
ARMv5    支援                        
ARMv7    支援    支援                    
ARMv8    支援    支援    支援                
MIPS                支援            
MIPS64                支援    支援        
x86    支援(3)    支援(2)                支援(1)    
x86_64    支援                    支援    支援
注意:上表格中的空白部分,是我不知道它是否支援,極有可能是不支援

解析: x86裝置上,選擇ABI的優先順序

libs/x86目錄中如果存在.so檔案的話,會被安裝
如果不存在,則會選擇armeabi-v7a中的.so檔案
如果也不存在,則選擇armeabi目錄中的.so檔案
x86裝置能夠很好的執行ARM型別函式庫,但並不保證100%不發生crash,特別是對舊裝置,因為是執行在x86裝置上模擬arm的虛擬層上。

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

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

6、 會安裝優先順序較高的ABI目錄,則其它優先順序較低的ABI目錄(包括其它module中的ABI目錄),都無法安裝。例如:在cpu是ARMv7架構的手機上,如果檢測到armeabi-v7a,就會選擇安裝armeabi-v7a,則armeabi下的檔案,都無法安裝了。

7、 相應的ABI二進位制檔案,要放進相應的ABI目錄中

8、一般情況下不要簡單得修改架構目錄名

我們可以通過Build.SUPPORTED_ABIS得到根據偏好排序的裝置支援的ABI列表。但你不應該從你的應用程式中讀取它,因為Android包管理器安裝APK時,會自動選擇APK包中為對應系統ABI預編譯好的.so檔案,如果在對應的lib/ABI目錄中存在.so檔案的話。

工具
檢視專案中ABI檔案的架構型別 
騰訊bugly,符號表工具,下載地址:http://bugly.qq.com/whitebook

Native Libs Monitor這個應用可以幫助我們理解手機上安裝的APK用到了哪些.so檔案,以及.so檔案來源於哪些函式庫或者框架。

疑難雜症
雖然規則制定出來了,但總是會出現一些,不合規的現象,導致一些錯誤,難以理解。現在就讓我們來一起把把脈,看看到底是什麼疑難雜症

一、.so檔案,放進了優先順序低的ABI目錄
一、如果你的專案中,有其他優先順序更高的ABI目錄,但是你把ABI檔案放到了優先順序低的目錄,則你的ABI檔案無法被載入

二、如果你的專案中,ABI檔案放在了,專案中優先順序最高的ABI目錄中(這個ABI目錄是手機所支援的在專案中優先順序最高的,但不一定是手機所支援的優先順序最高的),則這個ABI檔案,可以被載入,載入為ABI目錄的所表示的架構型別。

例子:

我的手機cpu架構是ARMv7,ABI檔案是armeabi-v7a,但是放進了armeabi目錄中

在執行的過程中會出現兩種情況:

1、專案中有armeabi-v7a的目錄,armeabi目錄中的檔案,無法被載入,執行後報錯,出現如下log資訊。

Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/.xx../base.apk"],nativeLibraryDirectories=[/data/app/.xx../lib/arm, /vendor/lib, /system/lib]]] couldn't find "lib..xx...so"
1
2、專案中只有armeabi的目錄,armeabi目錄是該專案優先順序最高的ABI目錄(雖然armeabi目錄在ARMv7所支援的優先順序最高的ABI目錄不是最高),作為armv5,安裝到手機上。

二、ABI二進位制檔案,放進了優先順序高的ABI目錄
可以被載入使用,被載入為ABI檔案所表示的結構型別

例子:

我的手機cpu架構是ARMv7,ABI檔案是armeabi-v5te,但是放進了armeabi-v7a目錄中。

可以被載入,但是載入為ABI檔案所表示的架構型別。這樣就出現了,同一個應用中ABI檔案,出現兩種的情況。

三、兩個第三的SDK中ABI檔案優先順序不一樣
問題:

兩個第三方的SDK中ABI檔案優先順序不一樣,手機載入執行時,會導致優先順序低的庫,無法被載入

例子:

我的手機cpu架構是ARMv7,專案中使用兩個第三方SDK:企業A和企業B

企業A:ABI檔案是armeabi-v7a,放進armeabi-v7a目錄中。 
企業B:ABI檔案是armeabi-v5te,放進armeabi目錄中。

在執行時,會發現執行後crash,出現如下log資訊。

Caused by: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/.xx../base.apk"],nativeLibraryDirectories=[/data/app/.xx../lib/arm, /vendor/lib, /system/lib]]] couldn't find "lib..xx...so"
1
解決辦法:

1、使用同一優先順序的ABI檔案,ABI檔案放入優先順序相同的ABI目錄

企業A:ABI檔案是armeabi-v5te,放進armeabi目錄中。 
企業B:ABI檔案是armeabi-v5te,放進armeabi目錄中。 
或 
企業A:ABI檔案是armeabi-v7a,放進armeabi-v7a目錄中。 
企業B:ABI檔案是armeabi-v7a,放進armeabi-v7a目錄中。

2、使用不同優先順序的ABI檔案,ABI檔案放入優先順序相同的ABI目錄。一般情況不建議這麼做。

企業A:ABI檔案是armeabi-v7a,但是放進armeabi目錄中。 
企業B:ABI檔案是armeabi-v5te,放進armeabi目錄中。 
或 
企業A:ABI檔案是armeabi-v7a,放進armeabi-v7a目錄中。 
企業B:ABI檔案是armeabi-v5te,但是放進armeabi-v7a目錄中。
--------------------- 
作者:薛瑄 
來源:CSDN 
原文:https://blog.csdn.net/xx326664162/article/details/51167849?utm_source=copy 
版權宣告:本文為博主原創文章,轉載請附上博文連結!