Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android Gradle配置中获取当前buildType_Android_Android Gradle Plugin - Fatal编程技术网

如何在Android Gradle配置中获取当前buildType

如何在Android Gradle配置中获取当前buildType,android,android-gradle-plugin,Android,Android Gradle Plugin,我想根据当前的构建类型在Android Gradle项目中动态添加依赖项。我知道我可以: 但是,如何使用当前构建类型指定要导入库的哪个变体,以便调试或发布构建自动导入库的调试或发布变体?我想要的是这样的东西(其中currentBuildType是一个包含当前使用的buildType名称的变量): 我要导入的库项目已设置为publishNonDefault true,因此所有构建类型都已发布。在Gradle的配置阶段,我找不到获取当前构建类型的干净方法。相反,我分别为每种构建类型定义依赖项,如下所

我想根据当前的构建类型在Android Gradle项目中动态添加依赖项。我知道我可以:

但是,如何使用当前构建类型指定要导入库的哪个变体,以便调试或发布构建自动导入库的调试或发布变体?我想要的是这样的东西(其中currentBuildType是一个包含当前使用的buildType名称的变量):


我要导入的库项目已设置为
publishNonDefault true
,因此所有构建类型都已发布。

在Gradle的配置阶段,我找不到获取当前构建类型的干净方法。相反,我分别为每种构建类型定义依赖项,如下所示:

debugCompile project(path: ':lib1', configuration: 'debug')
releaseCompile project(path: ':lib1', configuration: 'release')
如果您有许多构建类型和许多项目依赖项,那么这可能会变得非常冗长,但是可以添加一个函数,使依赖项成为一行程序。您需要将其添加到主Gradle生成文件中:

subprojects {
    android {
        dependencies.metaClass.allCompile { dependency ->
            buildTypes.each { buildType ->
                "${buildType.name}Compile" project(path: ":${dependency.name}", configuration: buildType.name)
            }
        }
    }
}
然后,您可以在Gradle模块中添加项目依赖项,如下所示:

allCompile project(':lib1')
如果还使用构建风格,则必须调整解决方案。有关该功能的文档,请参见此链接:

请注意,Android团队正在努力改进这种行为:

添加一个任务,该任务取决于调用后的每个Assemblexx任务和属性设置

ext {
    currentConfig = ""
}
task generateConfigProperty(dependsOn: 'installDebug') {

    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->

            def taskName = "taskindicate$output.name"
            task "$taskName"() << {
                project.ext.set("currentConfig", "$output.name")
            }
            output.assemble.dependsOn "taskindicate$output.name"
        }
    }

}

