Android Studio には Dalvik Debug Monitor Server (DDMS)と呼ばれるデバッグツールが含まれています。 このツールでは、ポートフォワーディングサービス、端末上での画面キャプチャ、端末上でのスレッドとヒープの情報、logcat、プロセスと無線の状態情報、着信コールとSMSスプーフィング、 位置情報スプーフィングなどが用意されています。 このページでは、 DDMS の機能について簡単に説明します。; 全ての機能と能力を網羅的に説明するわけではありません。
DDMS は Android Studioに組み込まれています。これを使うには、Android デバイスモニターを起動して、DDMS メニューボタンをクリックします。 DDMS はエミュレーターと接続された端末の両方で動作します。 エミュレーターと実機が両方が接続されて同時に動作している場合、DDMSは既定ではエミュレーターを使用します。
Androidでは、全てのアプリケーションは独自のプロセス上で動作し、各プロセスは独自の仮想マシン(VM)上で動作します。各 VM は、デバッガーが接続できる一意のポートを公開しています。
DDMS が起動した時、adbと接続します。
端末が接続された時、adb
とDDMSとの間でVM監視サービスが作成されます。これは、端末上のVMが開始したり終了したりした時にDDMS へ通知を行います。
VMが実行されると、
DDMS はadb
を介してVMのプロセスID(pid)を受け取り、端末上の adb デーモン(adbd)と介してVMのデバッガーとの接続を開きます。
これでDDMS は、カスタムワイヤープロトコルを使ってVM とやり取りできます。
DDMS は端末上の各 VM にデバッグポートを割り当てます。通常、DDMS は最初のデバッグ可能VMにポート8600 を割り当て、次のVMには8601を割り当てるといったような動きをします。 デバッガーがこれらのポートの1つと接続した時、関連するVMからの全てのトラフィックはこのデバッガーへ転送されます。 1つのデバッガーは1つのポートへのみ接続できますが、DDMS は接続された複数のデバッガーを制御できます。
既定では、DDMSは別のデバッグポートである DDMS "基底ポート" (既定では8700)の待ち受けもします。 基底ポートとはポート転送用ポートのことで、デバッグ用ポートからVMトラフィックを受け取ってポート 8700でデバッガーへ転送することができます。 これにより、ポート 8700に一つのデバッガーを接続して、端末上の全てのVMをデバッグすることができます。 転送されるトラフィックは、DDMSデバイスビュー上で選択した現在のプロセスによって決定されます。
以下のスクリーンショットは、典型的な DDMS の画面を示しています。コマンドラインから DDMS を起動している場合、画面は少し異なりますが機能面ではほとんど変わりません。
強調表示されているプロセスcom.android.systemui
は現在エミュレータ上で動作しており、デバッグポート8700と8601を割り当てられていることに注意してください。
これは、現在DDMSはポート8601を8700の静的デバッグポートに転送していることを示します。
コマンドラインを使用している場合、デバッガーを接続するための詳細については IDE をデバッグポートに接続する設定を行うを参照してください。
ヒント:File > Preferencesから、いくつかのDDM環境設定を設定できます。環境設定は$HOME/.android/ddms.cfg
に保存されます。
Dalvikでの既知のデバッグ問題
Dalvik VM でのアプリケーションのデバッグは、他のVMと同じ様に動作するはずです。
しかし、同期したコードからシングルステップアウトをした時、"現在の行"を示すカーソルがそのメソッドの最後の行にジャンプしてしまうことがあります。
以降の項目では、DDMS を使用する方法と、 DDMS GUIの一部である様々なタブとペインについて説明します。 Android Studio 版とコマンドライン版でUIに少し違いがありますが、機能は同じです。 DDMSの実行に関する詳細についてはこのページの前回の項目DDMSを実行するを参照してください。
DDMS を使うことで、プロセスが使用しているヒープメモリーの量を見ることができます。この情報は、アプリケーション実行時の特定の時点でのヒープ使用状況を追跡するのに便利です。
プロセスのヒープ使用状況を見るには:
DDMS では、メモリに割り当てられているオブジェクトを追跡したり、オブジェクトを割り当てるクラスやスレッドを確認したりする機能が実装されています。 これを使うことで、アプリケーションで特定のアクションを実行した時にオブジェクトがどこに割り当てられるかをリアルタイムに追跡できます。 この情報は、アプリケーションのパフォーマンスに影響を与える可能性のがるメモリ使用を評価する際に役立ちます。
オブジェクトのメモリ割り当てを追跡するには:
DDMS にはFile Explorerタブが実装されています。これを使うことで、端末上のファイルの閲覧やコピーや削除が行えます。 この機能は、アプリケーションによって作成されたファイルの調査や、端末との間でファイルを転送したい場合に役立ちます。
エミュレーターや端末のファイルシステムを操作するには:
DDMS のThreads タブでは、選択したプロセスで現在動作しているスレッドが表示されます。
メソッドプロファイリングを使って、呼び出し数や実行時間やメソッドの実行にかかった時間のような、メソッドに関する特定のメトリクスを追跡することができます。
プロファイリングデータが収集される場所をより細かく制御したい場合は、
startMethodTracing()
メソッドと
stopMethodTracing()
メソッドを使用してください。
トレースログ生成の詳細については、Profiling and Debugging UIsを参照してください。
DDMSでメソッドプロファイリングを開始する前に、以下の制限事項に注意してください。:
メソッドプロファイリングを開始するには:
Android 4.0では、DDMS (Dalvik Debug Monitor Server) に Detailed Network Usage タブが含まれており、アプリケーションがネットワークリクエストを作成したタイミングを追跡することができます。 このツールを使えば、アプリがデータの転送をいつどのように行うかを監視し、基礎コードを適切に最適化できます。 また、使用前にネットワークソケットへ“タグ”を適用することで、異なるタイプのトラフィックを区別することもできます。
図2出示すように、これらのタグはDDMS上ではスタックエリアチャート形式で表示されます。:
データ転送の頻度と各接続時に転送されたデータ量を監視することで、 バッテリー効率を上げることができるアプリケーション領域を特定できます。 一般的には、遅延が発生していたり、後から来た転送が優先されたりした可能性がある、グラフの乱高下を探します。
グラフ上で転送量が乱高下している原因をより明確にするために、TrafficStats
APIを使用します。
これを使うことでsetThreadStatsTag()
を実行しているスレッド内で発生したデータ転送にタグを付け、 tagSocket()
とuntagSocket()
を使って個別のソケットに手動でタグを付ける(もしくはタグを外す)ことができます。例:
TrafficStats.setThreadStatsTag(0xF00D); TrafficStats.tagSocket(outputSocket); // Transfer data using socket TrafficStats.untagSocket(outputSocket);
それ以外の方法として、プラットフォームに搭載されている URLConnection
APIが、 アクティブタグ (getThreadStatsTag()
で識別できる)に基づいて内部で自動的にソケットにタグ付けをします。
キープアライブ・プールを通してリサイクルされた時、これらのAPIはソケットにタグ付け/タグ解除を適切に行います。
以下の例では、setThreadStatsTag()
を使ってアクティブタグに 0xF00D
を設定しています。 アクティブタグは、スレッドごとに一つしか使用できません。
この値は、 getThreadStatsTag()
を実行した時に戻り値として返される値です。つまり、HTTP クライアントがソケットにタグを付ける際にはこの値を使用するのです。
以下のfinally
文では、clearThreadStatsTag()
を呼び出してタグをクリアしています。
TrafficStats.setThreadStatsTag(0xF00D); try { // Make network request using your http client. } finally { TrafficStats.clearThreadStatsTag(); }
ソケットのタグ付けは Android 4.0でもサポートされていますが、 リアルタイム統計情報はAndroid 4.0.3以降が動作している端末でのみ表示されます。
LogCat は DDMSに組み込まれています。
例外が投げられた時のスタックトレースといったようなシステムメッセージに加えて、Log
を使って出力できるメッセージも出力します。
メッセージをlogcatへ出力する詳細については、Log メッセージの読み込みと書き込みを参照してください。
ログ機能の設定をしたら、DDMS のLogCat 機能を使って、以下のボタンで特定のメッセージのフィルタを行えます:
また独自のカスタムフィルターを設定して、ログタグやログメッセージを生成したプロセスのIDを使ってメッセージをフィルタリングするなど、より詳細な指定も行えます。 add filterボタン、edit filterボタン、 delete filter ボタンを使うことで、カスタムフィルターを管理できます。
図1で表示されているEmulator Control タブはもうサポートされていません。 これの機能についてはAndroid エミュレーターを使用してください。