/**
* Created by chenchangjun on 17/10/27.
*/
1..So
理論基礎(chǔ)
首先介紹一下 目前所有手機(jī)上 .So
的指令集
Android系統(tǒng)目前支持以下七種不同的CPU架構(gòu)货裹,每一種都關(guān)聯(lián)著一個(gè)相應(yīng)的ABI。而架構(gòu)上對(duì)應(yīng)的指令集是以下幾種
- Intel 64 指令集在 x86基礎(chǔ)上擴(kuò)展的(x86指令集有兩種CPU位屋吨,既有32位的,也有64位的.)
- armabi 是針對(duì)舊的或者普通的ARM v5 CPU.
- armabi-v7a 是針對(duì)ARM v7 CPU (是針對(duì)有浮點(diǎn)運(yùn)算或高級(jí)擴(kuò)展功能的arm cpu).
- arm64-v8a 是針對(duì)最新的 ARM v8a CPU的(就是在MIPS64架構(gòu)上增加了ARMv7).
安卓這些固定平臺(tái)的應(yīng)用通常都編譯成ARM處理器的程序山宾,不全都會(huì)編譯成Intel或者M(jìn)IPS處理器的程序至扰。
為了解決這個(gè)問(wèn)題,Intel和MIPS要使用特殊的轉(zhuǎn)換軟件把ARM的指令轉(zhuǎn)換成他們處理器使用的指令资锰。這當(dāng)然是會(huì)降低性能的敢课。
2.項(xiàng)目問(wèn)題解決
2.1 思路分析
目前項(xiàng)目中的jniLib是這樣的,相當(dāng)冗余.
思路是這樣的
-
armabi
指令集是全arm平臺(tái)(包括armV7 armv8,以及x86,x86_64),都兼容的 指令集.
-
armabi-v7a
是針對(duì)有浮點(diǎn)運(yùn)算或高級(jí)擴(kuò)展功能的arm cpu,也就是armabi的高性能版本. Android 5.0+同時(shí)支持32位與64位ABI的.so. 有arm64-v8a就用,沒(méi)有就fallback到armeabi-v7a或armeabi.
-
arm64-v8a
64位指令集,運(yùn)行在64位手機(jī)cpu上,目前主流cpu都已經(jīng)是64位.
所以說(shuō):
為了盡量兼容市面所有手機(jī)類(lèi)型, 盡可能減少crash幾率. 所以,
ARM7, ARM8設(shè)備能夠向下兼容ARM5的SO,也就是說(shuō)只打包armabi
下的so即可
2.2 調(diào)研第三方lib庫(kù)
為了驗(yàn)證這個(gè)導(dǎo)論, 我反編譯了一些流行app文件.
反編譯了 微博
的jniLib中的 文件.
只用了 armabi
的兼容包.
反編譯 微信
他們只用了armabi
的兼容包,但是里面有_v7.so后綴的 高性能包,提高性能.
反編譯 淘寶
只用了 armabi
的兼容包.
第三方總結(jié)
這里, 都是用了 armeabi
包下的.so .
不同的是, 有的他們?cè)谶@個(gè)文件夾下的.so直接做了v7兼容包, 有的則可能選擇了插件加載.so的方式.
相同的是, 都是只打包armeabi
,提高最大的兼容性,并且減少apk體積.
3.實(shí)現(xiàn),測(cè)試
3.1 代碼實(shí)現(xiàn)
為了確保不出現(xiàn)問(wèn)題(比如gradle引用第三方可能存在so),保留可選擇性的打包.我沒(méi)有刪掉其他cpu指令集,而是用代碼選擇性編譯,只保留armeabi
進(jìn)行編譯.
//'armeabi-v7a' // , ‘a(chǎn)rm64-v8a’, ‘x86’, ‘x86_64’
ndk {
abiFilters 'armeabi'
}
3.2 結(jié)果對(duì)比
4. 總結(jié)
目前,可以只編譯armeabi
下的so,因?yàn)?code>armeabi兼容所有的cpu架構(gòu).
理論上行得通, 主流app也都是這么做的.
至于,性能問(wèn)題,so包影響程度不超過(guò)15%,性能問(wèn)題 最大的還是在手機(jī)質(zhì)量和運(yùn)行內(nèi)存..........
5. 后期方向
5.1 只保留armabi-v7a
或者arm64-v8a
隨著Android 版本的提高(Android5.0以后的版本支持v7和v8指令集), 手機(jī)性能的提高(不管高通,麒麟還是聯(lián)發(fā)科,目前主流cpu都是64位處理器.
也就是說(shuō)支持v7和v8指令集.越來(lái)越?jīng)]必要做ARM5和X86的支持了绷杜,以后就更沒(méi)必要直秆。
5.2 采用插件化 加載.so 包
我們可以采用 插件化加載.so .