【问题标题】:android onClick events and pro guardandroid onClick 事件和专业守卫
【发布时间】:2011-07-12 14:58:12
【问题描述】:

我试图在上传到市场之前混淆我的应用程序。 我已经设置了 pro Guard 并且我已经处理了 Serialzie 问题 (prog guard maul - serialize) 但是在尝试按下主屏幕中的一个按钮时我仍然遇到问题 (MethodNotFoundException)。 它们是带有背景的简单 LinearLayout,在 xml 中具有 android:onClick="doOnClick" 属性。在我的 HomeScreenActivity 我有一个名为的方法:
public void doOnClick(View v){...}
每当按下按钮时都应该调用它。 代码在没有被混淆时工作GREAT,但是一旦混淆了android类加载器就无法找到我的方法。在我只使用代码而不是 xml 回调(也许是可取的)之前,我想知道是否有一个很好的解决方法。 试图防止方法混淆对我不起作用(试图防止混淆扩展 Activity 并且形式为 public void on(android.view.View); 或 public void On (android.view.View)。

如果有人做过,我会很感激这个提示:-)

【问题讨论】:

    标签: android xml callback proguard


    【解决方案1】:

    真的很简单,应该可以的。

    -keepclasseswithmembers class MyActivity {
       public void doOnClick(android.view.View);
    }
    

    【讨论】:

    • 但我不想保留整个班级,我有太多的班级,如果大多数班级都没有混淆,那么混淆有什么意义? :-) 也 -keepmember 对我不起作用,我需要更通用的规则,因为并非我的所有方法都被命名为 doOnClick 因为我可能有其中的一些(例如 doOnFilter、doOnSort 等...)所以规则 doOn* 再次不要做这个伎俩。
    • 也可以使用 public void *(android.view.View);
    • 包含的方法太多了,我想……但我会试试看!
    【解决方案2】:

    将此添加到您的 proguards 文件中。

    -keep class com.android.toto.ClassName {
        public void doOnClick(android.view.View);
    }
    

    【讨论】:

      【解决方案3】:

      -keep 或 keepclasswithmemebers 不适用,因为我已经拥有 -keep public class * extends android.app.Activity,其中将包括所有活动。

      我设法找到了方法已被 proguard 优化完全删除并替换为直接内联代码的问题。发生这种情况是因为代码中没有对这些函数的特定调用;请注意,未考虑对代码的 XML 调用。

      在 proguard 配置中添加以下内容即可解决问题:

      -keepclassmembers class * extends android.app.Activity {
         public void *On*Click(android.view.View);
         public void *on*Click(android.view.View);
      }
      

      【讨论】:

      • 拼写:andriod.app.Activity => android.app.Activity
      • 10x :-) 我从来没有见过它 ;-)
      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 2017-11-27
      • 2013-03-31
      • 1970-01-01
      • 2014-11-12
      相关资源
      最近更新 更多