實(shí)在汗顏,之前寫(xiě)過(guò)一篇文章記錄了新版高德地圖使用過(guò)程中在不同版本的手機(jī)上有崩潰的現(xiàn)象荧库,崩潰原因在于某些平臺(tái)的機(jī)子上找不到底層JNI庫(kù)導(dǎo)致的汁果,還寫(xiě)了解決方式,后來(lái)發(fā)現(xiàn)只是治標(biāo)不治本疼电,一直沒(méi)有時(shí)間去更改嚼锄,今天抽空修改一下最終的解決方案。
其實(shí)高德地圖SDK中已經(jīng)兼容了平臺(tái)問(wèn)題蔽豺,只是我們不知道怎么弄而已区丑。先來(lái)介紹一下各個(gè)平臺(tái)。
下面這篇文章是從網(wǎng)上找來(lái)的修陡,介紹的十分充分:
armeabi-v7a沧侥,armeabi,arm64-v8a
armeabi就是針對(duì)普通的或舊的arm v5 cpu魄鸦,armeabi-v7a是針對(duì)有浮點(diǎn)運(yùn)算或高級(jí)擴(kuò)展功能的arm v7 cpu宴杀。
armeabi-v7a(32位ARM設(shè)備),arm64-v8a(64位ARM設(shè)備)
在2011年11月拾因,ARM公司發(fā)布了新一代處理器64位架構(gòu)ARMv8的部分技術(shù)細(xì)節(jié)(也就是我們常說(shuō)的Cortex-A57A53)旺罢,代表著未來(lái)移動(dòng)處理器邁入64位行列。我們得明確一點(diǎn)绢记,ARM公司自己本身并沒(méi)有64位芯片設(shè)計(jì)技術(shù)主经,他是通過(guò)了收購(gòu)MIPS64處理器架構(gòu)的部分技術(shù)使用權(quán),再結(jié)合ARM的一些特性設(shè)計(jì)出來(lái)的庭惜。也就是說(shuō):MIPS罩驻、ARM、X86三大架構(gòu)中护赊,唯一沒(méi)有64位技術(shù)的ARM惠遏,通過(guò)收購(gòu)MIPS的形式得到了64位。
所謂的ARMv8架構(gòu)骏啰,就是在MIPS64架構(gòu)上增加了ARMv7架構(gòu)中已經(jīng)擁有的的TrustZone技術(shù)节吮、虛擬化技術(shù)及NEON advanced SIMD技術(shù)等特性,研發(fā)成的判耕。
64位ARMv8架構(gòu)中包含兩個(gè)執(zhí)行狀態(tài):AArch32(也就是我們常說(shuō)的ARMv7)和AArch64(ARMv8)透绩。AArch64執(zhí)行狀態(tài)針對(duì)64位處理技術(shù),引入了一個(gè)全新指令集A64(也就是基于收購(gòu)的MIPS64架構(gòu)),而AArch32執(zhí)行狀態(tài)將支持現(xiàn)有的ARM指令集帚豪。所以64位的ARM處理器中同時(shí)包含著32位的ARMv7和64位的ARMv8兩種架構(gòu)碳竟。因此:
看到這里,你一定明白了狸臣,ARM64位處理器和電腦的64位處理器是兩個(gè)截然不容的概念莹桅,他并不是64位就能原生向下兼容32位程序,而是通過(guò)64位處理器中集成的32位架構(gòu)來(lái)運(yùn)行32位程序烛亦。說(shuō)得通俗點(diǎn)诈泼,它不是以64位形態(tài)來(lái)運(yùn)行32位程序,卻是以32位的形態(tài)運(yùn)行32位程序的煤禽。
由于目前新出的64位處理器包含兩個(gè)架構(gòu)铐达,而且制程技術(shù)沒(méi)有提升(28nm),同時(shí)在手機(jī)與平板上檬果,芯片面積有著嚴(yán)格的限定瓮孙,不能過(guò)分增加,這導(dǎo)致64位ARM處理器平均分配到每個(gè)架構(gòu)的晶體管數(shù)量銳減汁汗,也就是說(shuō)從64位處理器中的32位架構(gòu)方面衷畦,對(duì)于同規(guī)格的32位處理器而言栗涂,不但沒(méi)有提高知牌,性能反而是一定規(guī)模下降的。但處理器廠(chǎng)家又必須給消費(fèi)者一個(gè)交代斤程,以更好的推廣64位角寸,所以廠(chǎng)家就必須在其他方面提升性能,以彌補(bǔ)CPU的晶體管數(shù)量減少帶來(lái)的損失忿墅。比如:更換性能更強(qiáng)的GPU扁藕、提升內(nèi)存帶寬、多核心虛擬單顆核心提升單核性能疚脐、聯(lián)合跑分軟件商修改跑分權(quán)重(提升GPU分?jǐn)?shù)亿柑,降低CPU分?jǐn)?shù)的權(quán)重)等等。這樣棍弄,揚(yáng)長(zhǎng)避短望薄,最終到達(dá)消費(fèi)者手里,用跑分軟件一跑呼畸,確實(shí)有提升痕支,用戶(hù)開(kāi)心,廠(chǎng)家腰包也鼓了蛮原。
綜上所述卧须,ARM64位處理器從嚴(yán)格意義來(lái)說(shuō),叫它ARM32+64更加貼切,他相對(duì)于A(yíng)RM32位處理器花嘶,有倒退的地方笋籽,也有進(jìn)步的余地,但正因?yàn)榈雇思て鹆薃RM進(jìn)取的決心察绷,讓它大刀闊斧的向前變革干签,不得不說(shuō)也算一種進(jìn)步。但ARM64在的手機(jī)上真的有用嗎拆撼?我只能說(shuō)容劳,目前確實(shí)沒(méi)啥用,但今后或許有闸度。
真正的64位手機(jī)并不止單純停留在處理器上竭贩,如果只因?yàn)樗奶幚砥魇?4位,就稱(chēng)其為64位手機(jī)的話(huà)莺禁,我們可以毫不猶疑的說(shuō)這可能是虛假宣傳留量,好在聯(lián)想很聰明,在發(fā)布A678t和A805e宣傳的時(shí)候哟冬,只說(shuō)64位處理器手機(jī)楼熄。
“64位處理器手機(jī)”與“64位手機(jī)”是兩種天壤之別的概念:只要是處理器包含64架構(gòu)位的,就可以稱(chēng)“64位處理器手機(jī)”浩峡,這種手機(jī)也許還運(yùn)行不了64位程序可岂,只是用來(lái)?yè)屨际袌?chǎng),和32位手機(jī)比起來(lái)優(yōu)勢(shì)并不明顯翰灾。
“64位手機(jī)”就不同了:它包含著64位處理器缕粹、64位標(biāo)準(zhǔn)系統(tǒng)、64位安卓虛擬機(jī)纸淮、以及64位程序平斩,這才是真正意義上的64位手機(jī)!
聽(tīng)我細(xì)細(xì)解說(shuō):谷歌官方曾說(shuō)咽块,安卓很早前就支持64位了绘面,這話(huà)不假,從Android4.0到Android4.4侈沪,安卓系統(tǒng)都支持64位的硬件揭璃,但是這僅僅表示底層驅(qū)動(dòng)支持64位,能運(yùn)行在64位的硬件之上峭竣,僅此而已塘辅。然而,上層運(yùn)行軟件的皆撩,無(wú)論是Dalvik的虛擬機(jī)扣墩,還是ART虛擬機(jī)都是32位的哲银。也就是說(shuō),只要你的手機(jī)系統(tǒng)是Android4.0—4.4呻惕,即便你的處理器是64位荆责,也只能在32位虛擬機(jī)下運(yùn)行32位程序,就算真的64位程序擺在你眼前亚脆,也無(wú)法安裝做院。
Android L開(kāi)始才真正支持32位和64位的ART虛擬機(jī),配合上64位處理器濒持,名正言順的運(yùn)行64位軟件键耕。但是問(wèn)題又來(lái)了,沒(méi)有軟件商愿意開(kāi)發(fā)64位程序柑营。我有幾個(gè)搞安卓開(kāi)發(fā)的朋友屈雄,都明確表示永遠(yuǎn)不涉足64位安卓程序開(kāi)發(fā),這又是為什么呢官套?
ARMv8是一套不錯(cuò)的指令集酒奶,它既支持未來(lái)的64位程序,也向下兼容現(xiàn)有32位程序奶赔。有了ARMv8的支撐惋嚎,以后的64位手機(jī)操作系統(tǒng),如Android L 64bit都可以簡(jiǎn)單站刑、高效地支持現(xiàn)有的32位App另伍,你不用擔(dān)心兼容性問(wèn)題。
在明白了這些區(qū)別之后笛钝,剩下的就很好做了质况,下載高德官方最新的SDK愕宋,解壓發(fā)現(xiàn)里面玻靡,有兩個(gè)文件
- arm64-v8a
- armeabi
這就是官方為我們提供的,其實(shí)足夠了中贝《谀恚可為什么還會(huì)崩潰呢,那是因?yàn)槲覀兊捻?xiàng)目中或不僅僅只有高德地圖邻寿,或許還有極光推送蝎土,有盟平臺(tái)等SDK,每個(gè)里面都有自己的平臺(tái)庫(kù)绣否,在某些機(jī)型上直接去它自己的文件夾中搜尋庫(kù)誊涯,結(jié)果發(fā)現(xiàn)沒(méi)有,就出錯(cuò)了蒜撮。 -
解決方案:
我們?cè)陧?xiàng)目的libs下在創(chuàng)建x86文件夾暴构,以及arm64-v7a文件夾跪呈,然后把高德地圖中armeabi中的庫(kù)文件,拷貝到新創(chuàng)建的目錄中即可取逾。
下面還有一篇文章介紹的不錯(cuò)耗绿,也一起分享一下:
-
Android項(xiàng)目針對(duì)libs(armeabi,armeabi-v7a,x86)進(jìn)行平臺(tái)兼容
1.Android設(shè)備如何加載.so文件?
不同CPU架構(gòu)的Android手機(jī)加載時(shí)會(huì)在libs下找自己對(duì)應(yīng)的目錄砾隅,從對(duì)應(yīng)的目錄下尋找需要的.so文件误阻;如果沒(méi)有對(duì)應(yīng)的目錄,就會(huì)去armeabi下去尋找晴埂,如果已經(jīng)有對(duì)應(yīng)的目錄究反,但是如果沒(méi)有找到對(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文件夾而文件夾下沒(méi)有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文件夾而沒(méi)有 so也是會(huì)報(bào)錯(cuò)的本股;如果找不到armeabi-v7a文件夾,則尋找armeabi文件夾桐腌,兼容運(yùn)行該文件夾下的so拄显,但是不能兼容運(yùn)行x86的so。所以項(xiàng)目中如果只含有x86的so案站,在armeabi和armeabi-v7a也是無(wú)法運(yùn)行的躬审。以上就是不同CPU架構(gòu)運(yùn)行時(shí)加載so的策略。2.對(duì)于不同的平臺(tái)蟆盐,我們應(yīng)該怎么去進(jìn)行適配承边?
目前主流的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í)也會(huì)導(dǎo)致包變大。
armeabi-v7a是可以兼容armeabi的城瞎,而v7a的CPU支持硬件浮點(diǎn)運(yùn)算渤闷,目前絕大對(duì)數(shù)設(shè)備已經(jīng)是armeabi-v7a了,所以為了性能上的更優(yōu)脖镀,就不要為了兼容放到armeabi下了飒箭。x86也是可以兼容armeabi平臺(tái)運(yùn)行的,另外需要指出的是蜒灰,打出包的x86的so弦蹂,總會(huì)比armeabi平臺(tái)的體積更小,對(duì)于性能有潔癖的童鞋們强窖,還是建議在打包so的時(shí)候支持x86凸椿。
3.如果第三方?jīng)]有提供對(duì)應(yīng)平臺(tái)的.so文件怎么辦?
有一些第三方的類(lèi)庫(kù)只提供了armeabi下的.so文件翅溺,如果我們項(xiàng)目里適配了armeabi-v7a和x86脑漫,如果不在對(duì)應(yīng)的文件下放對(duì)應(yīng)的.so文件,就可能導(dǎo)致某些Android設(shè)備會(huì)出一些問(wèn)題咙崎,我們可以復(fù)制armeabi下得.so文件到不同的文件夾下优幸。如果第三方提供了不同平臺(tái)的.so文件,則復(fù)制不同平臺(tái)的.so文件到項(xiàng)目中對(duì)應(yīng)的文件夾下即可褪猛。