Iniciar sesión con el SDK de Android de Facebook y Proguard

He creado una aplicación de Android con el SDK de Android de Facebook 3.0.

He creado una aplicación de trabajo (cuando se ejecuta desde Eclipse). Se creará una sesión de Facebook (con com.facebook.UiLifecycleHelper) y un botón de inicio de sesión (con com.facebook.LoginButton) para que el usuario pueda iniciar sesión en Facebook. El cuadro de diálogo de autenticación de Facebook se muestra y después de rellenar las credenciales, el botón de inicio de sesión mostrará que el usuario está conectado a Facebook.

Por lo tanto, todo funciona bien, pero cuando estoy haciendo una compilación de liberación (con Proguard habilitado) recibo la siguiente excepción:

E/AndroidRuntime(14690): FATAL EXCEPTION: main E/AndroidRuntime(14690): com.facebook.FacebookException: Unable to save session. E/AndroidRuntime(14690): at com.facebook.Session.saveSession(Session.java:673) E/AndroidRuntime(14690): at com.facebook.UiLifecycleHelper.onSaveInstanceState(UiLifecycleHelper.java:124) E/AndroidRuntime(14690): at com.peerkesoftware.blockcrusher.MorburActivity.onSaveInstanceState(MorburActivity.java:175) E/AndroidRuntime(14690): at android.app.Activity.performSaveInstanceState(Activity.java:1147) E/AndroidRuntime(14690): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1216) E/AndroidRuntime(14690): at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3253) E/AndroidRuntime(14690): at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3312) E/AndroidRuntime(14690): at android.app.ActivityThread.access$900(ActivityThread.java:150) E/AndroidRuntime(14690): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1271) E/AndroidRuntime(14690): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(14690): at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(14690): at android.app.ActivityThread.main(ActivityThread.java:5191) E/AndroidRuntime(14690): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(14690): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(14690): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) E/AndroidRuntime(14690): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) E/AndroidRuntime(14690): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(14690): Caused by: java.io.NotSerializableException: com.facebook.internal.SessionTracker$CallbackWrapper E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) E/AndroidRuntime(14690): at java.util.ArrayList.writeObject(ArrayList.java:644) E/AndroidRuntime(14690): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(14690): at java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1053) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1074) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1404) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) E/AndroidRuntime(14690): at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) E/AndroidRuntime(14690): at com.facebook.Session.saveSession(Session.java:671) E/AndroidRuntime(14690): ... 16 more 

Ya he intentado agregar algunas reglas Proguard, pero no hay suerte para resolver este problema:

 -keep class com.facebook.* -keep class com.facebook.android.* -keep class android.webkit.WebViewClient -keep class * extends android.webkit.WebViewClient -keepclassmembers class * extends android.webkit.WebViewClient { <methods>; } 

¿Alguien tiene alguna idea de cómo resolver este problema?

Es probable que la clave sea NotSerializableException en el seguimiento de la pila.

Ya está en la línea correcta con el conjunto de reglas. Eche un vistazo a esta documentación de Proguard , en particular la sección 'Procesamiento de clases serializables'.

El ejemplo más simple que puedes probar desde allí es:

 -keepclassmembers class * implements java.io.Serializable { private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } 

pero amplían esto y agregan más complejidad.

He visto algo similar con la AIDL de Android y la interfaz Parcelable, que es una instancia diferente de serialización (pasar objetos a través de una API remota). Proguard cambia los nombres de clase, lo que significa que ya no puede encontrar las clases esperadas para construir.

  • Android O casting para findViewById ya no es necesario?
  • Devolución de llamada de la actividad en Córdoba
  • El nombre del proyecto no aparece en mi eclipse
  • Cómo cargar correctamente las texturas con libgdx assetmanager
  • No puede ver datos Sqlite con adaptador simple
  • Android: alternativa para context.getDrawable ()
  • ¿Podemos instanciar una clase abstracta?
  • ¿Por qué google map v2 de repente se estrelló por java.lang.NullPointerException: Intento de obtener la longitud de matriz nula?
  • Android: fija el elemento fijo en RecyclerView
  • Cómo detectar cuando se ha completado MotionEvent.ACTION_MOVE
  • Cambiar el color de línea inferior de EditText con appcompat v7
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.