compileSdkVersion指的是你当前android sdk的版本

minSdkVersion指的是应用最低兼容的android sdk版本

targetSdkVersion指的是应用向前兼容的android sdk版本

buildToolsVersion指的是当前构建工具的版本

minSdkVersion<=targetSdkVersion<=compileSdkVersion

理想情况下:用较低的 minSdkVersion 来覆盖最大的人群,用最新的 SDK 设置 target 和 compile 来获得最好的外观和行为。

详细介绍
compileSdkVersion: 
告诉 Gradle 用哪个 Android SDK 版本编译你的应用,不会被包含到 APK 中,它纯粹只是在编译的时候使用。

推荐总是使用最新的 SDK 进行编译。在现有代码上使用新的编译检查可以获得很多好处,避免新弃用的 API ,并且为使用新的 API 做好准备。

注意,如果使用 Support Library ,那么使用最新发布的 Support Library 就需要使用最新的 SDK 编译。例如,要使用 23.1.1 版本的 Support Library ,compileSdkVersion 就必需至少是 23 (大版本号要一致!)。通常,新版的 Support Library 随着新的系统版本而发布,它为系统新增加的 API 和新特性提供兼容性支持。

minSdkVersion: 
minSdkVersion 则是应用可以运行的最低要求。minSdkVersion 是 Google Play 商店用来判断用户设备是否可以安装某个应用的标志之一。

请记住,你所使用的库,如 Support Library 或 Google Play services,可能有他们自己的 minSdkVersion 。你的应用设置的 minSdkVersion 必需大于等于这些库的 minSdkVersion 。例如有三个库,它们的 minSdkVersion 分别是 4, 7 和 9 ,那么你的 minSdkVersion 必需至少是 9 才能使用它们。如果指明了这个属性,并且在项目中使用了高于这个API level的API, 那么会在编译时报错。在少数情况下,你仍然想用一个比你应用的 minSdkVersion 还高的库(处理所有的边缘情况,确保它只在较新的平台上使用),你可以使用 tools:overrideLibrary 标记,但请做彻底的测试!

targetSdkVersion: 
targetSdkVersion is the main way Android provides forward compatibility

targetSdkVersion 是 android 系统提供前向兼容的主要手段。这是什么意思呢?随着 Android 系统的升级,某个系统的 API 或者模块的行为可能会发生改变,但是为了保证老 APK 的行为还是和以前兼容。只要 APK 的 targetSdkVersion 不变,即使这个 APK 安装在新 Android 系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的前向兼容性。

举个例子: 
在 Android 4.4 (API 19)以后,AlarmManager 的 set() 和 setRepeat() 这两个 API 的行为发生了变化。在 Android 4.4 以前,这两个 API 设置的都是精确的时间,系统能保证在 API 设置的时间点上唤醒 Alarm。因为省电原因 Android 4.4 系统实现了 AlarmManager 的对齐唤醒,这两个 API 设置唤醒的时间,系统都对待成不精确的时间,系统只能保证在你设置的时间点之后某个时间唤醒。

这时,虽然 API 没有任何变化,但是实际上 API 的行为却发生了变化,如果老的 APK 中使用了此 API,并且在应用中的行为非常依赖 AlarmManager 在精确的时间唤醒,例如闹钟应用。如果 Android 系统不能保证兼容,老的 APK 安装在新的系统上,就会出现问题。

Android 系统是怎么保证这种兼容性的呢?这时候 targetSdkVersion 就起作用了。APK 在调用系统 AlarmManager 的 set() 或者 setRepeat() 的时候,系统首先会查一下调用的 APK 的 targetSdkVersion 信息,如果小于 19,就还是按照老的行为,即精确设置唤醒时间,否者执行新的行为。

使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是不支持的(比如:低版本不存在这个api),那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError.这个错误也就是说,此属性不会帮你解决兼容性的测试问题。因此你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的。

targetSdkVersion只是在新老版本都有某功能的情况下,对该功能进行兼容(比如上面的闹钟的例子);但老版本没有某功能的情况下,targetSdkVersion就无能为力了。

