首页 > 其他分享 >布局性能优化:安卓开发者不可错过的性能优化技巧

布局性能优化:安卓开发者不可错过的性能优化技巧

时间:2023-06-19 12:34:05浏览次数:39  
标签:性能 布局 应用程序 视图 Android 优化 安卓 内存


今天总结一下布局的性能优化,这是一个系列,上一篇是# 内存泄漏大集结:安卓开发者不可错过的性能优化技巧 也可以看性能优化专栏里的记录,都是非常好的开发经验。

当我们开发Android应用时,布局性能优化是一个必不可少的过程。一个高效的布局能够提高用户体验,使应用更加流畅、响应更加迅速,而低效的布局则会导致应用的运行变得缓慢,甚至出现卡顿、崩溃等问题,影响用户体验。在开发中,布局优化不仅需要考虑到UI设计的美观性和易用性,还需要关注布局的性能,避免出现因视图过多、嵌套过深、图片过大等问题导致的性能瓶颈。通过对布局进行优化,可以显著提高应用的性能和用户体验,减少应用的CPU和内存占用,加快应用的启动和响应速度,降低应用的耗电量,从而提高应用的稳定性和可靠性。

布局性能优化对于提高Android应用的质量和竞争力是至关重要的。在实际开发中,我们需要根据具体的业务场景和设计要求,结合布局优化的最佳实践,逐步提升应用的布局性能,为用户带来更好的体验。

布局为什么会有性能问题呢

那需要了解一下Android View的渲染机制,Android渲染机制是指Android系统中用于显示界面的工作流程。它包括视图树的构建、测量、布局和绘制四个过程。

