【问题标题】:Gradle Build Failure: Couldn't find outer classGradle 构建失败:找不到外部类
【发布时间】:2018-04-16 21:19:37
【问题描述】:

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

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 wrapper 和每个依赖项。

  • 移除匕首以支持 Koin

  • 移除了卡普特

  • 使用 Android Studio 的 Preview 和 Stable 版本

这是我的build scan,它会有什么好处

新发现:

这是杀死我的代码的 sn-p:

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、上帝?

【问题讨论】:

  • 这个问题可能与ProGuard有关。你有吗?
  • @comm1x 不,我没有

标签: gradle kotlin android-gradle-plugin


【解决方案1】:

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

【讨论】:

  • 我也试过了。它不适合我,但我知道它适用于许多人。
【解决方案2】:

我有办法解决这个错误: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 其他方法。我不再遇到这个问题了。我希望这会对你有所帮助。

【讨论】:

  • 这和我做的没什么不同。我只是不明白为什么,或者向谁报告。
  • 我和你一样遇到这个问题,当我这样做时,它起作用了。我也不知道为什么。你试过了吗?
  • 我没有完全尝试您的解决方案;但是如果你看到我上面的解决方案,你会发现它并没有太大的不同。
【解决方案3】:

问题在此处提交https://issuetracker.google.com/issues/72750890。 那里提到的两种解决方案都对我有用: 在 build.gradle 中添加 classpath 'com.android.tools.build:gradle:3.0.1' 或在 gradle.properties 中添加 android.enableD8.desugaring=true

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 2018-11-06
      • 2015-08-22
      • 2014-03-30
      相关资源
      最近更新 更多