Как разрешить несколько предупреждений D8: <Class X> не был найден, это требуется для десугарирования статических методов интерфейса или по умолчанию <Class Y>?
После обновления до Android Gradle Plugin с 3.1.4 до 3.2.x я получаю несколько предупреждений, таких как:
D8: Type `com.google.gson.reflect.TypeToken` was not found, it is required for default or static interface methods desugaring of `com.google.gson.reflect.TypeToken org.springframework.http.converter.json.GsonHttpMessageConverter.getTypeToken(java.lang.reflect.Type)`
D8: Type `com.squareup.okhttp.MediaType` was not found, it is required for default or static interface methods desugaring of `com.squareup.okhttp.MediaType org.springframework.http.client.OkHttpClientHttpRequest.getContentType(org.springframework.http.HttpHeaders)`
D8: Type `org.apache.http.impl.client.HttpClients` was not found, it is required for default or static interface methods desugaring of `void org.springframework.http.client.HttpComponentsClientHttpRequestFactory.<init>()`
D8: Interface `org.apache.http.HttpEntity` not found. It's needed to make sure desugaring of `org.springframework.http.client.HttpComponentsStreamingClientHttpRequest$StreamingHttpEntity` is correct. Desugaring will assume that this interface has no default method.
D8: Type `org.conscrypt.Conscrypt` was not found, it is required for default or static interface methods desugaring of `okhttp3.internal.platform.Platform okhttp3.internal.platform.ConscryptPlatform.buildIfSupported()`
...
В проекте используется совместимость с исходным кодом Java 1.8 (лямбда-выражения), и похоже, что предупреждения исходят от устройства для деклассирования классов gradle Android, которое по умолчанию включено в AGP 3.2.0.
Я пытался подавить эти предупреждения в
proguard-rules.pro
со следующими строками, но, кажется, ничего не работает.-dontwarn com.google.gson.reflect.TypeToken -keep class com.google.gson.reflect.TypeToken { *; } -dontwarn org.apache.http.** -keep class com.squareup.okhttp.** { *; } -dontwarn com.squareup.okhttp.** -keep class org.springframework.http.client.** { *; } -dontwarn org.springframework.http.client.**
Единственный способ сделать предупреждение об исчезновении - это установить
minifyEnabled
а такжеuseProguard
вfalse
вbuild.gradle
файлЯ пробовал AGP 3.3.0-alpha13 и новый AGP 3.2.1, но безуспешно.
Вы можете клонировать репозиторий с примером проекта с https://github.com/mdawid/D8WarningTest
1 ответ
Из плагина Android Gradle 3.2.1 список изменений:
Desugaring с D8 теперь включен по умолчанию.
Таким образом, вы должны отключить десагеринг с D8 (в проекте gradle.properties
файл):
android.enableD8.desugaring=false
Если вы используете R8:
R8 - это новый инструмент для сжатия и запутывания кода, который заменяет ProGuard. Вы можете начать использовать предварительную версию R8, включив в свой проект следующее
gradle.properties
файл:android.enableR8 = true
отключить десагеринг с R8 (в проекте gradle.properties
файл):
android.enableR8.desugaring=false
Я думаю, это потому, что этот класс написан на Java8, но проект скомпилирован на Java7.так я обновляю следующее:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
это решает мою проблему