Facebook 的 Android ProGuard 设置

Posted

技术标签:

【中文标题】Facebook 的 Android ProGuard 设置【英文标题】:Android ProGuard settings for Facebook 【发布时间】:2013-03-23 12:56:11 【问题描述】:

我终于找到了为什么我的应用程序崩溃了,因为它是为发布而构建的。 ProGuard 确实从我的应用程序中剥离了代码,但我通过在 proguard-android.txt(在 sdk 中找到)中使用 keep 命令手动添加类来防止这种情况发生。

对于我使用的 Facebook:

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

但我认为我仍然缺少一些东西。该应用程序现在没有崩溃,但我无法登录 Facebook 并使用 Open Graph。当我在调试模式下构建时,一切正常。

您使用 Facebook 和 Facebook 的 Open Graph 的 proguard 设置是什么?

编辑

这是我为 ProGuard 手动添加的命令:

-dontwarn android.support.**

# ActionBarSherlock 

-keep class android.support.**  *;  

-keep interface android.support.**  *;  

-keep class com.actionbarsherlock.**  *;  

-keep interface com.actionbarsherlock.**  *;  




# Keep line numbers to alleviate debugging stack traces 

-renamesourcefileattribute SourceFile 

-keepattributes SourceFile,LineNumberTable

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


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

编辑 2 所以没有登录的问题是我使用了我的调试哈希键而不是我的发布哈希键。在我的应用设置(developers.facebook.com)中更改了它,发现我的应用最终登录但登录后崩溃。

不知道这是否仍然是 ProGuard 问题,但它返回了此错误:

04-02 11:47:31.815: E/AndroidRuntime(9093): FATAL EXCEPTION: main
04-02 11:47:31.815: E/AndroidRuntime(9093): com.facebook.ab: com.facebook.b.e got an unexpected method signature: public abstract com.facebook.b.b com.facebook.b.b.a(java.lang.Class)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.facebook.b.f.a(SourceFile:400)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.facebook.b.e.b(SourceFile:546)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.facebook.b.e.invoke(SourceFile:470)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at $Proxy1.a(Native Method)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.facebook.bb.a(SourceFile:124)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.facebook.ar.a(SourceFile:264)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.facebook.as.run(SourceFile:1240)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at android.os.Handler.handleCallback(Handler.java:615)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at android.os.Looper.loop(Looper.java:137)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at android.app.ActivityThread.main(ActivityThread.java:4931)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at java.lang.reflect.Method.invokeNative(Native Method)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at java.lang.reflect.Method.invoke(Method.java:511)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
04-02 11:47:31.815: E/AndroidRuntime(9093):     at dalvik.system.NativeStart.main(Native Method)
04-02 11:47:31.820: W/ActivityManager(2130):   Force finishing activity com.xxxxx.xxxx/com.xxxxx.views.MainActivity
04-02 11:47:32.360: W/ActivityManager(2130): Activity pause timeout for ActivityRecord4289ca58 com.xxxxx.xxxxx/com.xxxxx.xxxxx.MainActivity

【问题讨论】:

【参考方案1】:

固定:

-keep class com.facebook.** 
   *;

代替:

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

还要确保在您的 Facebook 应用设置中检查您的哈希键。

【讨论】:

它有帮助,而 Facebook's own guide 没用。 FB 文档是多么令人震惊的笑话! 但它不会混淆 Facebook SDK 中的任何内容。即使您没有使用 SDK 的所有功能,它也只是存在于您的代码中。哪个不好。【参考方案2】:

在我的情况下你的解决方案

-keep class com.facebook.** 
   *;

有效,但我不得不保留

-keepattributes Signature

为了让一切正常工作。

【讨论】:

以上是关于Facebook 的 Android ProGuard 设置的主要内容,如果未能解决你的问题,请参考以下文章

关于Android混淆文件统一管理

启用 PROGUARD - Xamarin.Android

Android之代码混淆

Proguard 查询,正在使用哪一个

在 Facebook SDK Android 上找不到文件“com.facebook.android.facebook”

Android - Facebook 集成:无法导入 com.facebook.Session