Skip to content

Most visited

Recently visited

navigation

アプリのデバッグ

Android Studio には、Android エミュレータ または接続されている Android 端末で実行されているアプリをデバッグすることができるデバッガーが含まれています。Android Studio のデバッガーを使用すると、次の操作を行うことができます。

デバッグを開始するには、ツールバーで [Debug] をクリックします。Android Studio は APK をビルドして、デバッグキーで APK に署名し、選択した端末に APK をインストールしてから APK を実行し、図 1 に示されている [Debug] ウィンドウを開きます。C および C++ コードをプロジェクトに追加する場合も、Android Studio は [Debug] ウィンドウで LLDB デバッガーを実行し、ネイティブ コードをデバッグできるようにします。

[Debug] をクリックした後、[Select Deployment Target] ウィンドウに端末が表示されない場合は、端末を接続するか、[Create New Emulator] をクリックして、Android エミュレータをセットアップする必要があります。

図 1. 現在のスレッドと変数のオブジェクト ツリーが表示されている [Debugger] ウィンドウ。

接続された端末またはエミュレータでアプリが既に実行されている場合、次の手順を実行してデバッグを開始することができます。

  1. [Attach debugger to Android process] をクリックします。
  2. [Choose Process] ダイアログで、デバッガーを接続するプロセスを選択します。

    デフォルトでは、デバッガーは、現在のプロジェクトの端末とアプリプロセスに加えて、接続されているハードウェア端末とコンピュータ上の仮想端末を表示します。[Show all processes] を選択すると、すべての端末のすべてのプロセスが表示されます。たとえば、アプリで作成したサービスやシステム プロセスなどが表示されます。

    [Debugger] メニューから、別のデバッグタイプを選択できます。デフォルトでは、Android Studio は、プロジェクトに Java または C/C++ コードが含まれているかどうかに応じて、Auto デバッグタイプを使用して最適なデバッガー オプションを選択します。

  3. [OK] をクリックします。

    [Debug] ウィンドウが表示されます。このとき、[Debug] ウィンドウのタイトルの右側に表示される 2 つのタブに注意してください。1 つのタブは、ネイティブ コードのデバッグ用であり、もう 1 つのタブは、[-java] と示されているように、Java コードのデバッグ用です。

    別のデバッグ セッションでは、別のタブと異なるポート番号(タブの丸かっこ内に表示される)が表示されます。

  4. デバッグ セッションを終了するには、セッションのタブをクリックしてから、[Terminate] をクリックします。

注: Android Studio のデバッガーとガベージ コレクタは緩く統合されてます。Android 仮想マシンでは、デバッガーが切断されるまで、デバッガーが認識しているオブジェクトに対してはガベージ コレクションが行われません。そのため、デバッガーが接続されていると、オブジェクトのビルドに時間がかかる場合があります。たとえば、デバッガーが実行中のスレッドを認識している場合、スレッドが終了した後も、関連付けられている Thread オブジェクトに対してガベージ コレクションが行われません。

デバッグタイプ

デフォルトでは、Android Studio は Auto デバッグタイプを使用して、使用するデバッガーを選択するため、Java と C/C++ コードのデバッグを切り替えるときに、設定を変更する必要はありません。ただし、シンボル ディレクトリや LLDB コマンドの追加など、特定の設定をカスタマイズするために、または別のデバッグタイプを使用するために、デバッグ設定を作成または編集することができます。実行中の Android プロセスにデバッガーを接続するときに、[Choose Process] ダイアログの [Debugger] プルダウン リストからデバッグタイプを選択することもできます。

次のようなデバッグタイプが使用できます。

