BuildConfig没有正确创建(Gradle Android)

107

我正在尝试将我们的Android应用程序转换为gradle构建。 我已经成功构建了项目及其库。 现在,我正在尝试为我们的各种环境(开发/测试/生产)创建单独的apk文件,因为它们消耗restful服务的URL不同。

在搜索中,我认为最好的方法是为每个环境创建不同的BuildConfig。这是我尝试的方法:

import java.util.regex.Pattern

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:+'
    }
}

apply plugin: 'android'

task('increaseVersionCode') << {
    def manifestFile = file("AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
}

tasks.whenTaskAdded { task ->
    if (task.name == 'generateReleaseBuildConfig') {
        task.dependsOn 'increaseVersionCode'
    }
}

dependencies {
    compile 'com.android.support:support-v4:19.0.0' 
    compile files('libs/commons-io-2.4.jar',
                  'libs/google-play-services.jar',
                  'libs/gson-2.2.4.jar',
                  'libs/universal-image-loader-1.8.6.jar',
                  'libs/wakeful-1.0.1.jar')
    compile project(':pulltorefresh_lib')
    compile project(':edgeeffect_lib')
    compile project(':viewpagerindicator_lib')        
}

android {
    buildToolsVersion "18.1.1"
    compileSdkVersion "Google Inc.:Google APIs:18"

    defaultConfig { 
       minSdkVersion 14
       targetSdkVersion 18
    }

    buildTypes {
        debug {
            packageNameSuffix ".debug"
        }
        dev.initWith(buildTypes.debug)
        dev {
            buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\";"
            buildConfigField "String", "URL_CONNECT", "\"https://dev-connect.example.com\";"
            buildConfigField "String", "URL_SVC_NEWSLIST", "\"https://dev-mobilenews.example.com/newslist\";"
            buildConfigField "String", "URL_SVC_NEWSDETAIL", "\"https://dev-mobilenews.example.com/newsdetail\";"
            buildConfigField "String", "URL_SVC_REGISTERENDPOINTS", "\"https://dev-mobilenews.example.com/registerendpoints\";"
        }
        prod.initWith(buildTypes.release)
        prod {
            buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\";"
            buildConfigField "String", "URL_CONNECT", "\"https://connect.example.com\";"
            buildConfigField "String", "URL_SVC_NEWSLIST", "\"https://mobilenews.example.com/newslist\";"
            buildConfigField "String", "URL_SVC_NEWSDETAIL", "\"https://mobilenews.example.com/newsdetail\";"
            buildConfigField "String", "URL_SVC_REGISTERENDPOINTS", "\"https://mobilenews.pdc-np-cf.lmig.com/registerendpoints\";"          
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}

问题在于我的BuildConfig.java似乎没有注入静态变量,因此我会遇到类似以下错误的错误:

/Users/path/to/project/MainActivity.java:348: error: cannot find symbol
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(BuildConfig.URL_SEARCH)));
                                                                              ^
  symbol:   variable URL_SEARCH
  location: class BuildConfig
/Users/path/to/project/MainActivity.java:359: error: cannot find symbol
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(BuildConfig.URL_CONNECT)));
                                                                              ^
  symbol:   variable URL_CONNECT
  location: class BuildConfig
/Users/path/to/project/MainActivity.java:600: error: cannot find symbol
            HttpPost httpPost = new HttpPost(BuildConfig.URL_SVC_REGISTERENDPOINTS);
                                                        ^
  symbol:   variable URL_SVC_REGISTERENDPOINTS
  location: class BuildConfig
/Users/path/to/project/service/AlarmNotificationService.java:145: error: cannot find symbol
        String requestUrl = BuildConfig.URL_SVC_NEWSLIST + "?"
                                       ^
  symbol:   variable URL_SVC_NEWSLIST
  location: class BuildConfig
/Users/path/to/project/service/NewsService.java:240: error: cannot find symbol
        String requestUrl = BuildConfig.URL_SVC_NEWSLIST + "?"
                                       ^
  symbol:   variable URL_SVC_NEWSLIST
  location: class BuildConfig
/Users/path/to/project/service/NewsService.java:530: error: cannot find symbol
            HttpPost httpPost = new HttpPost(BuildConfig.URL_SVC_NEWSDETAIL);
                                                        ^
  symbol:   variable URL_SVC_NEWSDETAIL
  location: class BuildConfig
6 errors

我的构建/源代码/构建配置/调试/com/.../BuildConfig.java 文件包含:

/**
 * Automatically generated file. DO NOT MODIFY
 */
