android中的VERSION和VERSION_CODES和compileSdkVersion, minSdkVersion 和 targetSdkVersion理解

一 背景

经常会有代码中用到  Build.VERSION.SDK_INT < Build.VERSION_CODES.O ,这是指什么意思。

在app项目中,经常会看到

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"
    defaultConfig {
        applicationId "com.yl.qrcode"
        minSdkVersion 19
        targetSdkVersion 30
....
那么compileSdkVersion, minSdkVersion 和 targetSdkVersion 三者之间到底有什么区别

二 安卓系统版本的理解

对于VERSION和VERSION_CODES 是针对设备而言的,Build.VERSION.SDK_INT 是指设备当前运行的安卓sdk api的版本,而android系统的版本

1.VERSION和VERSION_CODES的理解

比如使用SDK_INT判断设备系统版本的示例代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// 当设备系统版本大于等于Android 5.0时执行的代码
// 可以在此处使用新版API和特性
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 当设备系统版本大于等于Android 4.4时执行的代码
// 可以在此处使用较新的API和特性,但不支持最新的API和特性
} else {
// 当设备系统版本小于Android 4.4时执行的代码
// 需要进行旧版本的兼容处理
} 

兼容性代码就是指在某种设备的安卓api版本下,程序需要运行哪一串逻辑去处理不同的安卓版本的API的不同或者其它的逻辑流程的不同。

总结:Build.VERSION.SDK_INT 和  Build.VERSION_CODES  是针对当前设备而言的判断。通过获取设备运行的安卓版本信息,来执行具体的兼容性代码。

2. 安卓系统版本和安卓api版本关系列表

不再记录这个,因为到处都是。

 

三  compileSdkVersion 、minSdkVersion 、targetSdkVersion 这三个属性的理解

1.compileSdkVersion

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

2.minSdkVersion 

最小的SDK版本。

如果 compileSdkVersion 设置为可用的最新 API,那么 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

三个版本号中最有趣的就是 targetSdkVersion 了。 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代码中不进行运行时权限的代码,你的应用程序就直接报错了。

总结:compileSdkVersion 、minSdkVersion 、targetSdkVersion 是针对你的应用运行的行为设置的,特别要注意minSdkVersion,表示的是你的应用最低兼容的运行的android设备版本,targetSdkVersion 还有向前兼容的功能以及决定了你的应用需要为向前兼容做的适配。

posted @ 2023-09-15 10:34  不卷轮子锅  阅读(853)  评论(0编辑  收藏  举报