Auto
Android Studio でデバッグするコードの最適なオプションを自動的に選択する場合、このタイプを選択します。たとえば、プロジェクトに C または C++ コードがある場合、Android Studio は Hybrid デバッグタイプを自動的に使用します。そうでない場合、Android Studio は Java デバッグタイプを使用します。
Java
Java で記述されているコードのみをデバッグする場合、このタイプを選択します。Java デバッガーはネイティブ コードに設定したブレークポイントやウオッチを無視します。
Native
LLDB のみを使用してコードをデバッグする場合、このタイプを選択します。このデバッグタイプを使用するときは、Java デバッガーのセッション ビューは利用できません。デフォルトでは、LLDB はネイティブ コードのみを検証し、Java コードのブレークポイントを無視します。Java コードをデバッグする場合は、Auto または Hybrid デバッグタイプに切り替える必要があります。
Hybrid
Java と ネイティブ コードのデバッグを切り替える場合、このタイプを選択します。Android Studio は Java デバッガーと LLDB の両方をアプリプロセスに接続するため(1 つは Java デバッガー用で、もう 1 つは、LLDB 用)、アプリを再起動したり、デバッグ設定を変更したりすることなく、Java とネイティブ コードの両方でブレークポイントをチェックすることができます。

注: Android Studio では、単一の LLDB プロセスを使用して Java と C/C++ の両方のブレークポイントをデバッグできる試験運用版の Java 対応 C++ デバッガー機能が提供されています。この機能はまだ開発段階ですが、Android Studio 2.2 以降でこの機能を試用することができます。詳細については、Android ツールのウェブサイトをご覧ください。

システムログの使用

アプリをデバッグしているとき、システムログにシステム メッセージが表示されます。これらのメッセージには、端末で実行中のアプリの情報が含まれています。アプリが開発段階にあるときに、システムログを使用してアプリをデバッグするには、コードでログメッセージを書き込み、例外のスタックトレースが出力されるようにする必要があります。

コードでログメッセージを書き込む

コードでログメッセージを書き込むには、Log クラスを使用します。ログメッセージを活用すると、アプリを操作しているときのシステムのデバッグ出力を収集して、実行フローを把握することができます。ログメッセージから、アプリの失敗した部分も知ることができます。ログの詳細については、ログの読み取りと書き込みをご覧ください。

次の例は、アクティビティを開始したときに以前の状態情報が利用できるかどうかを判定するために、ログメッセージを追加する方法を示しています。

import android.util.Log;
...
public class MyActivity extends Activity {
    private static final String TAG = MyActivity.class.getSimpleName();
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state");
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available");
            /* initialize app */
        }
    }
}

開発中に、コードで例外を検出し、スタックトレースをシステムログに書き込むことができます。

void someOtherMethod() {
    try {
        ...
    } catch (SomeException e) {
        Log.d(TAG, "someOtherMethod()", e);
    }
}

注: アプリを公開する準備ができたら、コードからデバッグ ログメッセージとスタックトレースの出力呼び出しを削除します。この操作は、DEBUG フラグを設定し、デバッグ ログメッセージを条件付きステートメント内に配置することにより実行できます。

システムログの表示

[Android DDMS](Dalvik Debug Monitor Server)ウィンドウと [Android Monitor] ウィンドウの両方に、システムおよび特定のアプリプロセスからのログが表示されます。[Android DDMS] ツール ウィンドウにシステムログを表示するには、次の手順を実行します。

  1. デバッグモードでアプリを実行するの説明に従ってアプリを起動します。
  2. [Android Monitor] をクリックします。
  3. [Logcat] ビューのシステムログが空の場合、[Restart] をクリックします。

図 2. [Android DDMS] ツール ウィンドウのシステムログ。

[Android DDMS] ツール ウィンドウでは、Android Studio からいくつかの DDMS 機能にアクセスできます。DDMS の詳細については、DDMS の使用をご覧ください。

システムログには、Android サービスやその他の Android アプリからのメッセージが表示されます。ログメッセージをフィルタリングして、必要なログメッセージのみを表示するには、[Android DDMS] ウィンドウのツールを使用します。

ブレークポイントの使用

