2013-04-02 40 views
26

Cuối cùng tôi đã tìm ra lý do tại sao sự cố ứng dụng của tôi được tạo để phát hành. ProGuard đã thực sự tước mã từ ứng dụng của tôi nhưng tôi ngăn chặn điều này bằng cách thêm các lớp bằng tay với lệnh giữ trong proguard-android.txt (tìm thấy trong sdk).Cài đặt Android ProGuard cho Facebook

Đối với Facebook tôi đã sử dụng:

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

Nhưng tôi nghĩ rằng tôi vẫn đang thiếu một cái gì đó. Ứng dụng này hiện không hoạt động nhưng tôi không thể đăng nhập vào Facebook và sử dụng Open Graph. Khi tôi xây dựng trong chế độ gỡ lỗi này tất cả hoạt động tốt.

Cài đặt proguard của bạn để sử dụng Facebook và Biểu đồ mở của Facebook là gì?

EDIT

Đây là lệnh bằng tay thêm của tôi cho 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>; 
} 

EDIT 2 Vì vậy, vấn đề không đăng nhập là tôi sử dụng chìa khóa debug băm của tôi thay vì tôi phát hành khóa băm. Thay đổi điều đó trong cài đặt ứng dụng của tôi (developers.facebook.com) và phát hiện ra rằng ứng dụng của tôi cuối cùng đăng nhập nhưng bị treo sau khi đăng nhập.

Dont biết nếu điều này vẫn còn là một vấn đề ProGuard nhưng nó lại báo lỗi này:

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 ActivityRecord{4289ca58 com.xxxxx.xxxxx/com.xxxxx.xxxxx.MainActivity} 

Trả lời

51

cố định:

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

thay vì:

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

Ngoài ra hãy chắc chắn để kiểm tra khóa băm của bạn trong cài đặt ứng dụng facebook của bạn.

+5

+1, cảm ơn bạn đã chia sẻ giải pháp của mình. – Prateek

+6

Nó giúp trong khi [hướng dẫn riêng của Facebook] (https://developers.facebook.com/docs/android/getting-started#proguard) không được sử dụng. Thật là một trò đùa kinh khủng về tài liệu FB! – Sufian

+1

Nhưng nó sẽ không làm xáo trộn bất cứ điều gì bên trong Facebook SDK. Mặc dù bạn không sử dụng tất cả các tính năng của SDK, nó chỉ đơn giản là nằm trong mã của bạn. Điều đó thật tệ. –

21

Trong trường hợp của tôi giải pháp của bạn

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

công trình, nhưng tôi đã phải giữ

-keepattributes Signature 

Để có được tất cả mọi thứ làm việc.

Các vấn đề liên quan