2012-11-24 3 views
17

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?

Répondre

30

Cela permettra de résoudre votre problème, je l'espère:

Et le gagnant est .....

-keepattributes Signature 

De Proguard Page d'accueil:

L'attribut "Signature" est nécessaire pour être en mesure d'accéder génériques types lors de la compilation dans le JDK 5.0 et versions ultérieures.

+0

Merci beaucoup! – borges

0

Cela peut fonctionner (non testé)

-keep class com.facebook.** { *; } 
+0

Il a travaillé en partie, s'il vous plaît voir mon édition. – borges

0

Essayez

-keep class com.facebook.** { 
    *; 
} 

La raison d'être, est que lors de la spécification d'un accès privé, public, vous ouvrez encore en place de protection par défaut (package privé) à l'obscurcissement.

+0

Cela a fonctionné partiellement, s'il vous plaît voir ma modification. – borges

15

si vous voulez Proguard Facebook, la configuration ci-dessous travaille pour moi

#modify for Facebook 
-keepattributes Signature 
-keep class com.facebook.model.** { *; } 

-keepnames class * implements java.io.Serializable 
-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    !static !transient <fields>; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 
+0

seulement cette solution complète fonctionne pour moi '-keepattributes Signature' n'a pas résolu le problème –

Questions connexes