Как разрешить несколько предупреждений 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.

  1. Я пытался подавить эти предупреждения в 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.**
    
  2. Единственный способ сделать предупреждение об исчезновении - это установить minifyEnabled а также useProguard в false в build.gradle файл

  3. Я пробовал 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
 }

это решает мою проблему

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