在日常开发中,我们管理View对象层次结构的方式可能会对的应用程序性能产生重大影响。 本文将介绍如何评估软件视图层次结构是否会减慢你的应用程序的运行速度,并且提供了解决可能出现的问题的一些策略。

布局和衡量绩效

渲染管线包括布局和度量阶段,在此阶段系统将相关项目适当地放置在你的视图层次结构中。这个阶段的度量部分决定了View对象的大小和边界。布局部分确定在屏幕上放置View对象的位置。

这两个流水线阶段都会导致他们处理的每个视图或布局的内存耗费成本很低。大多数情况下,这个成本是最小的,不会显着影响性能。但是,当应用程序添加或删除View对象时,可能会更大,例如RecyclerView对象回收它们或重新使用它们。如果View对象需要考虑调整大小来约束它的约束,成本也可以更高:例如,如果你的应用程序调用了包装文本SetText()的 View对象,则 View可能需要调整大小。

如果这样的情况花费太长时间,则可导致帧的系统超出允许的16ms内渲染,从而丢弃帧,并且动画变得非常复杂。

因为你无法将这些操作移动到工作线程 - 你的应用程序必须在主线程上处理这些操作 - 所以最好的方法是优化这些操作,以便尽可能缩短时间。

管理复杂性:布局很重要

Android 布局 允许你在视图层次结构中嵌套UI对象。这种嵌套也可能会增加布局成本。当你的应用程序处理一个布局对象时,应用程序也会在布局的所有子节点上执行相同的过程。对于复杂的布局,有时仅在系统首次计算布局时才会产生成本。例如,当你的应用程序在RecyclerView对象中回收复杂的列表项时 ,系统需要布置所有对象。在另一个例子中,微不足道的变化可以传播到父级,直到他们到达一个不影响父级大小变化的对象。

布局花费特别长时间的最常见情况是View对象的层次结构彼此嵌套。每个嵌套的布局对象都会增加布局阶段的成本。层次越平坦,布局阶段完成所需的时间越少。

Double Taxation

通常,框架一次执行布局 或度量阶段,并且很快。但是,在一些更复杂的布局情况下,框架可能需要多次遍历层次结构中需要多次传递才能最终定位元素的部分。不得不执行多个布局和度量迭代被称为double taxation。

例如,当你使用RelativeLayout允许你的View根据其他View对象的位置来定位对象的容器时,框架将执行以下操作:

执行布局和度量传递,在此期间,框架根据每个child的请求计算每个子对象的位置和大小。

使用这些数据,同时考虑对象权重,找出相关视图的正确位置。

执行第二个布局传递以完成对象的位置。

进入渲染过程的下一个阶段。

视图层次越多,潜在的性能损失就越大。除了RelativeLayout可能会导致Double Taxation的Containers以外。例如:

如果将LinearLayout视图设置为水平,视图可能会导致双重布局和度量传递。如果添加measureWithLargestChild,则在垂直方向上也可能发生双重布局和度量传递,在这种情况下,框架可能需要执行第二个传递来解析正确大小的对象。

该GridLayout 有一个类似的问题。虽然这个容器也允许相对定位,但是通常通过预处理子视图之间的位置关系来避免Double Taxation。但是,如果布局使用权重或填充 Gravity类,那么预处理的好处将会丢失,如果容器是一个RelativeLayout,框架可能必须执行多个过程。

多次布局和测量通行证本身不是一个性能负担。但如果他们在错误的地方,他们就会变成这样。你应该警惕以下情况之一适用于你的容器:

它是视图层次结构中的根元素。

它下面有一个深层次的视图层次结构。

它有很多填充屏幕的实例,类似于ListView对象中的child。

诊断视图层次结构问题

布局性能是一个复杂的问题,有许多方面。有几个工具可以为你提供有关性能问题发生位置的明确信息。其他一些工具提供的确切信息较少,但也可以提供有用的提示。

