修复“Build Type包含自定义BuildConfig字段,但该功能已禁用”错误并使用buildConfigField

84
在新版本的Android Studio(Flamingo | 2022.2.1 Canary 9)中,使用org.jetbrains.kotlin(1.8.0-Beta)插件和8.0.0-alpha09 gradle插件,新构建突然出现以下错误:

“release”构建类型包含自定义BuildConfig字段,但该功能已禁用。

有没有办法解决这个问题?

5个回答

107

回答自己的问题——有一个快速解决方案。尝试在gradle.properties中添加以下行,希望问题能得到解决(目前为止):

android.defaults.buildfeatures.buildconfig=true

或者,根据 @Scott_AGP 的答案,将此项更改添加到 build.gradle 而不是更改 gradle.properties 可能会更好:

android {
    buildFeatures {
        buildConfig = true
    }
}

这个问题是由于buildConfigField(来自android.packageBuildConfig)的弃用引起的,详见此提交

2022年12月12日更新:

根据下面Roar Grønmo的说明,有一种新方法可以将时间戳嵌入BuildConfig.java文件中,详见我在2014年提出的建议之外的方法

要使用这种新方法,请首先删除当前build.gradle(或build.gradle.kts)文件中类似于以下内容的任何行:

buildConfigField("String", "BUILD_TIME", "\"" + System.currentTimeMillis().toString() + "\"")

相反,首先将以下内容添加到您的build.gradle.kts的顶部:

import com.android.build.api.variant.BuildConfigField

build.config.kts文件的android { ... }部分之外添加以下内容:

androidComponents {
    onVariants {
       it.buildConfigFields.put(
            "BUILD_TIME", BuildConfigField(
                "String", "\"" + System.currentTimeMillis().toString() + "\"", "build timestamp"
            )
        )
    }
}

您不需要在主代码库中进行任何新更改-- 在 Kotlin 中,可以像这样访问时间戳:

private val buildDate = Date(BuildConfig.BUILD_TIME.toLong())
Log.i("MyProgram", "This .apk was built on ${buildDate.toString()}");

就是这样!请注意,如果您不遵循上面所述的更改gradle.properties,则会看到一个在变体____中访问buildConfigFields值没有效果,因为feature buildConfig已禁用。警告。

可能仍有更好的方法来执行此操作,而无需使用BuildConfigField,但如果有的话,我不知道。如果有人有更持久的解决方案,请告诉我(我们)。


我在这里找到了一个关于旧版AS的类似问题 https://issuetracker.google.com/issues/161727311,但是它介绍了另一种通过gradle设置这些值的方法。我还没有测试过它们。 - Roar Grønmo
确认设置 android.defaults.buildfeatures.buildconfig=true 不会在构建项目时产生错误,但尚未检查其他影响。 - Roar Grønmo
buildConfig = true 修复了我的问题。 - Rohaitas Tanoli

71
避免将 android.defaults.buildfeatures.buildconfig=true 添加到您的 gradle.properties 文件中,因为该属性已在 AGP 8.0 中被 弃用,并计划在 AGP 9.0 中删除
相反,对于每个使用 BuildConfig 的模块,请将以下内容添加到每个单独的 build.gradle 文件中:
android {
    buildFeatures {
        buildConfig = true
    }
}

1
谢谢!我已经更新了另一个答案,也包括了这个。--ft - fattire
4
每个模块都需要吗?这是1995年吗? - Dazzle
1
@Dazzle "Always has been" 梗 - Jemshit

7
android.defaults.buildfeatures.buildconfig=true 添加到您的 gradle.properties 中即可解决此问题。

1
由于该方案已过时,我谨卑微地给它点了个踩。 - jayeffkay

5

将以下行添加到您的gradle.properties文件中:

android.buildConfig=true
API_KEY=0000

以及这些添加到 build.gradle(module) 文件中:

buildFeatures {
        buildConfig = true
    }

0
我只是在这里添加一个替代的“解决方案”……对于可能有帮助的人来说?
来自developer.android.com文档
引用: 您可以通过在构建的根项目的gradle.properties文件中添加一行android.defaults.buildfeatures.buildconfig=true来覆盖此默认值,以便为所有项目设置。
所以,一个人可能只想在他的项目级gradle.properties中明确声明这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接