参考

Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion

1、minSdkVersion

其实说来话长,我还是长话短说。minSdkVersion表示应用可以运行的最低要求。大白话就是如果手机系统版本对应的SdkVersion低于minSdkVersion就安装不上。

2、compileSdkVersion

compileSdkVersion表示编译应用时使用的SDK的版本,其实也就是告诉开发人员SDK中哪些API能用,哪些API不能用。compileSdkVersion只作用于应用的编译时期,对应用的运行时没有任何影响,因为它根本不会被打包进APK中。新的SDK可能会有一些类、方法、接口的变动,所以如果更新compileSdkVersion有可能会报编译时错误或编译时警告,必须修复错误才能正常编译。比如compileSdkVersion从21更新到23后,由于6.0的SDK移除了HttpClient这个类,所以如果项目中使用到了HttpClient就会报错。Android强烈建议总是使用最新的SDK进行编译,这样就可以避免使用新弃用的API同时为使用新的API做好准备。

compileSdkVersion gradle版本 compilesdkversion什么意思_Android

如上图,compileSdkVersion=21时使用HttpClient是一切正常的。

如果我们把compileSdkVersion更新到23,再来看同一段代码:

compileSdkVersion gradle版本 compilesdkversion什么意思_运行时权限_02


已经报错。原因就是上面所说了。

3、targetSdkVersion

targetSdkVersion是Android专门用来做各个系统兼容的。这样,在老版本系统上开发的程序在新版本上仍然可以正常运行。比如我们的应用在适配6.0之前targetSdkVersion一直是19,Android6.0的一大更新就是运行时权限,但是我们应用在Android6.0的设备上运行起来各个功能也是很正常的,并没有在需要权限操作的时候让我们去手动获取。这就是targetSdkVersion的作用,向前兼容,只要targetSdkVersion还没有更新到目标设备的值,那么应用运行出来就不会表现出目标设备新的特性。如下图,模拟器是6.0的系统,程序很简单,就是一个简单的打电话的功能,此时targetSdkVersion=19,运行起来看一些,没问题,一切正常。

compileSdkVersion gradle版本 compilesdkversion什么意思_Android_03

然后我们把targetSdkVersion升级到23(注意:compileSdkVersion应该大于等于targetSdkVersion) ,然后相同代码再运行起来看看。

compileSdkVersion gradle版本 compilesdkversion什么意思_Android_04

竟然报错了。其实这就是对上面加粗的文字的体现了。targetSdkVersion更新到了23,那么应用运行在6.0的手机上就会被要求有运行时权限获取的功能(展现出目标设备的新特性),但是我们代码里并没有做相应的处理,自然报错crash了。当然,在真实的项目中需要权限的地方肯定不止一处,所以得经过全面的修改和充分的测试才能将更新推送给用户。

4、三者大小比较

综合起来看:
minSdkVersion<=targetSdkVersion<=compileSdkVersion
稳定情况下(推荐):
minSdkVersion<=targetSdkVersion==compileSdkVersion

5、总结

实际开发中:利用较低的minSdkVersion来覆盖尽可能多的设备,利用最新的sdk来设置target和compile来获得最新的外观和功能。