Android之64位和32位區分

..

ABI 是什麼

在Android編碼時候 ,我們經常會看到ABI 。ABI的意思是 Application Binary Interface 的縮寫。

不同 Android 手機使用不同的 CPU,因此支持不同的指令集。CPU 與指令集的每種組合都有其自己的應用二進制界面(或 ABI)。 ABI 可以非常精確地定義應用的機器代碼在運行時如何與系統交互。 您必須爲應用要使用的每個 CPU 架構指定 ABI。

常用的abi有:

  1. armeabi 對應着 ARMV5和ARMV6架構
  2. armeabi-v7a - 對應着 ARMV7a架構,是32位的尋址長度,裏面放置32位系統上運行的so庫
  3. armeabi-v8a - 對應着 ARMV8架構,64位尋址長度,裏面放置64位的so
  4. x86 對應 x86架構(PC機的架構),裏面放置x86上運行的so
  5. x86_64 對應着x86_64架構,裏面放置x86_64上運行的so

可以通過Build.SUPPORTED_ABIS得到根據偏好排序的設備支持的ABI列表。

因爲Android包管理器安裝APK時,會自動選擇APK包中爲對應系統ABI預編譯好的.so文件,不同的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等等)

如何區分64位app 和32位app

當下載安裝一個App之後,從Launcher啓動該應用,系統會由Zygote分叉出一個子進程來提供App運行的虛擬機和Runtime環境。

與32位系統不同的是,在64系統中會同時存在兩個Zygote進程——zygote和zygote64,分別對應32位和64位應用。

所以,要進行App的32/64位檢測,只需要看它的父進程是哪個Zygote即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章