如何为某些构建变体禁用 Android NDK 构建

How to disable Android NDK build for some build variant

我正在使用 Android Studio 2.2 并设置 Gradle 通过 CMake 使用 NDK 构建 c/c++ 源代码。

现在我想为 buildType "debug" 禁用 NDK 构建。对于 buildType "release" 我想保留它。

目标是让 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. 如何为 defaultConfig 或 buildType "debug" 禁用 NDK 构建 (externalNativeBuild)?

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

提前致谢


编辑:

此 externalNativeBuild 必须配置 'com.android.library' 模块,而不是 'com.android.application' 模块。

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

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

我是这样解决的。

这种方式 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"
}