Hatena::ブログ(Diary)

Android(アンドロイド)情報-ブリリアントサービス RSSフィード


2009-02-03

AndroidのDDMSの使用方法のドキュメントを翻訳しました

| 00:36 |

f:id:bs-android:20090204001327p:image

タイトルの通り2009/2/3時点のDDMSの使用方法のドキュメントを邦訳しました。

忠実に翻訳するよりもわかりやすさを優先しています。

デバッグする時に活躍すると思いますので、是非ご活用ください。

翻訳が間違っている部分がある可能性もありますが、その際はご指摘いただけたら幸いです。

PDF版も用意しています。

DDMSツールの使用について

 Androidが搭載するデバッギングツールであるDalvik Debug Monitor Service(DDMS)は、ポート-フォワーディングサービス、スクリーンキャプチャー、デバイス上のスレッドとヒープ情報、logcat、プロセス、そして無線状態の情報、疑似音声着信と疑似SMS、疑似位置情報データなどを提供します。

このページは、DDMS機能に関する概要を提供します。ただしすべての仕様とスペックを完全に記載するわけではありません。


 DDMSは、SDKのtools/ ディレクトリに入っています。コマンドプロンプトからsdkのtoolsディレクトリに入り、"ddms"(⇒Mac/Linuxでは"./ddms")と入力します。DDMSはエミュレーターデバイスの両方で動作します。両方とも同時に実行、接続されている場合はエミュレーターデフォルトで選択します。

DDMSはどのように動作するのか

 DDMSはデバイス上で動作するアプリケーションIDE間の接続の仲介を行います。

Android上のあらゆるアプリケーションは各自のプロセスで動作し、各自のバーチャルマシン(VM)のホストをつとめます。そして、各プロセスは異なるポートでデバッガーを監視をします。


 DDMSは開始時にadbに接続し、デバイスモニタリング・サービス(デバイス監視サービス)を起動します。

デバイスモニタリング・サービスはデバイスがいつ接続、切断されたのかをDDMSに通知します。

デバイスが接続されるとき、VMモニタリングサービス(VM監視サービス)がadbとDDMSの間で作成生成され、デバイス上のVMがいつ開始、終了したのかをDDMSに通知します。

 VMが走りだすと、DDMSはadbを経由してVMプロセスID(pid)を取得し、デバイスのadbデーモン(adbd)を通して、VMデバッガーへのコネクションをオープンし、カスタムのワイヤープロトコルを使って、VMと通信することができます。


 デバイスVM毎に、DDMSはデバッガーを監視するポートをオープンします。

DDMSは最初のVMをポート8600に、次のVMを8601に、その次に・・という具合に、デバッガーを監視します。

 デバッガーがこれらのポートの一つと接続した時、すべてのトラフィックデバッガーと、関連付けられたVMに転送されます。どのようなリモートデバッグセッションでも同様にデバッグをすることが可能です。


 DDMSは別のローカルポート、すなわち、DDMS「ベースポート」(デフォルトで、8700)、もオープンします。

「ベースポート」は、デバッガーの監視も行います。デバッガーがこのベースポートに接続すると、すべてのトラフィックがDDMSで現在選択されているVMへ転送されます。このポートはあなたのデバッガが接続する主なポートです。


 DDMSのポート-フォワーディングの詳細については、Configuring your IDE to attach to port 8700 for debuggingを参照してください。


ヒント: "File > Preferences"で、DDMSの設定を行うことができます。

     設定は、「$HOME/.ddmsrc」に保存されます。

Dalvikに関する既知のデバッグ問題

他のVMと同じように、Dalvik VMアプリケーションデバッグできなければなりませんが、同期実行しているソースコードを一度ステップアウトすると、現在行が一気に関数の最後の行へジャンプしてしまうかもしれません。

左ペイン

f:id:bs-android:20090204001326p:image

デバッグモニタの左側には、現在見つかっている各エミュレータ/デバイスVMのリストとともに表示されます。VMは、自身がホストしているアプリケーションのパッケージ名によって識別されます。


 デバッグしたいアクティビティを走らせているVMへアタッチする為にこのリストを使用します。

リスト表示されているのVMの隣(一番右のカラム)に、「デバッガーパス−スルー」ポートがあります。

