更新到“com.android.tools.build:gradle:4.1.0”后缺少 BuildConfig.VERSION_CODE

Voi*_*oid 58 android gradle build.gradle android-gradle-plugin

我有一个多模块应用程序,由于某种原因,VERSION_CODE 生成的字段从除根模块之外的所有模块中消失了,我已经在另一个项目上对其进行了测试,它的行为是相同的。现在我只是降级到 4.0.1,但这只是一种解决方法。

我需要使用 gradle 工具 4.1.0 在所有模块中恢复 BuildConfig.VERSION_CODE

将不胜感激任何帮助。

默认配置示例:

buildFeatures {
    buildConfig = true
}

defaultConfig {
    minSdkVersion global["androidMinSdkVersion"]
    targetSdkVersion global["androidTargetSdkVersion"]

    versionCode global["versionString"]

    javaCompileOptions {
        annotationProcessorOptions {
            includeCompileClasspath true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 4.0.1 上的 BuildConfig 代码

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "app";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "flavour";
  public static final int VERSION_CODE = 107;
  public static final String VERSION_NAME = "6.0.0";
  // Field from build type: debug
  public static final String AMQP_URL = "url";
  // Field from build type: debug
  public static final String API_VERSION_SUFFIX = "V_04_04_09";
  // Field from build type: debug
  public static final String BASE_URL = "url";
  // Field from product flavor: flavour
  public static final String BUILD_FLAVOR = "flavour";
  // Field from build type: debug
  public static final int DB_VERSION = 53;
}
Run Code Online (Sandbox Code Playgroud)

这是 4.1.0

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "app";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "flavour";
  public static final String VERSION_NAME = "6.0.0";
  // Field from build type: debug
  public static final String AMQP_URL = "url";
  // Field from build type: debug
  public static final String API_VERSION_SUFFIX = "V_04_04_09";
  // Field from build type: debug
  public static final String BASE_URL = "url";
  // Field from product flavor: flavour
  public static final String BUILD_FLAVOR = "flavour";
  // Field from build type: debug
  public static final int DB_VERSION = 53;
}
Run Code Online (Sandbox Code Playgroud)

Com*_*are 43

我有一个多模块应用程序,出于某种原因,VERSION_CODE 生成的字段已从除根模块之外的所有模块中消失

这似乎与这个报告的问题有关。在那种情况下,VERSION_NAME库模块中缺少它。请参阅此特定评论以了解其基本原理。显然,他们修复了VERSION_NAME但没有修复VERSION_CODE当我测试这个时,我没有得到VERSION_NAMEVERSION_CODE,所以我无法解释你的模块是如何得到VERSION_NAME.

您应该能够切换到使用buildConfigField来提供您的版本代码:

 buildConfigField "long", "VERSION_CODE", global["versionString"]
Run Code Online (Sandbox Code Playgroud)

  • 我在尝试您的建议时收到此错误:无法获取 DefaultConfig_decorated 的未知属性“全局”。 (4认同)

lee*_*eJB 42

添加buildConfigFieldbuildTypes模块 build.gradle 文件中

buildConfigField("long", "VERSION_CODE", "${defaultConfig.versionCode}")        
buildConfigField("String","VERSION_NAME","\"${defaultConfig.versionName}\"")
Run Code Online (Sandbox Code Playgroud)

例子,

buildTypes {
    debug{
        buildConfigField("long", "VERSION_CODE", "${defaultConfig.versionCode}")
        buildConfigField("String","VERSION_NAME","\"${defaultConfig.versionName}\"")

        //..
    }
    release {
        buildConfigField("long", "VERSION_CODE", "${defaultConfig.versionCode}")
        buildConfigField("String","VERSION_NAME","\"${defaultConfig.versionName}\"")

        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

defaultConfig.versionCodedefaultConfig.versionName

defaultConfig {
    minSdkVersion 16
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"

    //..
}
Run Code Online (Sandbox Code Playgroud)

在你的模块 build.gradle 中

您可以BuildConfig通过buildConfigField在模块 build.gradle 中编写方法来创建字段。该方法的第一个参数是创建字段类型,第二个是字段名称,第三个是值。

安卓工作室 4.1

  • 现在已经变成NULL了。 (2认同)

小智 7

我们还有一个多模块设置,我们能够通过将以下几行添加到每个模块的 build.gradle

buildConfigField 'int', 'VERSION_CODE', "${rootProject.appVersionCode}"
buildConfigField 'String', 'VERSION_NAME', "\"${rootProject.appVersionName}\""
Run Code Online (Sandbox Code Playgroud)


Ved*_*agh 5

您可以使用此处的其他答案作为解决方法,但此答案只是为了通知您处理该错误的人员的官方答复。这不会被修复,因为这是预期的行为。

以下是 Google 工程师的说法:

状态:无法修复(预期行为) 大家好,

是的,我们应该首先弃用这一点。自从发生这种情况(几个月前)以来,我们针对财产折旧/拆除制定了更好的政策。不过,这种情况在 4.1 版本中发生得有点晚,而且这个特定的问题被忽视了,因此我们没有机会决定是否恢复此更改(我们甚至错过了最初将此更改放入发行说明中的​​机会)。我们对此表示歉意。

这背后的一些动机是为了减少/消除围绕两点的混乱:

用户访问 BuildConfig 字段但未在 DSL 中设置它们。这肯定会被破坏,并且不会执行人们所期望的操作(即这些是静态值,不会神奇地反映库嵌入的应用程序的版本)库 AndroidManifest.xml 文件包含 DSL 中设置的值,但这些值在清单合并期间被使用应用程序完全忽略(它们也被覆盖)如果您想继续将公共位置的值注入到所有库项目的 BuildConfig 字段中,您可以继续手动执行此操作您自己的自定义字段。仅当您通过 DSL 设置这些字段时,这些字段才会存在(因此可以防止上面的问题 #1),并且不会影响库清单(上面的问题 #2)。

但是,如果您有一个包含许多库项目的大型设置,则此模式将生成大量重复项。拥有一个生成类似类的模块,并且让所有库项目(或者至少是需要该信息的项目)都依赖于它,会更有意义。