web-dev-qa-db-ja.com

Android Kotlin:Java.lang.NoClassDefFoundError:失敗した解決:<KotlinObject>

Androidアプリを毎秒実行すると、クラッシュが発生します。

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

BlahUtilは、@ JvmStaticアノテーションが含まれるkotlinオブジェクトです。これらの静的メソッドを残りのAndroid app(All in Java)から呼び出します。

Multidex1.0.1を使用します。

私はAndroid studio 2.1.2、JDK7を使用しています。

関連する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 ....

logcat出力

11
letronje

「インスタント実行」をオフにする必要があります。 Android Studio->設定->ビルド、実行、デプロイ->インスタント実行。すべてオフにします。

3
BurtK

Java.lang.ClassNotFoundExceptionは、デバッグのfun例外です。特に、さまざまな理由で発生する可能性があるためです。この場合、他のすべての起動動作が原因で、クラスを初期化できないことが原因である可能性があります。静的にロードするリソースがあり、本質的にシングルトンである場合、ファイルを開くか、JVMでのクラス作成時に「排他的」リソースを使用する場合、クラスがアプリケーションを再起動したかどうかに関係なく、すでにJVMにロードされています。クラスをロードする2番目のインスタンスが発生すると、既存のインスタンスと衝突し、両方のインスタンスがJVMから削除され、3番目の実行が正常に実行されます。

tl; drコードが正であるかどうかを確認する必要がありますが、ほとんどの場合(特に、@JvmStaticアノテーション)、クラスの2回目の静的ロードに失敗していること。失敗すると、すべてのインスタンスがJVMから削除され、プロセスが繰り返されます。

1

私が見つけた唯一の回避策は、Android.compileOptions.incremental = falseを設定することです。

詳細については、 この問題 を参照してください。

1
Dmide

クリーンビルドを試してください。別のブランチからキャッシュされた変更がある可能性があります。同じエラーに直面したときに問題を解決しました

0