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_NAME或VERSION_CODE,所以我无法解释你的模块是如何得到VERSION_NAME.
您应该能够切换到使用buildConfigField来提供您的版本代码:
buildConfigField "long", "VERSION_CODE", global["versionString"]
Run Code Online (Sandbox Code Playgroud)
lee*_*eJB 42
添加buildConfigField到buildTypes模块 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.versionCode和defaultConfig.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
小智 7
我们还有一个多模块设置,我们能够通过将以下几行添加到每个模块的 build.gradle
buildConfigField 'int', 'VERSION_CODE', "${rootProject.appVersionCode}"
buildConfigField 'String', 'VERSION_NAME', "\"${rootProject.appVersionName}\""
Run Code Online (Sandbox Code Playgroud)
您可以使用此处的其他答案作为解决方法,但此答案只是为了通知您处理该错误的人员的官方答复。这不会被修复,因为这是预期的行为。
以下是 Google 工程师的说法:
状态:无法修复(预期行为) 大家好,
是的,我们应该首先弃用这一点。自从发生这种情况(几个月前)以来,我们针对财产折旧/拆除制定了更好的政策。不过,这种情况在 4.1 版本中发生得有点晚,而且这个特定的问题被忽视了,因此我们没有机会决定是否恢复此更改(我们甚至错过了最初将此更改放入发行说明中的机会)。我们对此表示歉意。
这背后的一些动机是为了减少/消除围绕两点的混乱:
用户访问 BuildConfig 字段但未在 DSL 中设置它们。这肯定会被破坏,并且不会执行人们所期望的操作(即这些是静态值,不会神奇地反映库嵌入的应用程序的版本)库 AndroidManifest.xml 文件包含 DSL 中设置的值,但这些值在清单合并期间被使用应用程序完全忽略(它们也被覆盖)如果您想继续将公共位置的值注入到所有库项目的 BuildConfig 字段中,您可以继续手动执行此操作您自己的自定义字段。仅当您通过 DSL 设置这些字段时,这些字段才会存在(因此可以防止上面的问题 #1),并且不会影响库清单(上面的问题 #2)。
但是,如果您有一个包含许多库项目的大型设置,则此模式将生成大量重复项。拥有一个生成类似类的模块,并且让所有库项目(或者至少是需要该信息的项目)都依赖于它,会更有意义。