サイトのトップへ戻る

Android Studio ドキュメント 日本語訳

サイト内検索

DDMSを使用する

Android Studio には Dalvik Debug Monitor Server (DDMS)と呼ばれるデバッグツールが含まれています。 このツールでは、ポートフォワーディングサービス、端末上での画面キャプチャ、端末上でのスレッドとヒープの情報、logcat、プロセスと無線の状態情報、着信コールとSMSスプーフィング、 位置情報スプーフィングなどが用意されています。 このページでは、 DDMS の機能について簡単に説明します。; 全ての機能と能力を網羅的に説明するわけではありません。



DDMSを実行する

DDMS は Android Studioに組み込まれています。これを使うには、Android デバイスモニターを起動して、DDMS メニューボタンをクリックします。 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の静的デバッグポートに転送していることを示します。

図 1.DDMSのスクリーンショット

コマンドラインを使用している場合、デバッガーを接続するための詳細については IDE をデバッグポートに接続する設定を行うを参照してください。

ヒント:File > Preferencesから、いくつかのDDM環境設定を設定できます。環境設定は$HOME/.android/ddms.cfgに保存されます。

Dalvikでの既知のデバッグ問題
Dalvik VM でのアプリケーションのデバッグは、他のVMと同じ様に動作するはずです。 しかし、同期したコードからシングルステップアウトをした時、"現在の行"を示すカーソルがそのメソッドの最後の行にジャンプしてしまうことがあります。



DDMSを使用する

以降の項目では、DDMS を使用する方法と、 DDMS GUIの一部である様々なタブとペインについて説明します。 Android Studio 版とコマンドライン版でUIに少し違いがありますが、機能は同じです。 DDMSの実行に関する詳細についてはこのページの前回の項目DDMSを実行するを参照してください。



プロセスのヒープ使用状況を見る

DDMS を使うことで、プロセスが使用しているヒープメモリーの量を見ることができます。この情報は、アプリケーション実行時の特定の時点でのヒープ使用状況を追跡するのに便利です。

プロセスのヒープ使用状況を見るには:

  1. Devices タブで、ヒープ情報を表示したいプロセスを選びます。
  2. Update Heap ボタンをクリックして、そのプロセスのヒープ情報を有効にします。
  3. Heap タブで、Cause GC をクリックしてガベージコレクションを実行します。これでヒープデータの収集が有効になります。 操作が完了すると、オブジェクトタイプのグループと各タイプに割り当てられたメモリーが表示されます。 再度Cause GC をクリックしてデータを更新することができます。
  4. オブジェクトタイプをクリックすると、特定のメモリサイズ(バイト単位)に割り当てられたオブジェクトの数が表示されます。


オブジェクトのメモリ割り当てを追跡する

DDMS では、メモリに割り当てられているオブジェクトを追跡したり、オブジェクトを割り当てるクラスやスレッドを確認したりする機能が実装されています。 これを使うことで、アプリケーションで特定のアクションを実行した時にオブジェクトがどこに割り当てられるかをリアルタイムに追跡できます。 この情報は、アプリケーションのパフォーマンスに影響を与える可能性のがるメモリ使用を評価する際に役立ちます。

オブジェクトのメモリ割り当てを追跡するには:

  1. Devices タブで、 割り当てトラッキングを有効にしたいプロセスを選びます。
  2. Allocation Tracker タブで、Start Tracking ボタンをクリックして割り当てトラッキングを開始します。これで、アプリケーション上で行う全ての操作はトラッキングされます。
  3. Click Get Allocations をクリックして、Start Tracking ボタンをクリックして以降に割り当てられたオブジェクトの一覧を表示します。 再度 Get Allocations をクリックして新たに割り当てられたオブジェクトを一覧に追加できます。
  4. トラッキングを停止したり、データをクリアして最初からやり直したりするには、 Stop Trackingボタンをクリックします。
  5. 一覧内の特定の行をクリックすると、オブジェクトを割り当てたコードのメソッドや行番号といった詳細情報を表示できます。


エミュレーターや端末のファイルを操作する

DDMS にはFile Explorerタブが実装されています。これを使うことで、端末上のファイルの閲覧やコピーや削除が行えます。 この機能は、アプリケーションによって作成されたファイルの調査や、端末との間でファイルを転送したい場合に役立ちます。