デバッガーがリストアップされたポートに接続されている場合、デバイスに対応するVMに接続されます。

しかし、DDMSを使うとき、DDMSは現在選択されたVMにポート8700にある全てのトラフィックを転送するので、ポート8700に接続しさえすればよいです。(注意:リストから選択したVMはポート8700を含みます)

このように、VMを切り替えるたびに、デバッガーのポートを再設定する必要はありません。


 デバイスアプリケーションが実行され、waitForDebugger()が呼ばれると(または、開発者オプションでこのオプションを選んでいる時)、デバッガーがVMへアタッチするのを待つ間、赤いアイコンクライアント名の横に表示されます。デバッガーが接続されると緑のアイコンになります。


 消し線の引かれたバグアイコンが表示されたら、VMのローカルポートをオープンすることができずに

デバッガーとVMを関連付けられなかったこと意味します。

デバイス上の全てのVMに対してバグアイコンが表示されたら、それは恐らく別のDDMSのインスタンス(Eclipse pluginを含む)を走らせているからだと思われます。


 アプリケーションパッケージの代わりに疑問符が表示されたら、DDMSがadbからアプリケーションpidを受け取ることができたが、VMプロセスで接続が失敗したことを意味します。もしそうなったらDDMSを再起動してみてください。


右ペイン

ウィンドウの右側のデバッグモニタは、便利な情報とクールなツール群のタブを提供します。

Infoタブ

f:id:bs-android:20090204001328p:image

このタブは、選択中のVMプロセスID、パッケージ名、VMバージョンなどの一般的な情報がいくつか表示します。

Threadsタブ

f:id:bs-android:20090204001329p:image

スレッドビューではターゲットとなるVMプロセス上で動作しているスレッドのリストを持っています。

ワイヤー上に送られるデータの量を減らすために、ツールバーの「スレッド」ボタンをトグルすることで、スレッド情報を常に更新するかどうかを切り替えることが出来ます。このトグル設定は、VMごとに保持されます。

このタブは以下の情報を含んでいます。

・ID

 DalvikVMに割り当てられたユニークなスレッドID。3からはじまる奇数になっています。

・Tid

 プロセスのメインスレッドのためのLinuxスレッドID。これはプロセスIDにマッチしています。

・Status

 以下はスレッドのステータスの種類です。(デーモンスレッドは、アスタリスク(*)で示されます。)

 ・running:アプリケーション実行中

 ・sleeping:Thread.sleep()をコールしてスリープ

 ・monitor:モニターロック待ち

 ・wait:Object.wait()をコールしてオブジェクト待ち

 ・native:ネイティブコード実行中

 ・vmwait:VMリソース待ち

 ・zombie:死にゆくスレッド

 ・init:スレッド初期化中(参照すべきでない)

 ・starting:スレッドスタート処理中(参照すべきでない)

・utime

 このスレッドがユーザコードを実行した累積時間。これはLinux直下のプロセスのみ利用可能です。

・stime

 このスレッドがシステムコードを実行した累積時間。これはLinux直下のプロセスのみ利用可能です。

・Name

 スレッドの名前


スレッド開始時に「ID」と「名前」が設定されます。残りのフィールドは、定期的に更新されます。(デフォルトは4秒毎)

VM Heapタブ

f:id:bs-android:20090204001330p:image

ガーベージコレクションの間に更新されたヒープの統計データを表示します。

VMを選択した時にVM Heap表示がヒープの更新ができない場合は、「Show heap updates」ボタン(左上のツールバーにあります)を押してみてください。VM Heap表示のCause GCボタンを押してガーベージコレクションを実行するとヒープのステータスを更新できます。

Allocation Trackerタブ

f:id:bs-android:20090204001331p:image

このビューでは各々のバーチャルマシンのメモリアロケーションを追跡することができます。

Emulator Controlタブ

f:id:bs-android:20090204001332p:image

これらのコントロールで特別なデバイスの状態とアクティビティをシミュレートすることができます。

以下の機能を含んでいます:

・Telephony Status(電話通信ステータス)

