2012-11-24 35 views
17

Cảnh báo: Tôi đã xóa rất nhiều "văn bản cũ" để giữ cho câu hỏi rõ ràng hơn. Chỉ cần kiểm tra lịch sử nếu cần.Lỗi khi sử dụng bảo vệ với Android Facebook sdk 3.0

Tôi đang sử dụng proguard để cả hai thu nhỏ và làm xáo trộn ứng dụng sử dụng facebook sdk 3.0 (Tôi đang sử dụng sdk-version-3.0.2.b tag). Tôi không sử dụng tệp JAR. Thay vào đó, tôi nhập khẩu sdk bên trong không gian làm việc của tôi, như được dạy bởi documentation.

Tại thời điểm nhất định trong quá trình thực thi, ứng dụng sẽ tải PlacePickerFragment để cho phép người dùng chọn địa điểm của mình. Để viết mã này, tôi thực hiện chính xác số Scrumptious tutorial. Khi tôi tạo gói gỡ lỗi mà không cần sử dụng proguard mọi thứ hoạt động như mong đợi. Nhưng khi tôi tạo ra apk ký sử dụng proguard, nó bị treo khi tải PlacePickerFragment nơi lân cận với các dấu vết sau:

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) 

Đang cố gắng để tránh lỗi này, tôi giữ tất cả các lớp học facebook không bị ảnh hưởng, nhưng đã không làm việc. hiện proguard-project.txt tập tin của tôi:

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

của tôi hiện tại projet.properties file (trích đoạn):

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

Như bạn thấy, cấu hình proguard của tôi là một "chuyên môn" của this file.

Nếu tôi đặt -dontobfuscate trong tệp proguard-project.txt, tệp sẽ hoạt động. Nhưng những gì tôi không hiểu là keep class com.facebook.** nên đã ngăn chặn các lớp học liên quan đến facebook để được obfuscated. Điều này cho thấy vấn đề không liên quan trực tiếp đến các lớp học trên facebook.

Các excerpt of code mà ném com.facebook.FacebookGraphObjectException là:

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

Rõ ràng, expectedTypeAsParameterizedTypenull trong phiên bản xây dựng. Nhưng trong cả hai bản dựng (gỡ lỗi và phát hành) expectedType là giao diện com.facebook.model.GraphObjectList. Thật không may, tôi không hiểu hầu như không có gì về khái niệm phản chiếu Java.

Làm cách nào để khắc phục sự cố này?

Trả lời

30

Điều này sẽ giải quyết được sự cố của bạn, tôi hy vọng:

Và người chiến thắng là .....

-keepattributes Signature 

Từ Proguard Trang chủ:

Các "Chữ ký" thuộc tính là cần thiết để có thể truy cập vào chung loại khi biên dịch trong JDK 5.0 trở lên.

+0

Cảm ơn bạn rất nhiều! – borges

0

này có thể làm việc (chưa được kiểm tra)

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

Nó hoạt động một phần, vui lòng xem chỉnh sửa của tôi. – borges

0

Hãy thử

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

Lý do là, là khi xác định xuất public protected bạn vẫn đang mở ra mặc định (gói tin) truy cập khối tư nhân, để obfuscation.

+0

Nó hoạt động một phần, vui lòng xem chỉnh sửa của tôi. – borges

15

nếu bạn muốn Proguard Facebook, cấu hình dưới đây đang làm việc cho tôi

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

chỉ giải pháp làm việc đầy đủ này cho tôi '-keepattributes Signature' đã không giải quyết được vấn đề –

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