13

Android アプリを 2 回実行するたびに、次のようなクラッシュが発生します。

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

BlahUtil は @JvmStatic アノテーションを含む kotlin オブジェクトです。これらの静的メソッドを残りの Android アプリ (すべて Java 内) から呼び出します。

multidex 1.0.1 を使用しています。

私はJDK 7を使用してAndroidスタジオ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出力

4

4 に答える 4

3

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

于 2016-08-17T09:39:07.923 に答える
1

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

tl;dr@JvmStaticコードがポジティブであることを確認する必要がありますが、クラスの 2 回目の静的読み込みで失敗している可能性が最も高いです (特に注釈の場合)。失敗すると、すべてのインスタンスが JVM から削除され、プロセスが繰り返されます。

于 2016-08-01T18:32:50.823 に答える
1

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

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

于 2017-06-04T14:34:59.037 に答える