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

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

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


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

System Trace

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

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

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

打开的效果如下图:

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

在代码中打点方式如下:

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

Hierarchy Viewer

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

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

打开hierarchyviewer.bat即可。

效果如下图:

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

TraceView

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

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

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

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,就可以查看对应的层级关系,如下:

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

(2)Component Tree

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

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

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

(二)标签

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

(1)include标签

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

例如:

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

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

(2)merge标签

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

如下:

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

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

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

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

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

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

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

(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"

例如:

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

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

2、过度绘制

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

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

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

手机自带检测工具

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

蓝色:1次过度绘制

绿色:2次过度绘制

粉丝:3次过度绘制

红色:4次过度绘制

例如:

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

Android device monotor

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

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

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

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

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

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

上一篇:string_view暴力串串题


下一篇:真正带你搞懂-RecyclerView-的缓存机制,再也不怕面试被虐了