Android compileSdkVersion, minSdkVersion 和 targetSdkVersion 之间的关系
Android 为了保持向前兼容
,使用 compileSdkVersion
minSdkVersion
和 targetSdkVersion
分别控制可以使用哪些 API ,要求的 API 级别是什么,以及应用的兼容模式。
API level 是 Android 向开发者提供的一套 Framework(android.jar)的代号,可能发布了新的系统版本,但是这一套接口并没有变化,所以就不必提供新的 Framework 开发包,所以 API level 也不必改变。由此可知Android 系统版本和 API level 是多对一的关系。由于 API level 就是发布的 android.jar 的代号,所以 API level 和 sdk 中 platforms 目录中的各个 android.jar 是一一对应的。
Android 系统版本是给用户看的,而 API level 是给应用程序开发者看的。
compileSdkVersion 编译版本
compileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用,即使用哪个版本的 android.jar
。使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。
修改 compileSdkVersion 不会改变运行时的行为。
当修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误。新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。而且这些警告应该修复,它们出现是有原因的。
推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免使用弃用的 API ,并且为使用新的 API 做好准备。
注意,如果使用支持库,那么支持库的版本要和编译版本兼容。例如,要使用 23.1.1 版本的支持库,compileSdkVersion 就必需至少是 23 (大版本号要一致)。通常,新版的 Support Library 随着新的系统版本而发布,它为系统新增加的 API 和新特性提供兼容性支持。
minSdkVersion 最低兼容版本
一个用于指定应用运行所需最低 API 级别的整数。如果手机系统的版本低于该属性中指定的值,应用将无法安装。
决定使用哪个 minSdkVersion 应该参考当前的Android 分布统计,它显示了最近 7 天所有访问 Google Play 的设备信息。 这是一个商业决策问题,取决于为了支持额外 3% 的设备,确保最佳体验而付出的开发和测试成本是否值得。
第三方库可能有他们自己的 minSdkVersion,应用的 minSdkVersion 必需大于等于这些库的 minSdkVersion 。在少数情况下,你仍然想用一个比你应用的 minSdkVersion 还高的库,可以使用 tools:overrideLibrary 标记,但要做全面的测试。
targetSdkVersion 目标版本号
Android 会随新版本的推出而逐渐发展,在此过程中,某些行为乃至外观可能会发生变化。不过,如果平台的 API 级别高于应用 targetSdkVersion 所声明的版本,系统便可通过启用兼容性行为,确保应用继续以您所期望的方式工作。
targetSdkVersion 是 Android 提供向前兼容的主要依据,在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化。这允许你在适应新的行为变化之前就可以使用新的 API (因为你已经更新了 compileSdkVersion)。
例如,Android 6.0 变化文档中谈了 target 为 API 23 时会如何把你的应用转换到运行时权限模型上,Android 4.4 行为变化阐述了 target 为 API 19 及以上时使用 set() 和 setRepeating() 设置 alarm 会有怎样的行为变化。
由于某些行为的变化对用户是非常明显的(弃用的 menu 按钮,运行时权限等),所以将 target 更新为最新的 SDK 是所有应用都应该优先处理的事情。但这不意味着你一定要使用所有新引入的功能,也不意味着你可以不做任何测试就盲目地更新 targetSdkVersion ,请一定在更新 targetSdkVersion 之后做测试。
targetSdkVersion 所暗示的许多行为变化都记录在 VERSION_CODES 文档中了,在这个 API Level 表中可以方便地找到相应的链接。
总结
三者之间的关系如下:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
compileSdkVersion 是最大值,minSdkVersion 是最小值,那么最大值必需至少和最小值一样大且 targetSdkVersion 必需在二者之间。
理想情况应该是:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
用较低的 minSdkVersion 来覆盖最大的人群,用最新的 targetSdkVersion 和 compileSdkVersion 来获得最好的外观和最新的行为。
参考
[1] 谷歌开发者文档
[2] Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion
[3] Android Development Patterns