版本控制是应用升级和维护策略的关键组成部分。版本控制很重要,因为
- 用户需要有关设备上安装的应用版本以及可供安装的升级版本的具体信息。
- 其他应用(包括您作为套件发布的其他应用)需要查询系统以获取您应用的当前版本,以便确定兼容性并识别依赖项。
- 您发布应用的服务可能也需要查询您应用的版本,以便向用户显示该版本。发布服务可能还需要检查应用版本以确定兼容性并建立升级/降级关系。
Android 系统使用您的应用版本信息来防止降级。系统不使用应用版本信息来强制限制第三方应用的升级或兼容性。您的应用必须强制执行任何版本限制并告知用户。
Android 系统强制执行系统版本兼容性,如构建文件中的 minSdk
设置所表达。此设置允许应用指定其兼容的最低系统 API。有关 API 要求的更多信息,请参阅指定 API 级别要求。
不同项目的版本控制要求各不相同。然而,许多开发者认为语义版本控制是版本控制策略的良好基础。
设置应用版本信息
要定义应用的版本信息,请在 Gradle 构建文件中设置版本设置的值
Groovy
android { namespace 'com.example.testapp' compileSdk 33 defaultConfig { applicationId "com.example.testapp" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" ... } ... } ...
Kotlin
android { namespace = "com.example.testapp" compileSdk = 33 defaultConfig { applicationId = "com.example.testapp" minSdk = 24 targetSdk = 33 versionCode = 1 versionName = "1.0" ... } ... } ...
版本设置
为两个可用的版本设置定义值:versionCode
和 versionName
。
versionCode
- 一个用作内部版本号的正整数。此数字有助于确定哪个版本比另一个版本新,数字越大表示版本越新。这不是向用户显示的版本号;该数字由
versionName
设置。Android 系统使用versionCode
值来防止降级,方法是阻止用户安装versionCode
低于当前安装在设备上的版本的 APK。该值是一个正整数,以便其他应用可以编程方式对其进行评估,例如检查升级或降级关系。您可以将该值设置为任何正整数。但是,请确保应用的每个后续版本都使用更大的值。
注意:Google Play 允许的
versionCode
最大值为 2100000000。您不能将已用于先前版本的
versionCode
的 APK 上传到 Play 商店。注意:在某些情况下,您可能希望上传一个
versionCode
低于最新版本的应用版本。例如,如果您发布多个 APK,您可能已经为特定 APK 预设了versionCode
范围。有关为多个 APK 分配versionCode
值的更多信息,请参阅分配版本代码。通常,您发布应用的第一个版本时将
versionCode
设置为 1,然后每次发布时单调递增该值,无论该版本是主要版本还是次要版本。这意味着versionCode
值不一定与用户可见的应用发布版本相似。应用和发布服务不应向用户显示此版本值。 versionName
用作向用户显示的版本号的字符串。此设置可以指定为原始字符串或对字符串资源的引用。
该值是一个字符串,因此您可以将应用版本描述为 <major>.<minor>.<point> 字符串或任何其他类型的绝对或相对版本标识符。
versionName
是唯一向用户显示的值。
定义版本值
您可以通过在模块的 build.gradle
或 build.gradle.kts
文件的 android {}
块内的 defaultConfig {}
块中包含这些设置来定义它们的默认值。然后,您可以通过为各个构建类型或产品变体定义单独的值来覆盖应用不同版本的这些默认值。以下文件显示了 defaultConfig {}
块中的 versionCode
和 versionName
设置,以及 productFlavors {}
块。
这些值随后会在构建过程中合并到您的应用清单文件中。
Groovy
android { ... defaultConfig { ... versionCode 2 versionName "1.1" } productFlavors { demo { ... versionName "1.1-demo" } full { ... } } }
Kotlin
android { ... defaultConfig { ... versionCode = 2 versionName = "1.1" } productFlavors { create("demo") { ... versionName = "1.1-demo" } create("full") { ... } } }
在此示例的 defaultConfig {}
块中,versionCode
值表示当前 APK 包含应用的第二个版本,versionName
字符串指定它将向用户显示为版本 1.1。此文件还定义了两个产品变体:“demo”和“full”。由于“demo”产品变体将 versionName
定义为“1.1-demo”,因此“demo”构建将使用此 versionName
而不是默认值。“full”产品变体块没有定义 versionName
,因此它使用默认值“1.1”。
注意:如果您的应用直接在 <manifest>
元素中定义应用版本,则 Gradle 构建文件中的版本值将覆盖清单中的设置。此外,在 Gradle 构建文件中定义这些设置允许您为应用的不同版本指定不同的值。为了获得更大的灵活性并避免清单合并时可能出现的覆盖,请从 <manifest>
元素中移除这些属性,并在 Gradle 构建文件中定义您的版本设置。
Android 框架提供了一个 API,让您可以查询系统以获取应用的版本信息。要获取版本信息,请使用 PackageManager.getPackageInfo(java.lang.String, int)
方法。
指定 API 级别要求
如果您的应用需要特定最低版本的 Android 平台,您可以在应用的 build.gradle
或 build.gradle.kts
文件中将该版本要求指定为 API 级别设置。在构建过程中,这些设置会合并到您应用的清单文件中。指定 API 级别要求可确保您的应用只能安装在运行兼容 Android 平台版本的设备上。
注意:如果您直接在应用的清单文件中指定 API 级别要求,则构建文件中的相应设置将覆盖清单文件中的设置。此外,在 Gradle 构建文件中定义这些设置允许您为应用的不同版本指定不同的值。为了获得更大的灵活性并避免清单合并时可能出现的覆盖,请从 <uses-sdk>
元素中移除这些属性,并在 Gradle 构建文件中定义您的 API 级别设置。
有两个可用的 API 级别设置
minSdk
— 应用将在其上运行的 Android 平台的最低版本,由平台的 API 级别标识符指定。targetSdk
— 应用设计运行的 API 级别。在某些情况下,这允许应用使用目标 API 级别中定义的清单元素或行为,而不是仅限于使用为最低 API 级别定义的元素或行为。
要在 build.gradle
或 build.gradle.kts
文件中指定默认 API 级别要求,请在 android {}
块内的 defaultConfig{}
块中添加一个或多个 API 级别设置。您还可以通过将设置添加到构建类型或产品变体来覆盖应用不同版本的这些默认值。
以下文件在 defaultConfig {}
块中指定了默认的 minSdk
和 targetSdk
设置,并为其中一个产品变体覆盖了 minSdk
Groovy
android { ... defaultConfig { ... minSdk 21 targetSdk 33 } productFlavors { main { ... } afterNougat { ... minSdk 24 } } }
Kotlin
android { ... defaultConfig { ... minSdk = 21 targetSdk = 33 } productFlavors { create("main") { ... } create("afterNougat") { ... minSdk = 24 } } }
在准备安装您的应用时,系统会检查这些设置的值并将它们与系统版本进行比较。如果 minSdk
值大于系统版本,系统将阻止应用安装。
如果您不指定这些设置,系统会假定您的应用与所有平台版本兼容。这等同于将 minSdk
设置为 1
。
有关更多信息,请参阅什么是 API 级别?。有关 Gradle 构建设置,请参阅配置构建变体。