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
如果在proguard中包含带有注释的字段,如何保持类的成员不受影响
如何使用 Proguard 的 GUI?保持正确的类不被混淆的问题