Systrace

提供有关性能的优秀数据的一个工具是内置于Android SDK中的Systrace。Systrace工具允许您收集和检查整个Android设备的计时信息,让您了解布局性能问题何时会导致性能问题。

Profile GPU rendering

最有可能为你提供有关性能瓶颈的具体信息的另一个工具是设备上的 配置文件GPU渲染工具,可以在由Android 6.0(API级别23)和更高版本支持的设备上使用。此工具允许您查看每个渲染帧的布局和度量阶段所花费的时间。这些数据可以帮助您诊断运行时性能问题,并帮助您确定需要解决的布局和度量问题。

在其捕获的数据的图形表示中,配置文件GPU渲染使用蓝色来表示布局时间。

Lint

Android Studio的Lint工具可以帮助您获得视图层次结构中效率低下的感觉。要使用此工具,请选择Analyze> Inspect Code,如图1所示。

在Android Studio中 查找Inspect代码.png

有关各种布局项目的信息显示在`` Android> Lint> Performance```下。要查看更多详细信息,可以单击每个项目将其展开,并在屏幕右侧的窗格中查看更多信息。图2显示了这种显示的一个例子。

图2.查看有关lint工具已识别的特定问题的信息.png

点击其中一个项目,在右侧窗格中显示与该项目相关的问题。

Layout Inspector

Android Studio的Layout Inspector工具提供了应用程序视图层次结构的可视化表示。这是浏览应用程序层次结构的好方法,让特定视图的父链的清晰可视化,并允许你检查应用程序构造的布局。Layout Inspector提出的观点也可以帮助识别双重征税带来的性能问题。它还可以为你提供一个简单的方法来识别嵌套布局的深度链,或嵌套child的大量布局区域,这是潜在的性能耗费问题的根原。在这些情况下,布局和度量阶段可能会耗费很多内存,导致性能问题。

解决视图层次问题

解决视图层次结构中出现的性能问题背后的基本概念比较简单,但是在实践中确实不太容易。防止视图层级施加性能惩罚包括flattening视图层次结构和减少double taxation的双重目标

删除多余的嵌套布局

开发人员经常使用比所需更多的嵌套布局。例如, RelativeLayout容器可能包含也是RelativeLayout容器的单个子布局 。这种嵌套意味着冗余,并为视图层次结构增加了不必要的耗费。

Lint可以经常为你解决这个问题,减少调试时间。

使用Merge/Include

冗余嵌套布局的一常见原因是标签。例如,你可以定义一个可重用的布局,如下所示:

然后用一个include标签将这个项目添加到父容器中:

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/app_bg"

android:gravity="center_horizontal">

android:layout_height="wrap_content"

android:text="@string/hello"

android:padding="10dp" />

...

其中,并没什么必要将第一布局嵌套在第二布局内。merge标签可以帮助防止此问题。

采用更轻量的布局

你可能无法调整现有的布局方案,使其不包含多余的布局。在某些情况下,唯一的解决方案可能是通过切换到完全不同的布局类型来使你的层次结构变平。

例如,你可能会发现一个TableLayout 提供了与具有多个位置依赖关系的更复杂布局相同的功能。在Android的N版本中, ConstraintLayout类提供了类似的功能RelativeLayout,但成本消耗却相当低。

android分层测试,Android视图层次和性能的检测(官方)相关推荐

  1. Android渗透测试Android渗透测试入门教程大学霸

    Android渗透测试Android渗透测试入门教程大学霸 第1章  Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...

  2. android 人品测试,Android单元测试环境搭建采坑记录

    添加依赖 android { defaultConfig { testInstrumentationRunner "android.support.test.runner.AndroidJU ...

  3. android psensor测试,android传感器Gsensor和Psensor的使用举例

    今天leader给的任务是这样的,做一个开机自启动的后台Service,实现对重力及距离的检测 当手机屏幕朝下时,让Psensor可用.否则不可用 实现代码如下: SensorFunctionServ ...

  4. android+噪音测试,Android技术开发之:噪音测试

    首先,看看核心Activity: import android.app.Activity; import android.media.AudioFormat; import android.media ...

  5. android gpu测试,Android下的性能测试

    ◆ Android平台下的性能测试 Android平台下Intel提供的是一个pre-btea版的4.2.2系统,还不是太稳定,不过可以跑测试,Intel表示在最终达到与Windows平台相等的性能之 ...

  6. android驱动测试,Android: 通过 cucumber 驱动 monkey 做稳定性测试

    主要内容 稳定性测试是什么 Monkey 介绍 自动化 Monkey 稳定性测试是什么 通过随机点击屏幕一段时间,看看 app 会不会奔溃,能不能维持正常运行. Monkey 介绍 Monkey 是一 ...

  7. android mtbf测试,Android Crash 问题分析以及解决

    Crash问题(Java与Native) 1.问题介绍 Crash问题,无论是java侧还是native侧,在日常测试中经常会遇到. Crash问题一般我们可以分为两类,一类是java侧的crash问 ...

  8. android平板 测试,Android平板电脑系统测试的设计与实施

    摘要: Android是一个基于Linux核心的开放手持平台作业操作系统.系统测试是整个测试过程中非常关键的一步,它是提高软件质量的焦点.如果在系统测试阶段没能发现足够多的缺陷,这些缺陷将会在验收测试 ...

  9. android ipv6测试,android ipv6网络下测试app运行状态测试

    这个问题我足足研究了两天,才有了一点思路,现在我把我的心路历程写下来,给大家分享下23. 1.什么是ipv6,自己百度 2,它和ipv4的区别,也是没啥用自己搜 3.app怎么适配ipv6. 首先访问 ...

最新文章

  1. angularjs和mysql_AngularJS SQL
  2. XMLHttpRequest Object
  3. 网站描述怎么写?对网站优化有什么作用?
  4. 第三次学JAVA再学不好就吃翔(part10)--基础语法之if语句
  5. 一天掌握Android JNI本地编程 快速入门
  6. neo4j 关系属性_Neo4j:特定关系与一般关系+属性
  7. LeetCode 1847. 最近的房间(排序离线计算 + 二分查找)
  8. 细说ReactiveCocoa的冷信号与热信号(一)
  9. hive 十六进制转十进制_hive 常用运算
  10. WIFI 网络操作--------------------笔记
  11. python config模块_用Python内置模块处理ini配置文件
  12. 武汉Apache Hadoop大数据平台,金融行业如何搭建大数据平台?数据采集、分析、处理如何实现?...
  13. Java Socket总结
  14. 设计趋势:网页之粗粝设计风格
  15. ansys与solidworks关联失败,将SolidWorks模型导入ansys划分网格总是提示错误
  16. 【优化求解】基于NSGAII算法求解含约束多目标优化问题matlab代码
  17. 伦敦交通局设置较低的速度限制
  18. 关于笔记本电脑修改显示器刷新频率后,重新开机时会自动修改为上一次的频率问题
  19. iOS App体验设计
  20. 虚拟机安装64位Orace_Linux

热门文章

  1. mysql数据存储7天_MySQL开启binlog并且保存7天有效数据
  2. 1个价值80亿美元的iPod
  3. 如何查询 ABAP 传输请求(Transport Request)和使用该请求修改了的程序的信息?
  4. SAP Spartacus select option默认选择的实现
  5. SAP Commerce(原Hybris)的订单处理框架和SAP CRM One Order框架
  6. 新浪微博和SAP CRM Interaction Center(呼叫中心)的集成
  7. SAP UI5应用Opportunity S5 formatter issue
  8. how is home button implemented in Fiori launchpad
  9. Jerry Wang的ABAP Development Tool培训材料 - SAP 引入ADT的初衷
  10. 在WebIDE里导入SAP Fiori应用