Android Studio では、さまざまなデバッグ アクションをトリガーするいくつかのタイプのブレークポイントがサポートされています。最も一般的なタイプは、コードの指定された行でアプリの実行を一時停止する行のブレークポイントです。実行が一時停止しているときに変数や数式の値の確認し、1 行ずつ実行を続けることで、ランタイム エラーの原因を特定できます。

行のブレークポイントを追加するには、次の手順を実行します。

  1. 実行を一時停止するコードの行を特定してから、コードのその行の左ガターをクリックするか、行にキャレットを置いて、Control+F8(Mac の場合は Command+F8)を押します。
  2. アプリが既に実行されている場合は、アプリをアップデートしてブレークポイントを追加する必要はなく、[Attach debugger to Android proccess] をクリックするだけで済みます。そうでない場合は、[Debug] をクリックしてデバッグを開始します。

図 3. ブレークポイントを設定すると、行の横に赤いドットが表示されます。

コードがブレークポイントの位置まで実行されると、Android Studio はアプリの実行を一時停止します。その後、[Debugger] タブのツールを使用して、アプリの状態を特定することができます。

プロジェクトでネイティブ コードを使用している場合は、デフォルトで、Auto デバッグタイプにより、Java デバッガーと LLDB の両方が 2 つの別々のプロセスとしてアプリに接続されます。そのため、アプリを再起動したり、設定を変更したりすることなく、Java と C/C++ のブレークポイントの検証を切り替えることができます。

注: Android Studio で C または C++ コードのブレークポイントを検出するには、Auto、Native、Hybrid など、LLDB をサポートするデバッグタイプを使用する必要があります。デバッグ設定を編集することにより、Android Studio で使用するデバッグタイプを変更することができます。さまざまなデバッグタイプの詳細については、その他のデバッグタイプの使用に関するセクションをお読みください。

Android Studio がアプリをターゲット端末にデプロイすると、図 4 に示されているように、各デバッガー プロセスに対して、タブやデバッグ セッション ビューを備えた [Debug] ウィンドウが開きます。

図 4. LLDB を使用したネイティブ コードのデバッグ。

  1. Android Studio は、LLDB デバッガーが C/C++ コードのブレークポイントに到達すると、[<your-module>] タブに自動的に切り替えます。[Frames]、[Variables]、および [Watches] ペインも表示され、これらのペインは、Java コードのデバッグの場合と同じように動作します。LLDB セッション ビューでは [Threads] ペインが利用できませんが、[Frames] ペインのプルダウン リストを使用して、アプリプロセスにアクセスすることができます。これらのペインの詳細については、デバッグ ウィンドウ フレーム変数の検証に関するセクションをご覧ください。

    注: ネイティブ コードのブレークポイントを検証しているときに、Android システムは、アプリの Java バイトコードを実行している仮想マシンを一時停止します。つまり、ネイティブ コードのブレークポイントの検証中は、Java デバッガーを操作したり、Java デバッガー セッションから状態情報を取得したりすることができなくなります。

  2. Android Studio は、Java デバッガーが Java コードのブレークポイントに到達すると、[<your-module>-java] タブに自動的に切り替えます。
  3. LLDB でデバッグを実行しているときに、LLDB セッション ビューで LLDB ターミナルを使用して、コマンドライン オプションを LLDB に渡すことができます。

    ヒント: アプリのデバッグを開始するたびに LLDB で特定のコマンドを実行する必要がある場合、デバッガーをアプリプロセスに接続する直前、または接続した直後に、これらのコマンドをデバッグ設定に追加することができます。

C/C++ コードをデバッグしているときに、ウオッチポイントと呼ばれる特別なタイプのブレークポイントを設定できます。このブレークポイントにより、アプリがメモリの特定のブロックを使用しているときに、アプリプロセスを一時停止することができます。詳細については、ウオッチポイントの追加のセクションをご覧ください。

