前言
首先:ARM是神馬?
答:ARM是我們設(shè)備的CPU架構(gòu)。
其次:arm64-v8a、armeabi-v7a、armeabi是神馬?
答:在Android 系統(tǒng)上,每一個(gè)CPU架構(gòu)對應(yīng)一個(gè)ABI。他們就是我們的ABI類型
最后:ABI是神馬?
答:應(yīng)用程序二進(jìn)制接口(Application Binary Interface)定義了二進(jìn)制文件(尤其是.so文件)如何運(yùn)行在相應(yīng)的系統(tǒng)平臺(tái)上,從使用的指令集,內(nèi)存對齊到可用的系統(tǒng)函數(shù)庫。
補(bǔ)充:查詢手機(jī)cpu命令行
答: adb shell getprop ro.product.cpu.abi
正題
armeabi-v7a: ARM v7架構(gòu)之前的主流版本,現(xiàn)在也很多。
arm64-v8a: 64位支持,目前主流的版本。
ABI是如何工作的
一個(gè)Android設(shè)備可以支持多種ABI,設(shè)備主ABI和輔助ABI。
以arm64-v8a為主ABI的設(shè)備,輔助ABI為armeabi-v7a和armeabi。
以armeabi-v7a為主ABI的設(shè)備,輔助ABI為armeabi。
ABI具體適配流程
對于一個(gè)cpu是arm64-v8a架構(gòu)的手機(jī),它運(yùn)行app時(shí),進(jìn)入jnilibs去讀取庫文件時(shí),先看有沒有arm64-v8a文件夾,如果沒有該文件夾,去找armeabi-v7a文件夾,如果沒有,再去找armeabi文件夾,如果連這個(gè)文件夾也沒有,就拋出異常。
如果有arm64-v8a文件夾,那么就去找特定名稱的.so文件,注意:如果沒有找到想要的.so文件,不會(huì)再往下(armeabi-v7a文件夾)找了,而是直接拋出異常。
項(xiàng)目中該如何適配
問題:只適配了armeabi-v7a,那如果APP裝在其他架構(gòu)的手機(jī)上,如arm64-v8a上,會(huì)蹦嗎?
答: 不會(huì),但是反過來會(huì)。 因?yàn)閍rmeabi-v7a和arm64-v8a會(huì)向下兼容:
只適配armeabi的APP可以跑在armeabi,x86,x86_64,armeabi-v7a,arm64-v8上
只適配armeabi-v7a可以運(yùn)行在armeabi-v7a和arm64-v8a
只適配arm64-v8a 可以運(yùn)行在arm64-v8a上
適配方案有哪些?
1、只適配armeabi 優(yōu)點(diǎn):基本上適配了全部CPU架構(gòu)(除了淘汰的mips和mips_64) 缺點(diǎn):性能低,相當(dāng)于在絕大多數(shù)手機(jī)上都是需要輔助ABI或動(dòng)態(tài)轉(zhuǎn)碼來兼容。
2、只適配 armeabi-v7a 同理方案一,只是又篩掉了一部分老舊設(shè)備,在性能和兼容二者中比較平衡。
3、只適配 arm64-v8 優(yōu)點(diǎn): 性能最佳 缺點(diǎn): 只能運(yùn)行在arm64-v8上,要放棄部分老舊設(shè)備用戶。
這三種方案都是可以的,現(xiàn)在的大廠APP適配中,這三種都有,大部分是前2種方案。具體選哪一種就看自己的考量了,以性能換兼容就arm64-v8,以兼容換性能armeabi,二者稍微平衡一點(diǎn)的就armeabi-v7a。
打包配置
split分包
這個(gè)命令可以按照各種規(guī)則去分包,比如按照abi,屏幕密度(即ldpi,hdpi等)分包。
splits {
abi {
enable true
reset()
include 'x86','armabi'
exclude 'armeabi', 'armeabi-v7a', "arm64-v8a"
universalApk true
}
}
ndk{abiFilters:}過濾
這個(gè)指令可以配置只打包你配置的so庫,沒有配置的就不打包,很靈活。 第三方aar文件,如果這個(gè)sdk對abi的支持比較全,可能會(huì)包含armeabi、armeabi-v7a、x86、arm64-v8a、x86_64五種abi,而你應(yīng)用的其它so只支持armeabi、armeabi-v7a、x86三種,直接引用sdk的aar,會(huì)自動(dòng)編譯出支持5種abi的包。但是應(yīng)用的其它so缺少對其它兩種abi的支持,那么如果應(yīng)用運(yùn)行于arm64-v8a、x86_64為首選abi的設(shè)備上時(shí),就會(huì)crash了,所以我們需要在我們的app中配置 abiFilter 配置,來避免一些未知的錯(cuò)誤文章來源:http://www.zghlxwxcb.cn/news/detail-473570.html
//過濾x86的so庫
ndk {
abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}
這樣配置會(huì)將armeabi,armeabi-v71,arm64-v8a這3個(gè)包下的so庫都打包到一個(gè)apk,而不像splits會(huì)每一個(gè)包打一個(gè)apk.文章來源地址http://www.zghlxwxcb.cn/news/detail-473570.html
到了這里,關(guān)于Android中arm64-v8a、armeabi-v7a、armeabi是什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!