他们的大致流程是

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dh6EUepD-1677326378034)(https://upload-images.jianshu.io/upload_images/28852436-df2083f1bf6fc345.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

  1. 构建视图树(View Hierarchy):在应用启动时,Android系统会根据布局文件中定义的View、ViewGroup和其他组件创建一个视图树。视图树是根据xml进行解析的。
  2. 测量(Measure):在测量过程中,系统会遍历视图树,并计算每个视图的大小和位置
  3. 布局(Layout):在布局过程中,系统会根据视图树中每个视图的测量结果,确定每个视图的大小和位置,并将其放置在正确的位置上
  4. 绘制(Draw):在绘制过程中,系统会遍历视图树,并将每个视图绘制到屏幕上

在这几个过程中,布局过程是比较耗费时间的,并且耗时与视图树的复杂程度成正比。

复杂的布局指的是树关系的复杂,而不是元素的复杂。

不一样的角度

从系统角度分析,Android系统的UI界面是基于视图层次结构(View Hierarchy)构建的,每个UI元素都是View或ViewGroup对象的实例,这些对象按照它们在界面中出现的顺序排列,构成了一个视图层次结构。在这个结构中,每个UI元素都有自己的父元素和子元素,因此构成了一个树形结构。这个树形结构的根节点是一个ViewGroup对象,它是整个视图层次结构的根。

当用户进行交互操作时,Android系统需要对视图层次结构进行更新,例如重新布局、重绘等操作,这些操作会消耗大量的CPU和内存资源。因此,视图层次结构的构建对应用程序的性能和响应速度至关重要。

常见布局解析,用对了,你的性能问题会减少很多

我们从开始学习Android就知道五大布局是Android的布局基础,大家还记得他们的优缺点吗?之所以有五大布局,就是因为他们使用场景各不相同,然而有时候写法就是上来就相对,别的不考虑,这正确吗?

这是一个对比表格,加颜色的,年龄小的程序员可能都不知道。

布局性能优化:安卓开发者不可错过的性能优化技巧_布局容器

通过这个对比,你会发现,每一个布局都有它的用途,要是用对了,在性能方面都有提升。也不是说用约束布局一撸到底,在有些专场的场景中,对应的布局更加优于约束布局。

回顾完之后,我们看看开发中还有哪些影响性能的写法。

常见的开发中有损布局性能的操作方式

嵌套层数过多

当一个布局容器包含多个子布局容器时,会导致视图层次结构的深度增加,从而增加了CPU和内存资源的消耗

<LinearLayout
   >
    <RelativeLayout
        >

    </RelativeLayout>
    <LinearLayout
        >

    </LinearLayout>
</LinearLayout>

内存使用过高

当一个布局容器包含大量的子视图时,会导致内存占用过高,从而影响应用程序的性能

<RelativeLayout
    >
    <ImageView
         />
    <ImageView
        />
    <ImageView
        />

</RelativeLayout>

不合适的布局容器

在布局中选择合适的布局容器可以避免不必要的布局操作和内存消耗(当需要显示大量的数据列表时,使用ListView或RecyclerView等容器可以避免不必要的视图更新和内存消耗)

过多的重绘操作

当一个布局容器中包含多个视图时,每次修改其中一个视图的属性,都会导致整个布局容器的重绘操作

可以使用ViewStub元素来延迟加载复杂的视图。

不合理的布局属性

在布局中选择合适的布局属性可以避免不必要的视图更新和内存消耗

在使用RelativeLayout布局容器时,它的测量和布局都需要参考父、兄等原则,所以需要考虑到视图的相对位置和大小,以避免不必要的布局操作和内存消耗。

使用无效的布局容器

在布局中使用无效的布局容器会增加不必要的布局操作和内存消耗,影响应用程序的性能和响应速度

<TableLayout
    >
    <TableRow
        >
        <TextView
             />
        <TextView
             />
    </TableRow>
    <TableRow
        >
        <TextView
             />
        <TextView
             />
    </TableRow>
</TableLayout>

这种操作在开发中还是比较常见的,有时候为了给Text View或者ImageView 添加点击区域,外边搞一个FragmeLayout。这种操作会导致内存消耗过高的。

常见的检测布局性能工具

  1. Hierarchy Viewer工具:Hierarchy Viewer工具可以帮助开发者分析应用程序的视图层次结构,找出可能存在的性能问题。在Hierarchy Viewer中,可以查看应用程序的视图层次结构,以及每个视图的绘制时间、测量时间和布局时间等性能指标。
  2. TraceView工具:TraceView工具可以帮助开发者分析应用程序的性能问题,包括布局性能问题。在TraceView中,可以查看应用程序的方法调用链和执行时间等信息,以及每个方法的CPU使用率、内存消耗等性能指标。
  3. UI性能分析器:Android Studio中内置了UI性能分析器,可以帮助开发者分析应用程序的UI性能问题,包括布局性能问题。在UI性能分析器中,可以查看应用程序的渲染时间、FPS、布局时间等性能指标,并根据性能指标分析应用程序的性能问题。
  4. Monkey测试工具:Monkey测试工具可以帮助开发者测试应用程序的稳定性和性能问题,包括布局性能问题。在Monkey测试中,可以模拟用户随机点击和滑动操作,以测试应用程序的稳定性和响应速度,同时可以通过TraceView等工具分析应用程序的性能问题。(提前做好监测的买点,trace收集,然后用monkey测试,最后分析trace)

总结

1.减少布局层次

布局层次越深,绘制所需的时间就越长,因此应该尽可能减少布局层次。可以通过使用 ConstraintLayout 或者自定义 View 来减少布局层次。

2.使用合适的布局容器

应该选择最适合当前布局需求的布局容器,避免使用过于复杂的布局容器,比如 LinearLayout 嵌套多层、RelativeLayout 的多重嵌套等。

3.使用 ViewStub 来延迟加载视图

如果布局中包含复杂的视图,可以考虑使用 ViewStub 来延迟加载这些视图,以减少布局的加载时间。

4.避免使用过多的嵌套布局

嵌套布局会增加布局的复杂度,导致渲染时间变长。因此应该尽量避免过多的嵌套布局。

5.使用合适的布局属性

合理使用布局属性可以让布局更加简洁、高效,比如使用 match_parent 和 wrap_content 来替代具体的像素值。

6.避免在布局文件中使用过多的 include 标签

include 标签可以重复使用布局,但是过多的使用会增加布局层次和渲染时间,因此应该尽量避免在布局文件中使用过多的 include 标签

主要是要弄明白布局的使用场景,从这几个坑出发,写代码的时候上点心。

另外学习约束布局有一个很好的博客推荐大家# 万字长文 - 史上最全ConstraintLayout(约束布局)使用详解

作者:狼窝山下的青年

标签:性能,布局,应用程序,视图,Android,优化,安卓,内存
From: https://blog.51cto.com/u_16163442/6512393

相关文章

  • 22年12月Tita 升级,任务,HRBP,管理优化升级
    升级快速一览:·【任务】支持关联分类·【任务】到达开始时间后状态自动变更为「进行中」·【HRBP权限扩展】拥有查看 OKR 仪表盘权限·【企业微信】工作台支持复制工作事项链接分享给他人点击免费领取绩效考核模版等资料升级详情一、【任务】支持关联分类任......
  • 通过索引提升SQL性能案例一则
    最近有个应用,前端调用后台的一个逻辑很慢,请开发提供了对应逻辑使用的SQL,进行脱敏,示例如下,selectt.AGENTasagent,nvl(sum(casewhent.operation_type='A'then1else0end),0)asDflCount,nvl(sum(casewhent.operation_type=......
  • Oracle优化器对谓词顺序处理的一个场景
    最近听了个讲座,其中介绍到了Oracle的谓词,原始版本的例子,如下所示,从数据上能看到,c1='3'的时候,c2的值是个字符串类型的数字,SQL>createtabletest(c1char(1),c2varchar2(1));Tablecreated.SQL>insertintotestvalues('1','A');1rowcreated.SQL>insertintotes......
  • Android性能优化知识脑图总结+学习手册文档,超干分享!
    近几年,Android开发技术不断发展,岗位要求不断升高,导致程序员的面试也进一步向更深、更广处延伸,比如原先很少涉及的性能优化,现已成为大厂的高频面试题。熟悉性能优化相关内容,就相当于拿到大厂的敲门砖,更是工作中最能突显价值的金字招牌。但众所周知,想要学习和掌握性能优化,就必须有实......
  • MySQL 优化
    SQL优化是提高MySQL数据库性能和查询效率的过程。下面是一些常见的SQL优化技巧:优化表结构:合理的表结构设计有助于提高性能。特别是,列是否具有正确的数据类型,每个表是否具有符合业务需求的列?例如,执行频繁更新的业务通常表比较多,列很少,而分析大量数据的业务通常表比较少,列很......
  • 2023.6.18 12.数据库配置优化
    12.数据库配置优化mysql数据库优化框架体系优化要有框架和体系:根据⽤户访问⽹站流程优化集群,根据OSI7层模型,从下往上优化数据库!1、硬件层⾯优化1.1数据库物理机采购:1.2服务器硬件配置调整1.2.1服务器BIOS调整1.2.2阵列卡调整2、软件层优化2.1操作系统层⾯优化2.1.1操......
  • 基于生成式模型的图像分类:模型设计与性能分析
    目录1.引言2.技术原理及概念3.实现步骤与流程4.应用示例与代码实现讲解5.优化与改进《29."基于生成式模型的图像分类:模型设计与性能分析"》是一篇人工智能专家、程序员、软件架构师和CTO的专业技术博客文章,旨在介绍基于生成式模型的图像分类技术。文章包含了对相关技术原理......
  • 机器学习算法的实现与优化
    目录1.引言2.技术原理及概念3.实现步骤与流程4.应用示例与代码实现讲解5.优化与改进6.结论与展望7.附录:常见问题与解答人工智能专家,程序员,软件架构师,CTO,以下是《48.机器学习算法的实现与优化》技术博客文章的文章结构:1.引言1.1.背景介绍机器学习技术的发展历程机......
  • Python编程和数据科学中的人工智能:如何创建复杂的智能系统并提高模型性能
    目录1.引言2.技术原理及概念3.实现步骤与流程4.应用示例与代码实现讲解标题:《Python编程和数据科学中的人工智能:如何创建复杂的智能系统并提高模型性能》1.引言人工智能(AI)是一个广泛的领域,涵盖了许多不同的技术和应用。在Python编程和数据科学中,人工智能是一个非常重要......
  • 强化学习中的模型调优与优化
    目录《强化学习中的模型调优与优化》引言强化学习是一种机器学习领域的重要分支,旨在让智能体通过与环境的交互来学习最佳行为策略,从而完成目标任务。在强化学习中,模型作为智能体的决策引擎,必须能够高效地执行搜索策略,以最大化奖励函数的期望值。然而,在实际训练和调优中,模型可能......