Proguard с OrmLite на Android - PullRequest
       34

Proguard с OrmLite на Android

23 голосов
/ 24 марта 2012

Как мне использовать 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:Не удалось найти конструктор, который принимает аргумент контекста для класса вспомогательного класса kb

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

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

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

Ответы [ 8 ]

40 голосов
/ 23 апреля 2012

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

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

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

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

15 голосов
/ 23 июля 2015

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

# 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>();
}
15 голосов
/ 24 марта 2012

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

Вы можете отсутствовать:

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

и / или

-keepattributes *Annotation*
3 голосов
/ 15 октября 2014

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

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

... поскольку ORMLite DateTimeType делает все с помощью отражения.

1 голос
/ 13 декабря 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.** { *; }

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

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

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

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

0 голосов
/ 10 ноября 2017

Небольшое дополнение для последней версии 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

0 голосов
/ 20 января 2016

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

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

и

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

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

0 голосов
/ 09 апреля 2012

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

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

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

  • Добавлена ​​,!code/allocation/variable к -optimization опция

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

Хотя не происходит запутывания.

...