ブレークポイントの表示と設定

すべてのブレークポイントを表示して、ブレークポイントの設定をするには、[Debug] ウィンドウの左側にある [View Breakpoints] をクリックします。図 5 に示されているように、[Breakpoints] ウィンドウが表示されます。

図 5. 現在のすべてのブレークポイントと各ブレークポイントの動作設定が表示された [Breakpoints] ウィンドウ。

[Breakpoints] ウィンドウで、左側のリストから各ブレークポイントを有効または無効にすることができます。ブレークポイントが無効になっている場合、そのブレークポイントにヒットしても、Android Studio はアプリを一時停止しません。リストからブレークポイントを選択して、その設定を行います。最初にブレークポイントが無効になるように設定してから、別のブレークポイントにヒットした後、最初のブレークポイントを有効にすることができます。また、ブレークポイントにヒットした後、そのブレークポイントを無効にするかどうかを設定することもできます。例外のブレークポイントを設定するには、ブレークポイントのリストで [Exception Breakpoints] を選択します。

デバッグ ウィンドウ フレーム

[Debugger] ウィンドウの [Frames] ペインで、現在のブレークポイントにヒットした原因のスタック フレームを調べることができます。このペインでは、ナビゲートしてスタック フレームを調べることができるほか、Android アプリのスレッドのリストを検証できます。スレッドを選択するには、スレッド セレクターのプルダウン メニューを使用して、そのスタック フレームを表示します。フレームの要素をクリックすると、エディタでソースが開きます。また、ウィンドウ フレームのガイドで説明されているように、スレッドの表示をカスタマイズしたり、スタック フレームをエクスポートしたりできます。

変数の検証

[Debugger] ウィンドウでは、[Variables] ペインで、アプリがブレークポイントで停止したときに変数を検証したり、[Frames] ペインで、フレームを選択したりすることができます。[Variables] ペインでは、静的メソッドを使用してアドホック式を検証したり、選択したフレーム内で利用できる変数を調べたりできます。

[Watches] ペインに追加された式はデバッグ セッション間で保持されることを除いて、[Watches] ペインでも同様の機能が使用できます。頻繁にアクセスする変数やフィールド、または現在のデバッグ セッションに役立つ状態を提供する変数やフィールドの監視を追加する必要があります。[Variables] ペインと [Watches] ペインは図 5 のように表示されます。

[Watches] リストに変数または式を追加するには、次の手順を実行します。

  1. デバッグを開始します。
  2. [Watches] ペインで、[Add] をクリックします。
  3. 表示されたテキスト ボックスに監視する変数または式の名前を入力して、Enter キーを押します。

[Watches] リストからアイテムを削除するには、アイテムを選択して、[Remove] をクリックします。

アイテムを選択してから、[Up] または [Down] をクリックすると、[Watches] リストの要素を並べ替えることができます。

図 6. [Debugger] ウィンドウの [Variable] ペインと [Watches] ペイン。

ウオッチポイントの追加

C/C++ コードをデバッグしているときに、ウオッチポイントと呼ばれる特別なタイプのブレークポイントを設定できます。このブレークポイントにより、アプリがメモリの特定のブロックを使用しているときに、アプリプロセスを一時停止することができます。たとえば、メモリのブロックに 2 つのポインタを設定していて、そのブロックにウオッチポイントを割り当てている場合、いずれかのポインタを使用してメモリのそのブロックにアクセスすると、ウオッチポイントがトリガーされます。

Android Studio では、特定の変数を選択することにより、実行時にウオッチポイントを作成することができますが、LLDB は、システムによりその変数に割り当てられたメモリのブロックのみに(変数自体にではなく)ウオッチポイントを割り当てます。これは、変数を [Watches] ペインに追加することとは異なります。変数をこのペインに追加すると、変数の値を監視することができますが、システムによりメモリの値が読み取られるときや変更されるときにアプリプロセスを一時停止することはできません。

