在更新到“com.android.tools.build:gradle:4.1.0”后,BuildConfig.VERSION_CODE丢失

tyky79it  于 2023-10-19  发布在  Android
关注(0)|答案(8)|浏览(196)

我有一个多模块化的应用程序,由于某种原因,VERSION_CODE生成的字段已经从所有模块中消失,除了根模块,我已经在一个项目上测试了它,它的行为是一样的。现在我只是简单地降级到4.0.1,但这只是一个解决方案。
我需要使用gradle tools 4.1.0恢复所有模块中的BuildConfig.VERSION_CODE
会很感激你的帮助。
defaultConfig示例:

buildFeatures {
    buildConfig = true
}

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

    versionCode global["versionString"]

    javaCompileOptions {
        annotationProcessorOptions {
            includeCompileClasspath true
        }
    }
}

下面是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;
}

这是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;
}
cunj1qz1

cunj1qz11#

buildConfigField添加到模块构建.gradle文件中的buildTypes

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

举例来说,

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}\"")

        //...
    }
}

defaultConfig.versionCodedefaultConfig.versionName值是

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

    //..
}

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

p5cysglq

p5cysglq2#

我有一个多模块化的应用程序,由于某种原因,VERSION_CODE生成的字段已从所有模块中消失,除了根模块
这似乎与this reported issue有关。在这种情况下,库模块中缺少的是VERSION_NAME。参见this specific comment了解其原理。显然,他们修复了VERSION_NAME,但没有修复VERSION_CODE。当我测试这个时,我没有得到VERSION_NAMEVERSION_CODE,所以我无法解释你的模块如何得到VERSION_NAME
您应该能够切换到using buildConfigField来提供您的版本代码:

buildConfigField "long", "VERSION_CODE", global["versionString"]
wi3ka0sx

wi3ka0sx3#

我们还有一个多模块设置,我们能够通过将以下行添加到每个模块的build.gradle中来解决问题,只需做最小的更改

buildConfigField 'int', 'VERSION_CODE', "${rootProject.appVersionCode}"
buildConfigField 'String', 'VERSION_NAME', "\"${rootProject.appVersionName}\""
wmtdaxz3

wmtdaxz34#

您可以使用其他答案作为解决方法,但这个答案只是为了通知您来自bug工作人员的官方回复。这将不会被修复,因为这是一个预期的行为。
以下是Google工程师的说法:
状态:无法修复(预期行为)大家好,
是的,我们应该首先反对这个。自从这件事发生(几个月前)以来,我们已经制定了更好的政策来弃用/删除属性。不过,这在4.1中发生得有点晚,这个特殊的问题被忽略了,所以我们没有机会决定是否恢复这个更改(我们甚至错过了将这个更改放在发行说明中)。对此我们深表歉意。
这背后的一些动机是减少/消除围绕2点的混淆:
用户访问BuildConfig字段但不在DSL中设置它们。这肯定会被破坏,不会做人们所期望的事情(即这些是静态值,不会神奇地反映库嵌入的应用程序的版本)库AndroidManifest.xml文件包含DSL中设置的值,但这些值在清单合并期间被消费应用程序完全忽略(它们也被覆盖)如果你想继续从公共位置将值注入到库项目的所有BuildConfig字段中,你可以继续使用自己的自定义字段手动执行此操作。这些字段只有在您通过DSL设置它们时才会存在(因此可以防止上面的问题#1),并且不会影响库清单(上面的问题#2)。
但是,如果您有一个包含许多库项目的大型设置,则此模式将生成许多重复项。更有意义的做法是使用一个模块生成一个类似的类,并让所有库项目(或至少需要信息的项目)都依赖于它。

pobjuy32

pobjuy325#

您可以通过包名+ BuildConfig + Variable访问变量。
示例:com.heregoesyourpackagename.BuildConfig.VERSION_CODE
这将返回放置在Build gradle中的值

2wnc66cl

2wnc66cl6#

无法找到干净的解决方案,因此添加了一个解决方案:

buildConfigField "int", "VERSION_CODE1", String.valueOf(global["versionString"])
sbtkgmzw

sbtkgmzw7#

在构建Gradle应用程序模块中添加行后,我的问题得到修复

android {
buildFeatures {
        buildConfig true
    }
}
unftdfkk

unftdfkk8#

以下是Firebase指南中的简单介绍:https://firebase.google.com/docs/app-distribution/android/distribute-fastlane

lane :increment_version do
  latest_release = firebase_app_distribution_get_latest_release(
    app: "<your Firebase app ID>"
  )
  increment_version_code({ version_code: latest_release[:buildVersion].to_i + 1 })
end

相关问题