应用版本控制

版本控制是应用升级和维护策略的关键组成部分。版本控制很重要,因为:

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

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"
          ...
      }
      ...
    }
    ...
      

版本设置

定义两个可用版本设置的值:versionCodeversionName

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.gradlebuild.gradle.kts 文件的 android {} 块中嵌套的 defaultConfig {} 块中来定义这些设置的默认值。然后,您可以通过为各个构建类型或产品风格定义单独的值来覆盖应用不同版本的这些默认值。以下文件显示了 defaultConfig {} 块中的 versionCodeversionName 设置,以及 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.gradlebuild.gradle.kts 文件中的 API 等级设置。在构建过程中,这些设置将合并到应用的清单文件中。指定 API 等级要求可确保您的应用只能安装在运行兼容版本的 Android 平台的设备上。

注意:如果您直接在应用的清单文件中指定 API 等级要求,则构建文件中的相应设置将覆盖清单文件中的设置。此外,在 Gradle 构建文件中定义这些设置允许您为应用的不同版本指定不同的值。为了提高灵活性并避免在合并清单时发生潜在的覆盖,请从 <uses-sdk> 元素中删除这些属性,而改为在 Gradle 构建文件中定义您的 API 等级设置。

有两个可用的 API 等级设置

  • minSdk — 应用将在其上运行的 Android 平台的最低版本,由平台的 API 等级标识符指定。
  • targetSdk — 应用设计在其上运行的 API 等级。在某些情况下,这允许应用使用目标 API 等级中定义的清单元素或行为,而不是仅限于使用为最低 API 等级定义的那些元素或行为。

要在 build.gradlebuild.gradle.kts 文件中指定默认 API 等级要求,请将一个或多个 API 等级设置添加到 android {} 块中嵌套的 defaultConfig{} 块中。您还可以通过将设置添加到构建类型或产品风格来覆盖应用不同版本的这些默认值。

以下文件在 defaultConfig {} 块中指定默认的 minSdktargetSdk 设置,并覆盖一个产品风格的 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 构建设置,请参阅 配置构建变体