BuildConfig 未正确创建(Gradle Android)

我正在尝试将我们的 Android 应用程序转换为渐进式构建。我有这个项目,它的图书馆建设成功。我现在尝试为我们的不同环境创建单独的 apk (dev/test/prod 对于它们使用的静态服务有不同的 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

我的 build/source/buildConfig/debug/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;
}

我做错了什么?

105563 次浏览

Please, be sure that you are building "dev" or "prod" variant. There is no BuildConfig definition in default "debug" and "release" variant. In Android Studio, you can select current variant in bottom left corner:

Build Variants

To simplify your build.gradle file, you can define:

buildTypes {
debug {
buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\""
// etc.
}
release {
buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\""
// etc.
}
}

and then just use default "debug" and "release" variants.

At last, delete semicolon (sign: ';') from the value of buildConfigField parameter.

I had similar problem related to build types being setup using .initWith(someotherbuildtype), BuildConfig was not being created properly. I had to switch to the parent build variant and build that first, then the build types that initWith the parent built fine.

Just in case that helps somebody else, in my case it was a missing import: import uk.co.yourpackage.yourapp.BuildConfig;

Somehow, nowhere in the doc does it mention you need that include! Made me think it was automatically imported somehow but it ISN'T. not for me at least... So much time lost... Hope that helps another newbie like me!

I had same issue and fixed it like below:

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

Here is what fixed this for me:

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

In the project.ext.envConfigFiles array, ensure you set the debug to the right .env file you are using for development

If you are modifying your Environment Variables, and they are not reflecting correctly in Android studio try doing:

Build -> Clean Project
File -> Invalidate Caches/Restart... -> Invalidate and Restart

first do

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

then do

Build -> Clean Project

then do

Build - > Rebuild Project

Try to do

Build -> Clean Project

then do

Build - > Rebuild Project

If it doesn't work, try

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

then do

Build -> Clean Project

then do

Build - > Rebuild Project

I did all the things in the answers but still didn't work. I solved my problem by changing the package name in the manifest.xml file which still hadn't been updated :

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.android">

I solve this problem as given below in this case Android studio will generate Build Config file itself

File -> Sync Project with Gradle Files

In my case, I was expecting the BuildConfig for my new gradle module created. But forgot to add it as a dependency in app: module.

After trying everything, switching the build variant and selecting Build > Make Project worked for me.

In my case there was an string field resValue "string", "app_name", "MyApp" in strings.xml as well as in product flavours.

I did Invalidate Caches then Rebuild then android studion given the actual error of duplicate resources.

so Invalidate caches -> Rebuild -> Remove string resources which were already in buildconfigfield resvalue worked for me

I was using Android Studio Bumblebee 2021.1.1

Follow these steps:

Step 1

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

Step 2

Build -> Clean Project

Step 3

Build - > Rebuild Project

For Android Studio Version

Android Studio Dolphin | 2021.3.1 Patch 1

Build #AI-213.7172.25.2113.9123335, built on September 30, 2022

Runtime version: 11.0.13+0-b1751.21-8125866 aarch64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

What was I trying to do?

I set up three build variants for the app module, I wanted BuildConfig to be changed every time I change the build variant, for that particular variable defined in the build.gradle (app) configurations.

What didn't work

I have tried all three methods, DIDN'T WORK AT ALL, to regenerate my BuildConfig for the build variant I was changing:

  1. File > invalidate cache and restart along with Build > Clean Project & Build > Rebuild Project
  2. Build > Make Project alone
  3. File > Sync Project with Gradle Files alone

What worked

Then I tried a combination which is surprisingly WORKING WELL:

  1. First, Try Build > Make Project
  2. Then File > Sync Project with Gradle Files

I hope it will work for that particular version I am not sure for other versions of Android Studio.

Thanks, @ravi, and @ibrokhim for partially answered for the case.