【问题标题】:How can I tell ProGuard to keep my function that is used for onClick?如何告诉 ProGuard 保留用于 onClick 的函数?
【发布时间】:2011-08-30 09:39:59
【问题描述】:

我在我的一些 .xml 布局文件中为我的 android 应用程序使用了 android:onClick 属性,但 ProGuard 在我的代码运行时会从我的代码中删除这些方法,因为我的代码中没有任何东西调用它们。

而不是单独指定每个函数,我想将它们命名为listener_functionName,并使用通配符,如-keep listener_*(我知道这是不正确的,但希望它能说明我的目标)。

如果这是可能的,那就太好了,但如果不是,我仍然需要知道如何在 proguard.cfg 文件中指定这些函数。任何帮助表示赞赏。

【问题讨论】:

    标签: android proguard


    【解决方案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 中继续存在。

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 2015-07-27
      • 2014-06-15
      • 1970-01-01
      • 2014-11-04
      • 2022-01-02
      • 1970-01-01
      • 2011-11-19
      • 2019-03-16
      相关资源
      最近更新 更多