对应用进行版本控制

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

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

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。

如果您已将某个 APK 的 versionCode 用于以前的版本,就无法将该 APK 上传到 Play 商店。

注意:在某些情况下,您可能希望上传 versionCode 低于最新版本的应用版本。例如,如果您要发布多个 APK,您可能就已为特定 APK 预设了 versionCode 范围。如需详细了解如何为多个 APK 分配 versionCode 值,请参阅分配版本代码

通常,发布应用的第一个版本时将 versionCode 设为 1,而后该值随着发布每个版本单调递增,无论发布的是主要版本还是次要版本。这意味着,versionCode 值不一定与用户可见的应用发布版本非常相似。应用和发布服务不应向用户显示此版本值。

versionName

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

该值是一个字符串,所以您可以使用 <major>.<minor>.<point> 字符串或者其他任何类型的绝对或相对版本标识符来描述应用版本。versionName 是向用户显示的唯一值。

定义版本值

您可以通过将这些设置包含在 defaultConfig {} 代码块(嵌套在模块的 build.gradlebuild.gradle.kts 文件的 android {} 代码块内)中,为其定义默认值。然后,您可以通过为各个构建类型或产品变种定义单独的值,为应用的不同版本替换这些默认值。下面的文件显示了 defaultConfig {} 代码块以及 productFlavors {} 代码块中的 versionCodeversionName 设置。

这些值随后会在构建流程中合并到应用的清单文件中。

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”build 将使用此 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 级别设置添加到 defaultConfig{} 代码块(嵌套在 android {} 代码块内)。您还可以通过将设置添加到构建类型或产品变种,为应用的不同版本替换这些默认值。

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