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

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


person sealskej    schedule 24.03.2012    source источник
comment
Мой ответ помог чуваку? Если да, то примите его. Если нет, дайте свой ответ.   -  person Gray    schedule 20.09.2012
comment
пожалуйста, опубликуйте ответ, если вы нашли, или отметьте ответы как правильные Это может помочь другим найти ответ   -  person Nixit Patel    schedule 20.09.2012
comment
как ты в итоге это исправил?   -  person Frank    schedule 22.10.2012
comment
Я исправил это, выполнив все приведенное ниже (ответы Грея и Германа), и после этого мне также пришлось добавить все мои объекты содержимого базы данных (с одним или несколькими @ DatabaseField) в мою конфигурацию proguard следующим образом: -keep class com .myapp.model. ** -keepclassmembers класс com.myapp.model. ** {*; }   -  person Frank    schedule 22.10.2012
comment
Фрэнк, ты спас мне жизньeeee ...   -  person baboo    schedule 12.06.2013


Ответы (8)


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

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

# 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.** { *; }

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

person German    schedule 23.04.2012
comment
Для меня этого недостаточно .... он выдает что-то вроде этого: Класс поля java.lang.String для поля FieldType: name = b, class = Местоположение недопустимо для сохранения данных com.j256.ormlite.field.types.DateLongType @ 20f95c38 - person Jacek Kwiecień; 03.06.2014

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

# 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>();
}
person Sebastian    schedule 23.07.2015
comment
После долгих поисков это был единственный ответ, который помог мне. У меня было IllegalArgumentException: класс внешнего поля x не имеет поля id, и я думаю, что последний блок сохранения разрешил его. Спасибо. - person bradkratky; 23.08.2016
comment
И дополнительная строка исправила мою ошибку при попытке создать подписанный apk: -dontwarn com.j256.ormlite.android. ** с новейшим com.j256.ormlite: ormlite-android: 5.0, потому что com.j256.ormlite .android.OrmliteTransactionalProcessor расширяет процессор. - person Zbarcea Christian; 04.10.2016
comment
Для ORMLite 5.0 пришлось добавить -dontwarn com.j256.ormlite.android.** -dontwarn com.j256.ormlite.logger.** -dontwarn com.j256.ormlite.misc.** - person Diederik; 14.11.2016
comment
Это был единственный вариант, который у меня сработал, хотя, кроме того, мне пришлось преобразовать все com.j256. ** в com.j256 ** (т.е. удалить точку), иначе я получил красное подчеркивание «неразрешенного имени класса» (Android Студия 4.1.2) - person Mitch; 21.03.2021

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

Вам может не хватать:

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

и / или

-keepattributes *Annotation*
person Gray    schedule 24.03.2012

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

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

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

person Thomas Keller    schedule 14.10.2014
comment
Спасибо, Томас, забавно, что я нашел здесь от тебя ответ, который искал :) - person Tino; 01.05.2016
comment
Хе-хе :) И я здесь даже не особо активен. - person Thomas Keller; 03.05.2016

В дополнение к дефолту, необходимому для отражения:

# 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.** { *; }

В противном случае классы сущностей удаляются. Я использую предопределенную БД (сгенерированную ранее).

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

person Andrew Tsvirko    schedule 13.12.2016

В моем случае это помогло:

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

а также

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

С обфукацией и оптимизацией.

person carvaq    schedule 20.01.2016

Небольшое дополнение к последней версии 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: не удается найти указанный класс org.slf4j.LoggerFactory

Предупреждение: com.j256.ormlite.misc.JavaxPersistenceImpl: не удается найти указанный класс javax.persistence.Column

person comrade    schedule 10.11.2017

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

В proguard.cfg внесены такие изменения:

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

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

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

Однако обфускации не происходит.

person mortiy    schedule 09.04.2012