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 expectedTypeAsParameterizedType
null
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?
Vielen Dank! – borges