Подтвердить что ты не робот

Ошибка при использовании proguard с Android Facebook sdk 3.0

Предупреждение: Я удалил много "старого текста", чтобы сохранить вопрос более чистым. Просто проверьте историю, если необходимо.

Я использую proguard для сжатия и обфускации приложения, которое использует facebook sdk 3.0 (я использую тег sdk-version-3.0.2.b). Я не использую JAR файл. Вместо этого я импортировал sdk в свое рабочее пространство, как описано в документации.

В определенный момент выполнения приложение загружает PlacePickerFragment, чтобы пользователь мог выбрать место, где он находится. Чтобы закодировать это, я точно следую Scrumptious tutorial. Когда я создаю debug apk без использования proguard, все работает так, как ожидалось. Но когда я создаю подписанный apk с помощью proguard, он вылетает, когда PlacePickerFragment загружает соседние места со следующей трассировкой:

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)

Пытаясь избежать этой ошибки, я оставил все классы facebook нетронутыми, но не работал. Мой текущий файл proguard-project.txt:

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

Мой текущий projet.properties файл (выдержка):

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

Как вы можете видеть, моя конфигурация proguard является "специализацией" этого файла.

Если я поместил -dontobfuscate в файл proguard-project.txt, он будет работать.. Но я не понимаю, что keep class com.facebook.** должен уже предотвращать запутывание классов, связанных с facebook. Это говорит о том, что проблема напрямую не связана с классами facebook.

фрагмент кода, который выбрасывает com.facebook.FacebookGraphObjectException:

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

Ясно, что expectedTypeAsParameterizedType является null в сборке релизов. Но в обеих сборках (отладка и выпуск) expectedType - это интерфейс com.facebook.model.GraphObjectList. К сожалению, я почти ничего не понимаю о концепциях отражения Java.

Как я могу исправить эту проблему?

4b9b3361

Ответ 1

Это решит вашу проблему, я надеюсь:

И победитель.....

-keepattributes Signature

С веб-сайта Proguard:

Атрибут "Подпись" необходим для доступа к родовому типы при компиляции в JDK 5.0 и выше.

Ответ 2

если вы хотите proguard Facebook, нижеприведенная конфигурация работает для меня

#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();
}

Ответ 3

Это может работать (не проверено)

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

Ответ 4

Попробуйте

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

Причина в том, что при указании private, public, protected вы по-прежнему открываете доступ к обфускации по умолчанию (пакетный).