Gradle 3.4.1 无法使用 Proguard 将响应解析为 Object

Posted

技术标签:

【中文标题】Gradle 3.4.1 无法使用 Proguard 将响应解析为 Object【英文标题】:Gradle 3.4.1 not able to parse the response into Object with Proguard 【发布时间】:2019-10-13 12:14:34 【问题描述】:

我刚刚将我的 Gradle 更新到 3.4.1。 我的一个模块中有一个 API 调用。 我在应用程序中使用模块:

implementation com.mindvalley.module_login:Module_Login:$rootConfiguration.loginLibraryVersion

现在,当我使用 ProGuard 生成签名构建时,该对象为空,这意味着改造无法解析该对象。

附: :这适用于调试模式,或者如果我使用 Gradle 版本 3.3.2 运行应用程序

我的改造 Proguard 文件:

-dontwarn retrofit2.**
-keep class retrofit2.**  *; 
-keepattributes Signature
-keepattributes Exceptions

-keepclasseswithmembers class * 
    @retrofit2.http.* <methods>;



-keepattributes Signature, InnerClasses, EnclosingMethod

-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
-keepclassmembers,allowshrinking,allowobfuscation interface * 
    @retrofit2.http.* <methods>;


-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement

-dontwarn javax.annotation.**

-dontwarn kotlin.Unit

-dontwarn retrofit2.KotlinExtensions

-if interface *  @retrofit2.http.* <methods>; 
-keep,allowobfuscation interface <1>


-dontwarn org.codehaus.mojo.**
-keepattributes *Annotation*

-keepattributes RuntimeVisibleAnnotations
-keepattributes RuntimeInvisibleAnnotations
-keepattributes RuntimeVisibleParameterAnnotations
-keepattributes RuntimeInvisibleParameterAnnotations

-keepattributes EnclosingMethod

-keepclasseswithmembers class * 
    @retrofit2.* <methods>;


-keepclasseswithmembers interface * 
    @retrofit2.* <methods>;

我的 OkHttp proguard 文件:

-keepattributes Signature
-keep class okhttp3.**  *; 
-keep interface okhttp3.**  *; 
-dontwarn okhttp3.**

-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase

-dontwarn org.codehaus.mojo.animal_sniffer.*

-dontwarn okhttp3.internal.platform.ConscryptPlatform

-dontwarn org.codehaus.mojo.animal_sniffer.*

我的 GSON proguard 文件:

-keepattributes Signature
-keepattributes EnclosingMethod

-keep class sun.misc.Unsafe  *; 
-keep class com.google.gson.stream.**  *; 
-dontwarn com.google.gson.internal.UnsafeAllocator

-keepattributes Signature

-keepattributes *Annotation*

-dontwarn sun.misc.**
-keep class com.google.gson.examples.android.model.**  <fields>; 

-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

-keepclassmembers,allowobfuscation class * 
  @com.google.gson.annotations.SerializedName <fields>;

【问题讨论】:

【参考方案1】:

附: :这适用于调试模式,或者如果我使用 Gradle 版本 3.3.2 运行应用程序

从 Gradle 插件版本 3.4.0 开始,D8/R8 默认启用,混淆将由 R8 而不是 ProGuard 完成。

请参阅Stick to ProGuard Obfuscation,了解如何坚持使用 Proguard。

请参阅Android/java: Transition / Migration from ProGuard to R8? ,了解如何迁移到 R8。

【讨论】:

如果我在 gradle.properties 中禁用 R8,它可以正常工作。启用 R8 后,它会失败。您能否告诉我们是否需要编辑 ProGuard 文件或为 R8 添加额外内容?

以上是关于Gradle 3.4.1 无法使用 Proguard 将响应解析为 Object的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Gradle 创建构建

使用 Gradle 和 ProGuard 构建的 Android:“输出 jar 必须在输入 jar 之后指定,否则将为空”

Android Error:(1, 0) Gradle version 2.2 is required. Current version is 3.4.1.

Mac下安装配置gradle

Gradle 在运行 Android 检测时忽略 testProguardFile

Spring Tool Suite 无法使用 Gradle 创建新项目:无法使用 Gradle (STS) 导入,因为未安装 STS Gradle Tooling