注: アプリプロセスが関数を終了し、システムがメモリからローカル変数の割り当てを解除したときは、これらの変数に対して作成したウオッチポイントを再度割り当てる必要があります。

ウオッチポイントを設定するには、次の要件を満たす必要があります。

上記の要件を満たしている場合は、次の手順を実行してウオッチポイントを追加できます。

  1. ブレークポイントでアプリが一時停止しているときに、LLDB セッション ビューで [Variables] に移動します。
  2. トラッキングするメモリのブロックを占有している変数を右クリックして、[Add Watchpoint] を選択します。図 7 に示されているように、ウオッチポイントを設定するためのダイアログが表示されます。

    図 7. メモリの変数にウオッチポイントを追加する。

  3. 次のオプションを使ってウオッチポイントを設定します。
    • Enabled: 当分の間、ウオッチポイントを無視するように Android Studio に指示する場合は、このオプションを選択解除します。Android Studio では引き続きウオッチポイントが保存されるため、以降のデバッグ セッションでウオッチポイントにアクセスすることができます。
    • Suspend: デフォルトでは、Android システムはウオッチポイントに割り当てられたメモリのブロックにアクセスするときに、アプリプロセスを一時停止します。この動作の実行を防止するには、このオプションを選択解除します。選択解除すると、システムがウオッチポイントを処理するときの動作をカスタマイズするための追加のオプションが表示されます。追加のオプションは、[Log message to console] と [Remove [the watchpoint] when hit] です。
    • Access Type: 変数に割り当てられたメモリのブロックに対してアプリが [Read] または [Write] を行うときに、アプリがウオッチポイントをトリガーするかどうかを選択します。読み取りまたは書き込みのいずれかでウオッチポイントをトリガーするには、[Any] を選択します。
  4. [Done] をクリックします。

すべてのウオッチポイントを表示して、ウオッチポイントの設定をするには、[Debug] ウィンドウの左側にある [View Breakpoints] をクリックします。図 8 に示されているように、[Breakpoints] ダイアログが表示されます。

図 8. [Breakpoints] ダイアログには現在のウオッチポイントと各ウオッチポイントの動作設定が表示されます。

ウオッチポイントを追加した後、[Debug] ウィンドウの左側にある [Resume Program] をクリックして、アプリプロセスを再開します。デフォルトでは、ウオッチポイントを設定したメモリのブロックにアプリがアクセスを試みると、Android システムはアプリプロセスを一時停止し、図 9 に示すように、アプリが最後に実行したコードの行の横にウオッチポイント アイコン()が表示されます。

図 9. Android Studio ではウオッチポイントがトリガーされる直前にアプリが実行したコードの行が示されます。

オブジェクト割り当てのトラッキング

Android Studio では、Java ヒープに割り当てられているオブジェクトをトラッキングして、これらのオブジェクトを割り当てたクラスやスレッドを確認することができます。これにより、一定の期間に割り当てられたオブジェクトのリストを表示することができます。この情報は、アプリのパフォーマンスに影響を及ぼす可能性のあるメモリ使用率の評価に役立ちます。

  1. デバッグモードでアプリを実行するの説明に従ってアプリを起動してから、[View] > [Tool Windows] > [Android Monitor] を選択します(または、ウィンドウ バーで [Android Monitor] をクリックします)。
  2. [Android Monitor] ウィンドウで、[Monitors] タブをクリックします。
  3. ウィンドウの上部で、プルダウン リストから端末とアプリプロセスを選択します。
  4. [Memory] パネルで、[Start Allocation Tracking] をクリックします。
  5. 端末でアプリを操作します。
  6. 同じボタンを再度クリックして、割り当てのトラッキングを終了します

