Android 如何让ProGuard保留用于onClick的函数?

Android 如何让ProGuard保留用于onClick的函数?,android,proguard,Android,Proguard,我在android应用程序的一些.xml布局文件中使用了android:onClickatribute,但ProGuard在运行时从代码中删除了这些方法,因为我的代码中从来没有调用过它们 与其单独指定每个函数,不如将它们命名为listener\u functionName,并使用通配符,如-keep listener.*(我知道这是不正确的,但希望它能说明我的目标) 如果这是可能的,那就太好了,但如果不是,我仍然需要知道如何在proguard.cfg文件中指定这些函数。非常感谢您的帮助。根据文档

我在android应用程序的一些.xml布局文件中使用了
android:onClick
atribute,但ProGuard在运行时从代码中删除了这些方法,因为我的代码中从来没有调用过它们

与其单独指定每个函数,不如将它们命名为
listener\u functionName
,并使用通配符,如
-keep listener.*
(我知道这是不正确的,但希望它能说明我的目标)

如果这是可能的,那就太好了,但如果不是,我仍然需要知道如何在proguard.cfg文件中指定这些函数。非常感谢您的帮助。

根据文档:

字段和方法也可以是 使用正则表达式指定。 名称可以包含以下内容 通配符:?匹配任何一个 方法名称中的字符。 *匹配方法名称的任何部分

所以,你会发现

-keep class com.example.MyClass {
  public void listener_*(android.view.View);
}

在您的proguard标志中。

您可以通过以下方式为所有类执行一次:

-keepclasseswithmembers class * {
    void listener_*(...);
}

一种更贪婪的方法应该保留所有“onClick”方法:


==>因此,基本上,每个将Android视图作为唯一参数的公共方法都应该在ProGuard中生存。

这是一个很好的建议,尽管您应该使用-keepclasseswithmembers而不是-keepclasseswithmembernames,以保护这些方法不被重命名和删除。您是对的。我在配置中使用了-dontshrink,使用它也一样,但是一般来说-keepclasseswithmembers更好。我用这种方式编辑了我的答案。嗨,迭戈,你能看看我的问题吗?非常感谢。
-keepclassmembers class * {
    public void * (android.view.View);
}