Proguard с OrmLite на Android

Как я могу использовать proguard с библиотекой ormlite на Android?

Попытка:

-keep class com.j256.** -keepclassmembers class com.j256.** -keep enum com.j256.** -keepclassmembers enum com.j256.** -keep interface com.j256.** -keepclassmembers interface com.j256.** 

Но я получаю:

03-23 ​​20: 23: 54.518: E / AndroidRuntime (3032): java.lang.RuntimeException: не удается запустить активность ComponentInfo {cz.eman.android.cepro / cz.eman.android.cepro.activity.StationsOverviewActivity}: java .lang.IllegalStateException: Не удалось найти конструктор, который принимает аргумент Context для класса вспомогательных классов kb

Я также попытался добавить это:

 -keepclassmembers class * { public <init>(android.content.​Context); } 

Но я получаю ошибки в классе.

Solutions Collecting From Web of "Proguard с OrmLite на Android"

Большое спасибо за такие сообщения, которые помогают нам шаг за шагом продвигаться вперед.

Я придумал другое решение после того, как пробовал последний без успеха:

 # OrmLite uses reflection -keep class com.j256.** -keepclassmembers class com.j256.** { *; } -keep enum com.j256.** -keepclassmembers enum com.j256.** { *; } -keep interface com.j256.** -keepclassmembers interface com.j256.** { *; } 

Надеюсь, это может помочь кому-то.

У меня нет решения, но вот несколько ссылок, которые помогут:

  • Запрос поддержки Proguard вокруг ORMLite
  • Обсуждение ORMLite proguard # 1
  • Обсуждение ORMLite proguard # 2

Возможно, вам не хватает:

 -keepclassmembers class * { public <init>(android.content.Context); } 

и / или

 -keepattributes *Annotation* 

Принятого ответа было недостаточно для моего случая, поэтому я улучшил его, и это то, что у меня получилось:

 # OrmLite uses reflection -keep class com.j256.** -keepclassmembers class com.j256.** { *; } -keep enum com.j256.** -keepclassmembers enum com.j256.** { *; } -keep interface com.j256.** -keepclassmembers interface com.j256.** { *; } # Keep the helper class and its constructor -keep class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper -keepclassmembers class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper { public <init>(android.content.Context); } # Keep the annotations -keepattributes *Annotation* # Keep all model classes that are used by OrmLite # Also keep their field names and the constructor -keep @com.j256.ormlite.table.DatabaseTable class * { @com.j256.ormlite.field.DatabaseField <fields>; @com.j256.ormlite.field.ForeignCollectionField <fields>; # Add the ormlite field annotations that your model uses here <init>(); } 

Небольшое дополнение к конфигурации выше – если вы пытаетесь сериализовать / десериализовать объекты DateDime Joda через ORMLite, вам, вероятно, также понадобится это:

 -keepclassmembers class **DateTime { <init>(long); long getMillis(); } 

… поскольку DateTimeType ORMLite делает все через отражение.

В моем случае это сделало трюк:

 -keepattributes SourceFile,LineNumberTable,Signature,InnerClasses,*Annotation* 

а также

 -keepclassmembers class * {public <init>(android.content.Context);} -keep class com.j256.** { *; } 

С увязкой и оптимизацией.

При добавлении к дефолту, необходимому для размышления:

 # OrmLite uses reflection -keep class com.j256.** -keepclassmembers class com.j256.** { *; } -keep enum com.j256.** -keepclassmembers enum com.j256.** { *; } -keep interface com.j256.** -keepclassmembers interface com.j256.** { *; } 

Мне нужно было сохранить все классы Entity:

 -keep class com.example.db.Entities.** { *; } 

В противном случае классы объектов удаляются. Я использую предопределенные DB (сгенерированные ранее).

Есть ли более простой / лучший способ обфускации. Может быть, я занимаюсь слишком многими занятиями?

Я придумал такое решение (возможно, это сработает и для кого-то).

Сделаны такие изменения для proguard.cfg :

  • Добавлена ​​опция -dontobfuscate

  • Добавлен ,!code/allocation/variable в параметр -optimization

Размер файла APK с использованием такой конфигурации уменьшен с 580 до 250 кБ.

Хотя, никакая обфускация не выполняется.