Android SDK提供了一些工具可以帮助理解视图树的行为。其中第一个工具最近被称为layoutopt——而很多已经集成到新的名为Lint的工具中。layoutopt是个命令行工具,而Lint不但可以用于命令行,而更常见的方式是在Eclipse中使用。Lint工具会对组成应用布局的XML文件做一些即时检查。
任何在Android系统上做了一段时间开发的开发人员都经常受到以下的困扰:某个XML资源文件(布局文件或菜单文件)在语义上是正确的,但是它包含一些语法错误。如果处理res目录的aapt工具无法构建gen目录,该项目中会有一半的文件无法编译(因为缺失R类)。如果你使用Eclipse开发,整个项目就会显示一片红,到处都是错误——但就是找不到真正的错误原因。幸运的是,Lint工具可以帮助定位这类问题。
此外,Lint还可用于识别项目资源中的潜在问题。它会做合理性检查,查看Android开发工具每次的发布版本。在Eclipse中,只要资源文件发生了变化,就会触发Lint工具运行,Lint发现的问题既会作为标准的Eclipse告警信息显示,也会在Lint告警窗口显示。
有时Lint还会识别出你都没有意识到的问题。它有时会研究如何进行重构来解决问题。Lint工具还在不断的开发测试中,虽然有时会出现误报,但是它也会高亮显示潜在的问题。理解问题本质并验证该问题确实无关紧要,但这个过程是非常必要的。
Lint是通过查看源代码进行分析的静态分析器,因此,它发现问题无法面面俱到。比如,Lint无法查看动态添加到视图中的widget。幸运的是,Android工具箱还提供了分析正在运行的应用的实际视图树工具:Hierarchy Viewer。Hierarchy Viewer工具提供不同的模式,支持不同的功能。虽然之前Eclipse整合了Hierarchy Viewer的部分功能,在最新版本中这些视图已经无法工作。Hierarchy Viewer必须通过命令行执行。它在SDK文件夹工具中,最适合在Android版本9或更新的操作系统中使用。
Hierarchy Viewer类似一个调试器,可以分析正在运行的应用。为了正常工作,它必须能够找到连上网络的设备或模拟器。当Hierarchy Viewer连接到正在运行的设备上,在最上方的按钮会提供下载视图层次(view hierarchy)的工具。按下该按钮,屏幕显示如图6-9所示。
图6-9:Action按钮
视图层次窗口显示了很多信息,工具箱文档较详细地描述了其使用方式。但是,其最重要的功能是可以马上查看整棵视图树。
正如你将在第8章所见到的,视图树越深,绘制视图树的代价就会呈爆炸式增长。对应用进行优化的一个方面就是使视图树尽量扁平化。从图6-9可以看出一个窗口的视图树结构有多深,并确定如何减少该树的深度。
渲染包含三个阶段:测量(measure)、布局(layout)和绘制(draw),三种颜色的小圆点可以体现出每个阶段视图执行所花的时间。绿色圆点表示其时间小于该窗口视图的平均执行时间;黄色圆点表示视图执行时间大于该窗口视图的平均执行时间;而红色圆点表示整棵树中执行时间最长的视图。这种对视图树的粗略比较可以很明显地指出绘制阶段存在的问题,可以帮助定位问题所在。
本章介绍了Android控制器接口整体上是如何工作的,及操作其基础组件所需的工具:窗口、视图和事件。以下几章会运用这些概念,并进一步描述如何构建你自己的用户界面。