Android CPU架構(gòu)詳解

CPU架構(gòu)分類

armeabi
armeabi-v7a
arm64-v8a
x86
x86_64
mips
mips64

各種CPU架構(gòu)的介紹

ARM架構(gòu)屬于RISC指令集,指令集精簡、指令等長,雖然這樣的設(shè)計可以提高處理效率,但在遇到復(fù)雜的指令后,就需要更多的簡單指令來堆砌復(fù)雜任務(wù);ARM從來只是設(shè)計低功耗處理器。其宗旨是設(shè)計低功耗處理器,這是他們的強項。

armeabi:ARM架構(gòu)的默認選項,支持基于 ARM* v5TE 的設(shè)備,支持軟浮點運算,但不支持硬件輔助浮點運算,支持所有的 ARM* 設(shè)備。

armeabi-v7a:armeabi-v7a 向下兼容,在兼容 armeabi 的基礎(chǔ)上,支持基于 ARM* v7 的設(shè)備,支持硬件 FPU 指令,支持硬件浮點運算,目前大部分機器都屬于armeabi-v7a。

arm64-v8a:arm64-v8a向下兼容 armeabi 和 armeabi-v7a,最主要的區(qū)別在于 arm64-v8a 支持64位,在 MIPS64 架構(gòu)上增加了 ARMv7 架構(gòu)中已經(jīng)擁有的的TrustZone技術(shù)、虛擬化技術(shù)及NEON advanced SIMD技術(shù)等特性(ARM收購MIPS)。架構(gòu)中包含兩個執(zhí)行狀態(tài):AArch32(也就是我們常說的ARMv7)和AArch64(ARMv8),也就是說64位的ARM處理器中同時包含著32位的ARMv7和64位的ARMv8兩種架構(gòu),直接導(dǎo)致每種架構(gòu)所擁有的晶體管減半。

X86構(gòu)架是英特爾推出的一種復(fù)雜指令集,用于控制芯片的運行的程序,目前該構(gòu)架的處理器已經(jīng)廣泛運用在PC領(lǐng)域,由于X86構(gòu)架的處理器芯片在性能上比較強勁,善于執(zhí)行復(fù)雜工作,所以當(dāng)英特爾進軍移動市場領(lǐng)域后(例如聯(lián)想K800),就出現(xiàn)了X86的架構(gòu)。X86構(gòu)架屬于典型的CISC,指令集豐富,指令不等長,善于執(zhí)行復(fù)雜工作,更強調(diào)串行性能,它的整體運算能力要比只為移動而生的ARM架構(gòu)強大,并且在PC領(lǐng)域已經(jīng)廣泛應(yīng)用,擁有深厚的技術(shù)背景。英特爾設(shè)計超高性能的臺式機和服務(wù)器處理器,并且的確做的不錯。

x86:英特爾推出的32位CPU架構(gòu),生成的二進制代碼可支持包含基于硬件的浮點運算的 IA-32 指令集,同時,x86機器基本上可以使用 intel 的 libhounini 項目直接在x86機器上運行僅含armeabi的動態(tài)庫代碼,也就會說x86機器對armeabi也能夠兼容,不過性能上會有些損耗。

x86_64:英特爾推出的64位CPU架構(gòu),向下兼容x86。

mips和mips_64:MIPS是一種高性能的嵌入式CPU構(gòu)架,其出發(fā)點是高性能,主要用于路由器、貓等

總體來說,Android手機大部分采用的是ARM架構(gòu)的CPU.

CPU之間的架構(gòu)兼容

ARMv5 設(shè)備:只支持armeabi

ARMv7 設(shè)備:支持 armeabi 和 armeabi-v7a

ARMv8 設(shè)備:支持 armeabi-v7a、armeabi 和 arm64-v8a

X86 設(shè)備:支持 armeabi(性能有所損耗) 和 x86

x86_64 設(shè)備:支持 x86 和 x86_64

mips 設(shè)備: 支持 mips

mips_64 設(shè)備:支持 mips 和 mips_64

Android中設(shè)備加載so策略

不同CPU架構(gòu)的android手機加載時會在libs下找自己對應(yīng)的目錄,從對應(yīng)的目錄下尋找需要的.so文件;如果沒有對應(yīng)的目錄,就會去armeabi下去尋找,如果已經(jīng)有對應(yīng)的目錄,卻如果沒有找到對應(yīng)的.so文件,也不會去armeabi下去尋找了。

以x86設(shè)備為例,x86設(shè)備會在項目中的 libs文件夾尋找是否含有x86文件夾,如果含有x86文件夾,則默認為該項目有x86對應(yīng)的so可運行文件,只有x86文件夾而文件夾下沒有so,程序運行也是會出現(xiàn)find library returned null的錯誤的;如果工程本身不含有x86文件夾,則會尋找armeabi或者armeabi-v7a文件夾,兼容運行。以armeabi-v7a設(shè)備為例,該Android設(shè)備當(dāng)然優(yōu)先尋找libs目錄下的armeabi-v7a文件夾,同樣,如果只有armeabi-v7a文件夾而沒有 so也是會報錯的;如果找不到armeabi-v7a文件夾,則尋找armeabi文件夾,兼容運行該文件夾下的so,但是不能兼容運行x86的so。所以項目中如果只含有x86的so,在armeabi和armeabi-v7a也是無法運行的。以上就是不同CPU架構(gòu)運行時加載so的策略。

針對不同平臺,如何去適配

目前主流的Android設(shè)備主要是 armeabi-v7a 架構(gòu)的,然后是 x86 和 armeabi 了。如果同時包含了 armeabi, armeabi-v7a和x86,所有設(shè)備都可以運行,程序在運行的時候去加載不同平臺對應(yīng)的so,這是較為完美的一種解決方案,但是有時候為了減少apk的大小,不會同時設(shè)置 armeabi, armeabi-v7a 和 x86。根據(jù)不同的情況,可以進行不同的適配,

1.只適配 armeabi-v7a,因為目前主流機型是 ARMv7,并且 ARMv8 設(shè)備也向下兼容了armeabi-v7a,
Facebook、WhatsApp、王者榮耀等就是只適配了armeabi-v7a。(Google play store下載 Native libs Monitor 進行查看)。

2.只適配 armeabi,因為 ARMv7 、ARMv8 還是 x86 都兼容 armeabi,但是性能都會有些損耗,例如ARMv7 支持硬件浮點運算等沒法體現(xiàn),x86 支持 armeabi 同樣具有相應(yīng)的損耗。

3.同時適配 armeabi-v7a 和 armeabi,既能夠支持所有 ARM 架構(gòu),同時又能具有 ARMv7 支持硬件浮點運算等特性,例如Line等應(yīng)用

4.同時適配 x86 和 armeabi,既能支持所有 ARM 架構(gòu),又能支持x86架構(gòu),唯一的缺點就是沒有了ARMv7 支持硬件浮點運算等一系列特性,例如QQ

5.同時適配 armeabi, armeabi-v7a 和 x86,在性能方面來說是較為完美的方案,只是APK的大小也會隨之的變大

6.還有其他的一些方案,例如微信只適配了armeabi,但是對于某些需要利用 ARMv7 支持硬件浮點運算等一系列特性的操作,在armeabi目錄下存在v7對應(yīng)的so文件,通過代碼判斷加載不同的so文件。即達到了減少APK大小的目的,又能達到適配ARMv7等架構(gòu)以便使用其架構(gòu)的一些新特性的目的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容