Gradle构建失败:找不到外部类

12

尝试构建时,我得到了这个堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException: Couldn't find outer class com/xxx/CheckListPresenter$onAttached$1$5 of com/xxx/CheckListPresenter$onAttached$1$5$1
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:1079)
    at com.google.devtools.build.android.desugar.ClassVsInterface.isOuterInterface(ClassVsInterface.java:56)
    at com.google.devtools.build.android.desugar.InterfaceDesugaring.visitOuterClass(InterfaceDesugaring.java:246)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:638)
    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)

我检查了CheckListPresenter类,没有任何问题。我尝试删除该类以查看是否能够构建,但错误仅转移到另一个声明相同问题的类。
我上次接触这段代码是几个月前,所以不确定是什么触发了变化。
可能有影响的事情:这是一个Android项目。这是用Kotlin编写的。在transformClassesWithDesugarForDebug gradle任务中失败。
编辑:
以下是我尝试过的所有可能解决方案:
- 创建一个新项目,只移动我的源代码和gradle文件。 - 从Java 8降至7。 - 不同版本的JDK。我尝试了1.8.0_151和1.8.0_152。 - 在build.gradle中添加javaMaxHeapSize“4g”。 - 升级所有内容:gradle包装器和每个依赖项。 - 放弃Dagger,改为使用Koin。 - 删除Kapt。 - 使用Android Studio的预览版和稳定版。
这是我的构建扫描,希望对您有所帮助。
新发现:
这是让我烦恼的代码片段:
view?.let { v ->
    v.getCancelClicks()
        .doOnSubscribe({ disposables.add(it) })
        .subscribe({
           v.showExitDialog()
              .filter { it }
              .subscribe({
                 cancel()
            }, this::onError)
           
         }, this::onError)
    }

奇怪的是,这两者单独使用都不会给我带来问题。

view?.let { v ->
    v.getCancelClicks()
        .doOnSubscribe({ disposables.add(it) })
        .subscribe({
            //removed 
         }, this::onError)
    }
}

或者

view?.let { v ->
    v.showExitDialog()
        .filter { it }
        .subscribe({
           cancel()
        }, this::onError)
 }

但是一起使用它们就成为了一个问题。

值得注意的是,view在基类中被定义为通用类型。

目前,我的解决方法是删除view?.let{并只使用view!!。这显然是一个bug,但我不确定要向谁报告。Gradle、Kotlin、JetBrains、上帝?


这个问题可能与ProGuard有关。你有吗? - Pavel Shorokhov
@comm1x 不,我不会。 - Chad Bingham
4个回答

12

当我在gradle.properties中添加了android.enableD8.desugaring = true时,问题得以解决。


我也尝试过那个方法,但对我没用。不过我知道它对很多人有效。 - Chad Bingham

1
我有一种方法可以解决这个错误:java.lang.NullPointerException: Couldn't find outer class com/iconfitness/iconaudit/common/fragments/SettingsFragment$onCreate$1$1 of com/iconfitness/iconaudit/common/fragments/SettingsFragment$onCreate$1$1$1。只需将此代码块移动即可。
v.showExitDialog()
              .filter { it }
              .subscribe({
                 cancel()

还有另一种方法。我不再遇到这个问题了。我希望这可以帮助你。


这与我所做的并没有太大的区别。我只是不明白为什么,或者应该向谁报告。 - Chad Bingham
我遇到了和你一样的问题,当我这样做时,它起作用了。我也不知道为什么。你试过那个吗? - beokh
1
我没有完全尝试过你的解决方案;但是如果你看一下我的解决方案,你会发现它并没有太大的区别。 - Chad Bingham

1
问题已在此处https://issuetracker.google.com/issues/72750890进行了归档。 那里提到的两个解决方案对我都起作用: 将classpath 'com.android.tools.build:gradle:3.0.1'添加到build.gradle或将android.enableD8.desugaring=true添加到gradle.properties。

0

作为一种解决方法,您可以通过空值检查来替换let。至少在这之后代码开始编译了。

if (view!=null)
    view.showExitDialog()
        .filter { it }
        .subscribe({
           cancel()
        }, this::onError)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接