Version Code — 是Android开发中的一个正整数,用于唯一标识应用程序的每个新构建。Google Play和Android系统使用Version Code来确定是否需要更新:如果新构建的编码大于已安装的编码,则启动更新过程。根据Android Developer Documentation,Version Code不向用户显示,仅用于内部版本编号。
主要内容
Version Code — 是Integer类型的一个整数,分配给Android应用程序的每个构建。与Version Name不同,Version Code不向用户显示,仅由操作系统和Google Play在安装更新时用于比较版本。
Version Code 必须是从1到2100000000范围内的正整数。每个后续构建的Version Code必须严格大于前一个。如果开发者发布了Version Code为5的构建,下一次发布可以使用6、7或任何大于5的数字,但不能是4也不能再是5。
Google在2007年发布Android SDK时引入了Version Code和Version Name的区分。Version Code被设计为用于自动版本比较的机器标识符,而Version Name则是人类可读的标签。这种区分允许开发者随意命名版本,同时通过数字编码保持严格的更新顺序。
| 参数 | Version Code | Version Name |
|---|---|---|
| 数据类型 | Integer | String |
| 向用户显示 | 否 | 是 |
| 版本比较 | 数字比较 | 不使用 |
| 格式 | 1, 2, 3, 10, 100 | 1.0.0, 2.3.1-rc |
| 范围 | 1 — 2100000000 | 无限制 |
比较机制 Version Code内置于Android操作系统和Google Play商店。在每次发布时,Google Play会检查新构建的Version Code是否大于已安装版本的编码。如果不满足条件,发布将被拒绝并报错。
当设备联系Google Play检查更新时,服务器会将已安装应用的Version Code与商店中可用的最大值进行比较。如果服务器上的编码更大,则启动更新的下载和安装。用户看到开发者指定的Version Name,但更新决策是基于Version Code做出的。
开发者采用不同的策略来增加Version Code。最简单的方法是每次构建时增加1。对于CI/CD管道,常常使用时间戳或构建编号:2026070301(年-月-日-编号)。重要的是编码单调递增,并且不在不同的构建和Google Play跟踪之间重复。
Version Code和Version Name— build.gradle中的两个独立字段,执行不同的功能。Version Code是系统的内部标识符,Version Name是用户的市场营销标签。它们可以相互独立地变化。
Version Name— 是一个字符串,显示在应用程序设置、Google Play和更新对话框中。开发者可以指定任何格式:1.0.0、2.3.1-beta、3.0-rc1。对于比较文本版本,Version Name不被使用— Google Play始终依赖Version Code。
可能出现Version Code增加但Version Name保持不变的情况。例如,如果开发者在不改变功能的情况下的时候修复了热修复构建中的一个严重错误。Version Name保持2.0.0,Version Code从5变为6。Google Play将正确处理这种更新。
// 示例: version name不变,code增加
android {
defaultConfig {
versionCode 6 // 之前是5 — 没有新功能的热修复
versionName "2.0.0" // 未改变
}
}
// 在运行时检查版本
val code = BuildConfig.VERSION_CODE
val name = BuildConfig.VERSION_NAME
println("编码: $code, 名称: $name")
Version Code的配置在应用模块的build.gradle文件中完成。versionCode字段接受一个整数,位于defaultConfig块中。对于不同的flavor构建,可以通过产品配置中的versionCode字段设置自己的值。
// build.gradle.kts — Kotlin DSL
android {
defaultConfig {
applicationId "com.example.app"
versionCode 15
versionName "2.1.0"
}
flavorDimensions +"version"
productFlavors {
create("demo") {
versionCode 1015
}
create("full") {
versionCode 2015
}
}
}
Product flavors允许为不同配置使用不同的Version Code:示例版、平板电脑的单独版本。如果项目中使用了flavors,最终的Version Code由基数和flavor特定的增量组成。Google Play独立跟踪每个组合。
在CI/CD管道中(GitHub Actions、GitLab CI、Jenkins),Version Code常常根据构建编号或日期自动生成。这消除了手动更新时的人为错误。脚本从build.gradle读取当前Version Code,增加它并在构建开始前写回。
// Version Code的自动增量
import java.util.Properties
import java.io.FileInputStream
val versionProps = Properties()
versionProps.load(FileInputStream("version.properties"))
val versionCode = versionProps.getProperty("VERSION_CODE").toInt() + 1
versionProps.setProperty("VERSION_CODE", versionCode.toString())
android {
defaultConfig {
versionCode = versionCode
}
}
Google Play对于发布和更新应用程序时的Version Code有严格的规则。违反这些规则将导致构建被拒绝或无法发布更新。开发者必须理解生命周期所有阶段的限制和代码管理策略。
Google Play不允许上传Version Code小于或等于当前已发布版本的APK或AAB。这条规则独立适用于每个跟踪(production、beta、alpha)。如果在production中上传了Version Code为10的构建,而alpha中的编码为5,则alpha跟踪可以更新到6、7、8或9,但production保持在10。
在将构建从alpha提升到beta,然后到production时,Version Code必须在每个阶段增加。如果alpha版本的编码为10,beta可以使用11,production可以使用12。如果alpha已经使用10,则不能将编码为10的构建部署到production,即使production还没有见过它。
最常见的错误是上传到同一个跟踪的不同构建中Version Code重复。Google Play返回APK_VERSION_CODE_ALREADY_EXISTS错误。另一个错误是超过最大值2100000000,这将导致编译错误。为了避免冲突,请在CI系统中使用与构建编号或构建日期关联的自动代码生成。
开发者经常犯的错误还包括在为替代跟踪构建热修复时不增加Version Code。如果production的编码为15,而alpha跟踪保持在14,那么在将alpha提升到production时,Google Play将拒绝构建,因为它的编码小于当前的production。同时监控所有跟踪中代码的单调性—为此,使用一个统一的version.properties文件,所有跟踪从中读取当前值非常方便。
常见问题
不可以,Google Play不允许在同一个跟踪中上传Version Code小于或等于当前已发布版本的构建。系统在上传时检查编码,如果违反了单调递增规则则会报错。对于阿尔法和贝塔跟踪,同样独立适用这一原则。
第一次发布时可以指定Version Code 1。Google Play除了正整数之外没有设置任何最小阈值。建议从1开始,并在每次后续构建时增加1。如果使用时间戳格式,第一个构建可以是20260701。
Version Code— 是系统用于比较的内部机器标识符。Version Name— 是显示在Google Play和设备上的用户标签。用户看到Version Name(例如,2.0.0),而Google Play使用Version Code来确定更新需求。
Version Code的最大值为2100000000(Integer.MAX_VALUE)。超过时,编译器将报错,因为该字段是int类型。对于构建数量很大的项目(每日发布的CI/CD),建议使用时间戳格式或在主版本开始时重置计数器。
Version Code不直接用于A/B测试,但间接影响它。Google Play允许根据用户百分比为特定构建配置分阶段发布(staged rollout)。Version Code标识构建,A/B测试通过Firebase Remote Config或类似服务进行配置。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。