同时使用 Library Desugaring 和 R8/Proguard/minifyEnabled 时崩溃

问题描述

我有一个多模块应用程序(minSdk 21 ,AGP 7.0.0-alpha12),当使用 Java 8 脱糖时,它在发行版本(启用 Proguard/R8)中启动时崩溃{ {3}}

我知道这个错误与脱糖有关,因为如果我启用脱糖,就会发生错误

compileOptions {
      coreLibraryDesugaringEnabled true
}

而如果我禁用脱糖,则不会发生错误

compileOptions {
      coreLibraryDesugaringEnabled false
}

堆栈跟踪:

   java.lang.IncompatibleClassChangeError: Class j$.util.Collection implements non-interface class d.e (declaration of 'j$.util.Collection' appears in base.apk!classes2.dex)
        at ja.s.f(UnkNown Source:0)
        at h4.g0.<clinit>(:4)
        at y5.d1.C(:1)
        at v8.f.<init>(:2)
        at com.luminarlab.fontboard.KeyboardApp.<init>(:2)
        at java.lang.class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76)
        at androidx.core.app.CoreComponentFactory.instantiateApplication(UnkNown Source:0)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1155)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:1223)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431)
        at android.app.ActivityThread.access$1300(ActivityThread.java:219)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:940)

我尝试在 -keep class java.util.** { *; } 中使用 proguard-rules.pro 修复错误,但没有任何改变。

感谢任何帮助、提示或答案。提前致谢!

解决方法

事实证明 developers.android.com 上的指南已经过时。截至目前,它使用 coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9',但最新版本是 coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'。 更新到最新版本解决了我的问题。您可以找到最新版本 here