对您的应用进行版本控制

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

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

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 构建设置,请参阅配置构建变体

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容