Android Proguard - как сохранить обработчики onClick, на которые ссылаются только макеты XML - PullRequest
13 голосов
/ 02 июня 2011

В моем приложении для Android я часто не создаю обработчик нажатия кнопки View в коде, а полагаюсь на возможность указать его в файле макета XML, например:

   <Button
        ....
        android:onClick="onSearchClicked"
       ...../>

И затеместь метод в Деятельности, подобный этому:

    public void onSearchClicked( View v ) {
    ........}

То есть в моем собственном коде нет явной ссылки на этот метод.

При запуске Proguard для производственной версии он, кажется, удаляет этометод и сбой при нажатии.

Что можно добавить в мой конфигурационный файл proguard, чтобы избежать этого, что не заставит меня переименовать все эти методы?

  • Аннотация Iмог бы добавить к методу и заставить proguard заметить?
  • Каким-то образом указать эти типы методов, на которые ссылается xml?
  • Полагаю, я могу добавить в код ложную ссылку, но хотел быизбегайте этого, если я могу, как я не всегда помню, вставить его!

Я просмотрел примеры Proguard для Android и не вижу ничего для этой конкретной потребности.

Ответы [ 3 ]

22 голосов
/ 10 июня 2011

Это, кажется, лучший ответ, так как он на 100% устойчив к названию таких методов:

# This will avoid all the onClick listeners referenced from XML Layouts from being removed
-keepclassmembers class * extends android.app.Activity { 
       public void *(android.view.View); 
}

Надеюсь, это поможет.

1 голос
/ 06 декабря 2011

Я использую:

-keepclassmembers class * extends android.app.Activity { 
       public void on*Click(android.view.View); 
}

и затем я называю все методы onClick как: onCancelBtnClick (), onBackgroundClick () и т. Д.

1 голос
/ 02 июня 2011
-keepclasseswithmembers class * {
   public void onSearchClicked(android.view.View );
}

, но дважды проверьте его из документа proguard: http://proguard.sourceforge.net/index.html#/manual/refcard.html

...