在Android/Gradle中如何定义仅在构建特定buildType/buildVariant/productFlavor时运行的任务(v0.10 +)

pat*_*ckf 27 android gradle android-gradle-plugin

Gradle的Android插件为每个BuilType/Flavor/BuildVariant生成一项任务.问题是这个任务将动态生成,因此在定义这样的任务时不会作为依赖项提供:

task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
    //do smth
}
Run Code Online (Sandbox Code Playgroud)

这个答案的建议解决方法就是这样

task myTaskOnlyForDebugBuildType(dependsOn:"assembleDebug") {
    //do smth
}
Run Code Online (Sandbox Code Playgroud)

或这个

afterEvaluate {
    task myTaskOnlyForDebugBuildType(dependsOn:assembleDebug) {
        //do smth
    }
}
Run Code Online (Sandbox Code Playgroud)

但两者都不适合我.

pat*_*ckf 41

这里是如何做到这一点的完整示例通过这个帖子的启发: (Android插件v.0.9.2和gradle这个1.11在写作的时候)

我们将定义一个仅在我们构建"debugCustomBuildType"时运行的任务

android {
    ...
    buildTypes {
        debugCustomBuildType {
            //config
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

定义应该仅对特定的builtType/variant/flavor执行的任务

task doSomethingOnWhenBuildDebugCustom {
    doLast {
       //task action
    }
}
Run Code Online (Sandbox Code Playgroud)

通过gradle添加任务时动态设置依赖关系

tasks.whenTaskAdded { task ->
    if (task.name == 'generateDebugCustomBuildTypeBuildConfig') {
        task.dependsOn doSomethingOnWhenBuildDebugCustom 
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们使用"generateBuildConfig"任务,但您可以使用任何适合您的任务(另请参阅官方文档)

  • processManifest
  • aidlCompile
  • renderscriptCompile
  • mergeResourcess.
  • mergeAssets
  • processResources
  • generateBuildConfig
  • javaCompile
  • processJavaResources
  • 集合

不要忘记使用buildTypeSpecific任务(generateBuildConfigvs. generateDebugCustomBuildTypeBuildConfig)

就是这样.遗憾的是,这种解决方法没有很好地记录,因为对我而言,这似乎是构建脚本最简单的要求之一.


Juo*_*nis 7

我这样做了:

android {
    ext.addDependency = {
        task, flavor, dependency ->
            def taskName = task.name.toLowerCase(Locale.US)
            if (taskName.indexOf(flavor.toLowerCase(Locale.US)) >= 0) {
                task.dependsOn dependency
            }
    }

    productFlavors {
        production {
        }
        other
    }

    task theProductionTask << {
        println('only in production')
    }

    tasks.withType(JavaCompile) {
        compileTask -> addDependency compileTask, "production", theProductionTask
    }
}
Run Code Online (Sandbox Code Playgroud)

坦率地说,我没有使用哪个语言环境来生成编译目标的名称,因此toLowerCase(Locale.US)可能适得其反.