警告:我删除了很多“旧文本”以保持问题更清晰。如果需要,只需检查历史记录。
我proguard
用来缩小和混淆使用facebook sdk 3.0的应用程序(我正在使用sdk-version-3.0.2.b 标签)。我没有使用 JAR 文件。相反,我在我的工作区中导入了 sdk,正如文档中所教导的那样。
在执行的某个时刻,应用程序会加载一个PlacePickerFragment以让用户选择他所在的位置。为了编写代码,我完全按照Scrumptious 教程进行操作。当我在不使用一切的情况下生成调试 apk 时,proguard
一切都按预期工作。但是,当我使用 生成签名的 apkproguard
时,它会在 PlacePickerFragment 使用以下跟踪加载附近的地方时崩溃:
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)
为了避免这个错误,我保持所有 facebook 类不变,但没有工作。我当前的proguard-project.txt
文件:
-keep class com.facebook.** {
*;
}
我当前的projet.properties
文件(摘录):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
如您所见,我的proguard
配置是此文件的“特化” 。
如果我放入-dontobfuscate
文件proguard-project.txt
中,它将起作用。但我不明白的是,keep class com.facebook.**
应该已经防止与 facebook 相关的类被混淆。这表明问题与 facebook 类没有直接关系。
抛出的代码摘录com.facebook.FacebookGraphObjectException
是:
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());
}
// [...]
}
显然,expectedTypeAsParameterizedType
是null
在发布版本中。但是在两个版本(调试和发布)expectedType
中都是一个com.facebook.model.GraphObjectList
接口。不幸的是,我对 Java 反射概念几乎一无所知。
我该如何解决这个问题?