關(guān)于Android中CPU框架

一枫笛、介紹

????ARM:?

? ??是嵌入式中的一種架構(gòu),全稱為Advanced RISC Machine,可以理解為ARM處理器(也就是cpu)娇妓。? ? ?

? ? ABI(Application Binary Interface):

? ??應(yīng)用程序二進(jìn)制接口 描述了應(yīng)用程序和操作系統(tǒng)之間,一個(gè)應(yīng)用和它的庫之間活鹰,或者應(yīng)用的組成部分之間的低接口

? ? 通俗一點(diǎn)說就是: 不同android設(shè)備對應(yīng)的cpu指令集不同哈恰,架構(gòu)也不同,這樣當(dāng)我們需要使用cpu的時(shí)候就要尋找適合的指集志群、和架構(gòu).

? ??Android目前支持以下7種ABIs:? mips, mips64, X86, X86–64, arm64-v8a, armeabi, armeabi-v7a

? ? Android設(shè)備的ABI:

? ? 通常設(shè)備的ABI有兩種一種是主ABI,一種是輔ABI着绷。

? ? 在系統(tǒng)選擇ABI時(shí)會優(yōu)先選擇主ABI,如果不存在對應(yīng)的則會選擇輔的ABI:

? ??總的來說锌云,就是一個(gè)Android設(shè)備可以支持多種ABI,設(shè)備主ABI和輔助ABI,以arm64-v8a為主ABI的設(shè)備荠医,輔助ABI為armeabi-v7a和armeabi,以armeabi-v7a為主ABI的設(shè)備桑涎,輔助ABI為armeabi彬向。

? ? ABI的作用:

? ? ?我們在想使用c/c++的native庫的時(shí)候,需要提供不同的編譯包對應(yīng)不同的cpu架構(gòu)攻冷,也就是.so文件, 一般來說編譯包.so提供的是全套的cpu架構(gòu)娃胆,但是我們打包apk不需要全部都打包,因?yàn)檫@樣會很大程度增大apk體積等曼,所以ABI作用就在這里了里烦,只提供對應(yīng)的架構(gòu)的編譯包,也就是選擇最合適禁谦、最兼容招驴、性能最好的包,只需要在app下的build.gradle添加如下配置:

android{

? ? defaultConfig{

? ? ? ? ndk{? //指定 64位CPU使用32位so庫(其他類型如v8a枷畏、x86等會被過濾掉)

? ? ? ? ? ? abiFilters"armeabi-v7a"

? ? ? ? }

? ?}

}


在對應(yīng)的jnilibs中配置好

二别厘、ABI與CPU關(guān)系

首先了解下不同ABI的簡介:

armeabi: 僅支持ARMv5架構(gòu)、僅支持軟浮點(diǎn)運(yùn)算拥诡,支持所有ARM*設(shè)備

armeabi-v7a: 支持ARMv7并向下兼容(輔ARMv5),支持硬浮點(diǎn)運(yùn)算,目前大部分機(jī)型都為v7a.

arm64-v8a: 支持ARMv8并向下兼容(輔ABI:ARMv5触趴、ARMv7), 同時(shí)包含32位(v7a)以及64位框架(v8a)

x86: 英特爾推出的32位框架 ,硬浮點(diǎn)運(yùn)算氮发,同時(shí)支持ARMv5架構(gòu)以及ARMv7(同為32位),不過在ARMv5中會有性能損耗.

x86_64:?英特爾推出的64位框架,向下兼容x86冗懦、ARMv5爽冕,通樣在性能上有所損耗

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

可以看到不同CPU架構(gòu)對應(yīng)不同ABI支持情況

ABI支持情況

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

三、ABI適配

前面了解了不同設(shè)備的支持情況没讲,但是這些不同ABI是如何進(jìn)行加載的呢眯娱?

? ??ABI加載策略:

? ? 首先要明確,當(dāng)前設(shè)備支持的ABI架構(gòu)(主爬凑、輔架構(gòu))徙缴、以及當(dāng)前項(xiàng)目配置的ABI

? ? 其次再看我們的加載流程:

? ? 以ARMv8的cpu框架為例也就是支持v8a的設(shè)備為例:

加載.so流程

?想要了解適配方案就要先了解軟浮點(diǎn)運(yùn)算(ARMv5)和硬浮點(diǎn)運(yùn)算(ARMv7以上)

軟浮點(diǎn)是通過浮點(diǎn)庫去實(shí)現(xiàn)浮點(diǎn)運(yùn)算的,效率低嘁信;硬浮點(diǎn)是通過浮點(diǎn)運(yùn)算單元(FPU)來完成的于样,效率高

????(1)硬浮點(diǎn)(hard-float)

編譯器將代碼直接編譯成硬件浮點(diǎn)協(xié)處理器(浮點(diǎn)運(yùn)算單元FPU)能識別的指令潘靖,這些指令在執(zhí)行的時(shí)候ARM核直接把它轉(zhuǎn)給協(xié)處理器執(zhí)行穿剖。FPU 通常有一套額外的寄存器來完成浮點(diǎn)參數(shù)傳遞和運(yùn)算。使用實(shí)際的硬件浮點(diǎn)運(yùn)算單元(FPU)會帶來性能的提升卦溢。

????(2)軟浮點(diǎn)(soft-float)

