Proguard и размышления в Android

Я только что использовал proguard, но classы, которые я пытаюсь создать через reflection, не работают.

У меня есть интерфейс

Algorithm 

Я проходил такие classы

 AlgorithmFactory.SomeClassThatExtendsAlgorithmImpl.class 

Класс создается таким образом

 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; } 

Вот мой 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(...); } 

РЕШИТЬ

Для других, у которых возникает эта проблема, вам нужно добавить следующее в proguard.cnf

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

Первая команда keep сообщает proguard, чтобы не обфускать имена classов, которые расширяют ваше имя_classа

Второй говорит, чтобы сохранить имя конструктора ( означает конструктор) un-obfuscated, который имеет единственный аргумент Context и расширяет YourClassName

Кроме того, для разработчиков Android, которые используют атрибут onClick в вашем файле макетов XML, вам также нужно будет добавить имя функции в файл proguard.cnf.

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

Это говорит о сохранении всех методов с именем myClickHandler с единственным аргументом View во всех classах. Вы можете ограничить это, используя ключевое слово extends, как указано выше.

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

Для исправления по щелчку вам не нужно указывать имя каждого метода. Ты можешь сделать:

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

которые обнаруживают все методы, которые имеют параметр View as.

  • Java: индекс массива из исключения исключений
  • источник отладки jdk не может просматривать переменную, что она
  • HttpPost работает в Java-проекте, а не в Android
  • Ошибка конструктора списка Firebase
  • Захват экрана GLSurfaceView для растрового изображения
  • Передача пользовательских объектов между действиями?
  • Как обрабатывать возвращаемое значение из AsyncTask
  • XML-документ для строки?
  • Java не поддерживает множественное наследование, но неявно каждый class в java расширяет Object и позволяет еще один
  • Android: как получить текущий день недели (понедельник и т. Д.) На языке пользователя?
  • Как я могу получить результаты сканирования Android Wifi в список?
  • Давайте будем гением компьютера.