如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion

本文主要介绍在我们 Android 项目的 build.gradle 文件中关于 compileSdkVersion 、minSdkVersion 、maxSdkVersion 、buildtoolsVersion 的基本概念和使用

背景

在使用 Android Studio 开发我们的项目过程中经常会涉及到 SDK Tools 、SDK Platforms 升级提示,还有在我们 build.gradle 文件中如何对 compileSdkVersion 、minSdkVersion 、maxSdkVersion 、buildtoolsVersion 这些参数进行配置 ,不同的配置会对我们项目有哪些影响这些都不太明确。然后我决定对着概念进行梳理。

API 级别

API 级别是一个对 Android 平台版本提供的框架 API 修订版进行唯一标识的整数值。

Android 平台提供了一种框架 API,应用可利用它与底层 Android 系统进行交互。 该框架 API 由以下部分组成:

  • 一组核心软件包和类
  • 一组用于声明清单文件的 XML 元素和属性
  • 一组用于声明和访问资源的 XML 元素和属性
  • 一组 Intent
  • 一组应用可请求的权限,以及系统中包括的权限强制执行。
    每个后续版本的 Android 平台均可包括对其提供的 Android 应用框架 API 的更新。

框架 API 更新的设计用途是使新 API 与早期版本的 API 保持兼容。 也就是说,大多数 API 更改都是新增更改,会引入新功能或替代功能。 在 API 的某些部分得到升级时,旧版的被替换部分将被弃用,但不会被移除,这样现有应用仍可使用它们。 在极少数情况下,可能会修改或移除 API 的某些部分,但通常只有在为了确保 API 稳健性以及应用或系统安全性时,才需要进行此类更改。 所有其他来自早期修订版的 API 部分都将结转,不做任何修改。

Android 平台提供的框架 API 使用叫做“API 级别”的整数标识符指定。 每个 Android 平台版本恰好支持一个 API 级别,但隐含了对所有早期 API 级别(低至 API 级别 1)的支持。 Android 平台初始版本提供的是 API 级别 1,后续版本的 API 级别递增。

下表列出了各 Android 平台版本支持的 API 级别

如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion_第1张图片
API 级别

compileSdkVersion

compileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用。使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。

需要强调的是修改 compileSdkVersion 不会改变运行时的行为。当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。(你真的应该修复这些警告,他们的出现一定是有原因的)

因此我们强烈推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免新弃用的 API ,并且为使用新的 API 做好准备。

注意,如果使用 Support Library,那么使用最新发布的 Support Library 就需要使用最新的 SDK 编译。例如,要使用 23.1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 23 (大版本号要一致!)。通常,新版的 Support Library 随着新的系统版本而发布,它为系统新增加的 API 和新特性提供兼容性支持。

minSdkVersion

一个用于指定应用运行所需最低 API 级别的整数。 如果系统的 API 级别低于该属性中指定的值,Android 系统将阻止用户安装应用。 您应该始终声明该属性。

这里值得注意的地方是我在创建应用时,就应该选择好我们的向下最低兼容版本 ,我们可以先了解现在市场上手机各个版本的占有情况 “平台版本”信息中心页面 通过这个来帮助我们的选择,通过分析 Android 4.1x 一下的版本占有率仅为 1% , 我们大概可以忽略 Android 4.1x 已下的版本兼容。

如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion_第2张图片
Android 平台版本的相对数量设备的相关数据

注意:如果您不声明该属性,系统将假定默认值为“1”,这表示您的应用兼容所有 Android 版本。 如果您的应用并不兼容所有版本(例如,它使用 API 级别 3 中引入的 API),并且您尚未声明正确的 minSdkVersion,则当应用安装在 API 级别小于 3 的系统上时,应用将在运行时尝试访问不可用的 API 时发生崩溃。 因此,请务必在 minSdkVersion 属性中声明合适的 API 级别。

maxSdkVersion

一个指定作为应用设计运行目标的最高 API 级别的整数。

警告:不建议声明该属性。 首先,没有必要设置该属性,将其作为阻止您的应用部署到 Android 平台新发布版本上的一种手段。 从设计上讲,新版本平台完全向后兼容。 只要您的应用只使用标准 API 并遵循部署最佳实践,应该能够在新版本平台上正常工作。 其次,请注意在某些情况下,声明该属性可能导致您的应用在系统更新至更高 API 级别后被从用户设备中移除。 大多数可能安装您的应用的设备都会定期收到 OTA 系统更新,因此您应该在设置该属性前考虑这些更新对您的应用的影响。

targetSdkVersion

最重的概念 一个用于指定应用的目标 API 级别的整数。如果未设置,其默认值与为 minSdkVersion 指定的值相等。

该属性用于通知系统,您已针对目标版本进行测试,并且系统不应启用任何兼容性行为来保持您的应用与目标版本的向前兼容性。 targetSdkVersion 是 Android 提供向前兼容的主要依据,在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化。

要让您的应用与各 Android 版本保持同步,并且需要新版本的功能效果,您应该增加该属性的值,使其与最新 API 级别一致,然后在相应平台版本上对您的应用进行全面测试

buildToolsVersion

buildToolsVersion 是 Android SDK 构建工具,是构建 Android 应用程序所需的 Android SDK 的一个组件。它安装在 /build-tools/ 目录中,它只是构建工具。

如图,我们可以看出 SDK platforms 是我们下载的最新Android SDK 编译版本,前面提到的 compileSdkVersion,而 SDKTools 则是我们下载编译工具。您应该始终通过使用Android SDK Manager 下载最新版本来更新构建工具组件。

如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion_第3张图片
SDK Manager

总结 注意事项

如果你按照上面示例那样配置,你会发现这三个值的关系是:

minSdkVersion <= targetSdkVersion <= compileSdkVersion ( buildToolsVersion )

这种直觉是合理的,如果 compileSdkVersion 是你的最大值,minSdkVersion 是最小值,那么最大值必需至少和最小值一样大且 target 必需在二者之间。

理想上,在稳定状态下三者的关系应该更像这样:

minSdkVersion  (lowest possible ) <=  targetSdkVersion == compileSdkVersion ( latest SDK )

总结一句话:
用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 target 和 compile 来获得最好的外观和行为。

参考文章

https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#considerations
https://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion-targetsdkversion/

你可能感兴趣的:(如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion)