请牢记上述解释,下面我们来创建一个使用 LinearLayout 和 RelativeLayout 对象的传统布局层次结构。
▲
布局示例
假设我们想构建一个像上图那样的布局。如果您使用传统布局来构建,XML 文件会包含类似于下面这样的元素层次结构(在本例中,我们忽略属性):
尽管一般来说,这种类型的视图层次结构都有改进的空间,但您几乎必定还需要创建一个包含一些嵌套视图的层次结构。
如前所述,嵌套的层次结构会给性能造成负面影响。我们使用 Android Studio 的 Systrace 工具来看看嵌套视图对界面性能到底有何实际影响。我们通过编程方式针对每个 ViewGroup(ConstraintLayout 和 RelativeLayout)调用了测量和布局阶段并在执行测量和布局调用期间触发了 Systrace。以下命令可生成一个包含 20 秒间隔周期内发生的关键 Event 的概览文件,例如开销巨大的测量/布局阶段:
python $ANDROID_HOME/platform-tools/systrace/systrace.py --time=20 -o ~/trace.html gfx view res
有关如何使用 Systrace 的详细信息,请参阅使用 Systrace 分析界面性能指南:
https://developer.android.google.cn/studio/profile/systrace.html
Systrace 会自动突出显示此布局中的(大量)性能问题,并给出修复这些问题的建议。通过点击“Alerts”标签,您会发现,绘制此视图层次结构需要反复执行 80 次的测量和布局阶段,开销极为庞大!
触发开销如此庞大的测量和布局阶段当然很不理想,如此庞大的绘制 Activity 会导致用户能够觉察到丢帧的现象。我们可以得出这样的结论:这种嵌套式层次结构和 RelativeLayout(会对其每个子对象重复测量两次)的特性导致性能低下。
▲
观察 Systrace 针对使用 RelativeLayout 的布局版本发出的提醒
您可以在我们的 GitHub 代码库中查看我们用来执行这些测量的完整代码:
https://github.com/googlesamples/android-constraint-layout-performance