2016-11-21 62 views
-1

語境Occasionaly接受的,而不是造成PathClassLoader遷徙路線WarningContextClassLoader崩潰

在我的Android應用程序,我用遷徙路線更新我的DB模式。到目前爲止,我只有一次遷移,即創建了3個表。飛行的簡單和平常的業務。它工作得很好......大部分時間!有時這種錯誤(全棧下文)崩潰:

java.lang.ClassCastException: android.app.LoadedApk$WarningContextClassLoader 
cannot be cast to dalvik.system.PathClassLoader 

我有相關的錯誤幾個問題:

  • 什麼是LoadedApk.WarningContextClassLoader?
  • 爲什麼它有時用來代替dalvik.system.PathClassLoader?
  • 這是我的應用程序,Android系統或Flyway中的錯誤?

我也注意到,我可以明確地注入內飛行用的類加載器(Flyway.setClassLoader())

  • 我怎樣才能得到確保正確的類加載器?

請注意,我在Flyway注入應用程序上下文,而不是特定活動的上下文。

版本

我使用org.flywaydb:飛路核:4.0.2

我Android中4.2.2(傑利貝恩,API級17)和4.4(奇巧,API注意到了這個問題19級)。 AFAIK,它從來沒有出現在更高的版本。

堆棧跟蹤

Exception java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.myapp.free.debug/com.mycompany.MainActivity}: java.lang.ClassCastException: android.app.LoadedApk$WarningContextClassLoader cannot be cast to dalvik.system.PathClassLoader 
    android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2306) 
    android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2358) 
    android.app.ActivityThread.access$600 (ActivityThread.java:156) 
    android.app.ActivityThread$H.handleMessage (ActivityThread.java:1340) 
    android.os.Handler.dispatchMessage (Handler.java:99) 
    android.os.Looper.loop (Looper.java:153) 
    android.app.ActivityThread.main (ActivityThread.java:5299) 
    java.lang.reflect.Method.invokeNative (Method.java) 
    java.lang.reflect.Method.invoke (Method.java:511) 
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:833) 
    com.android.internal.os.ZygoteInit.main (ZygoteInit.java:600) 
    dalvik.system.NativeStart.main (NativeStart.java) 

Caused by java.lang.ClassCastException: android.app.LoadedApk$WarningContextClassLoader cannot be cast to dalvik.system.PathClassLoader 
    org.flywaydb.core.internal.util.scanner.classpath.android.AndroidScanner.<init> (AndroidScanner.java:46) 
    org.flywaydb.core.internal.util.scanner.Scanner.<init> (Scanner.java:38) 
    org.flywaydb.core.Flyway.execute (Flyway.java:1353) 
    org.flywaydb.core.Flyway.info (Flyway.java:1040) 
    com.mycompany.db.FlywayHelper.info (FlywayHelper.java:54) 
    com.mycompany.db.FlywayHelper.migrate (FlywayHelper.java:45) 
    com.mycompany.db.GW2DatabaseHelper.migrate (GW2DatabaseHelper.java:56) 
    com.mycompany.db.DbInit.initKeyGuild (DbInit.java:62) 
    com.mycompany.db.DbInit.init (DbInit.java:42) 
    com.mycompany.business.BootApp.boot (BootApp.java:79) 
    com.mycompany.MainActivity.onCreate (MainActivity.java:51) 
    android.app.Activity.performCreate (Activity.java:5122) 
    android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1081) 
    android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2270) 
    android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2358) 
    android.app.ActivityThread.access$600 (ActivityThread.java:156) 
    android.app.ActivityThread$H.handleMessage (ActivityThread.java:1340) 
    android.os.Handler.dispatchMessage (Handler.java:99) 
    android.os.Looper.loop (Looper.java:153) 
    android.app.ActivityThread.main (ActivityThread.java:5299) 
    java.lang.reflect.Method.invokeNative (Method.java) 
    java.lang.reflect.Method.invoke (Method.java:511) 
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:833) 
    com.android.internal.os.ZygoteInit.main (ZygoteInit.java:600) 
    dalvik.system.NativeStart.main (NativeStart.java) 

研究更新

雖然其目的不明確給我,LoadedApk.WarningContextClassLoader似乎是一個有效的類加載器,然後應該由遷飛支持。 A pull request已提交。

在這兩者之間,一個解決方法需要實現,注入預期的類裝載器:

private void injectClassLoader(Flyway flyway) { 
    ClassLoader classLoader = flyway.getClassLoader(); 
    if (classLoader != null && !(classLoader instanceof PathClassLoader)){ 
     flyway.setClassLoader(classLoader.getParent()); 
    } 
} 

回答

0

什麼是LoadedApk.WarningContextClassLoader?

爲什麼它有時用來代替dalvik.system.PathClassLoader?

不太確定,但是這個特定的類加載器的目的似乎警告用戶它的包可能與其他包共享虛擬機。More info here,感謝@orip。

這是我的應用程序,Android系統或Flyway中的錯誤嗎?

無論如何,WarningContextClassLoader仍然是一個有效的類加載器,並且必須由flyway接受。 AndroidScanner製作的劇本沒用。

1

有體面的信息的commit message adding WarningContextClassLoader。我猜想通過活動的上下文可能會有所幫助。

+0

不,不。我查過了(flyway是開源的),上下文並不是用來抓取類加載器的。其實flyway只是像這樣初始化它的類加載器:'private ClassLoader classLoader = Thread.currentThread()。getContextClassLoader();'但是感謝分享! – Benoit