Android NDK學習(六): so文件兼容之abiFilters的使用

最近項目中遇到了要使用opencv的狀況,涉及到了abi兼容的選擇。由於若是所有都適配的話,包很大,這樣兼容那些用戶數極少的cpu就很不划算,因此我只適配了armeabi-v7a這一個。可是今天在x64-v8a的模擬器上看的時候,提示個人library.so文件找不到,我記得這個應該是向下兼容的,可是出現這種狀況很奇怪,因而我就在網上找了找答案。架構

解決方法:abiFilters

在app的gradle的defaultConfig裏面加上這麼一句app

ndk {
    abiFilters  "armeabi-v7a"  // 指定要ndk須要兼容的架構(這樣其餘依賴包裏mips,x86,armeabi,arm-v8之類的so會被過濾掉)
}

這句話的意思就是指定ndk須要兼容的架構,把除了v7a之外的兼容包都過濾掉,只剩下一個v7a的文件夾。用了這個方法以後,確實解決了問題。這就是解決方法。框架

具體分析

其實這個方法我開始是很奇怪的,我明明沒有指定其餘的兼容框架,爲何會須要一個過濾。我打來了apk的包,找到了裏面的lib目錄,發現裏面有不少的兼容目錄,而後看到裏面目錄裏面的是一個fresco的.so文件。也就是說,fresco作了各個平臺的兼容,因此它建立了各個兼容平臺的目錄。由於只要出現了這個目錄,系統就只會在這個目錄裏找.so文件而不會遍歷其餘的目錄,因此就出現了以前找不到.so文件的狀況(由於其餘目錄沒有個人.so文件)。性能

總結

爲了決定最後適配的abi版本,我下載了排行前幾名的app,而後打開以後發現,他們基本上只適配了一個armeabi,少數會再加上v7a。我瞭解到的狀況是armeabi性能較差,可是兼容性最好,v7a對於浮點計算的cpu來講性能更好,不兼容不支持浮點運算的cpu。我想到的是目前的手機cpu絕大多數應該是支持浮點運算的,並且安卓從2.2開始就支持v7a,因此v7a的兼容性應該也不是問題。不管如何,abiFilters仍是應該添加的。gradle

相關文章
相關標籤/搜索