在带有 org.jetbrains.kotlin (1.8.0-Beta) 插件和 8.0.0-alpha09 gradle 插件的新版本 Android Studio (Flamingo | 2022.2.1 Canary 9) 中,新版本突然出现此错误:
构建类型“release”包含自定义 BuildConfig 字段,但该功能已禁用。
有办法让它消失吗?
我有两种口味,比如香草和巧克力.我也有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)
我有一个错误,所以我猜调试和发布技巧不起作用.有可能这样做吗?
我有一个项目,我有几个特定于设备的产品口味,每个口味需要用不同的配置签名:
productFlavors {
nexus7 {
signingConfig signingConfigs.nexus7
}
nexus4 {
signingConfig signingConfigs.nexus4
}
}
Run Code Online (Sandbox Code Playgroud)
这在构建"发布"变体时非常有用.但是,当使用'debug'变体时(例如,当我构建Nexus4Debug时),Gradle使用默认的android调试密钥.在我的情况下,我高度依赖这些构建以正确的方式签名,如果使用默认调试密钥签名,我的应用程序相对无用.任何人都知道是否有办法为每个变体指定签名配置?
我知道我可以按照构建类型来做,la:
buildTypes {
debug {
signingConfig signingConfigs.nexus4
}
}
Run Code Online (Sandbox Code Playgroud)
但这限制了我总是使用相同的签名配置来调试两种风格的版本.
PS - 了解这是一个有点边缘用例的地方.这是一个企业项目,我们在许多不同的Nexus设备上测试自定义ROM和系统签名的应用程序.
我试图定义一个buildConfigVariable取决于香精 + buildType.理想情况下,这就是我想要的
productFlavors {
strawberry {
buildConfigField "String", "WS_API_KEY", name + variant.buildType.name
}
... more flavors ..
}
Run Code Online (Sandbox Code Playgroud)
name确实包含"strawberry",但我不知道是否可以访问variant的buildType.
放置在Android闭包之外我可以访问BuildType和变体,但后来我无法调用buildConfigField
android.applicationVariants.all { variant ->
println "****************************"
println "variant: ${variant.name}"
println "flavor: ${variant.flavorName}"
println "****************************"
if (variant.buildType.name == 'release') {
if (variant.flavorName == 'strawberry') {
buildConfigField "String", "WS_API_KEY", '"strawberry_release"'
} else {
buildConfigField "String", "WS_API_KEY", '"chocolate_release"'
}
} else if(variant.buildType.name == 'debug') {
if …Run Code Online (Sandbox Code Playgroud) 如何为不同的变体设置不同的签名配置?
例如,我们目前有两种版本的buildtypes Debug/Beta/Release,免费和付费,产生了6种变体.为了使它更容易一点,让我们忘记Debug变体,只关注freeBeta/paidBeta/freeRelease/paidRelease.
我想要的是,每个变体都使用单独的不同的signedConfig.
到目前为止,我能找到的唯一解决方案是将signingConfigs置于buildTypes中,以便所有Beta变体都具有相同的signingConfigs:
buildTypes {
beta {
signingConfigs.beta
}
release {
signingConfigs.release
}
}
Run Code Online (Sandbox Code Playgroud)
或者,使用flavor,在这种情况下,所有免费变体都具有相同的signingConfigs:
productFlavors {
free {
signingConfig signingConfigs.free
applicationId 'com.example.free'
}
paid {
signingConfig signingConfigs.paid
applicationId 'com.example.paid'
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在当前的productFlavor闭包中执行此操作?只能通过覆盖android.applicationVariants.all { variant ->并根据某些命名方案或其他一些丑陋的黑客手动为每个应用程序变体应用signingConfig 来解决这个问题吗?
我也找到了这个答案,但它似乎不适用于最新的构建工具; 编译时我收到以下错误:
FAILURE:构建因异常而失败.
其中:构建文件'/home/dev/projects/app/build.gradle'行:61
出了什么问题:评估项目':app'时出现问题.
在ProductFlavor容器上找不到属性'free'.
我想弄清楚如何signingConfig为生成的各个风味维度指定 a 。我已经看到在使用不同的风味而不是风味维度时如何做到这一点。
我目前正在成功地为不同的风味维度应用不同的包名称,并认为可以用signingConfig?
> android.applicationVariants.all { variant ->
> def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName()
> def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor();
>
> if(flavorString.equalsIgnoreCase("amazonFree")) {
> mergedFlavour.setApplicationId("com.test.amazon.free")
> }
> if(flavorString.equalsIgnoreCase("amazonPro")) {
> mergedFlavour.setApplicationId("com.test.amazon.pro")
> }
> if(flavorString.equalsIgnoreCase("googleFree")) {
> mergedFlavour.setApplicationId("com.test.google.free")
> }
> if(flavorString.equalsIgnoreCase("googlePro")) {
> mergedFlavour.setApplicationId("com.test.google.pro")
> } }
Run Code Online (Sandbox Code Playgroud)
我的口味设置
Run Code Online (Sandbox Code Playgroud)// Special flavor dimensions for different markets and // versions paid and free. flavorDimensions 'market', 'version' productFlavors { amazon { flavorDimension 'market' } google { flavorDimension …
我正在开发一个白色品牌的应用程序。
我们创建每个客户不同的风味并且每个客户都Debug和ProductionAPI的,所以我试图建立起来的摇篮。
我该怎么做?
这是我尝试过的:
buildTypes {
debug {
// some configurations
}
release {
// some configurations
}
}
flavorDimensions "client"
productFlavors {
company1{
dimension "client"
buildConfigField("String", "BASE_URL", "\"https://app.company1/devApi/\"")
}
company2 {
dimension "client"
buildConfigField("String", "BASE_URL", "\"https://app.company2/devApi/\"")
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我希望能够为BASE_URL每个 Flavor 和 Buildtype定义一个不同的。
风味公司1,BuildType调试
https://app.company1.com/devApi/
Run Code Online (Sandbox Code Playgroud)
Flavor company1, BuildType 发布
https://app.company1.com/prodApi/
Run Code Online (Sandbox Code Playgroud)
风味公司2,BuildType调试
https://dev.company2.com/api/
Run Code Online (Sandbox Code Playgroud)
Flavor company2, BuildType 发布
https://prod.company2.com/api/
Run Code Online (Sandbox Code Playgroud) android android-gradle-plugin android-productflavors android-build-type
我正在使用 Kotlinscript 文件将 Android 应用程序转换为 Gradle Kotlin-DSL。
我在转换逻辑时遇到问题applicationId。我们不使用defaultConfigurationwith applicationIdplus 各种applicationIdSuffix口味来表达我们的口味,而是使用自定义逻辑。这个逻辑在这个 SO 答案中进行了描述,下面是常规代码:
flavorDimensions "price", "dataset"
productFlavors {
free { dimension "price" }
paid { dimension "price" }
dataset1 { dimension "dataset" }
dataset2 { dimension "dataset" }
}
android.applicationVariants.all { variant ->
def mergedFlavor = variant.mergedFlavor
switch (variant.flavorName) {
case "freeDataset1":
mergedFlavor.setApplicationId("com.beansys.freeappdataset1")
break
case "freeDataset2":
mergedFlavor.setApplicationId("com.beansys.freedataset2")
break
case "paidDataset1":
mergedFlavor.setApplicationId("com.beansys.dataset1paid")
break
case "paidDataset2":
mergedFlavor.setApplicationId("com.beansys.mypaiddataset2")
break
}
}
Run Code Online (Sandbox Code Playgroud)
对于 kotlin,我无法改变groovy 中的类似applicationId …