如何告诉 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 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 ProGuard 保留私有字段而不指定每个字段

Proguard 保留 R 类

如何强制 Proguard 保留我的 .xml 资源文件?

带有 proguard 的 Kotlin AAR 库:如何只保留类和方法名?

如何防止proguard完全混淆方法

使用 ProGuard 进行文件混淆