使用gradle有条件地构建依赖NDK

时间:2016-06-30 06:26:18

标签: android gradle android-gradle

我的项目取决于NDK。但我的NDK版本与我的projectFlavors不同。

如果为我的应用选择了应用-DFLAVOR1,我喜欢使用flavor1编译选项构建和打包我的相关NDK。选择-DFLAVOR2时等flavor2

如果应用程序位于flavor1且错误地使用-DFLAVOR2上构建的NDK,我的整个应用将无法正常运行,因此正确选择非常重要。

现在我们如何编写build.gradle来解决这个特殊的条件构建?

1 个答案:

答案 0 :(得分:0)

我终于找到了一个针对我的问题的hacky方法,然后我觉得最好在这里为大家分享并改进。

第1步:

您需要从应用提供标记并将其依赖于preBuild。以下是执行此操作的示例代码。感谢How to get current flavor in gradle获取功能。我刚修改了一下。

import java.util.regex.Matcher
import java.util.regex.Pattern

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String  tskReqStr = gradle.getStartParameter().getTaskRequests().toString()

    Pattern pattern;

    if( tskReqStr.contains( ":app:assemble" ) )
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else if( tskReqStr.contains( ":app:generate" ) )
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("incremental(\\w+)(Release|Debug)")

    Matcher matcher = pattern.matcher( tskReqStr )

    if( matcher.find() )
        return matcher.group(1).toLowerCase()
    else
    {
        println "NO MATCH FOUND"
        return "";
    }
}

task setFlavorFlag() {
    def flavorName = getCurrentFlavor();
    if (!flavorName.equals("")) {
        printf("Setting flag from app...\n")
        def f = file("../build/conf.tmp")
        if (!f.exists()) f.createNewFile()
        f.write("-D${flavorName.toUpperCase()}")
    }
}

preBuild.dependsOn setFlavorFlag

dependencies {
    compile project(path: ':mylibrary')
}

第2步:

从库中访问标志。我是在ndk部分中完成的:

ndk {
    ...
    def f = file("../build/conf.tmp")
    if (f.exists()) {
        printf("Building library for Flavor:%s\n", f.text)
        ndk.CFlags.add(f.text);
        f.delete()
    }
}

确定。现在你的app Flavor传递了-D选项来编译库。这是我在2-3天后发现的方法。我对这种方法的所有改进都持开放态度。