End

各种 sdk version 的意义

本文地址


目录

各种 sdk version 的意义

参考

一般情况,应做如下设置:

minSdkVersion <= 【targetSdkVersion】 <= compileSdkVersion == 当前Android发布的最新版本

即:用尽可能最低的 SDK 设置 minSdkVersion 来覆盖最大的人群,用尽可能最高的 SDK 设置 targetSdkVersion 和 compileVersion 来获得最好的外观和行为。

buildToolsVersion

用于指定项目构建工具的版本,如果有更新的版本,Android Studio会进行提示。

构建工具包括了打包工具aapt、dx、aidl等等,这个工具的目录位于sdk_path/build-tools/XX.XX.XX

这个版本号一般是API-LEVEL.x.x。例如28.0.3

可以用高版本的 build-tool 去构建一个低版本的 sdk 工程。

compileSdkVersion

SDK编译版本

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

最小支持的SDK版本

minSdkVersion 是应用可以运行的最低要求,是各大Android应用商店用来判断用户设备是否可以安装某个应用的标志之一。

在开发时 minSdkVersion 也起到一个重要角色:lint 默认会在项目中运行,它在你使用了高于 minSdkVersion 的 API 时会警告你,帮你避免调用不存在的 API 的运行时问题。如果只在较高版本的系统上才使用某些 API,通常使用运行时检查系统版本的方式解决。

注意,你所使用的库可能有他们自己的 minSdkVersion,你的应用设置的 minSdkVersion 必需大于等于这些库的 minSdkVersion。例如有三个库,它们的 minSdkVersion 分别是 4, 7 和 9 ,那么你的 minSdkVersion 必需至少是 9 才能使用它们。
在少数情况下,你仍然想用一个比你应用的 minSdkVersion 还高的库,你可以使用 tools:overrideLibrary 标记,但请做彻底的测试!

targetSdkVersion

三个版本号中最有趣、最重要的就是 targetSdkVersion 了。

如果要去适配某个版本,那么请将targetSdkVersion改为对应的版本号,点击 sync Now 即可。

targetSdkVersion 是 Android 提供向前兼容(兼容旧版本)的主要依据,在应用的 targetSdkVersion 没有更新之前系统不会应用最新的行为变化。这允许你在适应新的行为变化之前就可以使用新的 API(因为你已经更新了 compileSdkVersion 不是吗?)。

targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特征。比如,Android 6.0 系统引用了运行时权限这个功能,如果你将 targetSdkVersion 指定为23或者更高,那么系统就会为你的程序启动运行时权限;如果你将targetSdkVersion 指定为22,那么就说明你的程序最高只在Android 5.1系统上做过充分的测试,Android6.0系统中引入的新功能就不会启用了

说通俗一点,比如你将 targetSdkVersion 设置为22,涉及某个(或某几个)权限,你直接在mainfest中配置权限即可,然后在java代码中进行获取权限后的逻辑处理即可。
但如果你将 targetSdkVersion 设置为23或更高,你除了在mainfest中配置权限外,还需要在java代码中判断用户是否同意权限,如果同意,就可以执行具体的业务操作;如果不同意,提示某某权限被拒后某某功能无法正常使用。如果你只在mainfest中配置了权限,targetSdkVersion 又大于等于23,Java代码中不进行运行时权限的代码,你的应用程序就直接报错了。

看完上面,你的想法是不是:既然这样,那我把 targetSdkVersion 设置低一点不就更保险了。

这样做是可以的,但作为一位有良知且有追求的开发人员,不建议这么做,将 target 更新为最新的 SDK 是所有应用都应该优先处理的事情。

但这不意味着你一定要使用所有新引入的功能,也不意味着你可以不做任何测试就盲目地更新 targetSdkVersion,请一定在更新 targetSdkVersion 之前做测试!尤其是国产手机各种厂商定制。

总而言之,关于targetSdkVersion设置的值,需要自己把握度——既要为用户考虑,提升自己的能力,也要避免坑自己。

2019-1-23

posted @ 2019-01-23 20:54  白乾涛  阅读(418)  评论(0编辑  收藏  举报