3

Lors de la création d'un APK proguard activé, l'exception suivante est générée lorsque vous utilisez la FirebaseRecyclerAdapter de la bibliothèque Firebase-UI (com.firebaseui:firebase-ui:0.3.0):configuration Proguard pour la bibliothèque Firebase-UI

java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View] 
                       at com.firebase.ui.FirebaseRecyclerAdapter.onCreateViewHolder(FirebaseRecyclerAdapter.java:168) 

La version de débogage (sans proguard) fonctionne bien. Qui a une configuration de proguard pour Firebase-UI?

Ma config actuelle PROGUARD ressemble à ceci (uniquement les parties liées Firebase):

-optimizationpasses 5 
-keepattributes SourceFile,LineNumberTable,Exceptions, Signature, InnerClasses,*Annotation* 

-keepnames class ** { *; } 

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

L'exception provient de [cette ligne] (https://github.com/firebase/FirebaseUI-Android/blob/0.3.0/library/src/main/java/com/firebase/ui/FirebaseRecyclerAdapter.java# L168) dans le code FirebaseUI. FirebaseUI pour Android utilise la réflexion pour créer les instances ViewHolder. Vous devez ajouter '-keep class com.yourpackage.yourviewholder {*; } 'à la config proguard, afin qu'elle sache ne pas dépouiller votre viewholder. –

+1

Merci pour votre commentaire Frank, il m'a pointé dans la bonne direction. Je n'ai cependant pas été capable de le résoudre avec une règle qui pointe vers le ViewHolder comme vous l'indiquez; Je les garde comme cours internes. J'ai essayé la plupart des solutions proposées ici: [link] (http://stackoverflow.com/questions/14059888/android-proguard-keep-inner-class), mais je n'ai pas trouvé de solution de travail. À la fin, j'ai résolu ce problème en déplaçant mes viewholders vers un paquet dédié et en ajoutant: '-keep class com.mypackage.myapp.viewholders. ** {*; } ' Cela fonctionne très bien. Si je trouve une meilleure approche, je l'afficherai ici. – Peter

+0

Cela me semble être une bonne solution. Pouvez-vous l'ajouter comme réponse? –

Répondre

10

résolu ce problème en déplaçant les ViewHolder classes qui sont utilisées par le FirebaseRecyclerAdapter à un ensemble dédié (par exemple com.mypackage.myapp .viewholders) et en ajoutant une règle dans la configuration de proguard pour empêcher que les classes dans ce paquet deviennent par obscurcie proguard:

-keep class com.mypackage.myapp.viewholders.** { *; } 
+1

J'ai essayé toutes les autres solutions que j'ai trouvées sur StackOverflow mais seulement celle-ci a fonctionné pour moi! Merci!! – Sandra

2

Eh bien, j'avais mon ViewHolder intérieur par rapport FirebaseRecyclerAdapter en tant que classe interne et m'a donné cette erreur. Faire la classe interne a résolu le problème.

Également https://github.com/firebase/FirebaseUI-Android/issues/46#issuecomment-167373575 indique la même chose avec un ajout. La classe interne ViewHolder doit être public et static afin qu'elle puisse être initiée par réflexion.