Android Kotlin:java.lang.NoClassDefFoundError:解析失败:<KotlinObject>

let*_*nje 11 android kotlin kotlin-android-extensions

我们的Android应用程序每运行一次,就会发生崩溃

java.lang.NoClassDefFoundError: Failed resolution of: Lin/blahapp/xxx/BlahUtil
Run Code Online (Sandbox Code Playgroud)

BlahUtil是一个带有@JvmStatic注释的kotlin对象.我从Android应用程序的其余部分调用这些静态方法(全部在java中).

我们使用multidex 1.0.1.

我在android studio 2.1.2上,使用JDK 7.

相关的gradle配置:

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"
}
Run Code Online (Sandbox Code Playgroud)

跟踪:

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 ....
Run Code Online (Sandbox Code Playgroud)

logcat输出

小智 1

java.lang.ClassNotFoundException是一个有趣的调试异常。值得注意的是,它可能由多种原因引起。在这种情况下,由于所有其他启动行为,它很可能是由于无法初始化类而发生的。如果您有静态加载的本质上是单例的资源、打开的文件或 JVM 中类创建时的任何“独占”资源,那么当它第二次初始化它时,因为该类已经加载到JVM 中,无论您是否重新启动应用程序。当加载该类的第二个实例发生时,它与现有实例发生冲突,并且两个实例都从 JVM 中删除,从而使第三次执行运行得很好。

tl;dr我必须看到你的代码是积极的,但很可能(特别是带有@JvmStatic注释),你在类的第二次静态加载上失败了。当失败时,所有实例都会从 JVM 中删除,并重复该过程。