Android上的Firebase需要哪些ProGuard配置?

时间:2014-10-09 08:39:27

标签: android firebase proguard

使用适用于Android应用的Firebase SDK时,我会不断收到警告和错误(在Eclipse中):

Warning ... can't find referenced class ...
Warning: there were ... unresolved references to classes or interfaces ...
You may need to specify additional library jars (using '-libraryjars') ...

不幸的是,Firebase没有关于其与ProGuard一起使用的任何官方文档。

我的应用程序在使用ProGuard进行模糊处理时使用Firebase成功编译版本需要哪些指令?

12 个答案:

答案 0 :(得分:41)

根据我的个人测试,事实证明,Firebase增强的Android应用程序需要使用ProGuard进行编译。

在任何情况下,如果您在Firebase中使用自定义对象,即bean或POJO,则必须添加-keepnames class com.my.package.beans.** { *; }

Firebase SDK 1.0.18:

-keepnames class com.firebase.** { *; }
-keepnames class com.shaded.fasterxml.jackson.** { *; }
-keepnames class org.shaded.apache.** { *; }
-keepnames class javax.servlet.** { *; }
-dontwarn org.w3c.dom.**
-dontwarn org.joda.time.**
-dontwarn org.shaded.apache.commons.logging.impl.**

Firebase SDK 1.1.1:

-keep class com.firebase.** { *; }
-keep class org.shaded.apache.** { *; }
-keepnames class com.shaded.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.**

Firebase SDK 2.0.0:

-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-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.**

# Only necessary if you downloaded the SDK jar directly instead of from maven.
-keep class com.shaded.fasterxml.jackson.** { *; }

最后的手段:

-keep class !com.my.package.** { *; }

备注:

欢迎任何官方指南。 -dontwarn指令显然是危险的,代码可能会在我未测试的点处中断。此外,上述规则非常宽松,其他规则可能会更好地优化您的APK。

答案 1 :(得分:8)

这不是官方文档,但Firebase确实在其中一个Github存储库中显示了一些基本的proguard规则。 https://github.com/firebase/AndroidChat/blob/master/app/proguard-rules.pro

# Basic ProGuard rules for Firebase Android SDK 2.0.0+
-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.apache.**
-dontwarn org.w3c.dom.**

答案 2 :(得分:7)

我在Firebase文档中找到了这个:

在您的应用中使用Firebase实时数据库以及ProGuard时,您需要考虑在模糊处理后如何对模型对象进行序列化和反序列化。如果使用DataSnapshot.getValue(Class)或DatabaseReference.setValue(Object)来读取和写入数据,则需要向proguard-rules.pro文件添加规则:

# Add this global rule    
-keepattributes Signature

# This rule will properly ProGuard all the model classes in 
# the package com.yourcompany.models. Modify to fit the structure
# of your app.
-keepclassmembers class com.yourcompany.models.** {
*;
}

答案 3 :(得分:2)

跟进其他答案,使用Firebase 2.4.1我只需要在我的proguard配置(YMMV)中包含以下内容:

-keep class com.firebase.** { *; }
-dontwarn com.fasterxml.**

答案 4 :(得分:2)

Firebase SDK 2.4.2的工作集

-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

答案 5 :(得分:2)

firebase 2.5.2的配置似乎已更改。这对我有用:

-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.shaded.fasterxml.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.apache.**
-dontwarn org.w3c.dom.**

答案 6 :(得分:2)

2020年答案

在数据类之前使用@Keep批注,以便Proguard保留它们。这是JavaKotlin的AndroidX的一部分。适用于Firebase,Jetpack Navigator和翻新。

@Keep
data class Listing(
    val id: String = "",
    val name: String = ""
)

According to documentation:

表示在构建时最小化代码时,不应删除带注释的元素。通常用于仅通过反射访问的方法和类,因此编译器可能认为代码未使用。

答案 7 :(得分:1)

我也很努力。 感谢user4989692和Ugo为我指出了正确的方向。

这对我有用:

的build.gradle

    buildTypes {
    debug {
        minifyEnabled false
        shrinkResources false
        useProguard false
        debuggable true
        signingConfig signingConfigs.debug
    }
    release {
        minifyEnabled true
        shrinkResources true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
}

proguard-rules.pro

-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

-keepattributes Signature
-keepattributes *Annotation*
-keepattributes InnerClasses,EnclosingMethod

-keep class com.YOUR-APP-DOMAIN.** { *; }

# Basic ProGuard rules for Firebase Android SDK 2.0.0+
-keep class com.firebase.** { *; }

-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }

答案 8 :(得分:0)

它解决了我的问题

将此添加到您的proguard-rules文件中

-optimizations !class/merging/*

答案 9 :(得分:0)

如果您使用的是Firebase Realtime数据库,则混淆后将对模型对象进行序列化和反序列化。因此,您需要在proguard-rules.pro中添加它:

# Add this global rule
-keepattributes Signature

# This rule will properly ProGuard all the model classes in
# the package com.yourcompany.models. Modify to fit the structure
# of your app.
-keepclassmembers class com.yourcompany.models.** {
  *;
}

更多信息在这里:https://firebase.google.com/docs/database/android/start

答案 10 :(得分:0)

如果您使用的是Firebase Realtime数据库,则在混淆强文本之后将对模型对象进行序列化和反序列化

-keep class com.yourdevelopername.urappname.** { *; }

答案 11 :(得分:0)

这就是为什么当您进行简洁的体系结构易于修复时,请看这种情况,如果我的应用程序中有多个文件中的多个Firebase请求,那么尝试保留单个类以使Firebase正常工作将很麻烦。 ,如果我们具有模块化代码,并且将所有请求和数据模型存储在数据层中,那么仅保留使用firebase的类而不是整个项目将非常容易,这样做会更好地缩小apk大小也

enter image description here

-keep class com.mypackage.data.** {*;}