如何解决多个D8警告:找不到<Class X>,默认或静态接口方法是否需要使用<Class Y>?

mde*_*dev 14 android proguard android-gradle-plugin android-proguard android-d8

从3.1.4升级到Android Gradle插件到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()`
...
Run Code Online (Sandbox Code Playgroud)

Project正在使用Java 1.8源代码兼容性(lambdas),看起来警告来自Android gradle类dexer,它已在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.**
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我可以警告消失的唯一方法是设置minifyEnableduseProguardfalsebuild.gradle文件

  3. 我尝试过AGP 3.3.0-alpha13和新的AGP 3.2.1但没有成功.

您可以使用https://github.com/mdawid/D8WarningTest中的示例项目克隆存储库

kue*_*lye 11

更新:此问题已在Android Gradle插件3.5.0-beta05中得到修复(请参阅问题:能够在D8减震期间有选择地抑制警告)。


对于Android Gradle插件3.2.1-3.4.1,请使用以下解决方法:

来自Android Gradle插件3.2.1 changelog

D8的脱糖功能现在默认启用。

因此,您应该使用D8(在项目的gradle.properties文件中)禁用重复使用:

android.enableD8.desugaring=false
Run Code Online (Sandbox Code Playgroud)

如果使用R8:

R8是替代ProGuard的用于代码收缩和混淆的新工具。您可以通过在项目gradle.properties文件中包含以下内容来开始使用R8的预览版:

android.enableR8 = true
Run Code Online (Sandbox Code Playgroud)

禁用R8的减糖(在项目gradle.properties文件中):

android.enableR8.desugaring=false
Run Code Online (Sandbox Code Playgroud)

  • 禁用R8并不是解决方案,您只是抑制了该问题,并从Google推向主流的工具中误导了开发人员。 (6认同)
  • 当我通过设置属性android.enableD8.desugaring = false禁用D8中的除糖功能时,警告消失了。您还可以通过设置属性`android.enableR8.desugaring = false`来禁用R8中的反欺诈。@kuelye请编辑您的答案以阐明应启用/禁用的设置。然后我会接受你的回答。谢谢! (2认同)