繁体   English   中英

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

[英]ProGuard still stripping Facebook code? (Or disable ProGuard!!)

我确实在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是否仍在剥离Im正在使用的代码? 哪些设置可以解决此问题? 记录下来。在构建模式下,一切都很好。

另一个问题。 是否可以仅禁用ProGuard? 我认为确实没有用,只会带来更多问题。

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

ProGuard可能很有用,但您需要对其进行配置以使其在应用程序中得到任何反映。 在这种情况下,Facebook API正在对您自己的类执行反射。 查看API的代码,它将在GraphObject的扩展中搜索getter,setter和带注释的方法。 ProGuard默认情况下会重命名甚至删除这些内容,因为它不(通常不知道)有关反射的信息。 使用API​​的其他人可能知道需要保留哪些类,字段和方法。 传递给API并具有某些方法命名约定的类可能是不错的选择。

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

 -keep public class com.facebook.ads.** {
 public *;
}
 -keep class com.google.ads.mediation.facebook.FacebookAdapter {
 *;
   }

-dontwarn com.facebook.ads.internal。** -dontwarn com.facebook.ads。**

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM