Android 调试日志

开发人员用于调试应用程序的一个非常常见的技巧是调用 Console.WriteLine。 但是,在移动平台(如 Android)上没有控制台。 Android 设备会提供日志,可以在编写应用时使用。 这有时称为“logcat”,原因在于为检索它而输入的命令。 使用“调试日志”工具,可查看记录的数据。

Android 调试日志概述

“调试日志”工具使你能够在通过 Visual Studio 调试应用时查看日志输出。 调试日志支持以下设备:

  • 物理 Android 手机、平板电脑和可穿戴设备。
  • 在 Android Emulator 上运行的 Android 虚拟设备。

注意

“调试日志”工具并不适用于 Xamarin Live Player。

“调试日志”不会显示在设备上独立运行应用时生成的日志消息(即,在从 Visual Studio 断开连接时)。

从 Visual Studio 访问调试日志

若要打开“设备日志”工具,单击工具栏上的“设备日志 (logcat)”图标:

Location of Device Log tool on the toolbar

或者,也可以从以下菜单选项之一启动“设备日志”工具:

  • “视图”>“其他窗口”>“设备日志”
  • “工具”>“Android”>“设备日志”

下面的屏幕截图演示了“调试工具”窗口的各个部分:

Parts of the Debug Tool window

  • 设备选择器 – 选择要监视哪些物理设备或运行的仿真器

  • 日志条目 – logcat 中的日志消息表。

  • 清除日志条目 – 清除表中所有当前日志条目。

  • 播放/暂停 – 在更新或暂停显示新日志条目之间切换

  • 停止 – 暂停显示新日志条目。

  • 搜索框 – 在此框中输入搜索字符串以筛选日志条目子集

当显示“调试日志”工具窗口时,使用设备下拉菜单来选择要监视的 Android 设备:

Location of Device Selector

在选择设备后,“设备日志”工具会从正在运行的应用中自动添加日志条目 – 这些日志条目显示在日志条目表中。 在设备之间切换将停止和启动设备日志记录。 请注意,在任何设备显示在设备选择器中之前,必须加载 Android 项目。 如果设备未显示在设备选择器中,请确认它在“启动”按钮旁边的 Visual Studio 设备下拉列表菜单中可用。

从命令行访问

另一种方法是通过命令行查看调试日志。 打开命令提示符窗口,并导航到 Android SDK 平台工具文件夹(通常情况下,SDK 平台工具文件夹位于 C:\Program Files (x86)\Android\android-sdk\platform-tools 中)。

如果仅连接了单个设备(物理设备或仿真器),则可以通过输入以下命令查看日志:

$ 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 的所有后续消息均来自同一进程。