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

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