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 ....
「インスタント実行」をオフにする必要があります。 Android Studio->設定->ビルド、実行、デプロイ->インスタント実行。すべてオフにします。
Java.lang.ClassNotFoundException
は、デバッグのfun例外です。特に、さまざまな理由で発生する可能性があるためです。この場合、他のすべての起動動作が原因で、クラスを初期化できないことが原因である可能性があります。静的にロードするリソースがあり、本質的にシングルトンである場合、ファイルを開くか、JVMでのクラス作成時に「排他的」リソースを使用する場合、クラスがアプリケーションを再起動したかどうかに関係なく、すでにJVMにロードされています。クラスをロードする2番目のインスタンスが発生すると、既存のインスタンスと衝突し、両方のインスタンスがJVMから削除され、3番目の実行が正常に実行されます。
tl; drコードが正であるかどうかを確認する必要がありますが、ほとんどの場合(特に、@JvmStatic
アノテーション)、クラスの2回目の静的ロードに失敗していること。失敗すると、すべてのインスタンスがJVMから削除され、プロセスが繰り返されます。
私が見つけた唯一の回避策は、Android.compileOptions.incremental = false
を設定することです。
詳細については、 この問題 を参照してください。
クリーンビルドを試してください。別のブランチからキャッシュされた変更がある可能性があります。同じエラーに直面したときに問題を解決しました