Android 引入第三方so後啓動報錯 /lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so"

緣由:

由於項目需要,引用了不同平臺的so文件,分別a.so, b.so ,其中a.so 只有armabi-v7a版本,b.so通過gradle配置自動下載,編譯運行後程序啓動,運行到需要使用a.so 的地方直接閃退;報錯:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file xxxxxxxxxxxxxx
  xx.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so"
at java.lang.Runtime.loadLibrary(Runtime.java:367)
	at java.lang.System.loadLibrary(System.java:1076)

分析原因:

從AS中build 一個apk出來 解壓查看lib目錄 發現裏面帶有除armabi-v7a目錄外 還有其他目錄,並且每個目錄都有b.so,但是沒有a.so文件,再看運行的android 設備 是支持arm64-v8a,根據Android 尋找so的機制,可以得到答案,該Android 設備啓動時先到系統目錄尋找,沒找到,再到軟件內部lib找,找到與它適配的目錄 arm64-v8a ,繼續到目錄中尋找用到的a.so、b.so文件,然而除了armabi-v7a目錄外其他目錄都沒有a.so文件,於是系統就拋出這個錯誤,直接閃退;

通過網上比較多的說法,Android Studio 在打包apk時 會自動把支持的所有so版本複製到apk的lib目錄下,由於b.so帶有各種版本的so文件 ,打包時把b.so的所有版本隨同 arm64-v8a 、x86等目錄一併複製到lib中,但是由於a.so 只有armabi-v7a 版本,最終導致其他目錄不存在a.so ;

可以得出,這種錯誤會出現在支持armabi-v7a以外的其他cpu架構中;

解決問題

  1. 條件允許的情況下我們可以選擇爲a.so生成多個版本的文件,但是這樣會導致apk文件增大很多;
  2. 在app下的build.gradle中添加如下配置:(推薦)
android {

...
  ndk {
//只保留armeabi-v7a的目錄,具體保留那個根據自己需求
            abiFilters "armeabi-v7a"
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章