Android Monitor には、アプリの [Memory]、[CPU]、[GPU]、および [Network] の使用率に関する情報が表示されます。Android Monitor を使用する方法の詳細については、Android Monitor の基本をご覧ください。Android Monitor の概要では、Android Monitor の機能が紹介されています。これらの機能には、ログカタログ(logcat)、パフォーマンスのモニタリング、データ分析ツール、画面と動画の撮影ツールなどが含まれます。

図 10. Android Studio でのオブジェクト割り当てのトラッキング。

リソース値の表示形式の表示と変更

デバッグモードでは、リソース値を表示して、さまざまな表示形式を選択することができます。[Variables] タブを表示して、フレームを選択し、次の手順を実行します。

  1. [Variables] リストで、リソースの行の任意の場所を右クリックして、プルダウン リストを表示します。
  2. プルダウン リストで、[View as] を選択して、使用する形式を選択します。

    使用できる形式は、選択したリソースのデータタイプによって異なります。次のようなオプションが 1 つ以上表示されます。

    • Class: クラスの定義を表示します。
    • toString: 文字列の形式を表示します。
    • Object: オブジェクト(クラスのインスタンス)の定義を表示します。
    • Array: 配列の形式を表示します。
    • Timestamp: yyyy-mm-dd hh:mm:ss の形式で日時を表示します。
    • Auto: Android Studio がデータタイプに基づいて最適な形式を選択します。
    • Binary: 0 と 1 を使用してバイナリ値を表示します。
    • MeasureSpec: 親から選択した子に渡される値です。MeasureSpec をご覧ください。
    • Hex: 16 進値として表示します。
    • Primitive: プリミティブ データタイプを使用して数値として表示します。
    • Integer: Integer 型の数値を表示します。

次の手順を実行して、カスタム形式(データタイプ レンダラ)を作成できます。

  1. リソース値を右クリックします。
  2. [View as] を選択します。
  3. [Create] を選択します。[Java Data Type Renderers] ダイアログが表示されます。
  4. Java Data Type Renderers の手順に従います。

アプリを最適化するためのランタイム メトリクスの分析

アプリでランタイム エラーが発生していない場合でも、アプリに問題がないとは限りません。次の問題についても考慮する必要があります。

Android Device Monitor は、Dalvik Debug Monitor Server(DDMS)など、Android アプリのいくつかのデバッグおよび分析ツール向けのグラフィック ユーザー インターフェースを備えたスタンドアロン ツールです。Android Device Monitor を使用して、メモリ使用率の分析、メソッドのプロファイリング、ネットワーク トラフィックの監視、電話の着信やメッセージの受信のシミュレーションを行うことができます。

Android Studio から Android Device Monitor を開くには、ツールバーで [Monitor] をクリックします。Android Device Monitor は新しいウィンドウで開きます。

Android Device Monitor と DDMS の詳細については、Device MonitorDDMS の使用を御覧ください。

スクリーンショットと動画の撮影

Android Studio では、アプリの実行中に端末画面のスクリーンショットや短い動画を撮影することができます。スクリーンショットと動画はアプリの宣伝用資料として有用です。また、開発チームに送信するバグレポートにスクリーンショットや動画を添付することもできます。

アプリのスクリーンショットを撮影するには、次の手順を実行します。

  1. デバッグモードでアプリを実行するの説明に従ってアプリを起動します。
  2. [Android Monitor] をクリックします。
  3. 左側にある [Screen Capture] をクリックします。
  4. 任意: スクリーンショットの周りに端末フレームを追加するには、[Frame screenshot] をクリックします。
  5. [Save] をクリックします。

アプリの動画を録画するには、次の手順を実行します。

  1. デバッグモードでアプリを実行するの説明に従ってアプリを起動します。
  2. [Android Monitor] をクリックします。
  3. 左側にある [Screen Record] をクリックします。
  4. [Start Recording] をクリックします。
  5. アプリを操作します。
  6. [Stop Recording] をクリックします。
  7. 録画した動画のファイル名を入力して、[OK] をクリックします。
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)