android - Gradle对每种构建类型使用不同的任务/参数

标签 android gradle

我正在使用实验性插件0.4.0将android项目迁移到gradle的早期阶段

作为构建过程的一部分,在编译代码/构建apk之前,我应该运行许多脚本。对于调试或发布版本,参数或任务本身将有所不同。

我正在努力寻找实现这一目标的直接方法。

在弄清楚这一点的同时,我将所有内容都剥离到一个简单的hello world项目中。

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'
    }
}

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"
    }

    android.buildTypes {
        debug {
            //
        }
        release {
            //runProguard, sign etc.
        }
    }

    android.productFlavors {
        create("free")
        {
            applicationId = "com.example.app.free"
            versionName = "1.0-free"
        }
        create("full")
        {
            applicationId = "com.example.app.full"
            versionName = "1.0-full"
        }
    }
}

repositories { 
    jcenter()
}

dependencies {
    compile 'joda-time:joda-time:2.7'
}

task runScript(type: Exec) {
    executable "sh"
    args "-c", "echo SomeScriptHere"
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn runScript
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.5'
}

理想情况下,我想通过buildType(而不是productFlavor)来区分,因为所需的任务基于生成的类型而不是所生成的各种应用程序。

是否可以指定任务仅应在发行版或调试版本上运行?

另外,是否可以基于发布或调试版本来定义要用于我的runScript任务的不同参数?

抱歉,如果我缺少明显的东西,我是使用gradle的新手。

最佳答案

使用onlyIf()将是gradle docs here选项,但是必须定义属性似乎很尴尬,尤其是随着项目变得越来越大和越来越复杂。

ZXStudio有一个很好的博客文章/示例here,在该文章中,而不是使用属性或规则,它会遍历现有任务并根据buildType / flavor创建一个新任务。

因此,对于我的原始问题,答案是删除上面的runScript任务,并按以下方式替换task.withType(JavaCompile);

也可以扩展以匹配构建风格并适当创建任务。

tasks.withType(JavaCompile) {
    def newTaskName = "runScript_" + name;
    def isDebug = false;

    if( name.contains("Debug") )
    {
        isDebug = true;
    }

    //Create a new task
    tasks.create( newTaskName, Exec ) {
        if( isDebug )
        {
            executable "sh"
            args "-c", "echo this is a DEBUG task"
        }
        else 
        {
            executable "sh"
            args "-c", "echo this is a RELEASE task"
        }
    }

    dependsOn newTaskName
}

关于android - Gradle对每种构建类型使用不同的任务/参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34200749/

相关文章:

java - 错误 :Execution failed for task ':app:transformClassesWithMultidexlistForDebug' . 修复此问题

android - 如何在 GridLayout 的 RecyclerView 项目装饰中跳过第一行?

android - 从编译android [资源收缩]中排除xml文件

gradle - Gradle依赖版本列表

android - Gradle 更新到 v 5.4 后无法解析 com.google.android.exoplayer2

java - 从android中的另一个应用程序启动一个应用程序的Activity

java - ANDROID:如何在 Android 应用程序中获得 root 访问权限?

java - Android 应用程序运行时错误

java - 处理阴影(uber/fat)jar 文件中的重复条目

jar - Gradle:如何将资源(而非lib)jar添加到 war 根源?