宫缩是什么原因引起的compileSdkVersion,minSdkVersion和targetSdkVers。。。
在Android Studio项⽬的adle中,我们可以看到类似这样⼀段代码:
影楼化妆compileSdkVersion 27
defaultConfig {
applicationId "com.glh.fabdemo"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "st.runner.AndroidJUnitRunner"
苏州阳澄湖大闸蟹}
有那么一个女孩
缓解压力英语
其中有compileSdkVersion 、minSdkVersion 、targetSdkVersion 这三个属性⽐较特殊,本⽂将进⾏逐⼀讲解:清点
⼀.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 和新
特性提供兼容性⽀持。
当然,需要说明的是,部分Support Library中Level 不同,虽然调⽤⽅法⼀样,但源码可能有所改变。
⽐如我在 ⼀⽂中就提到,Level由24升为25后,recyclerView与floatingActionButton滚动显⽰、隐藏时,由于CoordinatorLayout源码发⽣改变,调⽤hide()就会出现隐藏后⽆法显⽰。
另外,还有⼀个buildToolsVersion。它是⽤于指定项⽬构建⼯具的版本.⽐如27.0.2。如果有更新的版本,Android Studio会进⾏提⽰。⼆.minSdkVersion
最⼩的SDK版本。
如果 compileSdkVersion 设置为可⽤的最新 API,那么 minSdkVersion 则是应⽤可以运⾏的最低要求。minSdkVersion 是 各⼤Android应⽤商店⽤来判断⽤户设备是否可以安装某个应⽤的标志之⼀。
在开发时 minSdkVersion 也起到⼀个重要⾓⾊:lint 默认会在项⽬中运⾏,它在你使⽤了低于 minSdkVersion 的 API 时会警告你,帮你避免调⽤不存在的 API 的运⾏时问题。如果只在较⾼版本的系统上才使⽤某些 API,通常使⽤运⾏时检查系统版本的⽅式解决。
请记住,你所使⽤的库,如 Support Library 或 Google Play rvices,可能有他们⾃⼰的 minSdkVer
sion 。你的应⽤设置的minSdkVersion 必需⼤于等于这些库的 minSdkVersion 。例如有三个库,它们的 minSdkVersion 分别是 4, 7 和 9 ,那么你的minSdkVersion 必需⾄少是 9 才能使⽤它们。在少数情况下,你仍然想⽤⼀个⽐你应⽤的 minSdkVersion 还⾼的库(处理所有的边缘情况,确保它只在较新的平台上使⽤),你可以使⽤ tools:overrideLibrary 标记,但请做彻底的测试!
三.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代码中不进⾏运⾏时权限的代码,你的应⽤程序就直接报错了。
看完上⾯,你的想法是不是:既然这样,那我把targetSdkVersion 设置低⼀点不就更保险了。
但作为⼀位有良知且有追求的开发⼈员,不建议这么做。
拿Android6.0引⼊的运⾏时权限来说,在Android6.0以前,⽤户必须同意所有的权限,才能安装app。但其实,很多权限其实是不合理的。以QQ 7.5.5.3460版本为例,这⾥它的权限部分截图:
我在使⽤QQ过程中,压根就不需要新建/修改通话记录 这个权限,甚⾄在想"QQ团队要我这个权限⼲嘛?我就聊聊天,怎么和通话记录"有关呢?
引⽤6.0运⾏时权限后,⽤户不需要在安装软件的时候⼀次性授权所有申请的权限,⽽是可以在软件的使⽤过程中再对某⼀项权限申请进⾏授权。还是拿QQ为例,即使我使⽤某⼀个功能时需要新建/新建通话记录权限,当时我拒绝了===>带来的结果是这⼀个功能或⼏个功能不能使⽤,但QQ整体还是可以⽤来愉快聊天的。
所以将 target 更新为最新的 SDK 是所有应⽤都应该优先处理的事情。
但这不意味着你⼀定要使⽤所有新引⼊的功能,也不意味着你可以不做任何测试就盲⽬地更新 targetSdkVersion ,请⼀定在更新targetSdkVersion 之前做测试!尤其是国产⼿机各种⼚商定制。并且在开发过程中,还有⼀种可能,产品经理要求你在运⾏时权限这⾥有这样的需求:⽤户拒绝某项权限后,可以直接跳到修改权限的界⾯(即设置/权限管理这⾥),或者⽤户第⼀次拒绝后,⽤户第⼆次操作这个按钮或界⾯时,再次出现权限的提⽰。
由于国产⼿机的多样化,单纯这⼀个需求,就够你呛的。当然,GitHub上已经有了很多开源的项⽬,对android各个版本都进⾏了兼容,且维护较好。
胃药广告
总⽽⾔之:关于targetSdkVersion设置的值,需要⾃⼰把握度——既要为⽤户考虑,提升⾃⼰的能⼒,也要避免坑⾃⼰。
四.综合来看
如果你细⼼的话,你会发现这三个值的关系是:
minSdkVersion<=targetSdkVersion<=compileSdkVersion
这种直觉是合理的,如果 compileSdkVersion 是你的最⼤值,minSdkVersion 是最⼩值,那么最⼤值必需⾄少和最⼩值⼀样⼤且targetSdkVersion 必需在⼆者之间。
理想上,在稳定状态下三者的关系应该更像这样:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
⽤较低的 minSdkVersion 来覆盖最⼤的⼈群,⽤最新的 SDK 设置 targetSdkVersion 和 compileVersion 来获得最好的外观和⾏为。广州国企
五.附:Android SDK版本
这是⽬前Android发布的SDK常见版本。
另外,在代码中进⾏判断时,往往采⽤如下代码: Build.VERSION.SDK_INT>=Build.VERSION_CODES.M 如果存在差异,在不同的版本中通过if进⾏判断。