在Android客戶端集成了一些so庫後,在某些設備上出現了一些問題,經過對比分析打包文件的差別,發現依賴庫會自動生成一些so文件目錄,好比armeabi,armeabi-v7a,x86等。html
舉個栗子,好比咱們在x86目錄下放了a.so一個文件,在armeabi目錄下放了a.so和b.so兩個文件,在armeabi架構的設備上調試的時候,不會有問題,而後打包。而後安卓系統在安裝應用的時候,會選取對應的目錄,好比在armeabi架構的設備,會選取armeabi目錄下的so庫,不會安裝其它目錄的文件,若是沒有armeabi目錄,會選取其它相近的目錄安裝so文件。可是,假如在x86的設備上安裝,由於已經有x86目錄了,系統只會安裝這個目錄下的so文件,(即便armeabi目錄下有app所需的所有so文件,也不會安裝)只安裝了a.so文件,而沒有b.so文件,這樣在app調用b.so文件的時候,就會出問題。android
解決方法:
1.爲每種目錄都放置項目所需的so文件,可是缺點是容易出現遺漏。
2.在gradle裏面,設置ndk的abiFilters,保證apk只有指定的so目錄,好比:架構
flavorDimensions "ndkfilter" productFlavors{ "Test" { manifestPlaceholders = [CHANNEL_NAME: "Test" , CHNL: 999999] ndk { abiFilters "armeabi-v7a" abiFilters "x86_64" abiFilters "armeabi" } dimension "ndkfilter" } }
這樣就能夠保證,不會出現多餘的so目錄,調用so時,不會出現找不到so文件的錯誤。缺點是不一樣的CPU架構設備,調用其它類型的so文件,可能會出現卡頓之類的現象。
參考連接:Android使用 SO 庫時要注意的一些問題app