我真的已经厌倦了 Android 的 ProGuard / Release 版本。我尝试将我的应用程序上传到游戏商店,但每次我修复某些内容时都会出现另一个错误。而且这只发生在发布模式下。经过大量的试验和错误,我的应用程序已在游戏商店中。以前它会在启动时崩溃(通过在 ProGuard 设置中添加类来修复)。然后 Facebook 就无法登录(通过添加
来修复) -keep class com.facebook.** {
*;
}
转到 ProGuard 设置。
现在,当我尝试连接 Facebook 的 Open Graph 并发布消息时,我的应用程序崩溃了。我收到此错误,但在网上找不到任何有关它的信息:
04-02 18:09:20.160: E/AndroidRuntime(16163): FATAL EXCEPTION: main
04-02 18:09:20.160: E/AndroidRuntime(16163): com.facebook.FacebookGraphObjectException: Factory can't proxy method: public abstract java.lang.String com.xxxx.views.am.a()
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.facebook.model.GraphObject$Factory.verifyCanProxyClass(SourceFile:270)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.facebook.model.GraphObject$Factory.createGraphObjectProxy(SourceFile:196)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.facebook.model.GraphObject$Factory.access$0(SourceFile:195)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.facebook.model.GraphObject$Factory$GraphObjectProxy.proxyGraphObjectMethods(SourceFile:530)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.facebook.model.GraphObject$Factory$GraphObjectProxy.invoke(SourceFile:470)
04-02 18:09:20.160: E/AndroidRuntime(16163): at $Proxy3.cast(Native Method)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.facebook.Response.getGraphObjectAs(SourceFile:124)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.xxxxx.views.aa.a(SourceFile:432)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.xxxxxx.views.aa.a(SourceFile:419)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.xxxxx.views.ag.a(SourceFile:377)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.xxxxx.views.ag.onPostExecute(SourceFile:1)
04-02 18:09:20.160: E/AndroidRuntime(16163): at android.os.AsyncTask.finish(AsyncTask.java:631)
04-02 18:09:20.160: E/AndroidRuntime(16163): at android.os.AsyncTask.access$600(AsyncTask.java:177)
04-02 18:09:20.160: E/AndroidRuntime(16163): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
04-02 18:09:20.160: E/AndroidRuntime(16163): at android.os.Handler.dispatchMessage(Handler.java:99)
04-02 18:09:20.160: E/AndroidRuntime(16163): at android.os.Looper.loop(Looper.java:137)
04-02 18:09:20.160: E/AndroidRuntime(16163): at android.app.ActivityThread.main(ActivityThread.java:4931)
04-02 18:09:20.160: E/AndroidRuntime(16163): at java.lang.reflect.Method.invokeNative(Native Method)
04-02 18:09:20.160: E/AndroidRuntime(16163): at java.lang.reflect.Method.invoke(Method.java:511)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
04-02 18:09:20.160: E/AndroidRuntime(16163): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
04-02 18:09:20.160: E/AndroidRuntime(16163): at dalvik.system.NativeStart.main(Native Method)
ProGuard 还在剥离我使用的代码吗?什么设置可以解决这个问题?郑重声明...在构建模式下一切都运行良好。
还有一个问题。是否可以只禁用 ProGuard?我认为真的没用,只会带来更多问题。
ProGuard 默认情况下处于禁用状态,在发布版本中也是如此。您可以通过启用
proguard.config
文件中的 project.properties
行自行启用它。您可以通过注释掉该行来再次禁用它。
ProGuard 可能很有用,但您需要为应用程序中的任何反射配置它。在本例中,Facebook API 正在对您自己的类执行反射。查看 API 的代码,它正在 GraphObject 的扩展中搜索 getter、setter 和带注释的方法。 ProGuard 默认情况下会重命名甚至删除它们,因为它不(并且通常不能)了解反射。其他使用 API 的人可能知道哪些类、字段和方法需要保留。您传递给 API 且具有某些方法命名约定的类可能是不错的候选者。
这个问题花了我几个小时。解决方案是除了当前的 proguard 代码之外,排除构建 OpenGraphObject 的类。所以你可以使用 ProGuard 而不是关闭它。