13

每次运行我们的 android 应用程序,我们都会遇到一个崩溃,上面写着

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

BlahUtil 是一个带有 @JvmStatic 注释的 kotlin 对象。我从 android app(All in 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"
}

痕迹:

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 ....

日志输出

4

4 回答 4

3

您应该关闭“即时运行”。Android Studio -> 首选项 -> 构建、执行、部署 -> 即时运行。关掉一切。

于 2016-08-17T09:39:07.923 回答
1

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

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

于 2016-08-01T18:32:50.823 回答
1

我发现的唯一解决方法是设置android.compileOptions.incremental = false

有关详细信息,请参阅此问题

于 2017-06-04T14:34:59.037 回答
0

尝试干净的构建。可能有一些从另一个分支缓存的更改。当我遇到同样的错误时解决了这个问题

于 2018-05-29T06:48:52.793 回答