關於SO文件的引用,一直都沒深究過,最初是把全部架構的SO包通通放進項目,每次新增引用都是如此,而如今的項目因爲對apk文件大小有限制,因此只保留了armeabi一種作基本兼容,一直這樣使用也沒有遇到什麼大問題。但在最近給項目升級播放器SDK時,遇到了一些問題,在只導入了armeabi的時候,播放器在大部分手機上都容易出現崩潰,因而我就趁這個機會研究一下abiFilters的相關內容。android
abiFilters的使用:在app的gradle的defaultConfig裏面加上這麼一句微信
ndk { abiFilters "armeabi-v7a" // 指定要ndk須要兼容的架構(這樣其餘依賴包裏mips,x86,armeabi,arm-v8之類的so會被過濾掉) }
這句話的意思就是指定ndk須要兼容的架構,把除了v7a之外的兼容包都過濾掉,只剩下一個v7a的文件夾。架構
如今不少android第三方 sdk是以aar形式提供的,甚至是遠程aar,若是這個sdk對abi的支持比較全,可能會包含armeabi, armeabi-v7a,x86, arm64-v8a,x86_64五種abi,而你應用的其它so只支持armeabi,armeabi-v7a,x86三種,直接引用sdk的aar,會自動編譯出支持5種abi的包。app
可是應用的其它so缺乏對其它兩種abi的支持,那麼若是應用運行於arm64-v8a,x86_64爲首選abi的設備上時,就會CRASH。怎麼解決這個問題?其實arm64-v8a,x86_64這兩個abi應用並非必需要作支持,手機通常都會提供自動兼容,像微信就是一個armeabi打天下。因此咱們只要把對x86, arm64-v8a,x86_64的支持去掉就能夠。gradle
1、須要在build.gradle的android裏添加以下內容:ui
productFlavors { code
生成apk的界面以下圖:ip
會分別生成app-abiall-release.apk和app-necess-release.apkv8
若是原本有作渠道包支持,只要添加對應的ndk.abiFilters便可,原理就是設置不一樣的渠道包指定不一樣的指令集編譯
2、使用全局設置
build.gradle的android裏的defaultConfig內添加以下內容:
而後全部渠道包都會頂多包含此三種指令集