Android のデバッグ ログ

開発者がアプリケーションのデバッグに使うとても一般的なトリックの 1 つは Console.WriteLine を呼び出すことです。 ただし、Android などのモバイル プラットフォームにコンソールはありません。 Android デバイスには、アプリの作成中に使用できるログがあります。 これは、ログの取得時に入力するコマンドから logcat と呼ばれることがあります。 ログに記録されたデータを表示するには、デバッグ ログ ツールを使います。

Android のデバッグ ログの概要

デバッグ ログ ツールを使うと、Visual Studio でアプリをデバッグしながらログ出力を見ることができます。 デバッグ ログは次のデバイスをサポートします。

  • 物理的な Android フォン、タブレット、ウェアラブル。
  • Android Emulator 上で動作する Android 仮想デバイス。

注意

デバッグ ログ ツールは、Xamarin Live Player では動きません。

デバッグ ログでは、デバイスのアプリがスタンドアロンで (つまり、Visual Studio から切断されて) 実行している間に生成されるログ メッセージは表示されません。

Visual Studio からデバッグ ログにアクセスする

デバイス ログ ツールを開くには、ツール バーの [デバイス ログ (logcat)] アイコンをクリックします。

ツール バーのデバイス ログ ツールの場所

または、次のいずれかのメニューを選んでデバイス ログ ツールを起動します。

  • その他の Windows > デバイス ログを表示>する
  • ツール > Android > デバイス ログ

次のスクリーンショットは、デバッグ ツール ウィンドウのさまざまな部分を示したものです。

[デバッグ ツール] ウィンドウの一部

  • デバイス セレクター – 監視する物理デバイスまたは実行中のエミュレーターを選択します。

  • ログ エントリ – logcat からのログ メッセージのテーブル。

  • [ログ エントリのクリア] – テーブルから現在のすべてのログ エントリをクリアします。

  • 再生/一時停止 – 新しいログ エントリの表示の更新または一時停止を切り替えます。

  • 停止 – 新しいログ エントリの表示を停止します。

  • [検索ボックス] – このボックスに検索文字列を入力して、ログ エントリのサブセットをフィルター処理します。

デバッグ ログ ツール ウィンドウが表示されているときは、デバイス プルダウン メニューを使って監視対象の Android デバイスを選びます。

デバイス セレクターの場所

デバイスを選択すると、 デバイス ログ ツールによって実行中のアプリからログ エントリが自動的に追加されます。これらのログ エントリはログ エントリのテーブルに表示されます。 デバイスを切り替えると、デバイスのログはいったん停止してから開始します。 デバイス セレクターにデバイスが表示されるためには、先に Android プロジェクトを読み込む必要があることに注意してください。 デバイスがデバイス セレクターに表示されない場合は、Visual Studio の [開始] ボタンの横にあるデバイス ドロップダウン メニューでデバイスが使用できることを確認します。

コマンド ラインからのアクセス

デバッグ ログを表示するには、コマンド ラインを使う方法もあります。 コマンド プロンプト ウィンドウを開き、Android SDK platform-tools フォルダーに移動します (通常、SDK platform-tools フォルダーは C:\Program Files (x86)\Android\android-sdk\platform-tools にあります)。

接続されているデバイス (物理デバイスまたはエミュレーター) が 1 つだけの場合は、次のコマンドを入力してログを表示できます。

$ adb logcat

複数のデバイスが接続されている場合は、デバイスを明示的に指定する必要があります。 たとえば、adb -d logcat では、接続されている物理デバイスのログのみが表示されます。また、adb -e logcat では、実行されているエミュレーターのログのみが表示されます。

その他のコマンドについては、「adb」と入力してヘルプ メッセージをご覧ください。

デバッグ ログへの書き込み

Android.Util.Log クラスのメソッドを使って、デバッグ ログにメッセージを書き込むことができます。 次に例を示します。

string tag = "myapp";

Log.Info (tag, "this is an info message");
Log.Warn (tag, "this is a warning message");
Log.Error (tag, "this is an error message");

これにより、次のような出力が生成されます。

I/myapp   (11103): this is an info message
W/myapp   (11103): this is a warning message
E/myapp   (11103): this is an error message

を使用 Console.WriteLine して デバッグ ログ に書き込むこともできます。これらのメッセージは、出力形式が若干異なる logcat に表示されます (この手法は、Android で Xamarin.Forms アプリをデバッグする場合に特に便利です)。

System.Console.WriteLine ("DEBUG - Button Clicked!");

これにより、logcat に次のような出力が生成されます。

Info (19543) / mono-stdout: DEBUG - Button Clicked!

興味深いメッセージ

ログを読むとき (特に、ログ スニペットを他のユーザーに提供するとき)、ログ ファイル全体を熟読するのは面倒なことががよくあります。 ログ メッセージに目を通しやすくするには、最初に次のようなログ エントリを探します。

I/ActivityManager(12944): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=GcTest.GcTest/gctest.Activity1 } from pid 24175

具体的には、アプリケーション パッケージの名前も含まれている正規表現に一致する行を探します。

^I.*ActivityManager.*Starting: Intent

これは、アクティビティの開始に対応する行であり、次のメッセージのほとんど (ただしすべてではありません) がアプリケーションと関連しています。

すべてのメッセージには、メッセージを生成するプロセスのプロセス識別子 (pid) が含まれていることに注意してください。 上記の ActivityManager メッセージでは、プロセス 12944 からメッセージを生成しました。 デバッグ対象のアプリケーションのプロセスを判断するには、mono.MonoRuntimeProvider メッセージを探します。

I/ActivityThread(  602): Pub TouchTest.TouchTest.__mono_init__: mono.MonoRuntimeProvider

このメッセージは、開始されたプロセスからのものです。 この PID を含む後続のメッセージはすべて、同じプロセスから生成されたものです。