【问题标题】:ProGuard still stripping Facebook code? (Or disable ProGuard!!)ProGuard 还在剥离 Facebook 代码? (或禁用 ProGuard !!)
【发布时间】:2013-04-02 16:17:56
【问题描述】:

我真的很喜欢 Android 的 ProGuard / Release 版本。我尝试将我的应用程序上传到 Play 商店,但每次我修复某些问题时都会出现另一个错误。而且这只发生在发布模式下。经过大量试验和错误后,我的应用程序在 Play 商店中。以前它会在启动时崩溃(通过在 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


    【解决方案1】:

    默认情况下禁用 ProGuard,在发布版本中也是如此。您已通过启用 project.properties 文件中的 proguard.config 行自己启用它。您可以通过注释掉该行再次禁用它。

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

    【讨论】:

    • 我设法通过不让 ProGuard 混淆或优化任何东西来解决我的问题。奇怪的是,我的应用程序会在发布版本中崩溃,而不是在我添加这些设置时(@ default 当我没有在我的 project.properties 中添加 proguard 时)。那将假设 proguard 确实自动运行。但是我得到了它的工作..感谢您的回答。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      相关资源
      最近更新 更多