【问题标题】:D8 desugaring: Unexpected type adjustmentD8脱糖:意外类型调整
【发布时间】:2018-06-23 08:15:28
【问题描述】:

我在我的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[]

这里是full stack-trace
注意:旧的 dexer 工作正常(当我停用上面的选项时)

我检查了 java 模块,我什至在任何 java 文件中都找不到 String[]Object[]。添加--debug --scan 也没有让我进一步了解问题所在。

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

【问题讨论】:

  • 我认为这个错误修复应该可以解决 Android Studio 3.2 中的问题:#78901754
  • 您可能想尝试将 gradle 插件版本更改为 com.android.tools.build:gradle:3.2.0-beta02(或更高版本)。就我而言,它解决了所有脱糖问题。

标签: android dex


【解决方案1】:

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

  1. 将失败的 jar 重命名为 zip
  2. 直接在其上运行 D8,类似于 D:\Development\Tools\android-sdk\build-tools\28.0.2\d8.bat D:\Development\<PROJECT_PATH>\build\intermediates\intermediate-jars\debug\classes.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);

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多