¿Qué configuración de ProGuard necesito para Firebase en Android?

Al usar Firebase SDK para aplicaciones de Android, sigo recibiendo advertencias y errores como estos (en 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') ... 

Desafortunadamente, Firebase no tiene ninguna documentación oficial sobre su uso con ProGuard.

¿Qué directivas necesito para que mis aplicaciones compilen versiones con Firebase cuando están ofuscadas con ProGuard?

En función de mis pruebas personales, resultó que algo similar a esto es necesario para que las aplicaciones de Android mejoradas de Firebase compilen con ProGuard.

En cualquier caso, debe agregar -keepnames class com.my.package.beans.** { *; } -keepnames class com.my.package.beans.** { *; } si está utilizando objetos personalizados en su Firebase, es decir, beans o POJO.

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.** { *; } 

Último recurso:

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

Notas:

Cualquier directriz oficial sería bienvenida. Las directivas de -dontwarn son obviamente peligrosas, el código puede romperse en puntos que no he probado. Además, las reglas anteriores son bastante permisivas y otras reglas pueden optimizar mejor tus APK.

No es realmente documentación oficial, pero Firebase sí mostró algunas reglas de defensa básicas en uno de sus repositorys de Github. 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.** 

Encontré esto en la documentación de Firebase:

Al usar Firebase Realtime Database en su aplicación junto con ProGuard, debe considerar cómo se serializarán y deserializarán sus objetos modelo después de la ofuscación. Si usa DataSnapshot.getValue (Class) o DatabaseReference.setValue (Object) para leer y escribir datos, deberá agregar reglas al archivo 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.** { *; } 

Siguiendo las otras respuestas, usando Firebase 2.4.1 solo tuve que incluir lo siguiente en mi configuración proguard (YMMV):

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

Mi conjunto de trabajo para 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 

La configuración de firebase 2.5.2 parece haber cambiado. Esto es lo que funciona para mí:

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

También tuve problemas con esto. Gracias a user4989692 y Ugo por indicarme la dirección correcta.

Esto es lo que funcionó para mí:

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.** { *; }