Android の専門家は、このメソッドがハングする理由を明らかにすることができますか?
スレッドを一時停止してスタックを見ると:
Thread [<13> Thread-15] (Suspended)
DexFile.openDexFile(String, String, int) line: not available [native method]
DexFile.<init>(String, String, int) line: 105
DexFile.loadDex(String, String, int) line: 144
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
...ネイティブ メソッド DexFile.openDexFile でハングしていることがわかります。
これは、作成中のアプリケーションに重大な問題を引き起こしています。それはランダムに発生するため、いくつかのスレッド間で何らかの競合状態が発生していることを示唆していますが、検出とデッドロックを接続し、さらにネイティブメソッドが何かを返すことを期待しています。例外でもいいでしょう!!
前もって感謝します
私は Android 2.2 Nexus One デバイスを使用しています。Eclipse からデバイスにアプリケーションをデプロイしています。アプリケーションを完全にアンインストールしてデバイスの電源を入れ直しても、上記の問題がランダムに表示されることを確認してください。
更新: Android 2.3.3 エミュレーター (API 10) で再試行しましたが、同じ問題が発生しました。私は今、ここに大きなバグがあると確信しています。問題を示す簡単なテスト ケースを作成しました。基本的に、私は 1 つの dexified jar を Android プロジェクトの assets フォルダーに追加します。起動時に、このファイルをアプリケーション データ領域にコピーします。次に x スレッドを開始し、各スレッド内で DexFile.loadDex を使用してこの dex 化された jar ファイルをロードしますが、生成された最適化された dex ファイルに別の出力ファイル名を付けます。x を 30 スレッドと指定すると、複数のスレッドがハングすることがほぼ保証されます。
念のため、各スレッドに固有の dexified jar ファイルが与えられるテストを繰り返しました。同じ問題が発生します。
私が見る唯一の LogCat 出力は、何が問題なのかのヒントを与える可能性があります。
02-23 11:59:23.097: DEBUG/dalvikvm(12598): DexOpt: 群れで眠っています (/data/dalvik-cache/system@framework@core.jar@classes.dex) 02-23 11:59:23.138: DEBUG/dalvikvm (12602): DexOpt: 群れでスリープ (/data/dalvik-cache/system@framework@core.jar@classes.dex) 02-23 11:59:23.357: DEBUG/dalvikvm (12602): DexOpt:群れで眠っている (/data/dalvik-cache/system@framework@framework.jar@classes.dex) 02-23 11:59:23.419: DEBUG/dalvikvm(12598): DexOpt: 群れで眠っている (/data/dalvik- cache/system@framework@framework.jar@classes.dex) 02-23 11:59:23.528: DEBUG/dalvikvm(12608): DexOpt: 群れで眠っています (/data/dalvik-cache/system@framework@core.jar @classes.dex) 02-23 11:59:23.577: DEBUG/dalvikvm(12598): DexOpt: 群れで眠っています (/data/dalvik-cache/system@framework@services.jar@classes.dex) 02-23 11 :59:23.698: DEBUG/dalvikvm(12606): DexOpt:群れで寝ている (/data/dalvik-cache/system@framework@core.jar@classes.dex)
もう1つの興味深い点は、例として、dex化されたjarファイルがあることです
myjar.jar (サイズ 5031)
この dex ファイルを開く各スレッドは、ファイルを作成します
myjar.jarX.dex (X はスレッドごとに一意の整数) (サイズ 4152)
DexFile.loadDex 呼び出しを完了しないスレッドは、まだ myjar.jarX.dex ファイルを作成できますが、ファイルのサイズは 3496 です。
私は、Dalvik ネイティブ コードの奥深くで何らかの形式の競合状態があると考えています。これは私たちにとって大きなショーストッパーです。続行する最善の方法はありますか?