2012-03-24 3 views
21

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

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

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

Но я получаю еще classmembers ошибки.

+1

ли мой ответ помощь чувак? Если да, то, пожалуйста, примите это. Если нет, пожалуйста, предоставьте свой собственный ответ. – Gray

+1

, пожалуйста, напишите ответ, если вы нашли или отметили ответы как правильные. Он может помочь другим найти ответ –

+0

, как вы это исправили? – Frank

ответ

39

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

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

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

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

+0

Недостаточно для меня .... это бросает что-то вроде этого: Поле class java.lang.String для поля FieldType: name = b, class = Местоположение недопустимо для data persister com.j256.ormlite.field .types.DateLongType @ 20f95c38 –

15

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

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

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

и/или

-keepattributes *Annotation* 
+0

'-keepclassmembers class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper { public (android.content.Context); } ' –

-2

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

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

  • Добавлена ​​-dontobfuscate вариант размер

  • приложено ,!code/allocation/variable в -optimization варианте

APK файл, используя такую ​​конфигурацию уменьшенной от 580 Кб до 250 Кб ,

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

3

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

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

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

+0

Спасибо Томасу, смешно, что я нашел ответ, который я искал здесь от вас :) – Tino

+0

Хе-хе :) И я даже не слишком активен здесь. –

12

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

# 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>(); 
} 
+0

После долгих поисков это был единственный ответ, который сработал для меня. У меня было «IllegalArgumentException: у иностранного полевого класса x нет поля id», и я думаю, что последний блок блокировки разрешил его. Спасибо. – bradkratky

+0

И еще одна исправленная ошибка при попытке создать подписанный apk: -dontwarn com.j256.ormlite.android. ** с новейшим «com.j256.ormlite: ormlite-android: 5.0», потому что com.j256. ormlite.android.OrmliteTransactionalProcessor расширяет процессор. –

+4

Для ORMLite 5.0 мне пришлось добавить '-dontwarn com.j256.ormlite.android. **' '-dontwarn com.j256.ormlite.logger. **' '-dontwarn com.j256.ormlite.misc. ** ' – Diederik

0

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

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

и

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

С уклонениями и оптимизациями.

1

В addittion по умолчанию, необходимые для отражения:

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

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

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

0

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

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

Смежные вопросы