compileSdkVersion和targetSdkVersion的区别

Android面试技术要点汇总
2021-05-17 14:29 · 阅读时长4分钟
小课

compileSdkVersiontargetSdkVersion是在Android开发中常见的配置,而且这两个配置的一般都是同一个版本,那他们之间有什么区别呢?在修改这两个配置的时候需要考虑什么?

首先,compileSdkVersiontargetSdkVersion两个配置都与版本兼容有关,也就是说升级这两个配置之前一定要考虑到可能兼容问题,下面看看具体是这两者的区别,以及为什么在升级之前要慎重考虑。

一、compileSdkVersion介绍

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介绍

targetSdkVersion是向后兼容非常重要的依据,换句话说,如果有一个功能Android新老版本系统上的表现是不一样的,而目前运行应用的系统是新系统,那么系统就有两种选择,一是按老版本的逻辑处理,二是按新版本的逻辑处理,那么如何来选择就要看应用的targetSdkVersion了,如果这个功能是在targetSdkVersion以后的版本改的,那么就按老逻辑走,如果是在targetSdkVersion之前的版本改的,那么久按新逻辑走。

比如说,Android 12更改了完全自定义通知的外观和行为,以前,自定义通知能够使用整个通知区域并提供自己的布局和样式,但是在Android 12之后,系统提供了一个标准的模板,保证所有通知保持外观一致。

加载中...

如果应用的targetSdkVersion小于31,即使应用运行的系统版本大于等Android 12,系统仍然会以之前的样式来显示自定义通知,但是如果targetSdkVersion大于等于31且运行系统大于Android 12的话,就会按照新的样式显示。

compileSdkVersion和targetSdkVersion的区别

参考:自定义通知

注释

但并不是所有的系统API变化都通过这种方式向后兼容,在Android系统新版本发布的时候会将变化分为两种:

  • 针对所有应用
  • 针对targetSdkVersion是新版本的应用

比如说Android 11(API 30)发布的单次授权功能,从 Android 11 开始,每当应用请求与位置信息、麦克风或摄像头相关的权限时,面向用户的权限对话框会包含仅限这一次选项,如果用户在对话框中选择此选项,系统会向应用授予临时的单次授权。这种情况,无论我们targetSdkVersion版本是否大于等于30,都会出现单次授权选项,我们需要对此进行兼容处理。

加载中...

参考:Android历史版本

注释
三、compileSdkVersion和targetSdkVersion的关系

即使compileSdkVersiontargetSdkVersion的作用完全不一样,但是它们之间还是有一定的关联,比如说targetSdkVersion不能高于compileSdkVersion,这很容易理解,如果compileSdkVersion低的话,使用了新API编译都通不过了,但是compileSdkVersion一般也没必要高于targetSdkVersion,因为使用了新API编译通过了,但是又不生效,看上去意义也不大,所以一般情况下,我们会让两者使用相同的版本。

compileSdkVersiontargetSdkVersionandroid