studio para developer crear app android facebook proguard facebook-android-sdk

para - login facebook android studio



Error al usar proguard con Android Facebook SDK 3.0 (4)

Esto puede funcionar (no probado)

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

Advertencia: eliminé muchos "textos antiguos" para mantener la pregunta más limpia. Solo revisa la historia si es necesario.

Estoy usando proguard tanto para reducir como para ofuscar una aplicación que usa el sdk 3.0 de facebook (estoy usando la etiqueta sdk-version-3.0.2.b ). No estoy usando un archivo JAR. En su lugar, importé el SDK dentro de mi área de trabajo, como se indica en la documentation .

En cierto punto de la ejecución, la aplicación carga un PlacePickerFragment para permitir al usuario elegir el lugar donde se encuentra. Para codificar esto, sigo exactamente el tutorial Scrumptious . Cuando genero la aplicación de depuración sin usar proguard todo funciona como se esperaba. Pero cuando genero el apk firmado utilizando proguard , se bloquea cuando PlacePickerFragment carga lugares cercanos con la siguiente traza:

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)

Tratando de evitar este error, mantuve todas las clases de facebook sin tocar, pero no funcionó. Mi proguard-project.txt actual proguard-project.txt :

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

Mi archivo actual projet.properties (extracto):

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

Como puede ver, la configuración de mi proguard es una "especialización" de este archivo .

Si pongo -dontobfuscate en el archivo proguard-project.txt , funcionará. Pero lo que no entiendo es que keep class com.facebook.** ya debería evitar que las clases relacionadas con Facebook sean confusas. Lo que sugiere que el problema no está directamente relacionado con las clases de facebook.

El extracto del código que lanza com.facebook.FacebookGraphObjectException es:

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

Claramente, expectedTypeAsParameterizedType es null en la versión de lanzamiento. Pero en ambas compilaciones (depuración y versión) expectedType es una interfaz com.facebook.model.GraphObjectList . Desafortunadamente, no entiendo casi nada acerca de los conceptos de reflexión de Java.

¿Como puedo solucionar este problema?


Esto solucionará tu problema, espero:

Y el ganador es .....

-keepattributes Signature

Desde la página de inicio de Proguard:

Se requiere el atributo "Firma" para poder acceder a los tipos genéricos al compilar en JDK 5.0 y superior.


Si desea programar Facebook, la configuración a continuación está funcionando para mí.

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


Tratar

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

La razón es que al especificar privado, público, protegido, todavía está abriendo el acceso predeterminado (paquete privado) a la ofuscación.