使用适用于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成功编译版本需要哪些指令?
答案 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)
在数据类之前使用@Keep
批注,以便Proguard保留它们。这是Java和Kotlin的AndroidX的一部分。适用于Firebase,Jetpack Navigator和翻新。
@Keep
data class Listing(
val id: String = "",
val name: String = ""
)
表示在构建时最小化代码时,不应删除带注释的元素。通常用于仅通过反射访问的方法和类,因此编译器可能认为代码未使用。
答案 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)