1

我们根据 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 编译器相关的构建时间的任何其他策略感兴趣。

谢谢!

4

0 回答 0