ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

国民级App性能优化方案+深层次实践=让你真正进阶的资料

2022-01-31 18:31:36  阅读:149  来源: 互联网

标签:层级 进阶 过度 标签 App 布局 深层次 绘制 View


在这里插入图片描述

1.性能优化分析工具学习


在开始代码优化之前,先得学会使用性能分析工具。以下三个工具都是谷歌官方推出的,可以帮助我们定位分析问题,从而优化我们的APP。

System Trace

Systrace是一个收集和检测时间信息的工具, 它能显示CPU和时间被消耗在哪儿了, 每个进程和线程都在其CPU时间片内做了

什么事儿. 而且会指示哪个地方出了问题, 以及给出Fix建议。给出的结果trace文件是以html形式打开的,直接用浏览器打开

查看十分方便。打开方法:打开DDMS后,连接手机,点击手机上方一排按钮中的SysTrace按钮。

打开的效果如下图:

在这里插入图片描述

在代码中打点方式如下:

在这里插入图片描述

Hierarchy Viewer

Hierarchy Viewer提供了一个可视化的界面来观测布局的层级, 让我们可以优化布局层级, 删除多余的不必要的View

层级, 提升布局速度。另外,开发者模式中调试GPU过度绘制选项也可以进行视图层级调试。在SDK-> tools目录下

打开hierarchyviewer.bat即可。

效果如下图:

在这里插入图片描述

TraceView

一个图形化的工具, 用来展示和分析方法的执行时间。也是一款性能优化的神器。可以通过像打log一样的方式去定位代码的执行时

间,从而可以准确定位是哪一段代码的执行消耗了太多时间。相比SysTrace,功能更强大,使用起来也更复杂。

在这里插入图片描述

2.布局优化


Android中布局优化主要包含以下三个方面:布局层级和测量次数、布局过度绘制、绘制过程

1、布局层级与测量次数

布局层级越多,绘制耗时就会相应增加。考虑使用布局层级比较少的方案.

(一)合理选择父容器

在布局层数相同时,我们优先选择测量次数较少的父容器

通常我们选取的优先级为:FrameLayout、不带Layou_wight的LinearLayuut、RelativeLayout。因为带有Layot_weight的LinearLayout和RelativeLayout会测量两次。

总结来看,首先优先布局层级少的方案,在布局层级相同时,采用测量次数少的。

那么如何分析布局层级呢?

(1)Android Device Monitor

Android studio3.0开始,Google不建议使用它, 因此我们需要手动在sdk目录下的tools中找到它,之后运行你的apk并且选择Hierarchy View,就可以查看对应的层级关系,如下:

在这里插入图片描述

(2)Component Tree

在Android studio.3.0之后,我们可以使用Component Tree,它同样提供了查看组件层级的功能,具体如下:

在这里插入图片描述

选择并查看我们的xm布局,点击左下角的design,则可以看到左侧层级关系。

(二)标签

除了上面提到的方式外,我们还可以通过使用标签来减少层级和复用组件

(1)include标签

include标签的作用就是可以直接引用已有的布局,而不需要重新写布局。而通常会将include和merge标签相结合使用,下面会介绍merge标签。

例如:

在这里插入图片描述

这里include引用的是一个LinearLayout的布局,虽然我们不需要重复写这个布局,但是却增加了层级关系。

(2)merge标签

merge标签通常是作为include标签的辅助扩展,就是为了解决引入include后导致布局层级增加问题,使用merge标签后,引入的布局中的View就会作为父布局的子View。

如下:

在这里插入图片描述

在这里插入图片描述

使用include标签引入后,层级关系如下:

在这里插入图片描述

现在我们把标签改为merge,层级关系如下:

在这里插入图片描述

可以明显看到中间少了一层。

(3)ViewStub标签

ViewStub继承于View,它是一个轻量级且宽高为0的组件,本身不参与布局和绘制。因此使用它可以做到在不需要的时候不加载,在需要的时候再加载,从而提高性能。

那么如何做到需要的时候显示呢?

可以通过以下两种方式:

setVisiable(View.Visiable)或者findViewById().inflate()

(三)使用ConstaintLayout

ConstaintLayout允许在不使用任何嵌套的情况下创建复杂布局,与RelativeLayout相似,可以依赖兄弟容器和父控件之间的相对关系。常见属性:

app:layout_constraintLeft_toLeftOf=“parent”

app:layout_constraintTop_toTopOf=“parent”

app:layout_constraintLeft_toRightOf="@+id/iv_image"

例如:

在这里插入图片描述

在这里插入图片描述

2、过度绘制

过度绘制其实指的是屏幕内某个像素在同一帧的时间内被绘制了多次。

而在多层次重叠的UI结构里,如果不可见的UI也在绘制的话,就会导致某些像素区域被绘制多次,从而浪费大量的cpu和gpu资源。

目前提供两种方式来检测过度绘制:

手机自带检测工具

手机的开发者模式中会有一项为调试GPU过度绘制>显示GPU过度绘制,设置后,打开任何一个app,就可以看到界面上出现蓝、绿、粉、红四种颜色中的一种或者多种。

蓝色:1次过度绘制

绿色:2次过度绘制

粉丝:3次过度绘制

红色:4次过度绘制

例如:

在这里插入图片描述

Android device monotor

打开Hierarchy Viewer(/'haɪərɑːkɪ/),运行模拟器,打开对应的Activity界面,就可以看到如下:

在这里插入图片描述

其中每一个View中,下面三个点依次表示测量、布局、绘制的时间,红点和黄点表示速度慢,而蓝绿则相对好一些。

在了解了如何分析过度绘制后,我们如何去处理过度绘制?
10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTg2Ng==,size_16,color_FFFFFF,t_70)

其中每一个View中,下面三个点依次表示测量、布局、绘制的时间,红点和黄点表示速度慢,而蓝绿则相对好一些。

在了解了如何分析过度绘制后,我们如何去处理过度绘制?

标签:层级,进阶,过度,标签,App,布局,深层次,绘制,View
来源: https://blog.csdn.net/m0_66265031/article/details/122761182

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有