Как я могу сказать ProGuard сохранить мою функцию, которая используется для onClick? - PullRequest
12 голосов
/ 22 мая 2011

Я использую атрибут android:onClick в некоторых моих файлах макета .xml для моего приложения для Android, но ProGuard удаляет эти методы из моего кода при запуске, потому что ничего в моем коде никогда не вызывает их.

Вместо того, чтобы указывать каждую функцию в отдельности, я бы хотел назвать их как listener_functionName и использовать подстановочные знаки, например -keep listener_* (я знаю, что это неверно, но, надеюсь, это иллюстрирует мою цель).

Если это возможно, это было бы здорово, но если нет, мне все еще нужно знать, как указать эти функции в файле proguard.cfg. Любая помощь приветствуется.

Ответы [ 3 ]

21 голосов
/ 22 мая 2011

Согласно proguard документации:

Поля и методы также могут быть указано с помощью регулярных выражений. Имена могут содержать следующие подстановочные знаки:? соответствует любому символ в имени метода. * соответствует любой части имени метода.

Итак, вы найдете указание

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

в ваших флагах Proguard.

3 голосов
/ 19 сентября 2011

Вы можете сделать это один раз для всех ваших классов следующим образом:

-keepclasseswithmembers class * {
    void listener_*(...);
}
0 голосов
/ 10 августа 2014

Немного более жадный подход, который должен поддерживать все методы "onClick":

-keepclassmembers class * {
    public void * (android.view.View);
}

==> так что в принципе каждый публичный метод, в котором Android View является единственным Paramater, должен выжить в ProGuard.

...