lightbulb_outline Please take our October 2018 developer survey. Start survey

对您的应用进行版本控制

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

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

Android 系统不会使用应用版本信息对第三方应用的升级、降级或兼容性进行限制,而是由您负责在您的应用内执行版本限制,或通知用户版本限制与局限性。不过,Android 系统会根据构建文件中 minSdkVersion 设置的说明强制执行系统版本兼容性。该设置允许应用指定与其兼容的最低系统 API。如需了解详细信息,请参阅指定最低系统 API 版本

设置应用版本信息

要为您的应用定义版本信息,请在 Gradle 构建文件中为版本设置设定相应的值。这些值随后将在构建流程中合并到您应用的清单文件中。

:如果您的应用直接在 <manifest> 元素中定义应用版本,Gradle 构建文件中的版本值将替换清单中的设置。此外,在 Gradle 构建文件中定义这些设置还让您可以为应用的不同版本指定不同的值。为了在合并清单时提高灵活性和避免潜在覆盖,您应当从 <manifest> 元素中移除这些属性,并改在 Gradle 构建文件中定义您的版本设置。

可配置两个设置,您应始终为它们定义相应的值:

  • versionCode - 一个整数,用作内部版本号。此数字仅用于确定一个版本是否比另一个版本更新,数字越大表示版本越新。这不是显示给用户的版本号;后者通过下面的 versionName 设置设定。

    该值是一个整数,其他应用可以通过编程方式对其进行评估,例如,检查升级或降级关系。您可以将该值设为您需要的任何整数,不过,您应确保应用的每个后续版本都使用一个较大的值。系统不强制执行此行为,但通常会针对后续版本增大此值。

    通常,发布应用的第一个版本时需要将 versionCode 设为 1,之后为每个发布版本单调增大此值,无论发布的是主版本还是次版本。这表示 versionCode 值不一定与用户可见的应用发布版本非常相似(请参阅下面的 versionName)。应用和发布服务不应向用户显示此版本值。

    警告:Google Play 允许的最大 versionCode 值为 2100000000。

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

    此值是一个字符串,您可以使用 <major>.<minor>.<point> 字符串或任何其他类型的绝对或相对版本标识符来描述应用版本。除了向用户显示之外,versionName 没有其他用途。

您可以将这些设置包含到 defaultConfig {} 块中(嵌套在模块的 build.gradle 文件的 android {} 块内部),为它们定义默认值。随后,您可以通过为各个构建类型或产品风味定义单独的值,为应用的不同版本替换这些默认值。下面的 build.gradle 文件显示了 defaultConfig {} 块和 productFlavors {} 块中的 versionCodeversionName 设置。

android {
  ...
  defaultConfig {
    ...
    versionCode 2
    versionName "1.1"
  }
  productFlavors {
    demo {
      ...
      versionName "1.1-demo"
    }
    full {
      ...
    }
  }
}

在本示例的 defaultConfig {} 块中,versionCode 值表示当前 APK 包含应用的第二个版本,versionName 字符串则指定应用将以版本 1.1 向用户显示。此 build.gradle 文件还定义了两个产品风味,即“demo”和“full”。由于“demo”产品风味将 versionName 定义为“1.1-demo”,“demo”将使用此 versionName,而不是默认值。“full”产品风味块未定义 versionName,因此它将使用默认值 1.1。

Android 框架提供了一个 API,让您可以查询系统,获取有关应用的版本信息。要获取版本信息,请使用 PackageManagergetPackageInfo(java.lang.String, int) 方法。

:如果使用 Instant Run,Android Studio 会自动将 versionCode 设置为 MAXINT,将 versionName 设置为 INSTANTRUN

指定 API 级别要求

如果您的应用需要特定的最低版本的 Android 平台,您可以在应用的 build.gradle 文件中以 API 级别设置的形式指定版本要求。在构建流程中,这些设置将合并到您应用的清单文件中。指定 API 级别要求可确保只能将您的应用安装在运行兼容的 Android 平台版本的设备上。

:如果您直接在应用的清单文件中指定 API 级别要求,构建文件中的对应设置将替换清单文件中的设置。此外,在 Gradle 构建文件中定义这些设置还让您可以为应用的不同版本指定不同的值。为了在合并清单时提高灵活性和避免可能发生的覆盖,您应当从 <uses-sdk> 元素中移除这些属性,并改在 Gradle 构建文件中定义您的 API 级别设置。

存在两种 API 级别设置:

  • minSdkVersion - 可运行应用的最低版本的 Android 平台,由该平台的 API 级别标识符指定。
  • targetSdkVersion - 指定运行应用的目标 API 级别。在某些情况下,这允许应用使用在目标 API 级别中定义的清单元素或行为,而不是仅限于使用那些针对最低 API 级别定义的元素或行为。

要在 build.gradle 文件中指定默认的 API 级别要求,请将上面的一个或多个设置添加到 defaultConfig {} 块中,嵌套在 android {} 块内。您还可以通过将设置添加到构建类型或产品风味的方式,为应用的不同版本替换这些默认值。下面的 build.gradle 文件可以指定 defaultConfig {} 块中默认的 minSdkVersiontargetSdkVersion 设置,并为一个产品风味替换 minSdkVersion

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 24
  }
  productFlavors {
    main {
      ...
    }
    afterLollipop {
      ...
      minSdkVersion 21
    }
  }
}

在准备安装您的应用时,系统将检查这些设置的值,并将其与系统版本比较。如果 minSdkVersion 值大于系统版本,系统将阻止应用安装。

如果您不指定这些设置,系统将假设您的应用与所有平台版本兼容。

如需了解详细信息,请参阅 <uses-sdk> 清单元素文档以及 API 级别文档。有关 Gradle 构建设置,请参阅配置构建变体