近期遇到一個so包兼容的問題使兔,困擾了2天默色,今天終于得到解決融痛,記錄一下壶笼。
需要了解的知識:
Android系統(tǒng)目前支持以下七種不同的CPU架構(gòu):ARMv5,ARMv7 (從2010年起)雁刷,x86 (從2011年起)覆劈,MIPS (從2012年起),ARMv8安券,MIPS64和x86_64 (從2014年起)墩崩,每一種都關(guān)聯(lián)著一個相應(yīng)的ABI。 應(yīng)用程序二進制接口(Application Binary Interface)定義了二進制文件(尤其是.so文件)如何運行在相應(yīng)的系統(tǒng)平臺上侯勉,從使用的指令集鹦筹,內(nèi)存對齊到可用的系統(tǒng)函數(shù)庫。在Android系統(tǒng)上址貌,每一個CPU架構(gòu)對應(yīng)一個ABI:armeabi铐拐,armeabi-v7a徘键,x86,mips遍蟋,arm64-v8a吹害,mips64,x86_64虚青。
所有的x86/x86_64/armeabi-v7a/arm64-v8a設(shè)備都支持armeabi架構(gòu)的.so文件它呀,如果項目中有x86文件夾,那么x86設(shè)備只會拷貝x86文件夾中的so棒厘,忽略其他文件夾纵穿。如果項目中有armeabi-v7a文件夾,那么v7a設(shè)備只會拷貝v7a文件夾中的so奢人。 如果項目中只有armeabi文件夾谓媒,那么所有的設(shè)備都只會拷貝armeabi中的so。由此可知何乎,項目中只保留armeabi可以實現(xiàn)兼容問題句惯,但這會影響到運行的性能問題,但考慮到現(xiàn)在大部分手機還都是v7手機支救,而且反編譯微信apk后抢野,它們也只提供 armeabi文件夾,兼容問題可以從這出發(fā)搂妻。
解決思路:
1.目前項目有armeabi的四個so包:main1.so蒙保,main2.so,main3.so欲主,main4.so
2.gradle引用第三方sdk邓厕, 提供armeabi-v7a,x86兩種架構(gòu)so
3.現(xiàn)在第一步要做得是扁瓢,過濾出armeabi的so包详恼,可以在application項目的build.gradle中加入
defaultConfig{
ndk{abiFilters "armeabi"}
}
第二步將第三方sdk中的armeabi-v7a中的so拷貝到項目中的aremeabi中。
至此所有的so包都在armeabi中引几,經(jīng)過測試昧互,可以正常運行。