1. 程式人生 > >百度地圖so包找不到SDK initialize初始化報錯及so包分析

百度地圖so包找不到SDK initialize初始化報錯及so包分析

1.       問題出現

開發百度地圖應用時,突然報如下錯誤:

java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/packagename/files/libs/libBaiduMapSDK_base_v4_3_1.so"is 32-bit instead of 64-bit
                    atjava.lang.Runtime.load(Runtime.java:344)
                    atjava.lang.System.load(System.java:1079)
                    atcom.baidu.platform.comapi.NativeLoader.f(Unknown Source)
                    atcom.baidu.platform.comapi.NativeLoader.b(Unknown Source)
                    atcom.baidu.platform.comapi.NativeLoader.a(Unknown Source)
                    atcom.baidu.platform.comapi.NativeLoader.c(Unknown Source)
                    atcom.baidu.platform.comapi.NativeLoader.loadCustomizeNativeLibrary(UnknownSource)
                    atcom.baidu.platform.comapi.NativeLoader.loadLibrary(Unknown Source)
                    atcom.baidu.platform.comapi.a.<clinit>(Unknown Source)
                    atcom.baidu.platform.comapi.a.a(Unknown Source)
                    atcom.baidu.platform.comapi.b.a(Unknown Source)
                    atcom.baidu.mapapi.SDKInitializer.initialize(Unknown Source)
                    atcom.baidu.mapapi.SDKInitializer.initialize(Unknown Source)


無奈排查了各種問題均沒有結果,後來沒辦法,分析了整個apk結構,終於找到了問題所在!

2.       問題分析

(1)      首先是報錯的意思是,需要64位的libBaiduMapSDK_base_v4_3_1.so包,而apk裡卻只找到了32位的so包,那麼問題可能就是apkso包的架構裡少了某個百度api的so包。

(2)      分析apk結構,重點分析so包架構,我的工程裡只有armeabi架構的so包,分析apk截圖如下:


瞬間懵逼…我只在armeabi資料夾下放了so包  ,為啥其他架構下也出現了so包資料夾?依次開啟資料夾:

armeabi 下,so包如下:


X86,arm64-v8a,x86_64資料夾下,so包如下:


那麼問題就好解決了,在百度map初始化時,因為有相應的so架構,所以執行時優先去找這些架構下的libBaiduMapSDK_base_v4_3_1.so包,結果只在armeabi資料夾下找到了so包,而他支援的arm64-v8a包下沒有發現這個so包,就報瞭如上錯誤!

3.       問題解決:

(1)      找出罪魁禍首

那麼libsqlcipher.so包是哪裡引進的呢,看了下這個包,就是我引入greendao依賴時,aar包自帶的,所以我在外部目錄根本看不到有其他so架構

(2)      設定so包過濾器

只需要在生成apk時,設定so包的過濾器即可,在build.gradle下加入如下程式碼:

defaultConfig {

        minSdkVersion 16

        targetSdkVersion 22

        ndk {

            abiFilters"armeabi"

        }

    }

Ok,再次執行,分析apk,so架構下只有armeabi檔案夾了,正常執行,問題解決。


PS:分析apk結構方法:

點選選單欄Build->選擇Analyze Apk->選擇你要分析的apk->確認,等待一會彈出分析結果