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: не удается запустить Activity ComponentInfo {cz.eman.android.cepro/cz.eman.android.cepro.activity.StationsOverviewActivity }: java.lang.IllegalStateException: не удалось найти конструктор, который принимает аргумент Context для класса класса-помощника kb
Я также попытался добавить это:
-keepclassmembers class * { public <init>(android.content.Context); }
Но я получаю ошибки в классе.
Ответы
Ответ 1
Большое спасибо за такие сообщения, которые помогают нам шаг за шагом продвигаться вперед.
Я придумал другое решение после того, как я пробовал последний без успеха:
# 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.** { *; }
Я надеюсь, что это может помочь кому-то.
Ответ 2
У меня нет решения, но вот несколько ссылок на помощь:
Возможно, вам не хватает:
-keepclassmembers class * {
public <init>(android.content.Context);
}
и/или
-keepattributes *Annotation*
Ответ 3
Принятый ответ был недостаточным для моего случая, поэтому я его улучшил, и это то, с чем я закончил:
# 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>();
}
Ответ 4
Небольшое дополнение к вышеприведенной конфигурации - если вы пытаетесь сериализовать/десериализовать объекты Joda DateTime
через ORMLite, вам, вероятно, также потребуется это:
-keepclassmembers class **DateTime {
<init>(long);
long getMillis();
}
... так как ORMLite DateTimeType
делает все через отражение.
Ответ 5
При добавлении к дефолту, необходимому для отражения:
# 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 (сгенерированные ранее).
Есть ли более простой/лучший способ обфускации. Может быть, я занимаюсь слишком многими занятиями?
Ответ 6
В моем случае это сделало трюк:
-keepattributes SourceFile,LineNumberTable,Signature,InnerClasses,*Annotation*
и
-keepclassmembers class * {public <init>(android.content.Context);}
-keep class com.j256.** { *; }
С увязкой и оптимизацией.
Ответ 7
Небольшое дополнение для последней версии OrmLite 5.
Вы можете добавить эти строки, чтобы скрыть некоторые новые предупреждения:
-dontwarn com.j256.ormlite.android.**
-dontwarn com.j256.ormlite.logger.**
-dontwarn com.j256.ormlite.misc.**
Предупреждения выглядят следующим образом:
Предупреждение: com.j256.ormlite.android.OrmliteTransactionalProcessor: не может найти ссылочный класс javax.lang.model.SourceVersion
Предупреждение: com.j256.ormlite.logger.Slf4jLoggingLog: не может найти ссылки class org.slf4j.LoggerFactory
Предупреждение: com.j256.ormlite.misc.JavaxPersistenceImpl: не удается найти ссылочный класс javax.persistence.Column
Ответ 8
Я придумал такое решение (возможно, это сработает и для кого-то).
Сделаны такие изменения в proguard.cfg
:
Размер файла APK с использованием такой конфигурации уменьшен с 580 кБ до 250 кБ.
Хотя, никакая обфускация не выполняется.