Android上Firebase需要什么ProGuard配置?
在使用Android应用程序的SDK时,我不断收到如下警告和错误(在Eclipse中): 不幸的是,Firebase没有任何关于它与ProGuard一起使用的官方文档Android上Firebase需要什么ProGuard配置?,android,firebase,proguard,Android,Firebase,Proguard,在使用Android应用程序的SDK时,我不断收到如下警告和错误(在Eclipse中): 不幸的是,Firebase没有任何关于它与ProGuard一起使用的官方文档 当我的应用程序与ProGuard混淆时,我需要什么指令才能成功地用Firebase编译发行版?根据我的个人测试,Firebase增强的Android应用程序必须使用ProGuard编译 在任何情况下,如果您在Firebase中使用自定义对象,即bean或POJO,则必须添加-keepnames class com.my.packa
当我的应用程序与ProGuard混淆时,我需要什么指令才能成功地用Firebase编译发行版?根据我的个人测试,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.**
-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.**
-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.** { *; }
Firebase SDK 1.1.1:
-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.**
-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.**
-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.** { *; }
Firebase SDK 2.0.0:
-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.**
-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.**
-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.** { *; }
最后手段:
-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.**
-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.**
-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.** { *; }
注意事项:
-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.**
-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.**
-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。这不是真正的官方文档,但Firebase在其一个Github存储库中展示了一些基本的proguard规则
继其他答案之后,使用Firebase 2.4.1,我只需在我的proguard配置(YMMV)中包括以下内容:
我的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
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.**
我也为此挣扎。 感谢用户4989692和Ugo为我指明了正确的方向 以下是对我有效的方法: 格雷德尔先生
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.** { *; }
我在Firebase文档中发现了这一点: 当你在应用程序中使用FieldRealTimeBasic和PROGORID时,你需要考虑你的模型对象在混淆之后会被序列化和反序列化。如果使用DataSnapshot.getValue(类)或DatabaseReference.setValue(对象)读取和写入数据,则需要将规则添加到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.** {
*;
}
它解决了我的问题
将此添加到proguard规则文件中
-optimizations !class/merging/*
如果您使用的是Firebase实时数据库,则模型对象将在模糊强大文本后序列化和反序列化
-keep class com.yourdevelopername.urappname.** { *; }
这就是为什么清洁架构很容易修复的原因,看看这个场景,如果我的应用程序中有来自多个文件的多个firebase请求,那么试图让单个类让firebase工作将是一团糟,所以,如果我们有一个模块化的代码,并且我们将所有的请求和数据模型存储在一个数据层中,那么只保留使用firebase的类而不是整个项目将非常容易,这样做将更好地缩小apk的大小 2021答案
在数据类之前使用
@保留注释,以便proguard保留它们。它是AndroidX的一部分,用于和。用于Firebase、Jetpack Navigator和改装
保持
数据类列表(
val id:String=“”,
val name:String=“”
)
表示在生成时缩小代码时不应删除带注释的元素。这通常用于仅通过反射访问的方法和类,因此编译器可能认为代码未使用
@詹尼通:谢谢!对这些变化有何解释?我在SDK中找不到任何org.apache.*
或com.fasterxml.jackson.*
类,只有shade
版本。我必须添加-keepattributes签名才能让jackson正常工作。参考:@riccardocasata你说得对,这是必需的。我只是忘了提到它,因为我有这个属性。从我们的Slack频道:“如果您使用FirebaseUI,您需要添加以下行:-dontwarn com.firebase.ui.auth.*
”您用“如果您在firebase中使用自定义对象,即bean或POJO”保存了我的一天。我的应用程序在生产中崩溃,因为没有此规则。谢谢谢谢这个消息来源!我的配置(见其他答案)的不同之处在于,他们删除了org.joda.time.*
、org.shade.apache.*
和org.ietf.jgss.*
的dontwarn
规则,而是为org.apache.*
添加了一条规则。欢迎您。只是想添加它,因为它来自Firebase本身,也因为它与您的个人测试略有不同。所以它只是最后四个新条目,对吗?也许一个-dontwarn com.firebase.*
在这里就足够了?不会保留com.YOUR-APP\u域只需禁用所有Proguard?这似乎真的错了。根据firebase,您需要:-keepclassmembers类com.yourcompany.models.*{*;}只需与实时数据库一起使用的模型!另请参见,不幸的是,这并没有解决Coinverse应用程序的Firebase问题。您可能会看到完整的代码。使用ProGuard的Firebase Firestore数据库是否有与使用实时数据库时类似的配置,如本节所述?能否提供文档链接?@SalicBlu3,以下是文档:。很遗憾,这并没有解决Firebase的问题。@Keep
注释也可用于保留数据类。为Firebase测试并生效:在@Kaiffi中的方法对您不起作用吗?不幸的是,这并没有解决Coinverse应用程序的Firebase问题。您可能会看到完整的代码。不幸的是,这并没有解决Coinverse应用程序的Firebase问题。你可以看到完整的代码。哇!你是一个救生员,有一个非常优雅的解决方案!感谢男士:)谷歌可以通过更新其文档做得更好。您仍然需要添加-keep class com.Google.firebase.*{*}
,否则您的应用程序将无法在三星设备上运行,请重新安装