接觸到過Jni的童鞋們應(yīng)該看著個(gè)crash會(huì)比較眼熟奖唯,對,就是so文件找不到,而引發(fā)的錯(cuò)誤端衰。
“java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader..............couldn't find "xxxxxxx.so"”
當(dāng)時(shí)遇到這個(gè)問題是我很疑惑符糊,報(bào)錯(cuò)報(bào)的是外部項(xiàng)目的so文件找不到(這里簡稱外so)凫海,AAR里的so文件(這里簡稱內(nèi)so)卻沒有報(bào)錯(cuò),可我確實(shí)在引入了這個(gè)AAR之后男娄,編譯生成的APK報(bào)錯(cuò)了行贪。
第一個(gè)想法:會(huì)不會(huì)是本身gradle本身不支持編譯生成APK時(shí)將內(nèi)so文件打包進(jìn)APK呢?
跟著我就去谷歌大法了一波沪伙,結(jié)果還真的在某些gradle版本里是不支持打包的瓮顽,需要自身在外部項(xiàng)目里加入內(nèi)so。ANDROID動(dòng)態(tài)加載 使用SO庫時(shí)要注意的一些問題?但有個(gè)問題围橡,我這邊是最新你的gradle暖混,而且報(bào)錯(cuò)報(bào)的是外so找不到,那就pass掉了這種可能翁授。但我還是嘗試性地將內(nèi)so復(fù)制到外部的lib里去編譯了一遍拣播,徒勞晾咪。。贮配。谍倦。
第二個(gè)想法:會(huì)不會(huì)是so文件重名了?
顯然不會(huì)泪勒,我還不至于在這個(gè)問題上折騰那么久昼蛀。
那么問題來了,到底是什么原因呢圆存?
通過分析crash日志叼旋,我發(fā)現(xiàn)一個(gè)問題:
nativeLibraryDirectories=[/data/app/xxx-1/lib/arm64, /data/app/xxx-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]
我外部的lib里并沒有那么多文件夾啊B僬蕖7蛑病!油讯!
這個(gè)就是crash的原因所在了详民。
當(dāng)AAR內(nèi)部的so文件類型比外部多時(shí),會(huì)導(dǎo)致外部的so文件找不到陌兑。
所以果斷的剔除了AAR中不需要的so文件夾“arm64”沈跨,“arm64-v8a”,“x86”诀紊。
再次編譯谒出,OK,齊活了邻奠。88笤喳,希望能幫助到你們。