如何找出哪种方法导致“方法代码太大”异常(更新到gradle 3后)

时间:2018-02-07 14:36:15

标签: java android gradle android-gradle

我们正在开发一个Android应用程序,我们目前正在尝试更新为gradle 3.0。我们按照here的谷歌指南迁移到新的gradle版本。

但是我们得到一个Exception,它说我们的任何方法都很大:

Exception in thread "main" java.lang.RuntimeException: Method code too large!
        at org.objectweb.asm.MethodWriter.a(Unknown Source)
        at org.objectweb.asm.ClassWriter.toByteArray(Unknown Source)
        at com.google.devtools.build.android.desugar.CoreLibraryRewriter$UnprefixingClassWriter.toByteArray(CoreLibraryRewriter.java:152)
        at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:403)
        at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:326)
        at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:280)
        at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:584)

我已经浪费了一天时间来找出这里出了什么问题。我知道这个失败是由ASM字节码操纵器(http://asm.ow2.org/)引起的,它可能是gradle 3中的新东西。我也知道ASM Framework中的代码部分抛出了这个RuntimeException(see here)。

我也发现大多数时候这样的休眠类/方法是由框架(例如Lombok或Dagger)生成的,并且/不应该由人类(source)编写。

任何人都可以帮我解决这个问题吗?有谁知道如何从我们的应用程序中找出哪个类或方法(希望生成)导致此异常?也许外面有一个工具可以分析java代码来查找超过64k限制的方法?


解决方案

我从desugar.desugarClassesInInputsee)的方法评论中得到了提示。它说:

/** Desugar the classes that are in the inputs specified in the command line arguments. */

所以我检查了gradle输出,我发现了这个输出:

Error while executing java process with main class com.google.devtools.build.android.desugar.Desugar with arguments {--input .....

列出的输入是我们项目的一些jar文件和库依赖项。我逐步删除了所有列出的依赖项,如果找到导致此异常的库。删除了该库,现在我们的项目使用Gradle 3运行。

如果他们面临类似的问题,也许这会帮助一些人。

0 个答案:

没有答案