Android基础概念

android {
  compileSdkVersion 23
  buildToolsVersion “23.0.1”
  defaultConfig {
    applicationId “com.example.checkyourtargetsdk"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName “1.0”
  }

以上是Android工程里名称为app的module的build.gradle文件其中的内容,涉及到的概念如下

minSdkVersion

我们的app能够运行的最小版本,如果选择15,那么就是Android 4.0.3 以及以上的设备才能运行我们app,如果小于这个版本,那么抱歉运行不了,我们不支持。这是应用程序支持api的下限。这也是应用商店判断这个应用是否能运行在设备上的一个依据之一。

compileSdkVersion

一句话总结,是编译环境下的SDK版本
例如指定的是23,编译环境使用的API就是6.0版本,注意改变编译版本号,本质上改变不了我们程序的运行,虽然可能会报错误❌或者警告⚠️,但compileSdkVersion 只会在编译期间起作用,因为环境是compileSdkVersion这个版本的SDK,所以你可以用一些这个版本的API,但是只是IDE给你的便利性帮助而已,帮助你检测代码,避免使用一些弃用的API。就算你用个低版本的compileSdkVersion,你依然可以那么写,但是可能会报错,报警告,但是你强制打包,其实也是没有问题的。IDE只是个工具,他的环境也只是工具的环境,不代表你应用运行时的表现。所以建议有两个可供选择。

  • 指定compileSdkVersion为最新的,这样我们可以使用到最新SDK的API方法和机制。
  • compileSdkVersion与targetSdkVersion保持一致.

另外注意如果我们使用了比如V4,V7包,有没有发现必须和compileSdkVersion的版本相匹配,比如我们compileSdkVersion = 26,那么V4,v7的版本也要相应的是26.xx.xx,首位的26必须一致,后两位没有要求,就是说明编译所依赖的SDK和依赖包必须是统一版本,不然两个不兼容,编译会通不过。同时也是为了使用该版本的新特性。

targetSdkVersion

简单的说就是你的应用已经针对这个版本的手机,做了充分的兼容性处理和测试性处理,比如 if(Build.VERSION.SDK_INT >= 23) { ... } ,这样针对不同的SDK版本做不同的处理,这就说明我们不能随便的改变targetSdkVersion得值,我们必须做好充足的兼容性处理和测试处理才行。

在 Android 4.4 (API 19)以后,AlarmManager 的 set() 和 setRepeat() 这两个 API 的行为发生了变化。在 Android 4.4 以前,这两个 API 设置的都是精确的时间,系统能保证在 API 设置的时间点上唤醒 Alarm。因为省电原因 Android 4.4 系统实现了 AlarmManager 的对齐唤醒,这两个 API 设置唤醒的时间,系统都对待成不精确的时间,系统只能保证在你设置的时间点之后某个时间唤醒。虽然api的名字没有改变,但是功能结果已经发生改变,我们设置targetSdkVersion为16,Android4.4之前,那么我们在Android4.4之后运行会出现什么呢?难道就不能用了吗?不准确了吗?
当然不是,系统通过targetSdkVersion来保证Android的向前兼容性,在Android4.4之后的设备上,系统会判断你的targetSdkVersion是否小于19,如果小于的话,那就按照19之前的api方法,如果大于等于19,那么就按照之后的api方法来走,保证了程序运行的一致性。也就是向前兼容性。

但是还有一个问题:

Android 6.0新增加了动态权限申请,我们的targetSdkVersion是5.0,如果我们运行在Android 6.0的设备上怎么办?
因为我们这个可以向前兼容,向后不行啊,如果你的代码里处理了Android 6.0的动态权限处理,那么可以的,如果没呢?你想啥呢大哥?更新应用处理呗~~

targetSdkVersion 的大部分更新变化都会记录在VERSION_CODES,所有的细节也会在每个版本的平台亮点写明。

targetSdkVersion保证的是api的一致性。
所以一般minSdkVersion <targetSdkVersion<= compileSdkVersion
不随意更改targetSdkVersion,更改targetSdkVersion必须做好兼容。

总结

一般设置为minSdkVersion <targetSdkVersion<= compileSdkVersion

推荐阅读更多精彩内容