
1.6 运行和测试应用程序
如今,大量的设备使用Android系统,它们的形状和尺寸各异。作为开发者,我们希望能够用最少的代码,让应用程序适配尽可能多的设备和形状因子。幸运的是,Android平台非常适合这一挑战。我们能够轻松地调整布局,并且可以构建模拟器,适配一切我们能想到的形状因子。
Google提供了一个非常方便的基于云的应用程序测试工具——Firebase测试实验室。
显然,在任何测试环境中,模拟器都是重要的组成部分。但这并不意味着连接测试机测试应用程序不方便。使用自己的测试机,不仅比任何模拟器都快,而且正如我们接下来将要看到的,真机连接的配置非常简单。
1.6.1 连接到真机
真机除了比模拟器快,还能让我们在现实环境中测试应用程序。
将真机连接到我们的开发环境需要两个步骤。
(1)在手机上启用开发者选项。在某些型号的手机上,需要进入Settings|About phone(设置|关于手机),点击7次Build number(版本号),之后Developer options(开发者选项)会出现在设置中。使用此选项,可以启用USB debugging(USB调试)以及Allow mock locations(允许模拟位置)。
(2)现在,你应该可以通过USB或者Wi-Fi插件线将设备连接到工作站了。此时打开Android Studio,已经可以显示设备。如果没有显示设备,可能需要打开SDK Manager,通过Tools(工具)选项卡安装Google USB driver(Google USB驱动程序)。极少数情况下,需要从设备制造商网站下载USB驱动程序。
真机对于快速测试应用程序的功能变化是非常有用的,但是为了在开发过程中可以直观看到应用程序在不同形状、尺寸的屏幕上的显示效果,需要创建一些模拟器。
1.6.2 连接到模拟器
利用Android虚拟设备(AVD),开发者可以随意试验各种模拟的硬件设置,但众所周知,它们速度很慢,会耗尽许多计算机系统资源,而且缺乏真机中的许多特性。虽然模拟器有这些缺点,但它仍是Android开发者工具箱中的重要部分。通过考虑以下内容,可以减少许多阻碍。
❑ 拆解模拟器,使其只包含应用程序设计所需的特性。例如,如果应用程序中没有拍照功能,可以从模拟器中删除相机功能,以后随时可以添加回来。
❑ 尽量降低AVD的内存和存储需求。当应用程序有需要时,创建另一个设备非常容易。
❑ 只有需要测试特定的新特性时,才使用最新的API级别创建AVD。
❑ 先在具有低分辨率和低密度屏幕的模拟器上进行测试,这将使运行速度更快,并且仍能测试不同的屏幕尺寸和长宽比。
❑ 尝试拆分耗费资源的功能,并单独测试它们。例如,如果应用程序中使用了大量的高清图像集合,可以通过单独测试此功能来节省时间。
构建适合特定用途的模拟器通常比构建用于测试所有功能的通用模拟器要快,而且现在有越来越多的第三方Android模拟器可用,例如Android-x86和Genymotion,它们通常更快,并且具有更多的开发特性。
值得注意的是,当只测试布局时,Android Studio提供了一些强大的预览选项,可以让我们预览许多形状因子、SDK级别以及主题上的潜在UI效果,如图1-6所示。

图1-6
现在,创建一个基本的AVD来运行和测试当前项目。目前没有什么真正需要测试的东西,但是通过此操作,我们将看到如何在运行时监控应用程序的行为,以及如何在不使用设备屏幕的情况下使用调试监控器服务来测试输出(对于调试项目来说,这种方式不太吸引人)。
1.6.3 监控设备
下面的演示对模拟器和真机都有效,因此可以任选最适合你的设备。如果要创建AVD,无须大尺寸、高密度的屏幕以及大内存。
(1)打开我们刚做的项目。
(2)从Tools|Android(工具|Android)菜单中,选择Enable ADB Integration(启用ADB集成),如图1-7所示。

图1-7
(3)在同一个菜单中,选择Android Device Monitor,尽管它可能已经在运行了。
(4)现在,使用Android Device Monitor在连接的设备上运行应用程序。
Android Device Monitor在以下几个方面很有用。
❑ 可以在运行时使用Monitors(监视器)选项卡查看实时系统信息,例如应用程序占用的内存或CPU时间。当我们想要查看应用程序未在前台运行时所使用的资源,监视器尤其有用。
❑ 可以设置监视器来收集各种数据,例如方法跟踪和资源使用,这些数据会被存储为文件,可以在Captures(捕获)面板(通常可以在左侧边栏打开)中查看。
❑ 在Captures面板中,对应用程序进行截屏和录屏非常简单。
❑ LogCat是一个特别有用的工具,因为它不仅可以实时报告应用程序的行为,而且正如我们接下来将要看到的,它还可以生成用户定义的输出。
目前,使用文本视图(TextView)来测试工厂模式是一种便捷但笨拙的代码测试方法。一旦我们开始开发复杂的布局,这种方式就会变得非常不便。一个更优雅的解决方案是使用调试工具,这些工具可以在不影响UI的情况下进行查看。本练习剩余的部分将演示该如何做。
(1)打开MainActivity.java文件。
(2)声明如下常量。
private static final String DEBUG_TAG = "tag";
(3)同样,需要确认android.util.Log;的导入。
(4)用如下所示代码,替换onCreate()方法中用来设置文本视图文本的代码。
Log.d(DEBUG_TAG, bread);
(5)再次打开设备监视器,这可以用快捷键Alt+6操作。
(6)从监视器右上角的下拉列表中,选择Edit Filter Configuration(编辑过滤器配置)。
(7)填写触发的对话框,如图1-8所示。

图1-8
运行应用程序,测试工厂示例。在logcat监视器中应该会产生如下输出。
05-24 13:25:52.48417896-17896/? D/tag: Brioche 05-24 13:36:31.21417896-17896/? D/tag: Baguette 05-24 13:42:45.18017896-17896/? D/tag: Roll
当然,如果你愿意,依然可以使用System.out.println()方法将信息在ADB监视器中打印出来,但需要在所有输出中搜索它。
我们已经了解了如何在真机和模拟器上测试应用程序,以及如何在运行时使用调试和监视工具查询应用程序。下面可以切换到更贴近现实的情况——涉及多个工厂以及比双字字符串更复杂的输出。