CompileSdkVersion 和 targetSdkVersion 有什么区别?
在 build.gradle (Module)
文件中,我们通常会看到 CompileSdkVersion
和 targetSdkVersion
的使用,比如下面是一个完整的 build.gradle (Module)
文件:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.example.processbarvertical"
minSdk 28
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.github.transferwise:sequence-layout:1.2.0'
}
一旦新的 Android SDK 版本发布,我们通常会更新这两个值。 但为什么这样做如此重要? 另外,为什么有两个SdkVersion,而我们通常将它们设置为相同的值呢?这篇文章,我们来解释一下 CompileSdkVersion
和 targetSdkVersion
是什么,以及他们的区别。
1 是什么
compileSdkVersion
和 targetSdkVersion
对于处理安卓中的向前兼容性至关重要,因此它们都与新 Android SDK 版本出现时的操作有关。
1.1 compileSdkVersion
compileSdkVersion
定义了 gradle 将使用哪个 Android SDK 版本来编译我们的应用程序。比如,在 Android 12 / API 31 中引入了一个新的功能,使我们能够轻松实现启动画面:
<item name="android:windowsSplashScreenBackground">@color/cyan_50</item>
<item name="android:windowsSplashScreenIconBackgroundColor">@color/cyan_200</item>
<item name="android:windowsSplashScreenAnimatedIcon">@color/ic_foreground</item>
<item name="android:windowsSplashScreenAnimationDuration">1000</item>
如果我们想在应用程序中使用该功能,我们必须:
- 在 Android Studio 中下载 API 31
- 在应用程序中将
compileSdkVersion
更新为 31
那么有人就要问了,有的手机没有升级到 Android 12 怎么办?对于那些版本低于 API 31 的用户/设备,我们必须提供一种替代方法来为那些无法访问此新 API 的旧设备显示上面这个新功能启动画面。同样,一些方法或属性可能会在此 Android SDK 版本中被弃用,其中一些甚至被删除。 这就是为什么一旦我们更新应用程序中的 compiledSdkVersion
,我们将经常在编译期间看到一些必须解决的警告和错误,比如下图:
但是单独更改 compileSdkVersion
并不会真正改变我们创建的应用程序的行为。那么安卓系统如何知道它是否可以使用此应用程序的新功能? 这就是 targetSdkVersion
发挥作用的地方。
1.2 targetSdkVersion
targetSdkVersion
是一个属性,它告诉系统应用程序是针对哪个安卓版本设计和测试的。
如果用户在安卓版本高于此应用中定义的 targetSdkVersion
的设备上运行您的应用程序,对于新的安卓功能,系统可能会引入一些向后兼容行为以确保此应用程序仍然以某种方式工作。比如说,在 Android 12 中,自定义通知的外观发生了变化。 以前他们可以使用整个通知区域,但在 Android 12 系统中,将标准模板应用于所有自定义通知,因此它们看起来更加一致。
如果我们的应用中设置 targetSdkVersion
低于 31,系统将假定此应用尚未测试该功能并将以旧方式显示通知,以将通知无法正确显示的风险降至最低。只有将目标 SDK 版本更新为 31 后,才会使用新的通知外观。
2 compileSdkVersion
和 targetSdkVersion
的关系
即使 compileSdkVersion
和 targetSdkVersion
的含义完全不同,它们显然也不是独立的。
简单地说,targetSdkVersion
不能高于 compileSdkVersion
。理想情况下,compileSdkVersion
和 targetSdkVersion
应该相等,并且都指向最新的安卓版本。