为什么 AndroidX 需要将 compileSdkVersion 设置为 28 或更高

Why AndroidX needs compileSdkVersion set to be 28 or higher

我最近一直在学习 Android,我对新的 AndroidX 库有疑问。我知道 AndroidX 只是对支持库的新升级,它侧重于为早期的 Android SDK 提供向后兼容性。

但是,Google 需要 "If you want to use AndroidX in a new project, you need to set the compile SDK to Android 9.0 (API level 28) or higher"。我在这里很困惑。这是否意味着 AndroidX 实际上使用了一些仅在 Android 9.0 或更高版本上可用的 API 方法或功能?如果是这样,它如何为无法访问这些高级 API 方法的旧 API 提供向后兼容性?

我认为支持库对compileSdkVersion没有任何要求。

I am confused here, does this mean AndroidX actually uses some API methods or functionalities that are only available on Android 9.0 or higher version?

AndroidX 将可用于具有向后兼容性的 Android 版本

阅读AndroidX Overview

  • 与支持库一样,AndroidX 与 Android OS 分开发布,并提供跨 Android 版本的向后兼容性。

有关详细信息,请阅读 Android 开发人员博客 Hello World, AndroidX

另请阅读有关 compileSdkVersion

的更多信息

compileSdkVersion

  • compileSdkVersion 是您告诉 Gradle 使用哪个版本的 Android SDK 编译您的应用程序的方式。使用新的 Android SDK 是使用该级别中添加的任何新 API 的要求。
  • 需要强调的是,更改 compileSdkVersion 不会更改运行时行为

编译版本是您在 IDE 上开发应用程序时需要使用的版本。 Accroding to this answer.

因此,您在哪个 SDK 上编写代码并不重要。它将始终提供向后兼容性。

我之前也有同样的疑问。关键是,不要混淆 minSdkVersioncompileSdkVersion。如果您的 minSdkVersion 是 16,那么您的应用将支持低至 Android API 版本 16。但是要使用 AndroidX,您需要确保 compileSdkVersion 是 28。您通常在编译应用程序时使用最新的 Android SDK 版本,所以这不是什么新鲜事。

这是一个使用 AndroidX 的示例应用程序 build.gradle 文件。注意 minSdkVersioncompileSdkVersion 版本号。

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}