Gradle buildConfigField BuildConfig 无法解析符号。

142

我正在使用Gradle来构建我的Android应用程序。我试图根据构建类型(发布或调试)使用一些标志。

我的Gradle文件如下所示:

android {
    buildTypes {
        debug {
            buildConfigField 'boolean', 'PREPROD', 'true'
            buildConfigField 'boolean', 'STAGING', 'false'
        }

        release {
            buildConfigField 'boolean', 'PREPROD', 'false'
            buildConfigField 'boolean', 'STAGING', 'false'
        }
    }
}
如果我尝试调用BuildConfig.PREPRODBuildConfig.STAGING,会出现“无法解析符号”的错误。 Gradle同步成功,因此我不知道是否忘记了一些步骤以便能够使用此功能? 生成的BuildConfig.java文件如下(位于build/source/buildConfig/debug/com.example.myapp):
package com.example.myapp;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String PACKAGE_NAME = "com.example.myapp";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 400;
  public static final String VERSION_NAME = "";
}

你能检查一下是否已经创建了正确的BuildConfig类吗?它应该位于build/source/buildconfig/debug/...目录下。 - Xavier Ducrohet
我把生成的 BuildConfig.java 添加到了我的问题中。 - Gaëtan
4
虽然Studio会要求您同步(因为它不知道您是否更改了模型),但您不需要进行同步,但您需要构建,因为BuildConfig类是根据build.gradle文件中的内容在构建过程中生成的。 - Xavier Ducrohet
2
嗨,我正在通过配置设置管理应用程序中的两种风格,就像您一样,我正在尝试创建一些配置变量,但是针对不同的风格。我尝试了您的方法,但在风格/BuildConfig.java中没有看到任何更新,因此甚至无法在编译时访问变量。有什么建议! - CoDe
在菜单中,尝试选择“构建” => “生成项目”。 对我来说,就是这么简单 :-) - undefined
显示剩余7条评论
32个回答

110

确保你的文件正确地导入了BuildConfig类。有时,如果你有其他项目的库或模块,它可能会导入错误的buildConfig。

确保你的导入是像这样的com.project.app.BuildConfig。我曾经遇到过同样的问题,问题就在这里,希望它能帮助到某些人。


如何使用构建变体来更改完整的com.x.x? - Zapnologica
五年后,我要向您表示衷心的感谢。在我的情况下,是使用algoliasearch.BuildConfig,而我甚至没有导入它。 - dustytrash
对我来说非常有效,我已经更改了我的包名称,这就是问题的原因。将导入更新以匹配包名称,然后添加.BuildConfig即可解决问题。谢谢。 - cherucole
错误:找不到符号 jsonObject.put(PayuConstants.VERSION_KEY,BuildConfig.VERSION_NAME); 我遇到了这个错误。我应该怎么做? - Supriya Gorai
祝你好运! - amtrax
显示剩余2条评论

55
在build.gradle(Module:App)中添加以下内容,并重新构建项目。
android {
    buildFeatures {
        buildConfig = true
    }
}

在我的情况下,这使得我的Android Studio工作!谢谢! - ChingKun Yu

53

我遇到了同样的错误。 尝试点击保存右侧的同步按钮。 在Gradle同步之后执行此操作。


10
同步在哪里? - Lucky_girl
2
文件 > "与 Gradle 文件同步项目"。 - Chase Roberts
1
谢谢您先生!虽然不是同步按钮解决了我的问题,但我点击了“无效缓存/重启”按钮,一切都恢复正常了。 - Keith Mak
1
清除缓存并重启对我没有用。我不得不清理并重新构建,现在它可以工作了。 - SaPropper

39
因为我没有正确声明一个字符串字段,所以发生了这种情况。
我忘记转义字符。从以下代码进行更改:
buildConfigField "String", "FOO", "foo"

buildConfigField "String", "FOO", "\"foo\""

问题已解决。


1
这就是我的全部!谢谢!有时候真的是那些该死的小事情 :) - MacD
1
为什么需要转义字符串? - IgorGanapolsky
1
如果类型是字符串,则值应包含引号。请参见:https://developer.android.com/reference/tools/gradle-api/4.2/com/android/build/api/variant/BuildConfigField#value - Louis
那不是我的问题,但知道这是来自某个配置文件足以给我一个提示来解决它。我搜索了所有的文件找到了这个属性。谢谢! - thebiggestlebowski

38

在我的情况下,在Android Studio中:

  1. 构建 -> 清理项目;

  2. 文件 -> 无效缓存 / 重启...

  3. 构建 -> 重新构建项目


这是唯一对我有效的解决方案! - Adam Burley
不知道发生了什么,但它可以工作。 - amerw
这个bug真烦人。 - undefined

32

即使在顶部单击黄色的“立即同步”栏,gradle构建文件的更改不会刷新BuildConfig类的生成。需要进行全面清理才能强制生成该文件。

在Android Studio中: Build -> Clean Project


除了“Clean Project”之外,其他方法都不起作用(如:清除缓存并重启;同步项目文件与gradle文件),谢谢。 - mikep

24

我也遇到了同样的问题,在项目根目录中运行以下命令后问题得以解决:

./gradlew assembleDebug

20

请确保你也将参数添加到defaultConfig中。你可能正在运行默认的buildVariant,而你的参数是在特定的buildVariant中定义的。

在build.gradle文件中使用以下代码:

Make sure you add your parameter also to the defaultConfig. You are probably running the default buildVariant while your parameter is defined in a speciffic buildVariant.
 defaultConfig {
        buildConfigField('String' , 'myParameter', 'someValue')
    }
然后,在代码中使用以下内容:
String myParam= BuildConfig.myParameter;
希望这能有所帮助, M.A :)

错误:找不到符号 jsonObject.put(PayuConstants.VERSION_KEY,BuildConfig.VERSION_NAME); 我遇到了这个错误。 - Supriya Gorai
有些行为真是奇怪;在此之后,我的工作正常了。 - undefined

18

首先,您需要选择所需的构建变体,才能访问其buildConfigField。

输入图片说明


这对我很有帮助。我已经选择了一个构建变体,但更改它会导致重新构建,从而使错误消失。 - LarsH
1
使用以下代码即可在 Android 上运行:android{ buildFeatures{ buildConfig = true } } - Nithin Raja
1
我将构建类型的名称更改为此处选择的内容,而不是从此处选择构建类型。 - Hüseyin Bülbül

14

如果出现这种问题,只需清理并重新构建项目。

谢谢。


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