Android關於NDK相關內容

原文:https://blog.csdn.net/sinat_30949835/article/details/60961092 

原文:https://juejin.im/post/5c08b6405188251da07dfbe1

原文:https://blog.csdn.net/gaugamela/article/details/56281098 

在原有內容上進行了整合其他的內容

image.png

ndk {

          abiFilters "armeabi-v7a" // 指定要ndk需要兼容的架構(這樣其他依賴包裏mips,x86,armeabi,arm-v8之類的so會被過濾掉)

        }

armeabi性能較差,但是兼容性最好,v7a對於浮點計算的cpu來說性能更好

目前的手機cpu絕大多數應該是支持浮點運算的,而且安卓從2.2開始就支持v7a,所以v7a的兼容性應該也不是問題。

armeabi、armeabi-v7a、arm64-v8a、mips、mips64、x86、x86_64等abi的原理後,很久以前一般都只是用armeabi在做兼容。現在其實市面上主流的手機都支持armeabi-v7a和arm64-v8a。請看如下簡介:
各版本的分析如下所示:
mips / mips64: 極少用於手機可以忽略,有興趣的可以百度一下。
x86 / x86_64: x86 架構的手機都會包含由 Intel 提供的稱爲 Houdini 的指令集動態轉碼工具,實現 對 arm .so 的兼容,再考慮 x86 1% 以下的市場佔有率,x86 相關的兩個 .so 也是可以忽略的
armeabi: ARM v5 這是相當老舊的一個版本,缺少對浮點數計算的硬件支持,在需要大量計算時有性能瓶頸
armeabi-v7a: ARM v7 目前主流版本,一般市面上的驍龍系列或者麒麟系列的處理器絕大部分都是這種架構
arm64-v8a: 64位支持
所謂的ARMv8架構,就是在MIPS64架構上增加了ARMv7架構中已經擁有的的TrustZone技術、虛擬化技術及NEON advanced SIMD技術等特性,研發成的。
  綜上所述建議大家兼容armeabi-v7a和arm64-v8a這兩個,其他架構少之又少,armeabi基本淘汰所以現在就不怎麼考慮了。對於一般項目來說,足夠了。
  在build.gradle的android裏的defaultConfig內添加如下內容:

defaultConfig {  
    ndk {
        abiFilters "armeabi-v7a"
        abiFilters "arm64-v8a"
    }

如果報錯
Error:(15, 1) A problem occurred evaluating project ':app'.
> Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

請在 gradle.properties 中 添加 
android.useDeprecatedNdk=true
 


對於新手Android開發者來說,像集成百度地圖SDK、JPush等再出現找不到.so文件的問題直接只使用armeabi-v7a和arm64-v8a就足以。
 

爲什麼要設置ndk的abiFilters?

其實這個可以不設置,這樣編譯時,就會將項目裏所有依賴資源包裏的so庫都打到最終的apk裏。

 

但是有些平臺,我們是不需要支持的,如果不刪除的話,apk就臃腫了。如果那些so庫是我們自己編譯出來的,那可以直接在工程中刪除對應so文件,但是如果是第三方提供的,就不好刪除了,所以就需要使用abiFilters來過濾了。

 


如果需要針對不同的平臺出不同的包,可以在productFlavors裏進行設置,可參考文章:

https://link.juejin.im/?target=https%3A%2F%2Fblog.csdn.net%2Fhknock%2Farticle%2Fdetails%2F76034125

armeabi、armeabi-v7a、arm64-v8a的兼容性問題

看上上面的描述,以爲新增一個so庫文件可以隨便根據需要適配的目錄放,就錯了。如果你有庫文件在armeabi裏有,但是armeabi-v7a目錄下沒有,那麼運行在V7a的架構時,就會出現找不到so庫文件的情況。具體描述參照:Android 關於arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容問題

正確的做法

  1. 當前市面絕大多數是arm的CPU,而且都是V7架構的了,所以可以保留armeabi或者armeabi-v7a即可。
  2. 如果僅保留armeabi-v7a,而有些第三方包未提供v7a的包,則可以將對應armeabi包拷貝到armeabi-v7a。
  3. 如果同時保留armeabi和armeabi-v7a,則需要保證兩個目錄下的so庫文件數相同。


android {
  ...
  splits {
    abi {
      enable true
      reset()
      include 'x86', 'armeabi-v7a', 'mips'
      universalApk true
    }
  }
}

  • enable:boolean型,表示打開或關閉APK分割功能
  • reset():復位,若要使用include功能,則使用前需調用reset()
  • include:創建白名單,僅構建出白名單中指定的格式
  • exclude:黑名單,不會構建出黑名單中指定的格式>* compatibleScreens(僅限density):未知
  • universalApk(僅限ABI):默認爲true,即除了指定的格式外,還會構建出一個通用的APK
android {
  ...
  splits {
    density {
      enable true
      exclude "ldpi", "tvdpi", "xxxhdpi"
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }

 

 

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