task getConfig(dependsOn: ['installDebug', 'generateConfigProperty']) << {
    println("My config is $currentConfig")
}
ext{
currentConfig=“”
}
任务generateConfigProperty(依赖于“installDebug”){
android.applicationVariants.all{variant->
variant.outputs.each{output->
def taskName=“taskindicate$output.name”

任务“$taskName”(此任务非常简单:

android {
    applicationVariants.all { variant ->
        variant.buildType.name // this is the value!
    }
}
编辑:显然在gradle update的某个时候,这并不像我在下面的评论中提到的那样起作用。因此我建议检查其他选项。

//声明一个自定义任务类,以便可以将其重新用于不同的任务
// declare a custom task class so you can reuse it for the different
// variants
class MyTask extends DefaultTask {
     String mVariantName;
     public void setVariantName(String variant) {mVariantName = variant;}
     public String getVariantName() { return mVariantName; }
     @TaskAction
     void action(){
        // do stuff
     }
}

// put this after your `android{}` block.
android.applicationVariants.all { variant ->
    def taskName = "myTask_$variant.name"
    task "$taskName"(type: MyTask) << {
        // you can setup this task to various info regarding
        // variant
        variantName = variant.name
    }
    variant.assemble.dependsOn (taskName)
}
//变体 类MyTask扩展了DefaultTask{ 字符串mVariantName; public void setVariantName(字符串变量){mVariantName=variant;} 公共字符串getVariantName(){return mVariantName;} @任务行动 无效行动(){ //做事 } } //把这个放在你的'android{}'块后面。 android.applicationVariants.all{variant-> def taskName=“myTask\u$variant.name” 任务“$taskName”(类型:MyTask)您可以使用

if (gradle.startParameter.taskNames.contains("assembleExample")) {
    // do stuff
}
该变量将在计算
buildConfig
块之前设置

基于环境执行特定代码的想法应该是通过依赖项注入。
请考虑仅对异常配置使用以下声明,因为一般情况下,代码中不应该存在引用环境的条件

格雷德尔先生 GL

基于和,这是对我有效的。我的app build.gradle最后有以下代码:

ext.getCurrentBuildType = {
    def isDebug = gradle.startParameter.taskRequests.any {
                            it.args.any { it.endsWith("Debug") } }
    return isDebug ? "Debug" : "Release"
}
只需在评估后调用它即可。示例:

afterEvaluate {
    tasks.getByName("externalNativeBuild${ext.getCurrentBuildType()}")
         .dependsOn myOtherTask
}

显然,
gradle.startParameter
有很多关于当前运行的信息。看看运行gradle任务“AssemblerEase”…

的它打断了:/@neuron Try change
subprojects
allprojects
。来自文档:“配置此项目及其每个子项目。此方法针对此项目及其子项目执行给定的闭包。”由于这对于组合buildType和flavor的工作方式不明显,因此解决方案如下:因为gradle在评估阶段不知道配置“ReleaseComile”或“DebugCompile”,还必须动态添加这些配置:allprojects{configurations.metaClass.addFlavorConfiguration{def configName=“$flavor.name${buildType.name.capitalize()}Compile”;创建(configName)}}}}}此循环通过所有可用的生成类型进行。@timkranen如果循环,则至少循环中的最后一个是当前的。例如,如果我运行
assembleDebug
它将返回“debug”如果我运行
assembleRelease
它会返回Release,这对我来说很有用!我一直以相同的顺序获取BuildType名称。我得到一个错误:由于未绑定的输入和/或主题,无法应用以下模型规则:android.applicationVariants.all{…}@重新解释为什么最后一个是当前的?gradle Assembly如何?它将调用AssembledBug和assembleRelease。+1请注意,如果您使用的是
com.android.library
插件,
applicationVariants
不是可访问的属性。它将变为
libraryVariants
。您应该查看所有任务对于活动配置,请确保定义了正确的任务名称,因为它有几个变体,具体取决于项目的设置方式。System.out.println(gradle.startParameter.taskNames)应该这样做。然后在上面@Shooky的示例中查找该任务。@ShellDude为我返回了一个空列表,但def isDebug=gradle.startParameter.taskRequests.any{it.args[0]。contains(“Debug”)}trickI是否更喜欢这种方法…甚至可能会转换为它。我想知道我们是否在gradle版本或构建配置中看到了差异。taskRequests和TaskName之间可能存在一些细微的差异。但是,有一个投诉。在Android Studio中,这不起作用,而您只需重建或重新同步gradle。有没有任务名称参数。@ JLund更像DEF ISDebug=GaldLe.StistAdvult.taskRevest.{{!..asgs.iSimple())& & .ARG.FARST()。包含(“调试”)}请考虑将链接和语句添加到注释中。我更喜欢<代码> >。side@AlexC
android {

    def TRUE = "true"
    def FALSE = "false"
    def IS_DEV = "IS_DEV"
    def IS_RELEASE = "IS_RELEASE"

    defaultConfig {
        //...
        buildConfigField BOOLEAN, IS_DEV, FALSE
        buildConfigField BOOLEAN, IS_RELEASE, FALSE
    }

    buildTypes {
        debug {
            buildConfigField BOOLEAN, IS_DEV, TRUE
        }
        release {
            buildConfigField BOOLEAN, IS_RELEASE, TRUE
        }
    }

}
ext.getCurrentBuildType = {
    def isDebug = gradle.startParameter.taskRequests.any {
                            it.args.any { it.endsWith("Debug") } }
    return isDebug ? "Debug" : "Release"
}
afterEvaluate {
    tasks.getByName("externalNativeBuild${ext.getCurrentBuildType()}")
         .dependsOn myOtherTask
}