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, он, как правило, переименовывает имена классов или вообще удаляет их.