2016-08-01 7 views
11

우리의 안드로이드 응용 프로그램의 모든 두 번째 실행, 우리는안드로이드 코 틀린 : java.lang.NoClassDefFoundError가이 :의 해상도를 실패 : <KotlinObject>

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

BlahUtil을 말한다 충돌이에 @JvmStatic 주석과 코 틀린 객체입니다 얻을 그것. 나는 안드로이드 애플 리케이션 (자바에서 모두)의 나머지 부분에서 이러한 정적 메서드를 호출합니다.

우리는 multidex 1.0.1을 사용합니다.

내가 JDK 7.

관련 Gradle을 CONFIGS 사용하여, 안드로이드 스튜디오 2.1.2 오전 :

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" 
} 

추적 :

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

항상 발생합니까 아니면 모든 두 번째 빌드에서만 (또는 다른 변형에서 첫 번째 클린 빌드에서만) 발생합니까? – AndroidEx

+0

보통 깨끗한 빌드를 따르는 첫 번째 실행에서는 절대로 발생하지 않습니다. 몇 가지 사항을 변경하고 다시 실행하면 두 번째 실행시 충돌이 발생합니다. 세 번째 실행 작동합니다. 내가 다시 변경하면 바로 다음 실행에서 충돌이 발생합니다. 그 후 실행에 대한 작업 ..... 등등. – letronje

+3

[이 버그] (https://youtrack.jetbrains.com/issue/KT-10733)와 매우 유사합니다. Kotlin 클래스가 첫 번째 클린 컴파일에서 발견 (= 삭제)되지 않았지만 두 번째 증분 빌드에서 나타난이 버그의 또 다른 변형이 있습니다. Google 트래커에서도 논의되었으므로 android gradle plugin 2.3이 출시 될 때까지 기다려야합니다. 이 문제로 인해 내 팀에 Kotlin을 소개 할 수 없었고, 불행히도 귀하와 공유 할 권장 사항이 없습니다. – AndroidEx

답변

1

java.lang.ClassNotFoundException입니다 재미 d 예외 ebug. 특히 여러 가지 이유로 인해 발생할 수 있습니다. 이 경우 다른 모든 실행 동작으로 인해 클래스를 초기화 할 수 없기 때문에 발생할 가능성이 큽니다. 정적으로로드하는 리소스가 본질적으로 싱글 톤이거나, 파일을 열거 나, JVM에서 클래스 생성시 "배타적"인 리소스 인 경우, 클래스가 이 이미 JVM에로드되어 있으므로 두 번째로 초기화 할 때 응용 프로그램을 다시 시작했는지 여부에 관계없이 클래스를로드하는 두 번째 인스턴스가 발생하면 기존 인스턴스와 충돌하고 두 인스턴스이 JVM에서 제거되어 세 번째 실행이 올바르게 실행됩니다.

TL; DR 내가 가진 거라고는 코드를 긍정적으로 볼 수 있지만, 그것은 당신이 클래스의 두 번째 정적 로딩에 실패하고 있음 (특히 @JvmStatic 주석) 가장 가능성이 높습니다. 실패하면 모든 인스턴스가 JVM에서 제거되고 프로세스가 반복됩니다.

4

'즉시 실행'을 해제해야합니다. Android Studio -> 환경 설정 -> 빌드, 실행, 배포 -> 인스턴트 실행. 모든 것을 끄십시오.

+5

나를 위해 작동하지 않는 것 같습니다. 모든 확인란의 선택을 취소 했는데도 오류가 발생합니다. – letronje

+1

이 오류는 명령 줄에서 실행 중일 때도 발생할 수 있습니다. 반드시 인스턴트 실행과 관련이 없습니다 ... –

0

내가 찾은 유일한 해결 방법은

android.compileOptions.incremental = false 자세한 것은 this issue를 참조 설정하는 것입니다.