2017-02-03 32 views
13

我使用以下的ProGuard規則:只有使用ProGuard:無法初始化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.** 

當啓動應用程序,我得到下面的崩潰日誌:

 
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)  

當編譯沒有ProGuard的應用程序,一切正常。

我在這裏是否缺少配置?我找不到這個與谷歌什麼...

+0

fwiw:經過2天的挖掘,我決定將數據庫切換到realm.io – muetzenflo

回答

2

看來這個指令:

-keep class org.greenrobot.greendao.** 

沒有被應用。正如你可以在日誌中看到,線路喜歡:

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) 

表明,儘管你的ProGuard指令告訴org.greenrobot.greendao下類被混淆(或者是假設告訴)ProGuard不要作任何改變。爲了解決這個問題,確保ProGuard的規則文件在那裏,這是定義在你的Android配置的proguardFiles部分被正確引用:

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

和你的釋放配置(S)使用相同的proguard-rules.pro文件。

+0

謝謝,我更新了我的規則集以保留幾乎所有與greendao無關的內容。日誌文件現在有點冗長,但錯誤不斷髮生。我用新的日誌和規則更新了我的問題。 – muetzenflo

2

keepEntity類在你的項目?
如果沒有,keep你把你的Entity
這樣
-keep class com.xxx.xxx.model.* {*;}

+0

是的,我這樣做。出於測試目的,我甚至保留了我的整個數據庫包未混淆,但無濟於事。由於我在嘗試搜索一週後無法解決此問題,因此我切換到了realm.io。他們在lib中有所有的proguard規則,並且沒有爲開發者做的事情。 – muetzenflo

1

包你可以試試這個

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

} 
-keep class **$Properties 

使用更新版上市Here

apply plugin: 'org.greenrobot.greendao' 

compile 'org.greenrobot:greendao:3.2.0' 

同樣的問題和 hereStackOverflow

相關問題