美文网首页
布局优化

布局优化

作者: flynnny | 来源:发表于2021-03-23 11:32 被阅读0次

1Android绘制原理及工具选择

绘制原理

CPU负责计算显示内容
GPU负责柵格化(UI元素绘制到屏幕上)

系统每16ms发出VSync信号出发UI渲染(每帧在16ms内完成)
大多数Android手机屏幕刷新频率60Hz(人眼和大脑极限)

优化工具

1、Systrace --之前用它查看了内存消耗情况;现在关注Frames
正常:绿色原点,丢帧:黄色或者红色
Alerts栏

1.png

2、Layout Inspector
AS自带
可查看层次结构

2.png 3.png

3、Choreographer
获取FPS,线上使用,具备实时性
API16+

Choreographer.getInstance().postFrameCallback

![4.png](https://img.haomeiwen.com/i14355128/7792e2dd423148ff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

实际效果

5.png

2Android布局加载原理

10.png

性能瓶颈
布局文件解析:IO过程
创建View对象:反射过程

LayoutInflater.Factory介绍

LayoutInflater.创建View的一个Hook
定制创建View的过程:全局替换自定义的TextView等。

11.png 12.png

Facory2多了一个parent参数

13.png

Factory是Hook点

3优雅获取界面布局耗时

常规方式

背景:获取每个界面加载耗时
实现:复写SetContentView 手动埋点

不够优雅
有侵入性

AOP/ArtHook方式

AOP实现
切Activity的setContentView

14.png 15.png 16.png

第一个224ms 第二个10ms

ArtHook方式 略
切Activity的setContentView

获取任意控件耗时

低侵入性
用到LayoutInflater.Factory是创建View的一个hook

代码:

17.png 18.png 19.png

上图创建View 其实是系统hoot 创建了TextViewCompat 实现了兼容

注意:LayoutInflaterCompat要在super.onCreate(..)之前设置!!之后无效

4异步Inflate实战

背景介绍

布局文件解析慢:IO过程
创建View对象:反射过程(比new 慢3倍)

侧面缓解AsyncLayoutInflater实战

简称异步Inflate
1WorkThread加载布局
2回调主线程
3节约主线程时间

先导包:谷歌默认的但并没加载到里面

com.android.support:asynclayoutinflater
20.png

创建了一个Handler,一个线程。创建过程都在子线程。

使用AsyncLayoutInflater将会失去系统兼容效果!!要自己写。

总结

侧面缓解

21.png

5布局加载优化实战

背景介绍

IO操作、反射
AsyncLayoutInflater只是缓解

22.png

布局加载优化实战

23.png 24.png 25.png 26.png 27.png 28.png

6视图绘制优化实战

测量:确定大小
布局:确定位置
绘制:绘制视图

性能瓶颈
每个阶段都耗时
自顶向下的遍历
触发多次

优化布局层级及复杂度

准则
1减少View树层级
2宽而浅,避免窄而深

1、ConstraintLayout
实现几乎完全扁平化的布局
构建复杂布局性能更高
具有Relative和LinearLayout的特性
2、不嵌套使用RelativeLayout
3、不在嵌套的LinearLayout中使用weight
4、merge标签:减少一个层级,只能用于根View

避免过度绘制

一个像素最好只被绘制一次
调试GPU过度绘制
蓝色可接受(绿色粉色红色)

1去掉多余背景色,减少复杂shape使用
2避免层级叠加
3自定义View使用clipRect屏蔽被遮盖View绘制

29.png 30.png

去掉background后

31.png

自定义view要如下修改

32.png 33.png

其他

Viewstub:高效占位符、延迟初始化
onDraw中避免:创建大对象、耗时操作
TextView优化:(有专项讲解)

7模拟面试

布局优化中用到哪些工具?
不同场景不同工具
统计线上FPS --》Choreographer 实时的
获取加载耗时 AOP/Hook
线下使用 systrace 、Layout Inspector

布局为什么导致卡顿,你怎么优化的
IO、反射、遍历、重绘
异步Inflate、X2C,减少 层级、重绘
AOP、监控

做完布局优化有哪些成果
体系化的监控手段:线下+线上
指标:FPS、加载时间、布局层级
上线前对核心路径保障review

相关文章

网友评论

      本文标题:布局优化

      本文链接:https://www.haomeiwen.com/subject/pxtlcltx.html