如何解决多个D8警告:<Class X>未找到,它是默认或静态接口方法解糖<类Y>所需的?

27

在将Android Gradle插件从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源代码兼容性(lambda),看起来警告来自于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.**
    
  2. 我能让警告消失的唯一方法是在build.gradle文件中将minifyEnableduseProguard设置为false

  3. 我已经尝试了AGP 3.3.0-alpha13和新的AGP 3.2.1,但都没有成功。

您可以从https://github.com/mdawid/D8WarningTest克隆带有示例项目的存储库


问题已经上报,可以在https://issuetracker.google.com/issues/118842646上进行跟踪。 - mdev
2个回答

19

更新:此问题已在Android Gradle Plugin 3.5.0-beta05中得到修复(请参见问题:选择性禁止D8解糖过程中的警告)。


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

从Android Gradle插件 3.2.1变更日志 中获取:

D8解糖现在默认启用。

因此,您应该在项目的gradle.properties文件中禁用D8解糖(即设置为false):

android.enableD8.desugaring=false

如果您使用R8:

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

android.enableR8 = true
在项目的gradle.properties文件中使用R8禁用掉解糖:
android.enableR8.desugaring=false

当我尝试启用R8 android.enableR8=true时,警告出现了:该选项设置“android.enableR8=true”是实验性的且不受支持。当前默认值为“false”,而gradle仍然会发出警告。 - mdev
2
当我通过设置属性android.enableD8.desugaring=false禁用D8中的脱糖时,警告已消失。 您还可以通过设置属性android.enableR8.desugaring=false来禁用R8中的脱糖。@kuelye请编辑您的答案以澄清应启用/禁用哪些设置。然后我会接受您的答案。谢谢! - mdev
7
禁用R8不是解决方案,这只是掩盖了问题,并让开发者误以为Google正在推广的一种工具不重要。 - originx

-1

我认为这是因为这个类是用Java8编写的,但项目是在Java7中编译的。所以我进行了以下更新:

compileOptions {
     sourceCompatibility JavaVersion.VERSION_1_8
     targetCompatibility JavaVersion.VERSION_1_8
 }

这解决了我的问题


1
如果您查看示例项目,您会发现 sourceCompatibility 已经设置为 Java 8。在这种情况下不会产生影响。 - mdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接