Android 中的7種CPU詳解

CPU歷史詳解

早起Android只支持ARMv5的CPU架構(gòu),而發(fā)展到現(xiàn)在,支持以下7種架構(gòu):

  • ARMv5:(armeabi )現(xiàn)在很少了,應(yīng)該不需要支持了(廢棄),使用軟件浮點(diǎn)運(yùn)算,兼容所有ARM設(shè)備,通用性強(qiáng),速度慢(只支持armeabi)

  • ARMv7(2010年起)大部分機(jī)型:第7代 ARM v7,使用硬件浮點(diǎn)運(yùn)算,具有高級(jí)擴(kuò)展功能(支持 armeabi 和 armeabi-v7a,目前大部分手機(jī)都是這個(gè)架構(gòu))魅族M9,iphone 3GS,三星I9000等

  • x86(2011年起):聯(lián)想K800,使用這種架構(gòu)的較少,畢竟Android手機(jī)大部分是ARM32位,一般用于平板,支持armeabi(性能有所損耗)

  • MIPS(2012年):可能有些國(guó)產(chǎn)廠商在用(廢棄)

  • ARMv8:第8代,高端機(jī)型,64位,包含AArch32、AArch64兩個(gè)執(zhí)行狀態(tài)對(duì)應(yīng)32、64bit(支持 armeabi-v7a、armeabi 和 arm64-v8a)華為 Mate 8,Galaxy S

  • MIPS64:暫時(shí)沒發(fā)現(xiàn)什么手機(jī)在用(64位)

  • x86_64(2014年):64位平板

現(xiàn)在Android CPU絕大多數(shù)已ARM架構(gòu)為主,少數(shù)用Intel的X86架構(gòu)
以CPU的品牌來說,有 高通【驍龍】、聯(lián)發(fā)科MTK【Helio】、三星【Exynos】、華為海思【Kirin】,其中三星和華為的芯片供自家用不外售。

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

  • 每種架構(gòu)關(guān)聯(lián)著一種ABI(application binary interface應(yīng)用程序二進(jìn)制接口),所以每一種架構(gòu)都對(duì)應(yīng)一個(gè).so文件。

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

  • 以x86設(shè)備為例,x86設(shè)備會(huì)在項(xiàng)目中的 libs文件夾尋找是否含有x86文件夾,如果含有x86文件夾,則默認(rèn)為該項(xiàng)目有x86對(duì)應(yīng)的so可運(yùn)行文件,只有x86文件夾而文件夾下沒有so,程序運(yùn)行也是會(huì)出現(xiàn) find library returned null 的錯(cuò)誤的;如果工程本身不含有x86文件夾,則會(huì)尋找armeabi或者armeabi-v7a文件夾,兼容運(yùn)行。

  • 以armeabi-v7a設(shè)備為例,該Android設(shè)備當(dāng)然優(yōu)先尋找libs目錄下的armeabi-v7a文件夾,同樣,如果只有armeabi-v7a文件夾而沒有 so也是會(huì)報(bào)錯(cuò)的;如果找不到armeabi-v7a文件夾,則尋找armeabi文件夾,兼容運(yùn)行該文件夾下的so,但是不能兼容運(yùn)行x86的so。所以項(xiàng)目中如果只含有x86的so,在armeabi和armeabi-v7a也是無法運(yùn)行的。以上就是不同CPU架構(gòu)運(yùn)行時(shí)加載so的策略。* 如果只對(duì)armeabi的手機(jī)cpu做適配,那么支持armeabi的手機(jī)都會(huì)去armeabi目錄下找對(duì)應(yīng)的so庫(kù)

  • 這里需要注意很重要的一點(diǎn):arm64-v8a是可以向下兼容的。如果你有兩個(gè)文件夾armeabi和arm64-v8a,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手機(jī)在用到b.so的時(shí)候發(fā)現(xiàn)有arm64-v8a的文件夾,然而該文件夾里面沒有b.so,就報(bào)錯(cuò)了。這個(gè)時(shí)候應(yīng)該刪掉arm64-v8a文件夾,手機(jī)發(fā)現(xiàn)沒有適配arm64-v8a,就會(huì)直接去找armeabi的so庫(kù)。所以要么你別加arm64-v8a,要么armeabi里面有的so庫(kù),arm64-v8a里面也必須有。

如何適配

目前主流的Android設(shè)備主要是 armeabi-v7a 架構(gòu)的,然后是 x86 和 armeabi 了。如果同時(shí)包含了 armeabi, armeabi-v7a和x86,所有設(shè)備都可以運(yùn)行,程序在運(yùn)行的時(shí)候去加載不同平臺(tái)對(duì)應(yīng)的so,這是較為完美的一種解決方案,但是有時(shí)候?yàn)榱藴p少apk的大小,不會(huì)同時(shí)設(shè)置 armeabi, armeabi-v7a 和 x86。根據(jù)不同的情況,可以進(jìn)行不同的適配,
1.只適配 armeabi-v7a,因?yàn)槟壳爸髁鳈C(jī)型是 ARMv7,并且 ARMv8 設(shè)備也向下兼容了armeabi-v7a,
Facebook、WhatsApp、王者榮耀等就是只適配了armeabi-v7a。(Google play store下載 Native libs Monitor 進(jìn)行查看)。
2.只適配 armeabi,因?yàn)?ARMv7 、ARMv8 還是 x86 都兼容 armeabi,但是性能都會(huì)有些損耗,例如ARMv7 支持硬件浮點(diǎn)運(yùn)算等沒法體現(xiàn),x86 支持 armeabi 同樣具有相應(yīng)的損耗。微信使用了此策略。
3.同時(shí)適配 armeabi-v7a 和 armeabi,既能夠支持所有 ARM 架構(gòu),同時(shí)又能具有 ARMv7 支持硬件浮點(diǎn)運(yùn)算等特性,例如Line等應(yīng)用。
4.同時(shí)適配 x86 和 armeabi,既能支持所有 ARM 架構(gòu),又能支持x86架構(gòu),唯一的缺點(diǎn)就是沒有了ARMv7 支持硬件浮點(diǎn)運(yùn)算等一系列特性,例如QQ.
5.同時(shí)適配 armeabi, armeabi-v7a 和 x86,在性能方面來說是較為完美的方案,只是APK的大小也會(huì)隨之的變大。

