ProGuard 还在剥离 Facebook 代码吗? (或者禁用 ProGuard!!)

问题描述 投票:0回答:2

我真的已经厌倦了 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?我认为真的没用,只会带来更多问题。

java android eclipse proguard dalvik
2个回答
0
投票

ProGuard 默认情况下处于禁用状态,在发布版本中也是如此。您可以通过启用

proguard.config
文件中的
project.properties
行自行启用它。您可以通过注释掉该行来再次禁用它。

ProGuard 可能很有用,但您需要为应用程序中的任何反射配置它。在本例中,Facebook API 正在对您自己的类执行反射。查看 API 的代码,它正在 GraphObject 的扩展中搜索 getter、setter 和带注释的方法。 ProGuard 默认情况下会重命名甚至删除它们,因为它不(并且通常不能)了解反射。其他使用 API 的人可能知道哪些类、字段和方法需要保留。您传递给 API 且具有某些方法命名约定的类可能是不错的候选者。


0
投票

这个问题花了我几个小时。解决方案是除了当前的 proguard 代码之外,排除构建 OpenGraphObject 的类。所以你可以使用 ProGuard 而不是关闭它。

© www.soinside.com 2019 - 2024. All rights reserved.