compileSdkVersion,minSdkVersion,targetSdkVersion还有buildToolsVersion的区别相关推荐

  1. build.gradle 中compileSdkVersion,minSdkVersion,targetSdkVersion,buildToolsVersion的意思

    compileSdkVersion: 编译版本:compileSdkVersion告诉gradle使用哪个版本AndroidSDK编译你的应用: minSdkVersion: 最低SDK版本:他代表的 ...

  2. 安卓开发——升级compileSdkVersion、targetSdkVersion、buildToolsVersion、support包到最新(28)问题解决

    最近给项目升级sdk版本: compileSdkVersion:26 -> 28 targetSdkVersion:23 -> 28 buildToolsVersion:"25. ...

  3. minSdkVersion = targetSdkVersion = compileSdkVersion

    minSdkVersion <= targetSdkVersion <= compileSdkVersion 理想情况 minSdkVersion (lowest possible) &l ...

  4. minSdkVersion、compileSdkVersion和targetSdkVersion

    从Eclipse转到AS以后,一直用着最新的各种版本号,对于这三个参数还没有仔细研究过,正好最近对三年前的一个APP进行升级时才发现这里面还是有区别的 1.minSdkVersion:没啥好说的,就是 ...

  5. 如何设置compileSdkVersion, minSdkVersion, and targetSdkVersion

    最近看到了一片国外的资料,google开发工程师贡献的一片如何设置compileSdkVersion, minSdkVersion, and targetSdkVersion,讲的很官方很正解,收藏一 ...

  6. Android 面试 - compileSdkVersion、minSdkVersion、targetSdkVersion、buildToolsVersion

    在Android的module级build.gradle里,有着为数不少的Version,其中最重要的有以下几个:compileSdkVersion.buildToolsVersion.minSdkV ...

  7. 浅谈Android各版本sdk区别

    转载地址:http://blog.csdn.net/itluochen/article/details/52688935 目录(?)[-] SDK目录 add-ons docs extras plat ...

  8. Android + OpenCV 入门教程笔记(保姆级)

    笔记基于Android+openCV培训进行记录 源码:github 记录不易,喜欢的可以给个三连,感谢感谢!!! OpenCV概述 什么是OpenCV OpenCV是一个基于Apache2.0许可( ...

  9. Vitamio使用篇,打造强悍的视频播放器

    Vitamio是一个优秀的Android视频框架,很多人也在用,所以这篇文章就是带大家接入Vitamio并且使用的 首先我们要明白一个需求就是,我们需要做一个视频播放器,那这样的话,我们首先想到的就是 ...

最新文章

  1. android开发调用照相机
  2. html5 java交互_html5+jquery与ssm进行json交互集成项目
  3. 需求用例分析之六:业务用例之科伯恩系
  4. 七十八、Antd 实现 TodoList 页面布局和Redux入门
  5. jcmd_程序化JCMD访问
  6. 将文件中所有数读到一个数组中_「数据结构与算法」将5个文件中的一千万年龄合并到一个新文件中...
  7. 五个角度,来梳理下产品经理的分类和职业发展方向
  8. 基类成员的public访问权限在派生类中变为_第17篇:C++继承中虚表的内存布局
  9. 2021温州市高考成绩查询,温州2021高考成绩排名榜单,温州各高中高考成绩喜报
  10. TCP/IP笔记 三.运输层(3)——TCP超时重传算法
  11. Nginx 安装使用
  12. 一键安装 kX3552 ProFX312 UFX52 程序
  13. Linux7系统克隆到另一个硬盘,Ubuntu14.04 dd命令克隆系统镜像安装到另一台机器上...
  14. 八皇后算法带给我们的启示吧
  15. YYC松鼠聚合直播系统添加图片上传视频提示网络错误的问题解决方案
  16. [附源码]java毕业设计政府公用车辆管理系统
  17. 世界道路协会(PIARC)道路安全手册(RSM)
  18. 《逆袭大学——传给IT学子的正能量》目录
  19. linux meld
  20. 丰田将在所有销售店安装充电设备丰田章男社长“建立共享基础设施”

热门文章

  1. status_code想要得到302却得到200_曼联华裔小妖接尤文3.5万周薪合同,签约费200万!意甲要挖空曼联...
  2. bootstraptable 列隐藏_bootstrapTable 隐藏某一列
  3. sizeof()与strlen()的区别与联系
  4. GitLab 已迁移至谷歌云平台,并表示目前运行良好
  5. 《Netty In Action》第二章:第一个Netty程序
  6. 893B. Beautiful Divisors#美丽的因子(打表法)
  7. Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
  8. linux下rpm包和命令使用简介
  9. MyBatis实现与插件开发
  10. MySQL中查询时对字母大小写的区分