2017-02-03 9 views
13

Używam następujących zasad PROGUARD:Tylko używając Proguard: Could not init, DaoConfig => ArrayIndexOutOfBoundsException

 
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { *; } 
-keep class **$Properties 

-keep class org.greenrobot.greendao.** 
-keepclassmembers class org.greenrobot.greendao.** { *; } 

# If you do not use SQLCipher: 
-dontwarn org.greenrobot.greendao.database.** 

# If you do not use RxJava: 
-dontwarn rx.** 

Po uruchomieniu aplikacji pojawia się następujący dziennik awarii:

 
java.lang.RuntimeException: Unable to create application my.app.package.MyApplication: org.greenrobot.greendao.DaoException: Could not init DAOConfig 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4569) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:148) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5272) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
Caused by: org.greenrobot.greendao.DaoException: Could not init DAOConfig 
    at org.greenrobot.greendao.internal.DaoConfig.(Unknown Source) 
    at org.greenrobot.greendao.AbstractDaoMaster.registerDaoClass(Unknown Source) 
    at my.app.package.database.model.DaoMaster.(Unknown Source) 
    at my.app.package.database.model.DaoMaster.(Unknown Source) 
    at my.app.package.ZamgApplication.onCreate(Unknown Source) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4566) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:148)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:135)  
    at android.app.ActivityThread.main(ActivityThread.java:5272)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)  
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=6 
    at org.greenrobot.greendao.internal.DaoConfig.reflectProperties(Unknown Source) 
    at org.greenrobot.greendao.internal.DaoConfig.(Unknown Source)  
    at org.greenrobot.greendao.AbstractDaoMaster.registerDaoClass(Unknown Source)  
    at my.app.package.database.model.DaoMaster.(Unknown Source)  
    at my.app.package.database.model.DaoMaster.(Unknown Source)  
    at my.app.package.ZamgApplication.onCreate(Unknown Source)  
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1011)  
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4566)  
    at android.app.ActivityThread.access$1500(ActivityThread.java:148)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:135)  
    at android.app.ActivityThread.main(ActivityThread.java:5272)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)  

przy kompilacji aplikacja bez ProGuard, wszystko działa dobrze.

Czy brakuje tu jakiejkolwiek konfiguracji? Nie mogłem znaleźć nic na ten temat z Google ...

+0

fwiw: po 2 kolejnych dniach kopania postanowiłem przełączyć bazę danych na realm.io – muetzenflo

Odpowiedz

2

Wydaje się, że z instrukcją:

-keep class org.greenrobot.greendao.** 

nie jest stosowana. Jak widać w dziennikach, linie jak:

at org.greenrobot.a.c.a.a(Unknown Source) 
at org.greenrobot.a.c.a.(Unknown Source) 
at org.greenrobot.a.b.a(Unknown Source) 

pokazują, że zajęcia w ramach org.greenrobot.greendao są ukrywane w czasie, gdy dyrektywa ProGuard mówi (lub był przypuszczać, aby powiedzieć) ProGuard pozostawić je bez zmian. Aby rozwiązać ten problem, należy upewnić się, że zasady PROGUARD pliku, w którym jest to określenie jest prawidłowo wymieniony w sekcji proguardFiles swojej konfiguracji Androida:

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

i konfiguracja (e) rozwiązanie używać tego samego proguard-rules.pro pliku.

+0

dzięki, zaktualizowałem mój zestaw reguł, aby zachować prawie wszystko od greendao. Plik dziennika jest teraz nieco bardziej szczegółowy, ale błąd nadal występuje. Zaktualizowałem moje pytanie nowym logiem i regułami. – muetzenflo

2

Czy w swoim projekcie używasz keep klasy Entity?
Jeśli nie, keep opakowanie, które można umieścić swoją klasę Entity
jak ten
-keep class com.xxx.xxx.model.* {*;}

+0

tak, mam. W celach testowych trzymałem cały pakiet bazy danych w stanie niezmąconym, ale bezskutecznie. Ponieważ nie mogłem tego naprawić po tygodniu prób i wyszukiwania, przełączyłem się na realm.io. Mają wszystkie reguły proguard w obrębie biblioteki i nie ma potrzeby robić dla programisty. – muetzenflo

1

Można spróbować tej

-dontwarn org.greenrobot.greendao.** 
-keepclassmembers class * extends de.greenrobot.dao.AbstractDao { 

} 
-keep class **$Properties 

Korzystając wersja zaktualizowana

apply plugin: 'org.greenrobot.greendao' 

compile 'org.greenrobot:greendao:3.2.0' 

same kwestie wymienione Here i here i StackOverflow

Powiązane problemy