在 gradle 中启用 Proguard 后 FCM 不起作用

Posted

技术标签:

【中文标题】在 gradle 中启用 Proguard 后 FCM 不起作用【英文标题】:FCM doesn't work after enabling Proguard in gradle 【发布时间】:2019-11-08 00:13:27 【问题描述】:

我之前连接了FCM 并进行了测试。而且效果很好。

但是,我已准备好发布我的应用并在build.gradle 中启用了proguard

    buildTypes 
        release 
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt')
            proguardFile 'proguard-rules.pro'
        
        debug 
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt')
            proguardFile 'proguard-rules.pro'
//            proguardFile 'proguard_debug.pro'
        
    

并将其应用到proguard-rules.pro

-keep class com.firebase.**  *; 
-keepnames class com.fasterxml.jackson.**  *; 
-keepnames class javax.servlet.**  *; 
-keepnames class org.ietf.jgss.**  *; 
-dontwarn org.w3c.dom.**
-dontwarn org.joda.time.**
-dontwarn org.shaded.apache.**
-dontwarn org.ietf.jgss.**
-dontwarn com.firebase.**
-dontnote com.firebase.client.core.GaePlatform

每个人都收到推送消息,但只有我的测试手机没有收到它们,这是 proguard 启用的。我将data 模型转换为Serialize 格式。但是现在这个问题正在发生。

如何使用 FCM 或其他 Firebase 功能,例如 Remote ConfigCrashlystics

【问题讨论】:

data 模型是 Kotlin data 类? 它是data class,但将其更改为class MyClass: Serializable,然后为每个变量提供@SerializedName('variable_name'),并解决了序列化问题。但这是另一个问题。我现在遇到FCM 的问题。 【参考方案1】:

混淆重命名 Kotlin data class 中的变量而没有 @SerializedName 并且结果 Json 不解析为模型类。 为了防止这种情况,您可以使用@Keep 注释

@Keep
data class MyClass(...)

或将@SerializedName 设置为所有值

【讨论】:

谢谢。但是..你对FCM有什么想法吗? @c-an 您可以将-dontnote com.google.** 添加到proguard-rules.pro 但我没有使用Firebase 的任何特定配置 我需要实现Serializable吗?

以上是关于在 gradle 中启用 Proguard 后 FCM 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在启用 Proguard 的情况下将 Play 服务从 8.1 更新到 8.3

Android Build 使用 Proguard 和 Gradle 失败

启用 ProGuard 会导致签名 APK 生成失败?

升级 gradle 后 Proguard 行为发生变化,从构建的 apk 中省略类

使用启用了 proguard 的 GSON

启用 Proguard 后无法实例化片段