compileSdkVersion
和targetSdkVersion
是在Android开发中常见的配置,而且这两个配置的一般都是同一个版本,那他们之间有什么区别呢?在修改这两个配置的时候需要考虑什么?
首先,compileSdkVersion
和targetSdkVersion
两个配置都与版本兼容有关,也就是说升级这两个配置之前一定要考虑到可能兼容问题,下面看看具体是这两者的区别,以及为什么在升级之前要慎重考虑。
compileSdkVersion
是指定gradle使用哪个版本的SDK来编译当前项目。比如说,在Android 12(API 31)中发布了一个新的API,SplashScreen
它可以让我们很方便的实现闪屏动画,我们可以在主题中使用以下属性来自定义闪屏动画。
<item name="android:windowSplashScreenBackground">@color/...</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>
<item name="android:windowSplashScreenAnimationDuration">1000</item>
<item name="android:windowSplashScreenIconBackgroundColor">@color/...</item>
如果你想使用这些属性,那么你就需要把compileSdkVersion
升级到31及以上,否则编译器无法识别这些属性。但是话说回来了,即使我们升级compileSdkVersion
使用了SplashScreen
也不意味着所有的设备都能使用这个功能,那些系统版本低于12的设备仍然无法运行该功能,对于这些设备,我们需要做一些兼容方案。
另外一种情况是,一些API在Android 12以后就废弃了,如果我们使用了,在我们编译的时候,就会出现一些警告⚠️,提示我们这些API已经废弃了,应该谨慎使用。
参考:SplashScreen
注释targetSdkVersion
是向后兼容非常重要的依据,换句话说,如果有一个功能Android新老版本系统上的表现是不一样的,而目前运行应用的系统是新系统,那么系统就有两种选择,一是按老版本的逻辑处理,二是按新版本的逻辑处理,那么如何来选择就要看应用的targetSdkVersion
了,如果这个功能是在targetSdkVersion
以后的版本改的,那么就按老逻辑走,如果是在targetSdkVersion
之前的版本改的,那么久按新逻辑走。
比如说,Android 12更改了完全自定义通知的外观和行为,以前,自定义通知能够使用整个通知区域并提供自己的布局和样式,但是在Android 12之后,系统提供了一个标准的模板,保证所有通知保持外观一致。
如果应用的targetSdkVersion
小于31,即使应用运行的系统版本大于等Android 12,系统仍然会以之前的样式来显示自定义通知,但是如果targetSdkVersion
大于等于31且运行系统大于Android 12的话,就会按照新的样式显示。
参考:自定义通知
注释但并不是所有的系统API变化都通过这种方式向后兼容,在Android系统新版本发布的时候会将变化分为两种:
targetSdkVersion
是新版本的应用比如说Android 11(API 30)发布的单次授权
功能,从 Android 11 开始,每当应用请求与位置信息、麦克风或摄像头相关的权限时,面向用户的权限对话框会包含仅限这一次选项,如果用户在对话框中选择此选项,系统会向应用授予临时的单次授权。这种情况,无论我们targetSdkVersion版本是否大于等于30,都会出现单次授权选项,我们需要对此进行兼容处理。
参考:Android历史版本
注释即使compileSdkVersion
和targetSdkVersion
的作用完全不一样,但是它们之间还是有一定的关联,比如说targetSdkVersion
不能高于compileSdkVersion
,这很容易理解,如果compileSdkVersion
低的话,使用了新API编译都通不过了,但是compileSdkVersion一般也没必要高于targetSdkVersion,因为使用了新API编译通过了,但是又不生效,看上去意义也不大,所以一般情况下,我们会让两者使用相同的版本。