我们根据 Google 的要求将我们的应用程序拆分为 32 位和 64 位版本。作为此更改的一部分,我们开始使用 D8 编译器而不是旧的 DEX 编译器。当我们使用 D8 编译器时,我们的构建时间从 6 分钟增加到 20 分钟(我们有一个大型应用程序)。我们在网上进行了广泛的研究,我们发现减少构建时间的唯一解决方案是禁用脱糖。但是,如果禁用脱糖功能,应用程序将不会构建。
当我们关闭脱糖功能时,将 gradle 版本从 5.5.1 更新到 5.6 并没有解决我们的问题。也没有删除 .gradle 和 build 目录并使应用程序无效+重新启动。我们使用的是 Android Studio 3.5 版。
使用 android.enableD8.desugaring=false 构建错误
> Task :app:compileRegionNaDebugAndroidTestJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Exception in thread "main" java.lang.TypeNotPresentException: Type org.gradle.internal.reflect.Instantiator not present
at sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:85)
at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:54)
at sun.invoke.util.BytecodeDescriptor.parseMethod(BytecodeDescriptor.java:41)
at java.lang.invoke.MethodType.fromMethodDescriptorString(MethodType.java:1067)
at com.google.devtools.build.android.desugar.LambdaDesugaring$InvokedynamicRewriter.visitInvokeDynamicInsn(LambdaDesugaring.java:406)
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1623)
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1126)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:698)
at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:477)
at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:361)
at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:314)
at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:711)
Caused by: java.lang.ClassNotFoundException: Class org.gradle.internal.reflect.Instantiator not found
at com.google.devtools.build.android.desugar.HeaderClassLoader.findClass(HeaderClassLoader.java:53)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.invoke.util.BytecodeDescriptor.parseSig(BytecodeDescriptor.java:83)
... 12 more
gradle.properties 文件
XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.caching=false
android.databinding.enableV2=true
android.enableD8.desugaring=false
build.gradle 片段
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 21
targetSdkVersion 26
buildToolsVersion '27.0.3'
testInstrumentationRunner "com.appmps.mobileapp.EspressoTestRunner"
multiDexEnabled true
testApplicationId "com.appmps.mobileapp.test"
}
splits {
abi {
enable true
reset()
if (isEmulatorRun()) {
include "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
} else {
include "armeabi-v7a", "arm64-v8a"
}
universalApk false
}
}
useLibrary 'org.apache.http.legacy'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dataBinding {
enabled = true
}
我们将感谢有关让我们的应用程序在禁用脱糖的情况下构建的建议。我们还对减少与使用 D8 编译器相关的构建时间的任何其他策略感兴趣。
谢谢!