2014-10-09 52 views
31

当使用Firebase SDK for Android应用程序,我不断收到警告和错误像这样(在Eclipse):Android上的Firebase需要哪些ProGuard配置?

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') ... 

不幸的是,火力地堡没有关于其使用ProGuard使用的任何正式文件。

使用ProGuard进行混淆处理时,我的应用需要使用哪些指令来成功编译Firebase版本?

+0

参见[配置ProGuard的(HTTPS ://firebase.google.com/docs/database/android/start/#proguard) – Kato 2017-01-09 22:17:09

回答

33

根据我的个人测试,结果发现Firebase增强的Android应用需要使用ProGuard进行编译。

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

火力地堡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.** 

火力地堡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.** 

火力地堡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。

+0

@JennyTong:谢谢!对变更的任何解释?我无法在SDK中找到任何'org.apache。**'或'com.fasterxml.jackson。**'类,只有'shaded'版本。 – caw 2014-12-16 04:48:16

+2

我不得不添加'-keepattributes Signature'让jackson正常工作。参考:http://stackoverflow.com/questions/28433281/how-to-include-typereference-proguard-rule – 2015-03-16 10:15:22

+0

@ RiccardoCasatta你是对的,这是必需的。无论如何,我只是忘记提及它,因为我有这个属性。 – caw 2015-03-16 15:06:55

6

这不是真正的官方文档,但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.** 
+0

感谢此源!与我的配置不同(见其他答案)似乎是他们放弃了'org.joda.time。**','org.shaded.apache。**'和'org.ietf.jgss'的'dontwarn'规则。**'而是在'org.apache。**'中包含一个。 – caw 2015-07-06 01:13:57

+0

不客气。只是想添加它,因为它来自Firebase本身,并且因为它与您的个人测试稍有不同。 – user4989692 2015-07-06 02:33:44

+0

此规则不起作用。 – 2016-02-04 08:45:44

2

跟进其他答案,使用火力地堡2.4.1我只有包括我的ProGuard配置以下(因人而异):

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

我的工作集火力地堡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 
+0

所以这只是最后四个新的条目,对吧?也许这里有一个'-twtwarn com.firebase。**'就够了? – caw 2016-03-04 01:30:21

+0

是的,这是正确的,我已经更新了这篇文章。 – Peter 2016-03-04 18:30:49

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.** 
1

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

这是我工作的东西:

构建。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.** { *; } 
+6

将不会保持com.YOUR-APP_DOMAIN只是禁用所有的Proguard?这似乎是错误的。 – domenukk 2016-07-12 17:11:35

+0

根据firebase,您需要改为: -keepclassmembers class com.yourcompany.models。** { *; }只是您使用的模型和实时数据库一起! – Tino 2016-07-12 18:45:15

4

我发现这个在火力地堡单证:

当你的应用程序使用ProGuard一起使用火力地堡实时数据库,你需要考虑如何您的模型对象将在混淆后序列化并反序列化。如果你使用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.** { 
*; 
} 
+0

你能提供一个指向文档的链接吗? – SalicBlu3 2017-03-15 15:44:51

+1

https://firebase.google.com/docs/database/android/start/ – MrAliB 2017-03-18 00:42:56