为特定flavor AND buildType定义buildconfigfield

Jes*_*usS 47 android build-tools gradle android-gradle-plugin

我有两种口味,比如香草和巧克力.我也有Debug和Release构建类型,我需要Vanilla Release才能有一个字段为true,而其他3个组合应该是false.

def BOOLEAN = "boolean"
def VARIABLE = "VARIABLE"
def TRUE = "true"
def FALSE = "false"

    VANILLA {

        debug {

            buildConfigField BOOLEAN, VARIABLE, FALSE

        }

        release {

            buildConfigField BOOLEAN, VARIABLE, TRUE

        }


    }

    CHOCOLATE {
        buildConfigField BOOLEAN, VARIABLE, FALSE
    }
Run Code Online (Sandbox Code Playgroud)

我有一个错误,所以我猜调试和发布技巧不起作用.有可能这样做吗?

Sim*_*mas 95

循环变体并检查其名称:

productFlavors {
    vanilla {}
    chocolate {}
}

applicationVariants.all { variant ->
    println("Iterating variant: " + variant.getName())
    if (variant.getName() == "chocolateDebug") {
        variant.buildConfigField "boolean", "VARIABLE", "true"
    } else {
        variant.buildConfigField "boolean", "VARIABLE", "false"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果这是在库中而不是应用程序中,那么小的更改如下:`libraryVariants.all { variant -> variant.outputs.all { println("Iterating variant: ${variant.name}") } }` (3认同)
  • 升级到 Gradle 插件 4.0 后它停止工作。:( 你难道没有偶然的解决办法吗? (3认同)

Ale*_*nko 18

这是一个没有缺乏的解决方案,我在Simas的回答中描述过

buildTypes {
    debug {}
    release {}
}

productFlavors {
    vanilla {
        ext {
            variable = [debug: "vanilla-debug value", release: "vanilla-release value"]
        }
    }
    chocolate {
        ext {
            variable = [debug: "chocolate-debug value", release: "chocolate-release value"]
        }
    }
}

applicationVariants.all { variant ->
    def flavor = variant.productFlavors[0]
    variant.buildConfigField "boolean", "VARIABLE", "\"${flavor.variable[variant.buildType.name]}\""
}
Run Code Online (Sandbox Code Playgroud)


Ed *_*rge 7

内摇篮构建系统,buildTypes并且productFlavors是不幸的是两个独立的实体.

据我所知,要完成你想要实现的目标,你需要创建另一个构建风格:

buildTypes {
        debug{}
        release {}
    }

    productFlavors {
        vanillaDebug {
             buildConfigField BOOLEAN, VARIABLE, FALSE
        }
        vanillaRelease {
             buildConfigField BOOLEAN, VARIABLE, TRUE
        }
        chocolate {
             buildConfigField BOOLEAN, VARIABLE, FALSE
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答,这就是我所害怕的.通过这种方法,我将有6种不同的构建,对吧?vanillaDebugDebug,vanillaDebugRelease,vanillaReleaseDebug,vanillaReleaseRelease,chocolateDebug,chocolateRelease对吗?我认为这个解决方案不适合我的需求,但我想这个问题并没有很好的解决方案 (2认同)

Arn*_*Fun 5

对于您的特定情况,您也可以使用 defaultConfig:

defaultConfig {
    buildConfigField BOOLEAN, VARIABLE, TRUE
}

buildTypes {
    debug {
        buildConfigField BOOLEAN, VARIABLE, FALSE
    }
    release {
    }
}

productFlavors {
    VANILLA {
    }
    CHOCOLATE {
        buildConfigField BOOLEAN, VARIABLE, FALSE
    }
}
Run Code Online (Sandbox Code Playgroud)

默认值为 TRUE,但随后您将 FALSE 设置为所有 Debug 版本和所有 Chocolate 版本。所以唯一剩下的 TRUE 是 VANILLA-release。