編譯器把浮點(diǎn)運(yùn)算轉(zhuǎn)成浮點(diǎn)運(yùn)算的函數(shù)調(diào)用和庫函數(shù)調(diào)用携御,沒有FPU的指令調(diào)用,也沒有浮點(diǎn)寄存器的參數(shù)傳遞既绕。浮點(diǎn)參數(shù)的傳遞也是通過ARM寄存器或者堆棧完成∽纳玻現(xiàn)在的Linux系統(tǒng)默認(rèn)編譯選擇使用hard-float,如果系統(tǒng)沒有任何浮點(diǎn)處理器單元,這就會產(chǎn)生非法指令和異常凄贩。因而一般的系統(tǒng)鏡像都采用軟浮點(diǎn)以兼容沒有VFP的處理器誓军。

了解了.so的加載策略,下面說下具體如何去適配.

? ? 適配方案:

? ? 1. 適配armeabi-v7a疲扎,市場上主流機(jī)型昵时,可兼容大部分設(shè)備除非過老機(jī)型,android2.2以下版本一般會采用老的CPU架構(gòu)椒丧,

這種適配方式壹甥,除去ARMv5架構(gòu)的機(jī)型都可以適配.

? ? 2. 適配armeabi, 這種適配方式會兼容所有類型的CPU壶熏,但是需要注意的是如果你的.SO包含使用CPU核心或者說對CPU使用過大的話句柠,不建議此種方式, 原因就是:目前主流為ARM7,上面也說了ARMv5架構(gòu)為軟浮點(diǎn)運(yùn)算,而這種低效率算法在CPU使用上效率不如硬浮點(diǎn)算法溯职,也就是ARMv7對應(yīng)armeabi-v7a類型ABI精盅。

? ? 3. 適配arm-v8a, 這種方式適配了ARMv8(64位)的機(jī)型,也就是說這種機(jī)型會向下兼容ARMv7(32位)以及ARMv5架構(gòu)谜酒,但是忽略了部分使用ARMv7的機(jī)型叹俏。

? ? 目前的主流配置基本就這3中,你也可以同時(shí)適配多種僻族,但是會增大apk體積, 還有一類問題就是第三方的庫只支持armeabi粘驰,而我們的項(xiàng)目需要v7a這類去適配,這樣2個(gè)庫沒有交集述么,我們該如何去選擇適配蝌数?

? ??第三方適配方案:

? ? 1. 首先要確定一個(gè)問題, 你在使用CPU中哪個(gè)庫對CPU的使用需求量更大或者更主要碉输,由于兩種庫沖突,我們必須合并適配亭珍,我們模擬v7a的這類庫對CPU需求更大敷钾,那我們可以這樣: 保留armeabi-v7a的庫,將第三方的armeabi中的.so放入v7a中肄梨,這樣我們統(tǒng)一了適配方案阻荒,前提是第三方庫支持這樣做.

? ? 2. 那如果第三方不支持這樣,那我們需要用到另一個(gè)方案 : 將v7a庫中的.so放入第三方的armeabi中, 這樣也是將v7a合并到了armeabi中众羡,但是由于咱們v7a對CPU需求大侨赡,不排除這樣配置會導(dǎo)致cpu使用效率下降.

以上就是關(guān)于ABI適配的一些方案和問題有錯(cuò)誤之處還望指教!

四、市場占有度

知道了適配方案粱侣,我們更要了解下市場上各個(gè)CPU類型的占有率羊壹,更容易讓我們確定我們適配的方向:

ARMv5 設(shè)備:目前幾乎遇不到這類機(jī)型,不排除特殊機(jī)型

ARMv7 設(shè)備:支持 armeabi 和 armeabi-v7a, 目前來說也是相對比較老的機(jī)型齐婴,一般是android 7.0以下的設(shè)備油猫。

ARMv8 設(shè)備:支持 armeabi-v7a、armeabi 和 arm64-v8a柠偶,目前主流的類型情妖,基本上主流機(jī)型,android10左右都是使用這類架構(gòu)诱担。

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

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

mips 設(shè)備: 支持 mips

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毡证,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蔫仙,更是在濱河造成了極大的恐慌料睛,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秦效,居然都是意外死亡雏蛮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門阱州,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挑秉,“玉大人,你說我怎么就攤上這事苔货∠牛” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵夜惭,是天一觀的道長姻灶。 經(jīng)常有香客問我,道長诈茧,這世上最難降的妖魔是什么产喉? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮敢会,結(jié)果婚禮上曾沈,老公的妹妹穿的比我還像新娘。我一直安慰自己鸥昏,他們只是感情好塞俱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吏垮,像睡著了一般障涯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膳汪,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天唯蝶,我揣著相機(jī)與錄音,去河邊找鬼遗嗽。 笑死生棍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媳谁。 我是一名探鬼主播涂滴,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晴音!你這毒婦竟也來了柔纵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤锤躁,失蹤者是張志新(化名)和其女友劉穎搁料,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郭计,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年霸琴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昭伸。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梧乘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庐杨,到底是詐尸還是另有隱情选调,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布灵份,位于F島的核電站仁堪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏填渠。R本人自食惡果不足惜弦聂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氛什。 院中可真熱鬧莺葫,春花似錦、人聲如沸屉更。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑰谜。三九已至,卻和暖如春树绩,著一層夾襖步出監(jiān)牢的瞬間萨脑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工饺饭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渤早,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓瘫俊,卻偏偏與公主長得像鹊杖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子扛芽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344