附:各CPU架構(gòu)簡(jiǎn)介

  • ARM架構(gòu)屬于RISC指令集,指令集精簡(jiǎn)、指令等長(zhǎng),雖然這樣的設(shè)計(jì)可以提高處理效率,但在遇到復(fù)雜的指令后,就需要更多的簡(jiǎn)單指令來堆砌復(fù)雜任務(wù);ARM從來只是設(shè)計(jì)低功耗處理器。其宗旨是設(shè)計(jì)低功耗處理器,這是他們的強(qiáng)項(xiàng)。
  • armeabi:ARM架構(gòu)的默認(rèn)選項(xiàng),支持基于 ARM* v5TE 的設(shè)備,支持軟浮點(diǎn)運(yùn)算,但不支持硬件輔助浮點(diǎn)運(yùn)算,支持所有的 ARM* 設(shè)備。
  • armeabi-v7a:armeabi-v7a 向下兼容,在兼容 armeabi 的基礎(chǔ)上,支持基于 ARM* v7 的設(shè)備,支持硬件 FPU 指令,支持硬件浮點(diǎn)運(yùn)算,目前大部分機(jī)器都屬于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收購(gòu)MIPS)。架構(gòu)中包含兩個(gè)執(zhí)行狀態(tài):AArch32(也就是我們常說的ARMv7)和AArch64(ARMv8),也就是說64位的ARM處理器中同時(shí)包含著32位的ARMv7和64位的ARMv8兩種架構(gòu),直接導(dǎo)致每種架構(gòu)所擁有的晶體管減半。
  • X86構(gòu)架是英特爾推出的一種復(fù)雜指令集,用于控制芯片的運(yùn)行的程序,目前該構(gòu)架的處理器已經(jīng)廣泛運(yùn)用在PC領(lǐng)域,由于X86構(gòu)架的處理器芯片在性能上比較強(qiáng)勁,善于執(zhí)行復(fù)雜工作,所以當(dāng)英特爾進(jìn)軍移動(dòng)市場(chǎng)領(lǐng)域后(例如聯(lián)想K800),就出現(xiàn)了X86的架構(gòu)。X86構(gòu)架屬于典型的CISC,指令集豐富,指令不等長(zhǎng),善于執(zhí)行復(fù)雜工作,更強(qiáng)調(diào)串行性能,它的整體運(yùn)算能力要比只為移動(dòng)而生的ARM架構(gòu)強(qiáng)大,并且在PC領(lǐng)域已經(jīng)廣泛應(yīng)用,擁有深厚的技術(shù)背景。英特爾設(shè)計(jì)超高性能的臺(tái)式機(jī)和服務(wù)器處理器,并且的確做的不錯(cuò)。
  • x86:英特爾推出的32位CPU架構(gòu),生成的二進(jìn)制代碼可支持包含基于硬件的浮點(diǎn)運(yùn)算的 IA-32 指令集,同時(shí),x86機(jī)器基本上可以使用 intel 的 libhounini 項(xiàng)目直接在x86機(jī)器上運(yùn)行僅含armeabi的動(dòng)態(tài)庫(kù)代碼,也就會(huì)說x86機(jī)器對(duì)armeabi也能夠兼容,不過性能上會(huì)有些損耗。
  • x86_64:英特爾推出的64位CPU架構(gòu),向下兼容x86。
  • mips和mips_64:MIPS是一種高性能的嵌入式CPU構(gòu)架,其出發(fā)點(diǎn)是高性能,主要用于路由器、貓等
  • 總體來說,Android手機(jī)大部分采用的是ARM架構(gòu)的CPU.華為海思芯片,也是基于ARM研發(fā)的.

Android 中配置

  • 首先在APP的builder.gradle中的defaultConfig中添加ndk的配置


    image.png
  • 在APP的libs下面創(chuàng)建對(duì)應(yīng)的文件夾,需要什么創(chuàng)建什么,和ndk中是對(duì)應(yīng)的
    ![image.png](https://upload-images.jianshu.io/upload_images/3937928-66c
    20190320145445.png
  • 在項(xiàng)目的build.gradle中的buildTypes{}中添加這句話,就是加載jni的資源文件在libs中尋找

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
  • 在項(xiàng)目的build.gradle中的dependencies{}中查看,是否添加了以下依賴
    implementation fileTree(include: ['*.jar'], dir: 'libs')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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