Fehler bei der Verwendung von Proguard mit Android Facebook SDK 3.0
Warnung: Ich habe viel "alten Text" entfernt, um die Frage sauberer zu halten. Überprüfen Sie bei Bedarf einfach den Verlauf.
Ich benutzeproguard
eine App zu verkleinern und zu verschleiern, die dieFacebook SDK 3.0 Ich benutze diesdk-version-3.0.2.b tag). Ich verwende keine JAR-Datei. Stattdessen habe ich das SDK in meinen Arbeitsbereich importiert, wie von derDokumentation.
An einem bestimmten Punkt in der Ausführung lädt die App einPlacePickerFragment Damit der Benutzer den Ort auswählen kann, an dem er sich befindet. Um dies zu kodieren, folge ich genau demLeckeres Tutorial. Wenn ich das Debug-apk ohne Verwendung generiereproguard
alles funktioniert wie erwartet. Aber wenn ich die signierte apk mit generiereproguard
stürzt ab, wenn das PlacePickerFragment Orte in der Nähe mit der folgenden Ablaufverfolgung lädt:
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)
Um diesen Fehler zu vermeiden, habe ich alle Facebook-Klassen unangetastet gelassen, aber nicht funktioniert. Meine jetzigeproguard-project.txt
Datei:
-keep class com.facebook.** {
*;
}
Meine jetzigeprojet.properties
Datei (Auszug):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
Wie Sie sehen können, meineproguard
Konfiguration ist eine "Spezialisierung" vonDiese Datei.
Wenn ich sage-dontobfuscate
improguard-project.txt
Datei, wird es funktionieren. Aber was ich nicht verstehe, ist daskeep class com.facebook.**
sollte bereits verhindern, dass Klassen in Bezug auf Facebook verschleiert werden. Was darauf hindeutet, dass das Problem nicht direkt mit den Facebook-Klassen zusammenhängt.
DasAuszug aus dem Code das wirftcom.facebook.FacebookGraphObjectException
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());
}
// [...]
}
Deutlich,expectedTypeAsParameterizedType
istnull
in Release Build. Aber in beiden Builds (Debug und Release)expectedType
ist eincom.facebook.model.GraphObjectList
Schnittstelle. Leider verstehe ich fast nichts über Java-Reflexionskonzepte.
Wie kann ich dieses Problem beheben?