D8脱糖:意外的类型调整



我在gradle.properties中启用了Android Studio 3.1.3中的新D8:

android.enableD8.desugaring=true

现在编译失败,并在其中一个仅限 java 的模块中出现此错误:

com.android.tools.r8.errors.Unreachable: 
Unexpected type adjustment from java.lang.String[] to java.lang.Object[]

这是完整的堆栈跟踪
注意:旧的dexer工作正常(当我停用上面的选项时(

我已经检查了java模块,我什至无法在任何java文件中找到String[]Object[]。添加--debug --scan也没有让我对问题可能是什么有更多的了解。

任何想法可能是什么问题或我如何从 dexer 获得更详细的错误信息:例如,错误代码在哪个文件中?

虽然原因可能取决于项目,但我想分享我修复此类错误的方式:

  1. 将失败的 JAR 重命名为 zip
  2. 直接在其上运行 D8,类似于D:DevelopmentToolsandroid-sdkbuild-tools28.0.2d8.bat D:Development<PROJECT_PATH>buildintermediatesintermediate-jarsdebugclasses.jar.zip
  3. 从 zip 中逐个删除类并返回步骤 2,直到异常消失

为了加快该过程,我正在批量删除文件以缩小到包的范围,然后缩小到导致 D8 失败的确切文件。

事实证明,它是以下代码(我正在使用com.annimon.stream.Stream(:

Stream.of(SOME_MAP).map(Map.Entry::getValue).findFirst().orElse(null);

SOME_MAPHashMap<String, String[]>的地方,解决方法是使用

Stream.of(SOME_MAP).map(entry -> entry.getValue()).findFirst().orElse(null);

最新更新