android - 有条件的依赖NDK的条件构建

标签 android gradle android-gradle-plugin

我的项目取决于NDK。但是我的NDK构建与我的projectFlavors不同。

如果为我的应用选择了应用的-DFLAVOR1,我想用flavor1编译选项来构建和打包我的依赖NDK。选择了-DFLAVOR2等时的flavor2

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

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

最佳答案

我终于找到了解决问题的办法,尽管我最好在这里与大家分享并加以改进。

步骤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()
    }
}

好。现在,您的应用程序Flavor使用-D选项传递,以编译库。这是我2-3天后发现的方法。我愿意接受这种方法的所有改进。

关于android - 有条件的依赖NDK的条件构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38115425/

相关文章:

android - google-services.json 文件已添加,但模块根文件夹中缺少 : File google-services. json 错误

android - 使用 'apply from:'的Android Gradle远程脚本有什么用

android - 按下蓝牙设备按钮应触发应用程序中的 Onclick 监听器

java - 应用程序不从网络加载任何图像

java - 如何使用Intent录制视频?

java - 无法打开 .jar 中的嵌套条目

gradle - 在 gradle 依赖中,为什么 API 配置会丢弃所有传递依赖?

安卓工作室 : Re-download dependencies and sync project

javascript - 如何使用 PhoneGap Javascript 在 android 中读取文件

gradle - Vaadin在styles.css上gradle项目HTTP 404