
..
ABI 是什么
在Android編碼時候 ,我們經(jīng)常會看到ABI 。ABI的意思是 Application Binary Interface 的縮寫。
不同 Android 手機使用不同的 CPU,因此支持不同的指令集。CPU 與指令集的每種組合都有其自己的應用二進制界面(或 ABI)。 ABI 可以非常精確地定義應用的機器代碼在運行時如何與系統(tǒng)交互。 您必須為應用要使用的每個 CPU 架構指定 ABI。
常用的abi有:
- armeabi 對應著 ARMV5和ARMV6架構
- armeabi-v7a - 對應著 ARMV7a架構,是32位的尋址長度,里面放置32位系統(tǒng)上運行的so庫
- armeabi-v8a - 對應著 ARMV8架構,64位尋址長度,里面放置64位的so
- x86 對應 x86架構(PC機的架構),里面放置x86上運行的so
- x86_64 對應著x86_64架構,里面放置x86_64上運行的so
可以通過Build.SUPPORTED_ABIS得到根據(jù)偏好排序的設備支持的ABI列表。
因為Android包管理器安裝APK時,會自動選擇APK包中為對應系統(tǒng)ABI預編譯好的.so文件,不同的ABI,針對不同的cpu架構有不同的優(yōu)先權例如: x86設備上,libs/x86目錄中如果存在.so文件的話,會被安裝,如果不存在,則會選擇armeabi-v7a中的.so文件,如果也不存在,則選擇armeabi目錄中的.so文件。x86設備能夠很好的運行ARM類型函數(shù)庫,但并不保證100%不發(fā)生crash,特別是對舊設備。

64位設備(arm64-v8a, x86_64, mips64)能夠運行32位的函數(shù)庫,但是以32位模式運行,在64位平臺上運行32位版本的ART和Android組件,將丟失專為64位優(yōu)化過的性能(ART,webview,media等等)
如何區(qū)分64位app 和32位app
當下載安裝一個App之后,從Launcher啟動該應用,系統(tǒng)會由Zygote分叉出一個子進程來提供App運行的虛擬機和Runtime環(huán)境。
與32位系統(tǒng)不同的是,在64系統(tǒng)中會同時存在兩個Zygote進程——zygote和zygote64,分別對應32位和64位應用。
所以,要進行App的32/64位檢測,只需要看它的父進程是哪個Zygote即可。
