Android のデバッグ ログ
開発者がアプリケーションのデバッグに使うとても一般的なトリックの 1 つは Console.WriteLine
を呼び出すことです。 ただし、Android などのモバイル プラットフォームにコンソールはありません。 Android デバイスには、アプリの作成中に使用できるログがあります。 これは、ログの取得時に入力するコマンドから logcat と呼ばれることがあります。 ログに記録されたデータを表示するには、デバッグ ログ ツールを使います。
Android のデバッグ ログの概要
デバッグ ログ ツールを使うと、Visual Studio でアプリをデバッグしながらログ出力を見ることができます。 デバッグ ログは次のデバイスをサポートします。
- 物理的な Android フォン、タブレット、ウェアラブル。
- Android Emulator 上で動作する Android 仮想デバイス。
Note
デバッグ ログ ツールは、Xamarin Live Player では動きません。
デバッグ ログでは、デバイスのアプリがスタンドアロンで (つまり、Visual Studio から切断されて) 実行している間に生成されるログ メッセージは表示されません。
Visual Studio からデバッグ ログにアクセスする
デバイス ログ ツールを開くには、ツール バーの [デバイス ログ (logcat)] アイコンをクリックします。
または、次のいずれかのメニューを選んでデバイス ログ ツールを起動します。
- [ビュー] > [その他のウィンドウ] > [デバイス ログ]
- [ツール] > [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 を含む後続のメッセージはすべて、同じプロセスから生成されたものです。