D8: тип `sun.misc.Unsafe` не найден

После включения D8 в моем проекте Android, я начал видеть эти предупреждения:

/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 отключен, а все остальное остается тем же.

2 ответа

Вам нужно сохранить sun.misc.Unsafe:

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

в качестве альтернативы, правило с includedescriptorclasses должен держать это динамически:

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

в общем:

  • добавление переключателя -verbose очень полезно для написания правил конфигурации ProGuard.

  • добавление переключателя -dontoptimize может использоваться для отключения всей оптимизации, для теста.

только что нашел это:

R8 теперь понимает спецификации proguard в META-INF/proguard.

но если это не было добавлено, нужно добавить пользовательские правила - вместо использования пользовательских правил.

В вашем файле проекта-proguard. Пожалуйста, добавьте это:

-keepnames class com.google.common.**

-keep class com.google.common.**

-dontwarn com.google.common.**

Это похоже на ошибку. Но иногда, когда вы используете D8, он, как правило, переименовывает имена классов или вообще удаляет их.

Другие вопросы по тегам