2012-03-24 14 views
21

Come dovrei usare proguard con la libreria ormlite su Android?Proguard con OrmLite su Android

Cercando questo:

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

ma ottengo:

03-23 ​​20: 23: 54,518: E/AndroidRuntime (3032): java.lang.RuntimeException: impossibile avviare l'attività ComponentInfo {cz.eman.android.cepro/cz.eman.android.cepro.activity.StationsOverviewActivity}: java.lang.IllegalStateException: Impossibile trovare costruttore che accetta un argomento di contesto per la classe classe helper kb

Ho anche cercato di aggiungere questo:

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

Ma io ottenere un altro ClassMembers errori.

+1

Forse la mia risposta aiuto tizio? Se è così, per favore accettalo. In caso contrario, si prega di fornire la propria risposta. – Gray

+1

si prega di inviare la risposta se avete trovato o contrassegnare le risposte come corrette Può aiutare gli altri a trovare la risposta –

+0

come hai risolto questo alla fine? – Frank

risposta

39

Grazie mille per post come questo che ci aiutano ad avanzare passo dopo passo.

ho si avvicinò con altra soluzione dopo ho provato l'ultima senza successo:

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

spero che possa aiutare qualcuno.

+0

Non abbastanza per me .... getta qualcosa come questo: Classe campo java.lang.String per campo FieldType: name = b, class = La posizione non è valida per dati persister com.j256.ormlite.field .types.DateLongType @ 20f95c38 –

-2

Sono venuto con tale soluzione (forse lavorerà per qualcuno troppo).

fatto tali modifiche proguard.cfg:

  • Aggiunto -dontobfuscate opzione dimensioni

  • Appended ,!code/allocation/variable a -optimization opzione

di file APK utilizzando tale configurazione ridotto da 580 kB a 250 kB .

Tuttavia, non viene eseguita alcuna offuscazione.

3

Una piccola aggiunta alla configurazione di cui sopra - se si sta cercando di serializzare/deserializzare DateTime oggetti di Joda via ORMLite, probabilmente avete bisogno di questo così:

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

... dal DateTimeType di ORMLite fa tutto via riflessione.

+0

Grazie Thomas, divertente che ho trovato la risposta che stavo cercando da te :) – Tino

+0

Hehe :) E non sono nemmeno troppo attivo qui. –

12

La risposta accettata non era abbastanza per il mio caso, così ho migliorato e questo è ciò che ho finito con:

# 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

Dopo molte ricerche questa è stata l'unica risposta che ha funzionato per me. Ho avuto "IllegalArgumentException: classe di campo estero x non ha campo ID" e penso che l'ultimo blocco di conservazione l'abbia risolto. Grazie. – bradkratky

+0

E la riga aggiuntiva ha corretto il mio errore durante il tentativo di creare un apk firmato è: -dontwarn com.j256.ormlite.android. ** con il più recente 'com.j256.ormlite: ormlite-android: 5.0', perché com.j256. ormlite.android.OrmliteTransactionalProcessor estende Processor. –

+4

Per ORMLite 5.0 ho dovuto aggiungere '-dontwarn com.j256.ormlite.android. **' '-dontwarn com.j256.ormlite.logger. **' '-dontwarn com.j256.ormlite.misc. ** ' – Diederik

0

Nel mio caso questo ha fatto il trucco:

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

e

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

Con obfucation e ottimizzazioni.

1

In addittion per impostazione predefinita necessaria per la riflessione:

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

avevo bisogno di tenere tutte le mie classi di entità:

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

In caso contrario, le classi di entità vengono eliminati. Io uso DB predefinito (generato in precedenza).

C'è un modo più semplice/migliore per offuscare. Forse sto mantenendo troppe lezioni?

0

Una piccola aggiunta per l'ultima versione OrmLite 5.

Si consiglia di aggiungere queste righe nascondere alcune nuove avvertenze:

-dontwarn com.j256.ormlite.android.** 
-dontwarn com.j256.ormlite.logger.** 
-dontwarn com.j256.ormlite.misc.** 

avvertenze sono come questi:

Attenzione: com.j256.ormlite.android.OrmliteTransactionalProcessor: non può trovare la classe di riferimento javax.lang.model.SourceVersion

Attenzione: com.j256.ormlite.logger.Slf4jLoggingLog: non riesce a trovare riferimento classe org.slf4j.Logg erFactory

Attenzione: com.j256.ormlite.misc.JavaxPersistenceImpl: non riesce a trovare classe di riferimento javax.persistence.Column