Как я могу указать ProGuard сохранить мою функцию, которая используется для onClick?

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

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

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


person finiteloop    schedule 21.05.2011    source источник


Ответы (3)


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

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

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

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

в ваших прогвардейских флагах.

person Diego Torres Milano    schedule 21.05.2011
comment
Привет, Диего, не могли бы вы взглянуть на мой вопрос здесь? Спасибо ... - person Y.S; 23.05.2016

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

-keepclasseswithmembers class * {
    void listener_*(...);
}
person ggurov    schedule 19.09.2011
comment
Хорошее предложение, хотя вам следует использовать -keepclasseswithmembers вместо -keepclasseswithmembernames, чтобы защитить методы от переименования и от удаления. - person Eric Lafortune; 20.09.2011
comment
Ты прав. У меня в конфиге было -donthrink и с ним было то же самое, но вообще -keepclasseswithmembers лучше. Я отредактировал свой ответ таким образом. - person ggurov; 20.09.2011

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

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

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

person donfuxx    schedule 10.08.2014