關於SO引用的過濾:abiFilters

        關於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

  1.     necess {  
  2.         ndk {  
  3.             abiFilters "armeabi-v7a"  
  4.             abiFilters "x86"  
  5.             abiFilters "armeabi"  
  6.         }  
  7.     }  
  8.     abiall {  
  9.         ndk {  
  10.             abiFilters "armeabi-v7a"  
  11.             abiFilters "x86"  
  12.             abiFilters "armeabi"  
  13.             abiFilters "arm64-v8a"  
  14.             abiFilters "x86_64"  
  15.         }  
  16.     }  
  17. }  

生成apk的界面以下圖:ip

會分別生成app-abiall-release.apk和app-necess-release.apkv8

若是原本有作渠道包支持,只要添加對應的ndk.abiFilters便可,原理就是設置不一樣的渠道包指定不一樣的指令集編譯

2、使用全局設置

        build.gradle的android裏的defaultConfig內添加以下內容:

  1. defaultConfig {  
  2.     ndk {  
  3.         abiFilters "armeabi", "armeabi-v7a", "x86"  
  4.     }  
  5. }  

而後全部渠道包都會頂多包含此三種指令集

相關文章
相關標籤/搜索