Android: onClick не работает с ProGuard

С сегодняшнего дня что-то странное происходит с моим приложением. Каждый раз, когда я нажимаю кнопку, которая устанавливает атрибут android: onClick, я получаю исключение IllegalStateException: Не удалось найти метод …

Я заметил, что это происходит только при включении Proguard в файл: default.properties

Это мой proguard.cfg:

-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } 

Дело в том, что на прошлой неделе этого не произошло. (Я тоже использовал proguard). Есть идеи?

EDIT Я нашел другое решение этой проблемы: проект с проблемами был создан со старой версией плагина ADT (Eclipse). Я создал новый проект с теми же параметрами и скопировал src / , res / и Manifest , и проблема решена!

Вам нужно сообщить proguard, чтобы не мутировать метод, связанный с тегом android:onClick .

Вот примерное правило (взятое с веб-сайта proguard ):

 -keep class mypackage.MyCallbackClass { void myCallbackMethod(java.lang.String); } 

В файле примера в инструментах среды Android (YOUR_ANDROID_DIR / tools / proguard / proguard-android.txt) вы можете найти следующее правило:

 # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } 

С комментарием это довольно ясно.