三. Android 布局优化

1. Android绘制原理及工具选择

1.1 绘制分析

CPU:负责计算显示内容。视图的创建,布局计算,图片解码,文本绘制。
GPU:负责栅格化操作(UI元素绘制到屏幕上),Button拆分成像素?;凰愠晌评怼?br> 16ms 发出VSync信号出发 UI 渲染。
大多数的Android设备屏幕刷新频率:60HZ

1.2 优化工具

Systrace

关注Frames
正常:绿色圆点,丢帧:黄色或红色
Alerts栏。自动分析异常性能分析的一些条目

Layout Inspector

查看视图层次结构

Choreographer(API16以后)

获取FPS,线上使用,具备实时性

Choreographer.getInstance().postFrameCallback

2. Android布局加载原理

深入布局加载源码:

setContentView -> LayoutInflater -> inflate -> getLayout -> createViewFromTag -> Factory -> createView -> 反射

性能瓶颈
布局文件解析:IO过程。布局特别大,文件也就特别大,io也就会卡顿。
创建View对象:反射。反射使用过多(标签过多)导致反射很慢。

LayoutInflater.Factory
LayoutInflater 创建View的一个Hook
定制创建View的过程:全局替换自定义TextView等
LayoutInflater当中的 Factory与Factory2
Factory2继承于Factory
多了一个参数:parent

3. 优雅获取界面布局耗时

3.1 常规方式

获取每个界面的加载耗时。
实现:复写setContentView、手动埋点。不够优雅,代码有侵入性。

3.2 AOP/ArtHook

找到切面点。切Activity的setContentView。

@Around("execution(* android.app.Activity.setContentView(..))")

call表示切在方法调用的部分。execution表示切在方法的里面

获取任一控件的加载耗时 ,在内部和执行方法处和启动时间计算方式一致。
低侵入性。
LayoutInflater.Factory

3.3 异步Inflate实战

布局文件读取过程慢,IO过程
创建view过程慢,反射过程创建,比new慢3倍。

根本性解决。不使用反射/IO
侧面缓解。

AsyncLayoutInflater(异步Inflater)

  • WorkThread加载布局
  • 回调主线程
  • 节约主线程时间

导包:

com.android.support:asynclayoutinflater

4. 布局加载优化实战

AsyncLayoutInflater只是缓解。
Java代码写布局,它的缺点是不便于开发、可维护性差。
X2C框架(通过APT编译器翻译XML为Java代码)
开发人员写XML,加载Java代码。

annotationProcessor 'com.zhangyue.we:x2c-apt:1.1.2'
implementation 'com.zhangyue.we:x2c-lib:1.0.6'

用到的页面使用:@Xml(layouts = "activity_main")
问题:部分属性Java不支持、失去了系统的兼容(AppCompat)

5. 视图绘制优化实战

优化布局层级及复杂度
测量:确定大小
布局:确定位置
绘制:绘制视图

性能瓶颈:每个阶段耗时。自顶向下遍历。触发多次。
准则:减少View树层级。

宽而浅,避免窄而深

(布局层级 从上往下叫宽度,所有元素尽可能在一个ViewGroup当中)
(布局深度尽可能更浅)

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

过度绘制

一个像素最好只会被控制一次。
5)调试GPU过度绘制(开发者模式中打开)
蓝色可接受
避免过度绘制方法

6)去掉多余背景色,减少复杂shape使用
7)避免层级叠加
8)自定义View使用 clipRect 屏蔽被遮盖View绘制
9)ViewStub:高效占位符、延迟初始化
10)onDraw中避免:创建大对象、耗时操作。
11)TextView优化

6. 总结

用到了哪些工具?
结构化思维。使用了很多工具,有不同的使用场景。
1)Choreographer 可以带到线上,得到帧率。
2)每个布局耗时 AOP、HOOK
3)线下开发环节、Systrace、Layout Inspector
4)布局为什么会导致卡顿,你又是如何优化的?
5)IO、反射、遍历、重绘
6)异步Inflate、X2C、减少层级、重绘
7)AOP、监控
8)做完布局优化后有哪些成果产出?
9)体系化监控手段:线下 + 线上

指标:FPS、加载时间、布局层级
核心路径保障

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容