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 を含む後続のメッセージはすべて、同じプロセスから生成されたものです。