乐趣区

程序性能优化之布局检测与优化二下篇

阿里 P7 移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680
本篇文章将继续从以下两个内容来介绍布局检测与优化:

  • [HierarchyViewer]
  • [Layout Inspector]

一、Hierarchy Viewer 使用详解

1.1. 功能

Hierarchy Viewer 工具提供了一个可视化界面显示布局的层次结构,让我们可以进行调试,从而优化界面布局结构。

1.2. 启动工具

启动方式有两种,一种是通过终端命令,输入 hierarchyviewer,进行启动,第二种是通过打开 Android Device Monitor,添加 hierarchyviewer 视图。官网提示第一种方式已经过期,建议用第二种方式启动,不过并不影响使用,功能是一样的,只不过是将 hierarchyviewer 整合到了 Android Device Monitor 里面了而已

1.2.1 第一种方式:

 #### 1.2.2 第二种方式:

1.3. 设备连接

如果你是用的模拟器或者开发版手机的话则可以直接进行连接调试了,如果不是的话,官方提供了两种方式,进行连接真机调试:

1.3.1 通过第三方库,安装和配置 ViewServer, 也是目前我在使用的方式,工具地址:https://github.com/romainguy/…,配置步骤比较简单,主要分为如下三步:

1.3.1.1 添加依赖,外层 build.gradle 文件,添加工具远程仓库地址;内层 build.gradle 文件,添加依赖:

allprojects {
    repositories {jcenter()
        maven {url "https://jitpack.io"}
    }
}

dependencies {
    ...................................
    compile 'com.github.romainguy:ViewServer:017c01cd512cac3ec054d9eee05fc48c5a9d2de'
}

1.3.1.2 在 manifest 文件申请网络权限

  <uses-permission android:name="android.permission.INTERNET"/>

1.3.1.3 在应用中需要调试的 Activity 中添加如下代码,启动 ViewServer, 这样就可以与 hierarchy viewer 通信了:

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        // Set content view, etc.
        ViewServer.get(this).addWindow(this);
    }

    public void onDestroy() {super.onDestroy();
        ViewServer.get(this).removeWindow(this);
    }

    public void onResume() {super.onResume();
        ViewServer.get(this).setFocusedWindow(this);
    }

1.3. 2 第二种方式

通过设置环境变量,export ANDROID_HVPROTO=ddm,我用小米 note, 5.0 系统的手机,发现并无效果,简书上有童鞋用 Nexus 的手机时可以正常使用呢的,目前暂未找到原因。

1.4. 分析页面布局性能

1.4.1 选择一个节点,点击右上角的的按钮,就可以获取到布局绘制的时间,如图:

这里我们主要关注下面的三个圆圈,从左到右依次,代表 View 的 Measure, Layout 和 Draw 的性能,不同颜色代表不同的性能等级:

1)绿: 表示该 View 的此项性能比该 View Tree 中超过 50% 的 View 都要快;例如, 一个绿点的测量时间意味着这个视图的测量时间快于树中的视图对象的 50%。

2)黄: 表示该 View 的此项性能比该 View Tree 中超过 50% 的 View 都要慢;例如, 一个黄点布局意味着这种观点有较慢的布局时间超过 50% 的树视图对象。

3)红: 表示该 View 的此项性能是 View Tree 中最慢的;例如, 一个红点的绘制时间意味着花费时间最多的这一观点在树上画所有的视图对象。

1.4.2 测量结果分析

红色节点是代表应用性能慢的一个潜在问题,下面是几个例子,如何来分析和解释红点的出现原因?

1)如果在叶节点或者 ViewGroup 中,只有极少的子节点,这可能反映出一个问题,应用可能在设备上运行并不慢,但是你需要指导为什么这个节点是红色的,可以借助 Systrace 或者 Traceview 工具,获取更多额外的信息;

2)如果一个视图组里面有许多的子节点,并且测量阶段呈现为红色,则需要观察下子节点的绘制情况;

3)如果视图层级结构中的根视图,Messure 阶段为红色,Layout 阶段为红色,Draw 阶段为黄色,这个是比较常见的,因为这个节点是所有其它视图的父类;

4)如果视图结构中的一个叶子节点,有 20 个视图是红色的 Draw 阶段,这是有问题的,需要检查代码里面的 onDraw 方法,不应该在那里调用。

1.5. 布局常见问题与优化建议

1)没有用的父布局时指没有背景绘制或者没有大小限制的父布局,这样的布局不会对 UI 效果产生任何影响。我们可以把没有用的父布局,通过 <merge/> 标签合并来减少 UI 的层次;

2)使用线性布局 LinearLayout 排版导致 UI 层次变深,如果有这类问题,我们就使用相对布局 RelativeLayout 代替 LinearLayout, 减少 UI 的层次;

3)不常用的 UI 被设置成 GONE, 比如异常的错误页面,如果有这类问题,我们需要用 <ViewStub/> 标签,代替 GONE 提高 UI 性能。

二、Layout Inspector

2.1 打开布局检查器

    1. 在连接的设备或模拟器上运行您的应用。
    1. 点击 Tools > Android > Layout Inspector
    1. 在出现的 Choose Process 对话框中,选择您想要检查的应用进程,然后点击 OK

注意:如果设备上的布局发生变化,布局检查器不会更新。您必须再次点击 Tools > Android > Layout Inspector,创建一个新的快照。每一个快照都将保存到 project-name/captures/ 内一个单独的 .li 文件中。

2.2 调试区域介绍

打开布局检查器后,界面如下:

  • 1.View Tree:视图在布局中的层次结构。
  • 2.Screenshot:带每个视图可视边界的设备屏幕截图。
  • 3.Properties Table:选定视图的布局属性。

屏幕截图中也可以使用鼠标点击选中,但是当存在重叠视图时,在屏幕截图(上图第 2 部分)中是不能直接选中的。你需要在 View Tree 中右键点击前面的视图,然后取消选中 Show in preview,这样就能选中后面的视图了。

参考:
https://juejin.im/post/5c4e7f…
https://blog.csdn.net/swordgi…
阿里 P7 移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

结束语

希望读到这的您能 点赞和关注一下我,以后还会持续分享阿里 P7 移动互联网架构师进阶专题知识点及解析,您的支持就是我最大的动力!!

退出移动版