各种 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
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/10311389.html