エミュレーターや端末のファイルシステムを操作するには:

  1. Devices タブで、ファイルシステムを見たいエミュレーターを選んでください。
  2. 端末からファイルをコピーするには、ファイルエクスプローラーでファイルを検索し、Pull file ボタンをクリックします。
  3. 端末へファイルをコピーするには、File Explorer タブで Push file ボタンをクリックします。


スレッド情報を調査する

DDMS のThreads タブでは、選択したプロセスで現在動作しているスレッドが表示されます。

  1. Devices タブで、スレッドを調査したいプロセスを選んでください。
  2. Update Threads ボタンをクリックします。
  3. Threadsタブで、選択したプロセスのスレッド情報を見ることができます。


メソッドプロファイリングを開始する

メソッドプロファイリングを使って、呼び出し数や実行時間やメソッドの実行にかかった時間のような、メソッドに関する特定のメトリクスを追跡することができます。 プロファイリングデータが収集される場所をより細かく制御したい場合は、 startMethodTracing()メソッドと stopMethodTracing() メソッドを使用してください。 トレースログ生成の詳細については、Profiling and Debugging UIsを参照してください。

DDMSでメソッドプロファイリングを開始する前に、以下の制限事項に注意してください。:

  • Android 2.1 以前の端末ではSDカードを入れる必要があり、アプリケーションにSDカードへの書き込み権限を付与しなければなりません。
  • Android 2.2 以降の端末ではSD カードは必要ありません。トレースログファイルは開発機へ直接出力されます。

メソッドプロファイリングを開始するには:

  1. Devices タブで、メソッドプロファイリングを有効にしたいプロセスを選びます。
  2. Start Method Profiling ボタンをクリックします。
  3. Android 4.4 以降では、トレースベースのプロファイリングか、指定したサンプリングインターバルを使ったサンプルベースのプロファイリングのうちいずれかを選びます。それより前のバージョンの Androidではトレースベースのプロファイリングのみ使用できます。
  4. アプリケーションを操作して、プロファイルしたいメソッドを実行させます。
  5. Stop Method Profiling ボタンをクリックします。 DDMS はアプリケーションのプロファイリングを停止して、 Traceviewを開いて Start Method ProfilingをクリックしてからStop Method Profilingをクリックするまでの間に収集したメソッドプロファイリング情報を表示します。


ネットワークトラフィックツールを使用する

Android 4.0では、DDMS (Dalvik Debug Monitor Server) に Detailed Network Usage タブが含まれており、アプリケーションがネットワークリクエストを作成したタイミングを追跡することができます。 このツールを使えば、アプリがデータの転送をいつどのように行うかを監視し、基礎コードを適切に最適化できます。 また、使用前にネットワークソケットへ“タグ”を適用することで、異なるタイプのトラフィックを区別することもできます。

図2出示すように、これらのタグはDDMS上ではスタックエリアチャート形式で表示されます。:

図 2. Network Usage タブ。

データ転送の頻度と各接続時に転送されたデータ量を監視することで、 バッテリー効率を上げることができるアプリケーション領域を特定できます。 一般的には、遅延が発生していたり、後から来た転送が優先されたりした可能性がある、グラフの乱高下を探します。

グラフ上で転送量が乱高下している原因をより明確にするために、TrafficStatsAPIを使用します。 これを使うことで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を使用する

LogCat は DDMSに組み込まれています。 例外が投げられた時のスタックトレースといったようなシステムメッセージに加えて、Logを使って出力できるメッセージも出力します。 メッセージをlogcatへ出力する詳細については、Log メッセージの読み込みと書き込みを参照してください。

ログ機能の設定をしたら、DDMS のLogCat 機能を使って、以下のボタンで特定のメッセージのフィルタを行えます:

  • Verbose
  • Debug
  • Info
  • Warn
  • Error

また独自のカスタムフィルターを設定して、ログタグやログメッセージを生成したプロセスのIDを使ってメッセージをフィルタリングするなど、より詳細な指定も行えます。 add filterボタン、edit filterボタン、 delete filter ボタンを使うことで、カスタムフィルターを管理できます。



携帯での操作と位置情報をエミュレートする

図1で表示されているEmulator Control タブはもうサポートされていません。 これの機能についてはAndroid エミュレーターを使用してください。