Avertissement: J'ai supprimé beaucoup de "vieux texte" pour garder la question plus propre. Vérifiez l'historique si nécessaire.Erreur sur l'utilisation de proguard avec Android Facebook sdk 3.0
J'utilise proguard
pour à la fois réduire et obscurcir une application qui utilise le facebook sdk 3.0 (j'utilise le sdk-version-3.0.2.b tag). Je n'utilise pas de fichier JAR. Au lieu de cela, j'ai importé le SDK dans mon espace de travail, comme enseigné par le documentation.
À un certain point dans l'exécution, l'application charge un PlacePickerFragment pour permettre à l'utilisateur de choisir l'endroit où il se trouve. Pour coder ceci, je suis exactement le Scrumptious tutorial. Lorsque je génère l'apk de débogage sans utiliser proguard
tout fonctionne comme prévu. Mais quand je produis le fichier APK en utilisant proguard
, il se bloque lorsque les charges PlacePickerFragment lieux à proximité avec la trace suivante:
E/AndroidRuntime(27472): FATAL EXCEPTION: main
E/AndroidRuntime(27472): com.facebook.FacebookGraphObjectException: can't infer generic type of: interface com.facebook.model.GraphObjectList
E/AndroidRuntime(27472): at com.facebook.model.GraphObject$Factory.coerceValueToExpectedType(Unknown Source)
E/AndroidRuntime(27472): at com.facebook.model.GraphObject$Factory$GraphObjectProxy.proxyGraphObjectGettersAndSetters(Unknown Source)
E/AndroidRuntime(27472): at com.facebook.model.GraphObject$Factory$GraphObjectProxy.invoke(Unknown Source)
E/AndroidRuntime(27472): at com.facebook.widget.$Proxy2.getData(Native Method)
E/AndroidRuntime(27472): at com.facebook.widget.GraphObjectPagingLoader.addResults(Unknown Source)
E/AndroidRuntime(27472): at com.facebook.widget.GraphObjectPagingLoader.requestCompleted(Unknown Source)
E/AndroidRuntime(27472): at com.facebook.widget.GraphObjectPagingLoader.access$1(Unknown Source)
E/AndroidRuntime(27472): at com.facebook.widget.GraphObjectPagingLoader$2.onCompleted(Unknown Source)
E/AndroidRuntime(27472): at com.facebook.Request$4.run(Unknown Source)
E/AndroidRuntime(27472): at android.os.Handler.handleCallback(Handler.java:587)
E/AndroidRuntime(27472): at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(27472): at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(27472): at android.app.ActivityThread.main(ActivityThread.java:3687)
E/AndroidRuntime(27472): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(27472): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(27472): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
E/AndroidRuntime(27472): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
E/AndroidRuntime(27472): at dalvik.system.NativeStart.main(Native Method)
en essayant d'éviter cette erreur, j'ai gardé toutes les classes facebook intacte, mais ne fonctionnent pas. Mon fichier actuel proguard-project.txt
:
-keep class com.facebook.** {
*;
}
Mon fichier actuel projet.properties
(extrait):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
Comme vous pouvez le voir, ma configuration proguard
est une "spécialisation" de this file.
Si je mets -dontobfuscate
dans le fichier proguard-project.txt
, cela fonctionnera. Mais ce que je ne comprends pas, c'est que le keep class com.facebook.**
devrait déjà empêcher les classes liées à facebook d'être obscurcie. Ce qui suggère que le problème n'est pas directement lié aux classes facebook.
Le excerpt of code qui jette com.facebook.FacebookGraphObjectException
est:
static <U> U coerceValueToExpectedType(Object value, Class<U> expectedType,
ParameterizedType expectedTypeAsParameterizedType) {
// [...]
} else if (Iterable.class.equals(expectedType) || Collection.class.equals(expectedType)
|| List.class.equals(expectedType) || GraphObjectList.class.equals(expectedType)) {
if (expectedTypeAsParameterizedType == null) {
throw new FacebookGraphObjectException("can't infer generic type of: " + expectedType.toString());
}
// [...]
}
De toute évidence, expectedTypeAsParameterizedType
est null
dans la version build. Mais dans les deux versions (débogage et libération) expectedType
est une interface com.facebook.model.GraphObjectList
. Malheureusement, je ne comprends presque rien sur les concepts de réflexion Java.
Comment puis-je résoudre ce problème?
Merci beaucoup! – borges