70

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

我的 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;
}

我究竟做错了什么?

4

14 回答 14

75

请确保您正在构建“dev”或“prod”变体。默认的“调试”和“发布”变体中没有 BuildConfig 定义。在 Android Studio 中,您可以在左下角选择当前变体:

构建变体

为了简化您的 build.gradle 文件,您可以定义:

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

然后只使用默认的“调试”和“发布”变体。

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

于 2013-12-20T16:06:23.273 回答
56

我有同样的问题并修复如下:

buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'
于 2015-10-22T13:40:11.797 回答
41

先做

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

然后做

Build -> Clean Project

然后做

Build - > Rebuild Project 
于 2020-04-09T06:08:52.380 回答
22

以防万一有助于其他人,在我的情况下,这是一个缺失的导入: import uk.co.yourpackage.yourapp.BuildConfig;

不知何故,文档中没有提到您需要包含!让我觉得它是以某种方式自动导入的,但它不是。至少不适合我……浪费了这么多时间……希望对像我这样的新手有所帮助!

于 2015-07-27T20:20:21.233 回答
13

试着做

构建 -> 清理项目

然后做

构建 - > 重建项目

如果不起作用,请尝试

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

然后做

构建 -> 清理项目

然后做

构建 - > 重建项目

于 2020-04-18T05:37:26.150 回答
4

这是为我解决此问题的原因:

File -> Invalidate Caches/Restart... -> Invalidate and Restart 
于 2019-02-20T21:19:40.317 回答
4

如果您正在修改环境变量,并且它们在 Android Studio 中没有正确反映,请尝试执行以下操作:

Build -> Clean Project 
File -> Invalidate Caches/Restart... -> Invalidate and Restart 
于 2020-03-13T20:15:25.720 回答
3

我解决了这个问题,在这种情况下,Android Studio 将自己生成构建配置文件

File -> Sync Project with Gradle Files
于 2020-12-23T03:42:30.173 回答
1

在 project.ext.envConfigFiles 数组中,确保将调试设置为用于开发的正确 .env 文件

于 2019-07-09T08:12:27.157 回答
1

我做了答案中的所有事情,但仍然没有工作。我通过更改manifest.xml文件中仍未更新的包名称解决了我的问题:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.android">
于 2020-10-24T05:53:20.570 回答
1

在尝试了一切之后,切换构建变体并选择Build > Make Project 对我有用。

于 2021-10-27T11:23:33.317 回答
0

我遇到了与使用 .initWith(someotherbuildtype) 设置的构建类型相关的类似问题,BuildConfig 没有正确创建。我不得不切换到父构建变体并首先构建它,然后是 initWith 父构建的构建类型很好。

于 2015-04-27T00:56:44.797 回答
0

就我而言,我期待为我的新 gradle 模块创建的 BuildConfig。但是忘记将它作为依赖项添加到 app: 模块中。

于 2021-07-29T12:01:11.550 回答
0

在我的例子中,strings.xml 和产品风味中都有一个字符串字段resValue "string", "app_name", "MyApp"

考虑到重复资源的实际错误,我当时做了Invalidate Cachesandroid Rebuildstudion。

所以Invalidate caches -> Rebuild -> Remove string resources which were already in buildconfigfield resvalue对我有用

我正在使用Android Studio Bumblebee 2021.1.1

于 2022-02-08T13:00:07.837 回答