package com....;

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

我做错了什么?


可能最好删除那些自由软件的参考。虽然这里没有任何关键代码,但最好避免在StackOverflow上共享专有代码 ;) - antonpug
Gradle的BuildConfigField(BuildConfig)无法解析符号。 - Michael
Gradle buildConfigField无法解析符号"BuildConfig"。 - Muhammad Noman
21个回答

102
在我的情况下,我需要将buildConfig作为构建特性启用。
android {
    buildFeatures {
        buildConfig true
    }
}

8
然后执行以下操作: 文件 -> 与 Gradle 文件同步项目 - mahsa k
1
在执行此操作后,您需要清理项目并重新构建它。 - Amjad Tubasi
2
它对我有用。但是为什么我们需要添加 buildConfig true?我不理解这个。 - Rahul Singhal
2
唯一的解决方案适用于我(拯救了我的一天) - Eugene Voronoy
1
这对我来说是一个在Android Studio Giraffe上的解决方案。谢谢你。 - Rickyslash
显示剩余6条评论

86
请确保您正在构建“dev”或“prod”版本。在默认的“debug”和“release”版本中,没有BuildConfig定义。在Android Studio中,您可以在左下角选择当前变量:
Build Variants
为了简化您的build.gradle文件,您可以定义:
buildTypes {
    debug {
        buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\""
        // etc.
    }
    release {
        buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\""
        // etc.      
    }
}

然后只需使用默认的"debug"和"release"变体。

最后,从buildConfigField参数的值中删除分号(标志:';')。


谢谢...是我自己犯傻,正如我所预料的那样。"gradle installDev" 运行良好... "gradle build" 给了我错误信息。 - Innova
7
你还可以这样写:buildConfigField 'String', 'URL_SEARCH', '"https://search.example.com"' - Androiderson
1
我想补充一点,当您更改活动构建变体时,可能需要重新构建项目(Build -> Rebuild Project),否则 BuildConfig 将不会被重新生成。 - acarlstein

62

首先做

File -> Invalidate Caches/Restart... -> Invalidate and Restart 

然后执行

Build -> Clean Project

那么就这样做

Build - > Rebuild Project 

1
完成这个操作后,Gradle 终于报告说其中一个库的最低 SDK 版本高于应用程序的最低 SDK 版本。 - Mars
1
确认,它已经工作了。 - vuhung3990
2
太棒了!它运行了! 谢谢@Mirza Ahmed - Avramo

58

我曾遇到同样的问题,我按以下方式解决:

buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'

7
对于String而言,双引号无法正确生成变量,只有单引号可以成功生成变量。 - Youngjae
2
对于像我这样第一次错过的人来说,关键部分是值在单引号内的双引号中。 - speckledcarp

23

如果有帮助到其他人就好了,对于我来说,问题是缺少了一个导入: import uk.co.yourpackage.yourapp.BuildConfig;

在文档中没有提到需要导入这个!让我以为它会被自动导入,但它并没有。至少对我来说不是这样的...浪费了很多时间...希望能帮助像我一样的新手!


1
太棒了,这是一个导入问题,我从android.support.v4.BuildConfig导入了。谢谢 :) - Tarek El-Mallah
我不小心导入了"org.koin.android",而且它有自己的BuildConfig,原因不明。感谢您的评论,这提醒我手动检查导入! - Stylianos Gakis
我几乎尝试了所有的方法,但都没有成功。 - undefined

13

尝试做以下步骤:

构建 -> 清理项目

然后执行:

构建 -> 重建项目

如果不起作用,请尝试:

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

然后再执行:

构建 -> 清理项目

最后再执行:

构建 -> 重建项目


清理并重新构建应该可以解决问题 - 对我有效。 - srinij

10
你需要在你的 `gradle.properties` 文件中添加这行代码:
android.defaults.buildfeatures.buildconfig=true

希望这对你有所帮助

7
我会尝试翻译如下:

我解决这个问题的方法如下,在这种情况下,Android Studio会自动生成Build Config文件

File -> Sync Project with Gradle Files

这个帮了我。 - Neo Raiden X
请为我工作。谢谢!(Android Studio 2020.03.01 补丁3) - SamanSepahvand

7
将以下内容添加到build.gradle文件中。
buildFeatures {
    buildConfig = true
}

如果使用Jetpack Compose
 buildFeatures {
        compose = true
        buildConfig = true
    }

4
这是我的解决方案:
File -> Invalidate Caches/Restart... -> Invalidate and Restart 

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