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),然后在您的依赖项部分中添加下面给出的依赖项
coreLibraryDesugaring ‘com.android.tools:desugar_jdk_libs:1.0.9’
现在,添加此依赖项后,您必须在代码的compileOptions部分中添加以下行
coreLibraryDesugaringEnabled true
第2步:现在,我们必须在应用程序中启用multiDex,以导航到您的Gradle文件,在defaultConfig部分的部分中,将以下行添加为
multiDexEnabled true
并同步您的项目。成功完成项目同步后,已在我们的应用程序中实施了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中。您可以从下图清楚地了解此过程。
这样,Desugaring可以工作,并且可以为API级别较低的设备中的新Java库提供向后兼容性。