如何告诉 ProGuard 保留用于 onClick 的函数?
Posted
技术标签:
【中文标题】如何告诉 ProGuard 保留用于 onClick 的函数?【英文标题】:How can I tell ProGuard to keep my function that is used for onClick? 【发布时间】:2011-08-30 09:39:59 【问题描述】:我在我的一些 .xml 布局文件中为我的 android 应用程序使用了 android:onClick
属性,但 ProGuard 在我的代码运行时会从我的代码中删除这些方法,因为我的代码中没有任何东西调用它们。
而不是单独指定每个函数,我想将它们命名为listener_functionName
,并使用通配符,如-keep listener_*
(我知道这是不正确的,但希望它能说明我的目标)。
如果这是可能的,那就太好了,但如果不是,我仍然需要知道如何在 proguard.cfg 文件中指定这些函数。任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:根据proguard 文档:
字段和方法也可以是 使用正则表达式指定。 名称可以包含以下内容 通配符:?匹配任何单曲 方法名称中的字符。 * 匹配方法名称的任何部分。
所以,你会发现指定
-keep class com.example.MyClass
public void listener_*(android.view.View);
在你的 proguard 标志中。
【讨论】:
嗨 Diego,你能看看我的问题here 吗?谢谢...【参考方案2】:您可以通过这种方式为所有课程执行一次:
-keepclasseswithmembers class *
void listener_*(...);
【讨论】:
好建议,尽管您应该使用 -keepclasseswithmembers 而不是 -keepclasseswithmembernames,以保护方法不被重命名和不被删除。 你是对的。我的配置中有 -dontshrink 并且它是相同的,但通常 -keepclasseswithmembers 更好。我以这种方式编辑了我的答案。【参考方案3】:一种更贪婪的方法,应该保留所有“onClick”方法:
-keepclassmembers class *
public void * (android.view.View);
==> 所以基本上每个将 Android 视图作为唯一参数的公共方法都应该在 ProGuard 中继续存在。
【讨论】:
以上是关于如何告诉 ProGuard 保留用于 onClick 的函数?的主要内容,如果未能解决你的问题,请参考以下文章