简体   繁体   English

使用Facebook Android SDK和Proguard登录

[英]Logging in with the Facebook Android SDK and Proguard

I have created a Android application with the Facebook Android SDK 3.0. 我用Facebook Android SDK 3.0创建了一个Android应用程序。

I created a working application (when running from Eclipse). 我创建了一个工作应用程序(从Eclipse运行时)。 It will create a Facebook session (with com.facebook.UiLifecycleHelper) and a login button (with com.facebook.LoginButton) so that the user can login into Facebook. 它将创建一个Facebook会话(使用com.facebook.UiLifecycleHelper)和一个登录按钮(使用com.facebook.LoginButton),以便用户可以登录Facebook。 The Facebook authentication dialog is showing and after filling in the credentials the login button will show that the user is logged in into Facebook. Facebook身份验证对话框正在显示,填写凭据后,登录按钮将显示用户已登录到Facebook。

So, far everything works fine, but when I'm making a release build (with Proguard enabled) I get the following exception: 所以,一切正常,但是当我正在进行发布版本(启用了Proguard)时,我得到以下异常:

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

I already tried adding some Proguard rules, but no luck resolving this issue: 我已经尝试添加一些Proguard规则,但没有运气解决这个问题:

-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>;  }

Does anybody have any idea how to resolve this problem? 有没有人知道如何解决这个问题?

The key is likely to be the NotSerializableException in your stack trace. 密钥很可能是堆栈跟踪中的NotSerializableException。

You are already along the right lines with the rule set. 您已经在规则集的右侧。 Have a look at this Proguard documentation , in particular the section 'Processing serializable classes'. 看看这个Proguard文档 ,特别是“处理可序列化类”一节。

The simplest example you can try from there is: 您可以尝试的最简单的例子是:

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

but they expand on this and add more complexity. 但他们扩展了这一点,增加了更多的复杂性。

I've seen something similar with Android's AIDL and the Parcelable interface, which is a different instance of serialisation (passing objects over a remote API). 我见过类似Android的AIDL和Parcelable接口,它是一个不同的序列化实例(通过远程API传递对象)。 Proguard changes the class names, meaning that it can no longer find the expected classes to construct. Proguard更改了类名,这意味着它无法再找到要构造的预期类。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM