应用版本控制

版本控制是应用程序升级和维护策略中的一个关键组成部分。版本控制非常重要,因为

  • 用户需要了解安装在他们设备上的应用程序版本以及可供安装的升级版本的相关信息。
  • 其他应用程序(包括您作为套件发布的其他应用程序)需要查询系统以获取您的应用程序的版本,以确定兼容性并识别依赖项。
  • 您发布应用程序的服务也可能需要查询您的应用程序的版本,以便他们能够将版本显示给用户。发布服务可能还需要检查应用程序版本以确定兼容性并建立升级/降级关系。

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` 值的更多信息,请参阅 分配版本代码

通常,您会发布具有设置为 1 的 `versionCode` 的应用程序的第一个版本,然后每次发布时单调增加该值,无论该发布是否构成主要发布或次要发布。这意味着 `versionCode` 值不一定类似于对用户可见的应用程序发布版本。应用程序和发布服务不应将此版本值显示给用户。

versionName

用作显示给用户的版本号的字符串。此设置可以指定为原始字符串或对字符串资源的引用。

该值为字符串,以便您可以将应用程序版本描述为 ``.``.`` 字符串或任何其他类型的绝对或相对版本标识符。`versionName` 是唯一显示给用户的版本值。

定义版本值

您可以通过将这些设置包含在 `defaultConfig {}` 块中,嵌套在模块的 `build.gradle` 或 `build.gradle.kts` 文件的 `android {}` 块中来为这些设置定义默认值。然后,您可以通过为单个构建类型或产品风格定义单独的值来覆盖应用程序不同版本的这些默认值。以下文件显示了 `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 级别要求,请将一个或多个 API 级别设置添加到 `defaultConfig{}` 块中,嵌套在 `android {}` 块中。您还可以通过将设置添加到构建类型或产品风格来覆盖应用程序不同版本的这些默认值。

以下文件在 `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 构建设置,请参阅 配置构建变体