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.** { *; }
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. –
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
Cela me semble être une bonne solution. Pouvez-vous l'ajouter comme réponse? –