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 generiereproguardstü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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage