2012-03-24 25 views
21

Jak korzystać z proguarda z biblioteką ormlite na Androida?Proguard z OrmLite na Androida

Trying to:

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

Ale otrzymuję:

03-23: 20: 23: 54,518: E/Android Runtime (3032): java.lang.RuntimeException: Nie można rozpocząć działalność ComponentInfo {cz.eman.android.cepro/cz.eman.android.cepro.activity.StationsOverviewActivity}: java.lang.IllegalStateException: nie można odnaleźć konstruktora, że ​​trwa argumentem kontekst dla klasy pomocnika klasy kb

Próbowałem też dodać to:

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

Ale mam kolejne classmembers błędów.

+1

Czy moja odpowiedź pomocy koleś? Jeśli tak, to proszę, zaakceptuj to. Jeśli nie, proszę podać własną odpowiedź. – Gray

+1

proszę zaksięgować odpowiedź, jeśli znalazłeś lub oznaczyłeś odpowiedzi jako prawidłowe. Może pomóc innym znaleźć odpowiedź: –

+0

jak to naprawiłeś w końcu? – Frank

Odpowiedz

39

Bardzo dziękuję za takie posty, które pomagają nam krok po kroku.

ja wymyślił inne rozwiązanie po Próbowałem ostatni bez powodzenia:

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

Mam nadzieję, że może komuś pomóc.

+0

Za mało dla mnie .... rzuca coś takiego: Klasa pola java.lang.String dla pola FieldType: name = b, class = Lokalizacja nie jest poprawna dla danych persister com.j256.ormlite.field .types.DateLongType @ 20f95c38 –

-2

ja wymyślił takie rozwiązanie (być może będzie pracować dla kogoś zbyt).

dokonał takiej zmiany proguard.cfg:

  • Dodane -dontobfuscate opcja rozmiar

  • załączono ,!code/allocation/variable do -optimization opcja

plik APK przy użyciu takiej konfiguracji zmniejszone od 580 kB do 250 kB .

Chociaż nie wykonuje się zaciemniania.

3

niewielkim dodatkiem do konfiguracji powyżej - jeśli próbujesz do serializacji/deserializacji Joda za DateTime obiektów poprzez ORMLite, prawdopodobnie trzeba to także:

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

... od ORMLite za DateTimeType robi wszystko poprzez odbicie.

+0

Dzięki Thomas, zabawne, że znalazłem odpowiedź, której szukałem od Ciebie :) – Tino

+0

Hehe :) I nie jestem tu nawet zbyt aktywny. –

12

Zaakceptowanych odpowiedź nie wystarczyło moim przypadku, więc zwiększona go i to, co skończyło się z:

# 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

Po wielu poszukiwaniach była to jedyna odpowiedź, która sprawdziła się u mnie. Miałem "IllegalArgumentException: obce pole klasy x nie ma id field" i myślę, że ostatni blok keep rozwiązał go. Dziękuję Ci. – bradkratky

+0

Dodatkową linią naprawiono mój błąd podczas próby utworzenia podpisanego pliku APK: -dontwarn com.j256.ormlite.android. ** z najnowszym com.j256.ormlite: ormlite-android: 5.0 ', ponieważ com.j256. ormlite.android.OrmliteTransactionalProcessor rozszerza procesor. –

+4

Dla ORMLite 5.0 musiałem dodać '-dontwarn com.j256.ormlite.android. **' '-dontwarn com.j256.ormlite.logger. **' '-dontwarn com.j256.ormlite.misc. ** ' – Diederik

0

w moim przypadku to załatwiło sprawę:

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

i

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

Z obfucation i optymalizacje.

1

W addittion domyślne niezbędne do refleksji:

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

Musiałem zachować wszystkie moje zajęcia jednostki:

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

przeciwnym razie podmiot klas są usuwane na zewnątrz. Używam predefiniowanego DB (wygenerowanego wcześniej).

Czy istnieje łatwiejszy/lepszy sposób zaciemniania. Może mam za dużo zajęć?

0

Mały dodatek do najnowszej wersji OrmLite 5.

Możesz dodać te wiersze ukryć jakieś nowe ostrzeżenia:

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

ostrzeżenia takie jak:

Ostrzeżenie: com.j256.ormlite.android.OrmliteTransactionalProcessor: nie znaleźć odwołuje klasy javax.lang.model.SourceVersion

Warning: com.j256.ormlite.logger.Slf4jLoggingLog: nie można odnaleźć odniesienia klasy org.slf4j.Logg erFactory

Ostrzeżenie: com.j256.ormlite.misc.JavaxPersistenceImpl: nie można odnaleźć odwołuje klasa javax.persistence.Column