adbとADT

またもやだが、複数のEclipseを上げた後、片方のADTでAndroidプロジェクトのデバッグをしようとした所、エミュレータがデバッガに全く反応しないという現象が発生した。(もう片方はAndroidプロジェクトではない)

本来であれば、ビルドが成功してapkイメージがエミュレータにインストールされてデバッガが使用可能になるはずだが、コンソールを見てみるとアクティビティを起動するためにインテントをポストした所で止まっている。

[2010-01-04 13:36:47 - TestDroid]Installing TestDroid.apk...
[2010-01-04 13:36:53 - TestDroid]Success!
[2010-01-04 13:36:53 - TestDroid]Starting activity jp.hoge.TestDroid on device 
[2010-01-04 13:36:55 - TestDroid]ActivityManager: Starting: Intent { cmp=jp.hoge/.TestDroid }
(本来であればここで "Attempting to connect debugger to 'jp.hoge' on port XXXX"と出力されて、デバッグ可能になる)

Eclipseを使っていると、ついついその背後を無視しがちだが、adb(Android Debug Bridge、Windowsの場合adb.exeが実行イメージ)はシステムに一つしか存在しないことを理解する必要がある。また、ADTの設定はADTがインストールされた後、Android-SDKのパスを入力した時点から有効であり、その後Eclipseが起動されると同時にadbも起動されて、DDMS(Dalvik Debug Monitor Service)が使用可能となる。

その際にADTで保存されたadbとDDMSそれぞれの設定が使用される

  • adbの設定が保存される.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.adt.prefs
#Thu Dec 03 14:46:28 JST 2009
com.android.ide.eclipse.adt.sdk=E\:\\android-sdk-windows
eclipse.preferences.version=1
  • DDMSの設定が保存される.metadata/.plugins/org.eclipse.core.runtime/.settings/com.android.ide.eclipse.ddms.prefs
#Thu Dec 03 14:46:28 JST 2009
com.android.ide.eclipse.ddms.adb=E\:\\android-sdk-windows\\tools\\adb.exe
eclipse.preferences.version=1

と、いろいろ調べた結果デバッグできるようになったのだが、原因がよく分からないし動作が怪しい。

1. デバッグできないのは後で起動した(件の日本語入力のバグを回避するため)EclipseのADTだったこと
2. 最初に起動した非Androidプロジェクトでは一度もエミュレータ及びDDMSを起動したことが無かったこと

これらを考慮すると、デバッグの情報が一度も正しく保存されていない状態でDDMSが実行されており、その状態でAndroidプロジェクトがエミュレータにアタッチしようとして失敗していたのだと思われる。

ネットの情報では上記com.android.ide.eclipse.ddms.prefsでデバッグ用のポートが衝突しないように、

com.android.ide.eclipse.ddms.addDebugBasePort=XXXX

とポートを追加する方法が見られるのだが、undocumentedなパラメタなのか情報が見つからないので、真偽の程は定かではない。

追記:
その後、何度かビルドし直している間にまたデバッグが出来なくなってしまった。コードに変更が生じてapkをインストールし直す際に失敗するようで、以降、アプリケーションを起動できなくなってしまう。
仕方が無いので、デバッグ対象となるADTは一つになるように、関係の無いプロジェクトでは上記二つのファイルを消してADTの設定を初期化した所、デバッグができるようになった。


ADTを無効にしたプロジェクトからEclipseを起動すると、このようなエラーが表示されるが仕方がない。

以上を鑑みると、現状のADTは複数立ち上げてadbを共有するという使い方は考慮されていないようだ。