2016-08-01 15 views
11

Co drugi bieg naszego android app, mamy awarię, która mówiAndroid Kotlin: java.lang.NoClassDefFoundError: Nie rozdzielczość: <KotlinObject>

java.lang.NoClassDefFoundError: Failed resolution of: Lin/blahapp/xxx/BlahUtil 

BlahUtil jest obiektem Kotlin z @JvmStatic adnotacji w to. Te statyczne metody nazywam reszta aplikacji na Androida (All in java).

Używamy multidex 1.0.1.

Jestem na Androidzie 2.1.2 studiu, używając JDK 7.

Istotne Gradle configs:

compileSdkVersion 23 
buildToolsVersion "23.0.3" 
defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 23 
} 
dexOptions { 
     incremental true 
     dexInProcess true 
     javaMaxHeapSize "10g" 
     preDexLibraries true 
} 
buildscript { 
    ext.kotlin_version = '1.0.3' 

    dependencies { 
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
    } 
} 
apply plugin: 'kotlin-android' 
dependencies { 
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" 
} 

Ślad:

at in.blahapp.xxx.OurActivity 
at android.app.Activity.performCreate(Activity.java:6251) 
at ndroid.app.Instrumentation.callActivityOnCreate 
at android.app.ActivityThread.performLaunchActivity 
at android.app.ActivityThread.handleLaunchActivity 
at android.app.ActivityThread.-wrap11 
at android.app.ActivityThread$H.handleMessage 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Caused by: java.lang.ClassNotFoundException: Didn't find class "in.blahapp.xxx.BlahUtil" on path: DexPathList[[dex file .... 

logcat output

+0

Czy to się zawsze zdarza, czy tylko w co drugiej kompilacji (lub, w innym wariancie, tylko przy pierwszym czystym kompilacji)? – AndroidEx

+0

Zwykle nigdy nie dzieje się przy pierwszym uruchomieniu, które następuje po czystej kompilacji. awarie podczas drugiego uruchomienia po wprowadzeniu pewnych zmian i ponownym uruchomieniu. Działa trzeci bieg. jeśli ponownie wprowadzę zmianę, nastąpi awaria następnego razu. następnie pracuje w biegu po tym ..... i tak dalej. – letronje

+3

To brzmi jak [ten błąd] (https://youtrack.jetbrains.com/issue/KT-10733). Miałem inny wariant tego błędu, gdy klasa Kotlin nie została znaleziona (= usunięta) na pierwszej czystej kompilacji, ale pojawiła się na drugiej przyrostowej kompilacji. Zostało to również omówione na trackerze google, a wynik był taki, że musimy poczekać na wydanie android gradle plugin 2.3. Ten problem uniemożliwił mi wprowadzenie w moim zespole Kotlina i, niestety, nie mam żadnych zaleceń, którymi mógłbym się z tobą podzielić. – AndroidEx

Odpowiedz

1

java.lang.ClassNotFoundException JEST zabawa wyjątek od d ebug. Szczególnie dlatego, że może wystąpić z wielu powodów. W tym przypadku, ze względu na każde inne działanie uruchamiania, najprawdopodobniej dzieje się to z powodu niemożności zainicjowania klasy. Jeśli masz zasoby ładowane statycznie, które mają charakter singletonowy, otwieraj pliki lub dowolne zasoby "wyłączne" podczas tworzenia klasy w JVM, gdy po raz drugi zainicjujesz je, ponieważ klasa jest już załadowana do maszyny JVM , niezależnie od tego, czy ponownie uruchomiłeś aplikację. Gdy wystąpi druga instancja ładowania klasy, koliduje ona z istniejącą i oba wystąpienia są usuwane z maszyny JVM, co powoduje, że trzecie wykonanie jest w porządku.

tl; dr Musiałbym zobaczyć Twój kod będzie pozytywny, ale jest to najprawdopodobniej (zwłaszcza z @JvmStatic adnotacji), że jesteś na drugim braku obciążenia statyczne klasy. W przypadku niepowodzenia wszystkie wystąpienia są usuwane z maszyny JVM, a proces powtarza się.

4

Powinieneś wyłączyć "Instant Run". Android Studio -> Preferencje -> Kompilacja, wykonanie, wdrożenie -> Natychmiastowe uruchamianie. Wyłącz wszystko.

+5

Wydaje się nie działać dla mnie. Usunąłem zaznaczenie wszystkich pól wyboru i nadal otrzymuję te błędy. – letronje

+1

Ten błąd może wystąpić nawet podczas uruchamiania z wiersza poleceń. Niekoniecznie powiązany z Instant Run ... –

0

Jedyne obejście znalazłem jest ustawienie android.compileOptions.incremental = false

Zobacz this issue szczegóły.

Powiązane problemy