問題:針對現在VIVO,oppo應用平台,打包上傳時需要打兼容包的問題,這里就需要注意設置ABI Filter的問題,通過各種百度和千度后,發現唯一一個有問題的帖子竟然要收費觀看,於是,這里記錄一下,如何處理打32/64位兼容包的問題。
1. 什么是Android的ABIFilter
設備的CPU類型(通常稱為”ABIs” Application Binary Interface 安卓二進制編程接口,就是安卓上層應用如何使用底層C/C++打包生成的.SO文件的一套接口)
看這個名稱有點費解,至少我是的。
於是我搜索了一些科普知識,供我自己來理解,大概是這樣的
armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以后的生產的大部分Android設備都使用它.
arm64-v8a: 第8代、64位ARM處理器,很少設備,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM處理器,早期的手機用的比較多。
x86: 平板、模擬器用得比較多。
x86_64: 64位的平板。
2. Android設備如何加載.so文件
arm64-v8a是可以向下兼容的,但前提是你的項目里面沒有arm64-v8a的文件夾,如果你有兩個文件夾armeabi和arm64-v8a,兩個文件夾,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手機在用到b的時候發現有arm64-v8a的文件夾,發現里面沒有b.so,就報錯了,所以這個時候刪掉arm64-v8a文件夾,這個時候手機發現沒有適配arm64-v8a,就會直接去找armeabi的so庫,所以要么你別加arm64-v8a,要么armeabi里面有的so庫,arm64-v8a里面也必須有
當一個應用安裝在設備上,只有該設備支持的CPU架構對應的.so文件會被安裝。不同CPU架構的Android手機加載時會在libs下找自己對應的目錄,從對應的目錄下尋找需要的.so文件;如果沒有對應的目錄,就會去armeabi下去尋找,如果已經有對應的目錄,但是如果沒有找到對應的.so文件,也不會去armeabi下去尋找了。
以x86設備為例,x86設備會在項目中的 libs文件夾尋找是否含有x86文件夾,如果含有x86文件夾,則默認為該項目有x86對應的so可運行文件,只有x86文件夾而文件夾下沒有so,程序運行也是會出現findlibrary returned null的錯誤的;如果工程本身不含有x86文件夾,則會尋找armeabi或者armeabi-v7a文件夾,兼容運行。以armeabi-v7a設備為例,該Android設備當然優先尋找libs目錄下的armeabi-v7a文件夾,同樣,如果只有armeabi-v7a文件夾而沒有 so也是會報錯的;如果找不到armeabi-v7a文件夾,則尋找armeabi文件夾,兼容運行該文件夾下的so,但是不能兼容運行x86的so。所以項目中如果只含有x86的so,在armeabi和armeabi-v7a也是無法運行的。以上就是不同CPU架構運行時加載so的策略。
ndk {
//APP的build.gradle設置支持的SO庫架構
abiFilters 'armeabi', 'armeabi-v7a','arm64-v8a'
}

3. 適配不同的平台
目前主流的Android設備是armeabi-v7a架構的,然后就是x86和armeabi了。如果同時包含了 armeabi,armeabi-v7a和x86,所有設備都可以運行,程序在運行的時候去加載不同平台對應的so,這是較為完美的一種解決方案,但是同時也會導致包變大。
armeabi-v7a是可以兼容armeabi的,而v7a的CPU支持硬件浮點運算,目前絕大對數設備已經是armeabi-v7a了,所以為了性能上的更優,就不要為了兼容放到armeabi下了。x86也是可以兼容armeabi平台運行的,另外需要指出的是,打出包的x86的so,總會比armeabi平台的體積更小,對於性能有潔癖的童鞋們,還是建議在打包so的時候支持x86。
4. 第三方平台的.so庫怎么處理
第三方的類庫只提供了armeabi下的.so文件,我們項目里適配了armeabi-v7a和x86,如果不在對應的文件下放對應的.so文件,就可能導致某些Android設備會出一些問題,我們可以復制armeabi下得.so文件到不同的文件夾下。如果第三方提供了不同平台的.so文件,則復制不同平台的.so文件到項目中對應的文件夾下即可
5 . 解決方法