向前兼容是 Android
应用非常重要的事情,用户在升级到新版 Android
系统时,用以前版本 SDK
构建的应用需要保证不会出现问题,这就是 compileSdkVersion
、minSdkVersion
、targetSdkVersion
的作用,他们分别控制可以使用哪些 API
,要求的最低 API
级别是什么,以及应用的兼容模式。
compileSdkVersion
compileSdkVersion
告诉 Gradle
用哪个版本的 Android SDK
编译你的应用,使用任何新添加的 API
就需要使用对应 Level
的 Android SDK
。修改 compileSdkVersion
不会改变运行时的行为,当修改了 compileSdkVersion
时可能会出现新的编译警告、编译错误,强烈推荐总是使用最新的 SDK
进行编译,避免弃用的 API
。此外,如果使用最新发布的 Support Library
就需要使用最新的 SDK
编译。例如使用 23.1.1
版本的 Support Library
,compileSdkVersion
就必需至少是 23
(大版本号要一致)。通常,新版的 Support Library
随着新的系统版本而发布,它为系统新增加的 API
和新特性提供兼容性支持。
minSdkVersion
minSdkVersion
是应用可以运行的最低 API 要求,也是 Google Play
商店用来判断用户设备是否可以安装某个应用的标志之一。在开发时 minSdkVersion
也起到一个重要角色,lint
默认会在项目中运行,它在我们使用了高于 minSdkVersion
的 API
时会警告我们,避免调用低版本不存在的 API
而导致在低版本设备上运行时的问题。如果只在较高版本的系统上才使用某些 API
,通常使用运行时检查系统版本的方式解决。此外要记住,我们所使用的库(如 Support Library
或 Google Play services
)可能有他们自己的 minSdkVersion
,我们应用设置的 minSdkVersion
要必需大于等于这些库的 minSdkVersion
。在少数情况下你可能仍然想用一个比你应用的 minSdkVersion
还高的库,这时可以使用 tools:overrideLibrary
标记配合代码调用处主动版本判断操作来实现。
targetSdkVersion
targetSdkVersion
是 Android
提供向前兼容的主要依据,在应用的 targetSdkVersion
没有更新之前系统不会应用最新的行为变化,这允许你在适应新的行为变化之前就可以使用新的 API
(因为你已经更新了 compileSdkVersion
)。譬如 targetSdkVersion
为 19
(对应为 Android4.4
),应用运行时最高只能使用 API 19
的新特性,即使代码中使用了 API 23
的新特性,实际运行时也不会使用该新特性。同样譬如 AlarmManger
的 set()
和 get()
方法,在 API 19
和之前的效果是不一样的,如果 targetSdkVersion
为 18
,无论运行手机是什么版本都是旧效果,如果 targetSdkVersion
为 19
则在 4.4
以上的手机上运行时就是新效果了。
总结
minSdkVersion
和 targetSdkVersion
与 compileSdkVersion
的另一个不同之处是它们会被包含进最终 APK
的 AndroidManifest.xml
文件中,他们的大小关系应该是 minSdkVersion <= targetSdkVersion <= compileSdkVersion
,而推荐的大小关系是 minSdkVersion(lowest possible) <= targetSdkVersion == compileSdkVersion(latest SDK
。