エミュレーター上の Android アプリでスタンドアロンの Java デバッガーを使用すると問題が発生します。どうやら、jdb(またはjswat)などのリモート対応のJavaデバッガーは、以下の手順に従うことで活用できます(あちこち読んだ後、理解できます)。
1) エミュレーターの電源を入れ、エミュレーターにアプリをインストールします (adb install)
2) dalvik サーバー (ddms) をオンにします。
3)エミュレータで、「DevTools」アプリを実行します->「開発設定」->デバッグするアプリを選択し、「デバッガーを待機」フラグを有効にします
4) エミュレーターで再びアプリを実行します。デバッガーがアタッチされるのを待ってブロックされ、dalvik は「赤いバグ」によってフラグが立てられた新しいプロセスを表示します。
5) dalvik で、赤旗のプロセスを選択します。したがって、そのデバッグ ポートは localhost:8700 に転送されます。
6) デバッガーを localhost:8700 にフックします。jdb では、「jdb -attach 8700」を実行する必要があります。
デバッガーが起動されるとすぐに、エミュレーター上のアプリのブロックが解除されます。したがって、アプリはデバッガーを適切に検出したため、無料で実行されているようです。
ただし、重要なのは、「自由に実行される」ことです。つまり、デバッガーが「実行」コマンドを発行するのを待ちません。そのため、ブレークポイントを設定する機会がありません。
1のヒントに従って、ブレークポイントを設定する時間があることを期待して、アプリの先頭に待機ループを配置しようとしました。ブレークポイントを設定しようとすると、アプリがまだ実行されていないため、jdb は「ブレークポイント XXX.YYY を保留しています。クラスがロードされた後に設定されます。」と表示します。しかし、「実行」コマンドを発行すると、アプリは既に実行されていたため、答えは「中断されたものはありません」です (実際に実行されています)。
jswat ではこれらのメッセージは表示されませんが、最終的な結果は同じです :-(
言うまでもなく、「jdb -attach」は、localhost で実行されている Android 以外の Java アプリでも問題なく動作します。
ヒントはありますか(「日食を使用してください」を除く)?
ばかげた詳細がどこかに欠けているだけですか?
アプリはHelloWorld、ビルドコマンドは「ant debug」です。
前もって感謝します。