電話のVoiceとDataプラン(ホーム、ローミング、サーチング、その他)の状態を変更できます。そして、異なる種類のネットワークのスピードと待ち時間(GPRS、EDGE、UTMS、その他)をシミュレーションすることができます。

・Telephony Actions

 エミュレーターに電話発信とSMSメッセージを送信することができます。

・Location Controls

GPSマッピングのような場所認識操作を活用することができるように、偽のロケーションデータをエミュレーターに送信することが出来ます。

ロケーションコントロールを使うにはAndroidエミュレーターアプリケーションを起動してDDMSを起動します。エミュレーターのControlsタブをクリックし、Location Controlsが表示されるまで下にスクロールしてください。

ここから、以下の操作を行うことができます:

・経度/緯度座標のデバイスへの手動送信

f:id:bs-android:20090204003319p:image

 Manualタブを選択後、座標フォーマットを選択し、フィールドを記入して「Send」を押して座標情報を送信します。


・プレイバック用ルートが記述されているGPXファイルの使用

f:id:bs-android:20090204003317p:image

 GPXタブを選択後、"Load GPX"ボタンを押してをGPXファイルをロードします。

 ロードが完了したら、Playボタンを押すとルートのプレイバック情報がロケーション認識のあるアプリケーションに送られます。

 GPXからプレイバックを実行する時、DDMSのパネルからPauseとSkipボタンを使ってプレイバックのスピードを調節することができます。MSは"waypoints"(<wpt>:最初のテーブル)と"tracks"(<trk>:2番目のテーブルにある複数のセグメントをサポートしたもの、<trkseg>:単純に連結されている)の両方を解析します。tracksのみ再生することが可能です。

 再生させようとしているtrackを選択している間、リストの最初にある"waypoint"をクリックすると、デバイスへその座標が送信されます。


・連続プレイバックにKMLファイルを使用する

f:id:bs-android:20090204003318p:image

 KMLタブをクリックして、ファイルをロードさせます。

 ロードが完了したら、Playボタンを押すとロケーション認識のあるアプリケーションに座標が送信されます。

 KMLファイルを使用する際に、<coordinates>エレメントとして解析されます。

 経度、緯度、高度の値が一つのセットになっている必要があります。

 例:

 <coordinates>-122.084143,37.421972,4</coordinates>

 ファイルには複数の<Placemark>要素や<coordinates>要素が含まれるかもしれません。

そのような場合はplacemarksのコレクションはトラックとして加えられます。

DDMSは1秒につき1つのplacemarkをデバイスに送信します。

 適当なKMLファイルを生成するにはGoogle Earthを使う方法があります。

 Google Earthで適当な地点を右クリックすると、左にKmlに設定する保存フォーマットと"Save place as..."が表示されます。

注:DDMSは、以下のメソッドで作成されるルートをサポートしていません。

  <MultiGeometry><LineString>lat1、long1、lat2、long2、...</LineString></MultiGeometry>

  <Placemark>中の<TimeStamp>ノードのサポートはしていません。

  将来のリリースでは一つの座標要素内での時間とメソッドをサポートするかもしれません。

 擬似座標データのその他のメソッドは、

Location-based Service APIsを参照してください。

File Explorer

f:id:bs-android:20090204001333p:image

File Explorerを用いれば、デバイスファイルシステムを見ることができ、ファイルを置いたり取り出したりする基本的な管理を行うことができます。


これによって、adbのpushやpullコマンドをの使用しないでGUIによる操作が可能です。

ディレクトリデバイスドラッグ&ドロップすることはできますが、ディレクトリドラッグアウトすることはできません。

ファイルをデバイスからコピーするには、ファイルを選んで、ツールバーのDeviceボタンからPull Fileをクリックしてください。

ファイルを削除するには、ツールバーでDeleteボタンを使ってください。


エミュレーターSDカードイメージを使うにはイメージを作成するためにmksdcardコマンドを使う必要があります。そして、エミュレーターをブートする時にイメージをマウントさせます。

例えば、以下のようにして/toolsディレクトリから実行します。

$ mksdcard 1024M ./img
$ emulator -sdcard ./img

エミュレーターが動作している間、DDMS File Explorerでsdcardディレクトリに読込み及び書込みを行うことができます。しかし、追加したファイルが、自動的には表示されないかもしれません。

