web-dev-qa-db-fra.com

Comment résoudre plusieurs avertissements D8: <Classe X> est introuvable, il est requis pour les méthodes d'interface par défaut ou statique désuchant <Classe Y>?

Après la mise à niveau vers Android Gradle Plugin de 3.1.4 à 3.2.x, je reçois plusieurs avertissements tels que:

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()`
...

Le projet utilise la compatibilité source Java 1.8 (lambdas) et il semble que les avertissements proviennent du dexer de classe gradle Android qui a été activé par défaut dans AGP 3.2.0.

  1. J'ai essayé de supprimer ces avertissements dans proguard-rules.pro Avec les lignes suivantes, mais rien ne semble fonctionner.

    -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. La seule façon de faire disparaître les avertissements est de définir minifyEnabled et useProguard sur false dans le fichier build.gradle

  3. J'ai essayé AGP 3.3.0-alpha13 et le nouveau AGP 3.2.1 mais sans succès.

Vous pouvez cloner le référentiel avec un exemple de projet à partir de https://github.com/mdawid/D8WarningTest

13
mdev

Mise à jour : le problème a été corrigé dans Android Gradle Plugin 3.5.0-beta05 (voir problème: Possibilité de supprimer sélectivement les avertissements lors du désuchage D8 ).


Pour Android Gradle Plugins 3.2.1 - 3.4.1, utilisez les solutions de contournement suivantes:

De Android Plugin Gradle .2.1 changelog :

Le désuchage avec D8 est désormais activé par défaut.

Vous devez donc désactiver le désuchage avec D8 (dans le fichier gradle.properties Du projet):

Android.enableD8.desugaring=false

Si vous utilisez R8:

R8 est un nouvel outil de réduction de code et d'obscurcissement qui remplace ProGuard. Vous pouvez commencer à utiliser la version d'aperçu de R8 en incluant les éléments suivants dans le fichier gradle.properties De votre projet:

Android.enableR8 = true

désactiver le désuchage avec R8 (dans le fichier gradle.properties du projet):

Android.enableR8.desugaring=false
9
kuelye

Je pense que c'est parce que cette classe est écrite en Java8, mais le projet est compilé en Java7. donc je mets à jour ce qui suit:

compileOptions {
     sourceCompatibility JavaVersion.VERSION_1_8
     targetCompatibility JavaVersion.VERSION_1_8
 }

cela résout mon problème

0
王楠楠