1.區(qū)別:
?????????這三者都表示的是CPU類型,早期的Android系統(tǒng)幾乎只支持ARMv5的CPU架構(gòu)蘑志,但是現(xiàn)在已經(jīng)有7種了累奈。ARMv5,ARMv7 (從2010年起)急但,x86 (從2011年起)澎媒,MIPS (從2012年起),ARMv8羊始,MIPS64和x86_64 (從2014年起)旱幼,每一種都關(guān)聯(lián)著一個(gè)相應(yīng)的ABI(應(yīng)用程序二進(jìn)制接口(ApplicationBinary Interface)定義了二進(jìn)制文件(尤其是.so文件)如何運(yùn)行在相應(yīng)的系統(tǒng)平臺(tái)上,從使用的指令集突委,內(nèi)存對(duì)齊到可用的系統(tǒng)函數(shù)庫(kù))柏卤。Android現(xiàn)在的主流CPU是armeabi-v7a。armeabi-v7a是針對(duì)有浮點(diǎn)運(yùn)算或高級(jí)擴(kuò)展功能的ARMv7CPU匀油。
2.Android設(shè)備如何加載.so文件:
? ? ? ? ? ?當(dāng)一個(gè)應(yīng)用安裝在設(shè)備上缘缚,只有該設(shè)備支持的CPU架構(gòu)對(duì)應(yīng)的.so文件會(huì)被安裝。不同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)findlibrary 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的策略。
3.適配不同的平臺(tái)
目前主流的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。
4.第三方平臺(tái)的.so庫(kù)怎么處理
?????????關(guān)于.so文件之前有一個(gè)坑腰埂,svn會(huì)把提交的so文件過(guò)濾掉实昨,在接第三方SDK的時(shí)候通過(guò)SVN更新了文檔,但是沒(méi)有注意到少了幾個(gè)so文件盐固,浪費(fèi)了一天的時(shí)間去找原因荒给,SVN如何提交so文件(http://blog.csdn.net/wds1181977/article/details/40373373)。第三方的類庫(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)的文件夾下即可孝情。
以下內(nèi)容轉(zhuǎn)載于:http://blog.csdn.net/liumou111/article/details/52949156