2012-11-24 8 views
17

Warnung: Ich entfernte eine Menge "alten Text", um die Frage sauberer zu halten. Überprüfen Sie den Verlauf bei Bedarf.Fehler bei der Verwendung von Proguard mit Android Facebook sdk 3.0

Ich benutze proguard zum Schrumpfen und Verschleiern einer App, die die facebook sdk 3.0 verwendet (ich benutze die sdk-version-3.0.2.b tag). Ich verwende keine JAR-Datei. Stattdessen importierte ich das SDK in meinen Arbeitsbereich, wie es von der documentation gelehrt wird.

Zu einem bestimmten Zeitpunkt der Ausführung lädt die App einen PlacePickerFragment, damit der Benutzer den Ort auswählen kann, an dem er sich befindet. Um dies zu kodieren, folge ich genau der Scrumptious tutorial. Wenn ich die Debug-APK ohne proguard generieren, funktioniert alles wie erwartet. Aber wenn ich das signierte apk mit proguard erzeugen, stürzt es, wenn die PlacePickerFragment Lasten Orte in der Nähe der folgenden Spur:

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) 

Der Versuch, diesen Fehler zu vermeiden, habe ich alle Facebook-Klassen unberührt gehalten, aber hat nicht funktioniert. Meine aktuelle proguard-project.txt Datei:

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

Mein aktueller projet.properties Datei (Auszug):

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 

Wie Sie sehen können, meine proguard Konfiguration ist eine "Spezialisierung" von this file.

Wenn ich -dontobfuscate in proguard-project.txt Datei, wird es funktionieren. Aber was ich nicht verstehe, ist, dass die keep class com.facebook.** bereits verhindern sollte, dass Facebook-bezogene Klassen verschleiert werden. Was darauf hindeutet, dass das Problem nicht direkt mit den Facebook-Klassen zusammenhängt.

Die excerpt of code die com.facebook.FacebookGraphObjectException wirft ist:

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()); 
     } 
    // [...] 
} 

Offensichtlich ist expectedTypeAsParameterizedTypenull in Release-Build. Aber in beiden Builds (Debug und Release) expectedType ist eine com.facebook.model.GraphObjectList Schnittstelle. Leider verstehe ich fast nichts über Java-Reflektionskonzepte.

Wie kann ich dieses Problem beheben?

Antwort

30

Dies wird Ihr Problem lösen, ich hoffe:

Und der Gewinner ist .....

-keepattributes Signature 

Von Proguard Homepage:

Die "Signature" Attribut ist erforderlich, um Typen zugreifen generic wenn in JDK 5.0 und höher zu kompilieren.

+0

Vielen Dank! – borges

0

Dies kann (nicht getestet) arbeiten

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

Es funktionierte teilweise, bitte meine bearbeiten sehen. – borges

0

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

Der Grund dafür ist versuchen, ist, dass bei der Angabe von privaten, öffentlichen, geschützten Sie öffnen immer noch Standard (Paket privat) Zugang zur Verschleierung.

+0

Es funktionierte teilweise, siehe meine Bearbeitung. – borges

15

wenn Sie Facebook ProGuard, unter die Config für mich arbeitet

#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

nur diese vollständige Lösung funktioniert für mich '-bezeichnet Signature 'hat das Problem nicht gelöst –

Verwandte Themen