📜  在Android中进行脱糖

📅  最后修改于: 2021-05-09 18:19:42             🧑  作者: Mango

Google正式宣布Kotlin作为Android开发的推荐语言,这就是为什么许多开发人员从Java切换到Kotlin进行Android开发的原因。因此,Google团队每天在Android中引入新的API,并且新版本的Android设备中也提供了这些API。因此,Desugaring也是我们应在我们的应用程序中启用的Android中的重要功能之一,这也将使我们的应用程序也可以在较低的API级别上工作。因此,在本文中,我们将学习脱糖。

  • 什么是脱糖?
  • 为什么我们需要脱糖?
  • 脱糖的实际实施。
  • 到底发生了什么事?

什么是脱糖?

Android设备正在日趋优化。 Android中为用户和开发人员提供的许多功能都在不断优化。开发任何Android操作系统时,都会附带许多Java类,这些Java类为用户设备中的不同应用程序提供对各种功能(例如时间,日期和许多其他功能)的支持。现在,如果我们考虑时间API,它是在API级别26中引入的,并且使用此API的应用程序将在较低API级别的设备(如棉花糖和较低版本)上崩溃。因此,在这种情况下,为避免应用程序崩溃,Desugaring发挥了作用。它允许较低的API级别与新的Java库一起使用。

为什么我们需要脱糖?

例如,假设我们正在使用API级别26中引入的新时间API,并且已在应用程序中使用了该时间API。此应用程序将在API级别26及更高级别上完美运行,但是当我们在较低的API级别上安装此应用程序时,假设API级别低于23,则我们的应用程序将崩溃,因为我们的设备操作系统支持API级别23和API提供的功能。我们正在使用无法使用的API级别26的功能。因此,为避免此应用崩溃,并支持从API级别26到API级别23的新功能,我们必须在我们的应用中添加Desugaring。

Android除糖的实际实现

当我们在低于API级别26的设备中使用API级别26提供的功能时,该应用将崩溃。在API级别较低的应用中,我们将看到一个错误,如NoClassDefFoundError。因此,要解决此错误,我们必须在Android中启用Desugaring。

分步实施除糖

第1步:导航至Gradle脚本> build.gradle(:app),然后在您的依赖项部分中添加下面给出的依赖项

现在,添加此依赖项后,您必须在代码的compileOptions部分中添加以下行

第2步:现在,我们必须在应用程序中启用multiDex,以导航到您的Gradle文件,在defaultConfig部分的部分中,将以下行添加为

并同步您的项目。成功完成项目同步后,已在我们的应用程序中实施了Desugaring,现在我们将无法在API级别较低的设备中看到NoClassDefFoundError。 Gradle文件的完整代码如下:

Kotlin
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}
  
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"
  
    defaultConfig {
        applicationId "com.gtappdevelopers.desugaring"
        minSdkVersion 19
        multiDexEnabled true
        targetSdkVersion 30
        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
        coreLibraryDesugaringEnabled true
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}
  
dependencies {
  
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.2'
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}


幕后发生了什么?

因此,这里发生的事情以及丢失的Java类如何突然出现在这里。这是因为D8和R8工具。以前,为了将应用程序的代码转换为dex代码,我们必须使用Proguard,但是为了减少编译时间并减小应用程序大小,新的R8工具被引入。此R8工具提供了对缺少的Java类的支持。当此工具将您应用的代码转换为dex代码时,它还会添加新Java库的dex代码,然后将其添加到APK中。您可以从下图清楚地了解此过程。

在Android中进行脱糖

这样,Desugaring可以工作,并且可以为API级别较低的设备中的新Java库提供向后兼容性。

想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处,前往由我们的专家精心策划的指南,以使您立即做好行业准备!