例えば、MP3ファイルをsdcardに追加した時、エミュレーター再起動するまではメディアプレーヤーはそれらを認識しません。 (コマンドラインからエミュレーター再起動させる際、必ずもう一度sdcardをマウントさせるようにしてください。)


SDカードイメージの作成方法の詳細については、

Other Toolsを参照してください。

Screen Capture

f:id:bs-android:20090204001334p:image

メニューバーにある Device > Screen capture...を選択する、あるいは、CTRL-Sを押すことによって、デバイスまたはエミュレーターのスクリーン画像をキャプチャーすることができます。

Exploring Processes

f:id:bs-android:20090204001335p:image

メニューバーにある Device > Show process status...を選択すると、選択したVMの"ps -x"出力を見ることができます。

Cause a GC to Occur

f:id:bs-android:20090204001336p:image

ツールバーのゴミ箱ボタンを押すと、ガーベージコレクションを発生させることができます。

Running Dumpsys and Dumpstate on the Device (logcat)

f:id:bs-android:20090204001337p:image

・Dalvikからdumpsys(logcat)を実行させるには、メニューバーから Device > Run logcat...を選択してください。

・Dalvikからdumpstateを実行させるには、メニューバーで Device > Dump device state...を選択してください。

Examine Radio State(無線状態の検査)

デフォルトで、無線状態は標準のlogcatでは出力されません(多くの情報が出る為)。

無線情報を見るには、Device > Dump radio state...をクリックするか、Logging Radio Informationで記述されているように、logcatを実行してください。

Stop a Virtual Machine

Actions > Halt VM を選ぶと、バーチャルマシンを停止することができます。

このボタンを押すと、VMにSystem.exit(1) をコールするさせることになります。

Known issues with DDMS(DDMSの既知の問題)

DDMSには、以下の既知の制限があります:

デバッガーをつないで切断すると、ddmsはクライアントを落として再接続します。

するとVMデバッガが消えてしまったと認識してしまいます。これは、そのうちFIXされるでしょう。

PDF版はこちらです。

ひろひろ 2009/11/24 19:36 Google には「called the Dalvik Debug Monitor Server (DDMS)」とあるのですが、
「Dalvik Debug Monitor Service(DDMS)」としているのはなぜでしょうか?

ふじいふじい 2009/11/24 23:51 はじめまして。ブリリアントサービス 藤井と申します。

http://developer.android.com/intl/ja/guide/developing/tools/ddms.html

"Android ships with a debugging tool called the Dalvik Debug Monitor Server (DDMS)"の文のことでしょうか?
こちらを和訳しますと(ほぼ直訳ですみません)
「Androidは、the Dalvik Debug Monitor Server(DDMS)と呼ばれるデバッグツールと同梱で出荷される」
つまり、calledは、「通称、〜と呼ばれる」という意味だと思います。
答えになってなければ、すみません。。

ふじいふじい 2009/11/24 23:52 すみません。読み間違えました。
ServerとServiceの違いですね。
こちらの、転記ミスと思われます。担当者に問い合わせて、対応させて頂きます。

bs-androidbs-android 2009/11/25 00:13 SDK 1.6r1に付属のドキュメントを確認したところ、
当時はDalvik Debug Monitor Service(DDMS)で正しかったです。
SDK 2.0のドキュメントからひそかに名称が変わったようですね。

ひろひろ 2009/11/25 19:05 あーっと、もっとはっきりと書いておくべきでした…。申し訳ないです。
ご確認ありがとうございます。

ということは、これからのDDMSの名称はDalvik Debug Monitor Serverになるのかな。
古いドキュメントの入手方法が不明なのでいつごろ変更したのかわかりませんが…。

探してみると、古い表記らしきものが残っていました。

Tools Overview | Android Developers
http://developer.android.com/guide/developing/tools/index.html
> Dalvik Debug Monitor Service (ddms)

他にもいくつか残っていますね。
# s/Dalvik Debug Monitor Service (DDMS)/Dalvik Debug Monitor Server (DDMS)/g で置換したのかな?
# なんだかFirefoxの綴りのときみたいな感じで最終的にもうどうでもいいよってなりそう…