问题 Gradle Build Failure:无法找到外部类


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

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。

  • 添加 javaMaxHeapSize "4g" build.gradle。

  • 升级所有内容: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!!。这显然是一个错误,但我不确定将其报告给谁。 Gradle,Kotlin,JetBrains,上帝?


2349
2018-04-16 21:19


起源

此问题可能与ProGuard有关。你有吗? - comm1x
@ comm1x不,我没有 - Chad Bingham


答案:


当我添加时,问题自行解决了 android.enableD8.desugaring = true 至 gradle.properties


7
2018-04-26 10:17



我也试过了。它对我不起作用,但我知道它适用于许多人。 - Chad Bingham
适合我,这只是一个问题 - gradle.properties位置在哪里.. - Evgen


我有办法解决这个错误: 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()

oo其他方法。我不再遇到这个问题了。我希望这能帮到您。


1
2018-04-18 07:00



这与我的做法没什么不同。我只是不明白为什么,或者向谁报告。 - Chad Bingham
我像你一样遇到这个问题,当我这样做时,它有效。我也不知道为什么。你试过吗? - beokh
我没有完全尝试你的解决方案;但如果你看到我上面的解决方案,你会发现它并没有太大的不同。 - Chad Bingham


这个问题在这里提出 https://issuetracker.google.com/issues/72750890。 这里提到的两个解决方案对我有用: 加入 classpath 'com.android.tools.build:gradle:3.0.1' build.gradle或者添加 android.enableD8.desugaring=true to gradle.properties


1
2017-08-15 11:17





作为一种解决方法,您可以替代 let 通过null检查。至少代码在此之后开始编译

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

0
2017-07-02 20:16