对compileSdkVersion、targetSdkVersion和minSdkVersion的理解

Android平台版本


1.Android版本号与API等级


不同的设备运行在不同的Android版本上,例如Android4.0和Android4.4。每一个交替更新的Android平台版本通常都会新增一些旧版本所不支持的API 。为了指明哪些API可用,每一个平台版本都会指定一个API等级。例如Android1.0对应的是API1。而Android4.4的API等级是19。我们可以使用API等级去声明我们的app所兼容的最低版本。在AndroidManiFest文件下的ManiFest 标签中声明minSDKVersion属性。

例如,在Android4.0中新增了Calendar Provider的相关API,如果这些API在我们的app中不起作用时,我们应当指定app的最低API等级为14,代码如下:


2. 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 和新特性提供兼容性支持。

3. targetSDKVersion


targetSDKVersion指的是app性能最佳的SDK版本(因为这个版本我们已经经过充分测试了,如果目标设备的版本正好与它一样,Android系统就不必为此程序开启兼容性检查判断的工作了)。 每一个更迭的Android版本都会为使用旧版本的app提供兼容性,因此当我们的应用使用到官方的API时,需要始终能够兼容到新的版本。

注意,指明了targetSDKVersion后并不是说我们的app不能运行在更高版本的Android系统中,但这个属性对于我们的app是否可以使用到新版本中的新特性来说很重要,如果我们不更新targetSDKVersion版本号,在你新的版本上运行的时候系统会假定我们的app 需要某些兼容的行为。

例如,在Android4.4的变化当中,为了电源的使用效率,系统会为为所有应用的Alarm服务使用批量启动的方式来处理相似的时间以激活设备。在以前的版本中,系统到点就会为我们单独去激活设备启动我们设置的服务,这样做比较准时但却耗电。这时候,如果我们的targetSDKVersion低于19,系统依然使用以前的做法,并不会按照4.4的新变化执行。

然而,如果我们的app使用了新版本中增加的API,但这些并不是主要的功能的时候,我们可以在运行时去检查 API等级,当API等级太低的时候,可以优雅的降低相应的特征,例如4.4以上才能使用的沉浸式状态了,如果API等级低于19,我们可以做相应的处理。在这种情况下,需要把minSDKVersion设置得尽可能低,但前提是满足 app的主要功能,接着,你需要使用以下的方法去比较当前设备的版本与API所需要的版本:

4.总结

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

minSdkVersion<=targetSdkVersion<=compileSdkVersion

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

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

官方文档

你可能感兴趣的:(对compileSdkVersion、targetSdkVersion和minSdkVersion的理解)