Android Proguard - 如何保持仅从 XML 布局引用的 onClick 处理程序

Posted

技术标签:

【中文标题】Android Proguard - 如何保持仅从 XML 布局引用的 onClick 处理程序【英文标题】:Android Proguard - how to keep onClick handlers only referenced from XML layouts 【发布时间】:2011-09-07 04:25:01 【问题描述】:

在我的 android 应用程序中,我通常不会在代码中创建 View 的点击处理程序,而是依赖于在 XML 布局文件中指定它的能力,如下所示:

   <Button
        ....
        android:onClick="onSearchClicked"
       ...../>

然后在Activity中有这样的方法:

    public void onSearchClicked( View v ) 
    ........

意思是我自己的代码中没有明显引用这个方法。

在为生产版本运行 Proguard 时,它似乎删除了此方法并且单击失败。

我可以在我的 proguard 配置文件中添加什么来避免这种不需​​要我重命名所有这些方法的情况?

我可以添加到方法中并让 proguard 注意到的注释? 以某种方式指定从 xml 引用的这些类型的方法? 我想我可以在代码中添加一个错误的引用,但如果可以的话我想避免这种情况,因为我不会总是记得把它放进去!

我查看了适用于 Android 的 proguard 示例,但没有看到任何满足此特殊需求的内容。

【问题讨论】:

再次。没有适合该法案的直接答案,我不能投票支持我自己的答案。 【参考方案1】:

这似乎是最好的答案,因为它对此类方法的命名 100% 稳健:

# This will avoid all the onClick listeners referenced from XML Layouts from being removed
-keepclassmembers class * extends android.app.Activity  
       public void *(android.view.View); 

希望对你有帮助。

【讨论】:

我添加了上面的代码,但我仍然收到java.lang.IllegalStateException: Could not execute method of the activity 它是否公开并与 onClick 处理程序所需的方法签名匹配? 感谢您的回复。是的,它是公开的,但我发现问题与 onClick 中调用的其他函数有关。所以不用担心。【参考方案2】:
-keepclasseswithmembers class * 
   public void onSearchClicked(android.view.View );

但从 proguard doc 仔细检查: http://proguard.sourceforge.net/index.html#/manual/refcard.html

【讨论】:

我想到了,但在一个活动中,我可能有很多这些,都具有不同的名称。对我的代码进行任何更改都需要更改我的 proguard 配置……我正在寻找一种更强大的方法。【参考方案3】:

我用:

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

然后我将所有 onClick 方法命名为:onCancelBtnClick()、onBackgroundClick() 等。

【讨论】:

以上是关于Android Proguard - 如何保持仅从 XML 布局引用的 onClick 处理程序的主要内容,如果未能解决你的问题,请参考以下文章

Android proguard,保持Inner class的inner class

如何为 Android 升级 ProGuard?

如果在proguard中包含带有注释的字段,如何保持类的成员不受影响

如何使用 Proguard 的 GUI?保持正确的类不被混淆的问题

在 Android Facebook sdk 3.0 中使用 proguard 时出错

在 Eclipse 中使用 Proguard 进行 Android 开发时,如何检查/升级 Proguard 版本?