相關環境僅作參考
android 6.0.1 cpu 高通驍龍625 8核 2.0G gradle 3.3 com.android.tools.build:gradle 2.2.3
錯誤日誌:
java.lang.UnsatisfiedLinkError:
dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.telecom.video-1/base.apk"],
nativeLibraryDirectories=[/data/app/com.telecom.video-1/lib/arm64, /data/app/*packagename*-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]]
couldn't find "libijkffmpeg.so"
分析
項目目錄中的僅配置了armeabi-v7a目錄
../lib
|-armeabi-v7a
|-libijkffmpeg.so
|-..
從日誌中看到虛擬機加載了/lib/arm64 和 /lib/arm64-v8a,沒有/lib/armeabi-v7a,不科學啊
對生成的apk分析
apk中lib/
|-armeabi-v7a
|-libijkffmpeg.so
|-libsophix
|-..
|-x86_64
|-libsophix
|-arm64-v8a
|-libsophix
|-armeabi
|-libsophix
|-x86
|-libsophix
發現存在多個cpu兼容目錄,而我們只兼容armeabi-v7a,根據apk發現其中的libsophix是項目中的一個依賴其包含了多個兼容庫被一起打包到了apk中,這裏根據項目的情況只想要一個兼容庫。
解決
我在build.gradle中這樣配置,增加了過濾設置cpu兼容:
android {
defaultConfig {
ndk {
abiFilter "armeabi-v7a" //, "armeabi", "x86" 按需設置
}
}
}
然後再次分析apk,其僅兼容armeabi-v7a了:
apk中lib/
|-armeabi-v7a
|-libijkffmpeg.so
|-libsophix.so
|-..
虛擬機加載so庫時,如果發現arm64-v8a目錄,就只加載arm64-v8a目錄(但是爲啥還有個arm64目錄?)
arm64-v8a中顯然沒有目標so,所以報錯。其實還可以將armeabi-v7a中的so文件copy到arm64-v8a中,但不是個好方法,因爲我們的目標是兼容armeabi-v7a,不同的cpu版本有不同的開發接口。