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, expectedTypeAsParameterizedType
là null
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?
Cảm ơn bạn rất nhiều! – borges