1、compileSdkVersion:Android SDK编译版本号
compileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用。使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免使用弃用的 API ,并且为使用新的 API 做好准备。
需要强调的是:修改 compileSdkVersion 不会改变运行时的行为。当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用。
另外,还有一个buildToolsVersion。它是用于指定项目构建工具的版本,比如27.0.2。如果有更新的版本,Android Studio会进行提示。
2、minSdkVersion:最小的Android SDK版本号
minSdkVersion 是应用可以运行的最低要求。minSdkVersion 是各大 Android 应用商店用来判断用户设备是否可以安装某个应用的标志之一。
在开发时 minSdkVersion 也起到一个重要角色:lint 默认会在项目中运行,它在你使用了低于 minSdkVersion 的 API 时会警告你,帮你避免调用不存在的 API 的运行时问题。如果只在较高版本的系统上才使用某些 API,通常使用运行时检查系统版本的方式解决。
请记住,你所使用的库,如 Support Library 或 Google Play services,可能有他们自己的 minSdkVersion 。你的应用设置的 minSdkVersion 必需大于等于这些库的 minSdkVersion 。例如有三个库,它们的 minSdkVersion 分别是 4、7和9 ,那么你的 minSdkVersion 必需至少是9才能使用它们。在少数情况下,你仍然想用一个比你应用的 minSdkVersion 还高的库(处理所有的边缘情况,确保它只在较新的平台上使用),你可以使用 tools:overrideLibrary 标记,但请做彻底的测试!
3、targetSdkVersion:为了系统兼容的Android SDK版本号
三个版本号中最有趣的就是 targetSdkVersion 了。 targetSdkVersion 是 Android 提供向前兼容的主要依据,在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化。这允许你在适应新的行为变化之前就可以使用新的 API (因为你已经更新了 compileSdkVersion 不是吗?)。
targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特征。比如,Android 6.0 系统引用了运行时权限这个功能,如果你将 targetSdkVersion 指定为23或者更高,那么系统就会为你的程序启动运行时权限。如果你将 targetSdkVersion 指定为22,那么就说明你的程序最高只在 Android 5.1 系统上做过充分的测试,Android 6.0 系统中引入的新功能就不会启动了。
说通俗一点:比如你将 targetSdkVersion 设置为22,涉及某个(或某几个)权限,你直接在 AndroidManifest 中配置权限即可,然后在java代码中进行获取权限后的逻辑处理即可。但如果你将 targetSdkVersion 设置为23或更高,你除了在 AndroidManifest 中配置权限外,还需要在java代码中判断用户是否同意权限,如果同意,执行什么业务操作;如果不同意,执行什么业务操作(一般是提示某某权限被拒后,某某功能无法正常使用)。如果你只在AndroidManifest 中配置了权限,targetSdkVersion 又大于等于23,Java代码中不进行运行时权限的代码,你的应用程序就直接报错了。
举个例子:
高版本手机兼容:targetSdkVersion=20,当运行在系统10.0,SDK_INT=29的设备上时,调用SDK 20的版本API,即使当前手机的特性已经改变,但是还是运行SDK 20的API。
低版本手机兼容:targetSdkVersion=29,当运行在系统8.1,SDK_INT=27的设备上时,调用SDK 29的版本API,用到新API要做好兼容:
if(Build.VERSION.SDK_INT < 29) {
...
} else {
....
}
targetSdkVersion 不能随便调整。如果targetSdkVersion=29,那就要做好29以前所有版本的兼容。
4、总结
三个值的关系是:minSdkVersion<=targetSdkVersion<=compileSdkVersion
理想情况下,三者的关系应该更像这样:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 targetSdkVersion 和 compileVersion 来获得最好的外观和行为。
附录
Android 平台版本和 API 级别的对应关系:
https://developer.android.google.cn/guide/topics/manifest/uses-sdk-element
网友评论