【问题标题】:D8: Type `sun.misc.Unsafe` was not foundD8:找不到类型“sun.misc.Unsafe”
【发布时间】:2018-12-07 07:33:59
【问题描述】:

在我的 android 项目中启用 D8 后,我开始看到以下警告:

/Users/yashasvi/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.0.1-android/b7e1c37f66ef193796ccd7ea6e80c2b05426182d/guava-27.0.1-android.jar: D8: Type `sun.misc.Unsafe` was not found, it is required for default or static interface methods desugaring of `void com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.<clinit>()`
/Users/yashasvi/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.0.1-android/b7e1c37f66ef193796ccd7ea6e80c2b05426182d/guava-27.0.1-android.jar: D8: Type `sun.misc.Unsafe` was not found, it is required for default or static interface methods desugaring of `sun.misc.Unsafe com.google.common.cache.Striped64.getUnsafe()`
/Users/yashasvi/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.0.1-android/b7e1c37f66ef193796ccd7ea6e80c2b05426182d/guava-27.0.1-android.jar: D8: Type `sun.misc.Unsafe` was not found, it is required for default or static interface methods desugaring of `sun.misc.Unsafe com.google.common.hash.LittleEndianByteArray$UnsafeByteArray.getUnsafe()`
/Users/yashasvi/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.0.1-android/b7e1c37f66ef193796ccd7ea6e80c2b05426182d/guava-27.0.1-android.jar: D8: Type `sun.misc.Unsafe` was not found, it is required for default or static interface methods desugaring of `void com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper.<clinit>()`
/Users/yashasvi/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.0.1-android/b7e1c37f66ef193796ccd7ea6e80c2b05426182d/guava-27.0.1-android.jar: D8: Type `sun.misc.Unsafe` was not found, it is required for default or static interface methods desugaring of `sun.misc.Unsafe com.google.common.cache.Striped64.getUnsafe()`
/Users/yashasvi/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.0.1-android/b7e1c37f66ef193796ccd7ea6e80c2b05426182d/guava-27.0.1-android.jar: D8: Type `sun.misc.Unsafe` was not found, it is required for default or static interface methods desugaring of `sun.misc.Unsafe com.google.common.hash.LittleEndianByteArray$UnsafeByteArray.getUnsafe()`

.

项目成功构建,但在运行时,我看到这些错误日志,因此,应用功能受到影响。

 java.lang.AbstractMethodError: abstract method "java.lang.Object com.google.common.base.e.a(java.lang.Object)"
        at com.google.common.e.a.i$c.a(SourceFile:1464)
        at com.google.common.e.a.i$c.a(SourceFile:1453)
        at com.google.common.e.a.i$a.run(SourceFile:1408)
        at com.google.common.e.a.l$a.execute(SourceFile:456)
        at com.google.common.e.a.i$f.a(SourceFile:153)
        at com.google.common.e.a.i.a(SourceFile:1234)

搜索了一段时间后,我无法找到任何有用的东西。请帮忙。

是的,如果 D8 被禁用并且其他一切保持不变,我在运行时不会遇到此错误。

【问题讨论】:

标签: android android-guava android-d8


【解决方案1】:

你需要保留sun.misc.Unsafe:

-keep class sun.misc.Unsafe { *; }
-dontnote sun.misc.Unsafe

或者,带有includedescriptorclasses 的规则应该动态保持它:

-keep,includedescriptorclasses class com.google.common.**

一般:

  • 添加开关-verbose对编写ProGuard配置规则很有帮助。

  • 添加开关-dontoptimize可用于禁用所有优化,进行测试。

刚刚找到this

R8 现在可以理解 META-INF/proguard 中的 proguard 规范。

但除非已添加,否则必须添加自定义规则 - 而不是使用消费者规则。

【讨论】:

    【解决方案2】:

    在您的项目-proguard 文件中。请添加:

    -keepnames class com.google.common.**
    
    -keep class com.google.common.**
    
    -dontwarn com.google.common.**
    

    这似乎是一种错误。但有时当您使用 D8 时,它往往会重命名类名或完全删除它们。

    【讨论】:

    • 但这会增加apk的大小,对吧?将所有内容保存在com.google.common
    • 有点,你甚至可能没有注意到差异。如果您使用任何模型(POJO)类,请在类名前添加@keep。
    • D8 仍然会缩小您的代码,但会保留必要的内容
    • 你试过我的解决方案了吗?您还没有提供任何反馈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2018-10-31
    • 1970-01-01
    • 2017-11-09
    • 2019-07-13
    相关资源
    最近更新 更多