2016-12-22 52 views
2

我正在使用Android Studio 2.2并设置Gradle通过CMake使用NDK构建c/C++源。如何禁用某些构建变体的Android NDK构建

现在我想为buildType“debug”禁用NDK构建。对于buildType“发布”,我想保留它。

目标是在构建服务器上编译NDK源代码(使用“release”),但为开发人员禁用它(使用“debug”)。

这是的build.gradle文件目前正在使用:

android { 
    externalNativeBuild { 
     cmake { 
      path "CMakeLists.txt" 
     } 
    } 

    defaultConfig { 
     externalNativeBuild {     
      cmake { 
       arguments "-DANDROID_TOOLCHAIN=clang" 
       cppFlags "-std=c++14" 
      } 
     } 

     ndk { 
      abiFilters 'armeabi-v7a', 'x86' 
     } 
    } 

    buildTypes {   
     release {    
      externalNativeBuild {     
       cmake { 
        arguments "-DANDROID_TOOLCHAIN=clang" 
        cppFlags "-std=c++14" 
       } 
      } 

      ndk { 
       abiFilters 'armeabi-v7a' 
      } 
     } 
    } 
} 
  1. 如何我可以禁用NDK编译(externalNativeBuild)为defaultConfig或buildType “调试”?

  2. 其他开发者将不会安装NDK(local.properties 没有 ndk.dir = PATH_TO_NDK)。这可能配置吗?

预先感谢


编辑:

这externalNativeBuild必须与被配置 'com.android.library'模块,而不是一个' com.android.application'-模块。

回答

2

这是我如何解决它。

这种方式Gradle构建适用于开发者安装(并在构建服务器上),NDK,这是目标。

/* 
* As soon as Gradle is linked to the externalNativeBuild (cmake/ndkBuild) with a path to 
* CMakeLists.txt/Android.mk, the ndk.dir from local.properties file or the ANDROID_NDK_HOME 
* environment variable needs to be set, otherwise gradle fails. 
* E.g.: 
externalNativeBuild { 
    cmake { 
     path "CMakeLists.txt" 
    } 
} 
*/ 

// Only enable externalNativeBuild on machines with NDK installed -> valid ndkDir 
def ndkDir = project.android.ndkDirectory; 
if (ndkDir != null && !ndkDir.toString().isEmpty()) { 

    externalNativeBuild.cmake.path = "CMakeLists.txt" 
} 
0

关于#1,如果我理解正确,您希望根据buildType执行(或跳过)某些事情。如果是这样,您可以查看关于此主题的许多讨论之一,例如:get current buildType

关于#2,它不是很清楚你想要什么。如果您正在寻找在local.properties中设置NDK路径的替代方法,则可以通过ANDROID_NDK_HOME环境变量对其进行设置。如果要防止gradle失败,请检查ndk.dir是否存在于build.gradle脚本的相关位置(使用properties.getProperty('ndk.dir'))。

+0

谢谢@yakobom! 我发现了一个解决方案,其灵感来自你对#2的回答。我已将它作为单独的答案发布。 #1不再需要了。我忘了提到一个重要的细节 - “外部生成构造”配置应该为图书馆而不是应用程序。我并不知道以下限制:“默认情况下,库仅发布其版本变体”(http://tools.android.com/tech-docs/new-build-system/user-guide) – andrfog