Proguard y reflection en Android

Acabo de usar Proguard, pero las clases que bash crear a través de la reflexión no funcionan.

Tengo una interfaz

Algorithm 

Paso clases como esta

 AlgorithmFactory.SomeClassThatExtendsAlgorithmImpl.class 

La clase está instanciada así

 public ArrayList getAlgorithms(Context cnx) { ArrayList list = new ArrayList(); for(Class alg: algorithms) { try { Constructor c = alg.getConstructor(Context.class); list.add(c.newInstance(cnx)); } catch (IllegalArgumentException e) { Log.e(TAG, "IllegalArgumentException", e); throw new IllegalStateException("There was a problem creating the Algorithm class"); } catch (InvocationTargetException e) { Log.e(TAG, "InvocationTargetException", e); throw new IllegalStateException("There was a problem creating the Algorithm class"); } catch (InstantiationException e) { Log.e(TAG, "InstantiationException", e); throw new IllegalStateException("There was a problem creating the Algorithm class"); } catch (IllegalAccessException e) { Log.e(TAG, "IllegalAccessException", e); throw new IllegalStateException("There was a problem creating the Algorithm class"); } catch (SecurityException e) { Log.e(TAG, "SecurityException", e); throw new IllegalStateException("There was a problem creating the Algorithm class"); } catch (NoSuchMethodException e) { Log.e(TAG, "NoSuchMethodException", e); throw new IllegalStateException("There was a problem creating the Algorithm class"); } } return list; } 

Aquí está mi proguard.cnf

 -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 com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native ; } -keepclasseswithmembernames class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public (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 *; } -assumenosideeffects class android.util.Log { public static *** d(...); public static *** v(...); public static *** i(...); public static *** w(...); public static *** e(...); } 

SOLUCIONADO

Para otros que tienen este problema, debe agregar lo siguiente a proguard.cnf

 -keep public class * extends com.yoursite.android.yourappname.YourClassName -keepclassmembers class * extends com.yoursite.android.yourappname.YourClassName{ public (android.content.Context); } 

El primer keep le dice a proguard que no ofusque los nombres de clase que extienden YourClassName

El segundo dice que mantenga el nombre del constructor ( significa constructor) no ofuscado que tiene un solo argumento de Context y extiende YourClassName

Además, para los desarrolladores de Android que estén utilizando el atributo onClick en su archivo de diseños XML , también deberán agregar el nombre de la función en su archivo proguard.cnf.

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

Esto dice que mantenga todos los métodos denominados myClickHandler con un solo argumento View en todas las clases. Puede restringir aún más esto mediante el uso de la palabra clave extends como se indica arriba.

espero que esto ayude.

Para la corrección por clic no es necesario que enumere el nombre de cada método. Tu puedes hacer:

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

que encuentran todos los métodos que tienen una Vista como parámetro.