25

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

项目正在使用 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.**
    
  2. 我可以使警告消失的唯一方法是在文件中设置minifyEnableduseProguardfalsebuild.gradle

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

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

4

2 回答 2

19

更新:该问题已在 Android Gradle Plugin 3.5.0-beta05 中得到修复(请参阅问题:在 D8 脱糖期间选择性抑制警告的能力)。


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

从 Android Gradle 插件3.2.1 更新日志

现在默认启用使用 D8 进行脱糖。

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

android.enableD8.desugaring=false

如果您使用 R8:

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

android.enableR8 = true

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

android.enableR8.desugaring=false
于 2018-11-05T22:30:07.980 回答
-1

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

compileOptions {
     sourceCompatibility JavaVersion.VERSION_1_8
     targetCompatibility JavaVersion.VERSION_1_8
 }

这解决了我的问题

于 2019-05-19T00:16:04.157 回答