90%的开发者都不知道的UI本质原理和优化方式,android组件化架构

可以看见,上面这些导致卡顿的原因都是我们平时开发中非常常见的。

有些人可能会觉得自己的应用用着还蛮OK的,其实那是因为你没进行一些瞬时测试和压力测试,一旦在这种环境下运行你的App你就会发现很多性能问题。

下面就分享给大家几种常见的UI 优化方式。

所谓UI优化,就是拆解渲染过程的耗时,找到瓶颈的地方,加以优化。

前面分析了UI原理,Activity、Window、DecorView、ViewRootImpl之间的关系,以及XML布局文件是如何解析成View对象的。

耗时的地方:

  • View的创建在主线程,包括measure、layout、draw,界面复杂的时候,这一部分可能会很耗时。

  • 解析XML,反射创建VIew对象,这一过程的耗时。

下面介绍一些常用的UI优化方式~

3.1 常规方式

  1. 减少UI层级、使用merge、Viewstub标签优化

  2. 优化layout开销、RelativeLayout和带有weight的Linearlayout会测量多次,可以尝试使用ConstraintLayout 来代替。

  3. 背景优化,分析DecorView创建的时候,发现DecorView会设置一个默认背景,可以统一将DecorView背景设置为通用背景,其它父控件就无需设置背景,避免重复绘制。

3.2 xml转换成代码

使用xml编写布局,很方便,但是最终要通过LayoutInflater的inflate方法,将xml解析出来并递归+反射去创建View对象,布局比较复杂的时候,这一部分会非常耗时。

使用代码创建可以减少xml递归解析和反射创建View的这部分耗时。 当然,如果将xml都换成代码来写,开发效率将不忍直视,并且代码可读性也是个问题。

掌阅开源的一个库,编译期自动将xml转换成java代码,X2C

它的原理是采用APT(Annotation Processor Tool)+ JavaPoet技术来完成编译期间【注解】-【解注解】->【翻译xml】->【生成java】整个流程的操作

即在编译生成APK期间,将需要翻译的layout翻译生成对应的java文件,这样对于开发人员来说写布局还是写原来的xml,但对于程序来说,运行时加载的是对应的java文件。

侵入性极低,去除注解则回退到原生的运行时解析方式。当然,有些情况是不支持转换的,比如merge标签,编译期没法确定它的parent。

3.3 异步创建View

通过子线程创建View,减少主线程耗时。

private void threadNewView() {

new Thread(){

@Override

public void run() {

mSplashView = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_splash,null);

}

}.start();

}

当然,这种方式需要处理同步问题,并且没有从源头上解决创建View耗时,只是将这部分耗时放到线程去做。UI更新的操作还是要切换到主线程,不然会触发ViewRootImpl的checkThread检测。

void checkThread() {

if (mThread != Thread.currentThread()) {

throw new CalledFromWrongThreadException(

“Only the original thread that created a view hierarchy can touch its views.”);

}

}

3.4 复用View

复用View这个应该比较常见了,像RecyclerView的四级缓存,目的就是通过复用View减少创建View的时间。

我们可以在onDestroy方法将View的状态清除,然后放入缓存。在onCreate的时候去命中缓存,设置状态。

3.5 异步布局: Litho

正常情况下measure、layout、draw都是在主线程执行的,最终绘制操作是在draw方法,而measure、layout只是做一些数据准备,完全可以放到子线程去做。

Litho 的原理就是将measure、layout 放到子线程: github.com/facebook/li…

优点:

  1. 将measure、layout、放到子线程去做,减少主线程耗时。

  2. 使用自己的布局引擎,减少View层级,界面扁平化。

  3. 优化RecyclerView,提高缓存命中率。

缺点:

  1. 无法在AS中预览。

  2. 使用自己的布局引擎,有一点的使用成本。

3.6 Flutter:自绘引擎

Flutter 是一个跨平台UI框架,内部集成了Skia图像库,自己接管了图像绘制流程,性能直逼原生,是时候制定计划学习一波了~


学习的过程中善于总结才能快速提升个人的水平,这里我也总结了一份《Android性能优化全方面解析》,1586页,5个章节,95个小点,不仅仅有详细的底层原理的解析,还有大厂性能优化探索与实践!

第一章 性能优化心得与经验

  • 移动端性能监控方案Hertz

  • Android性能优化之虚拟机调优

  • Android UI 性能优化

  • 美团外卖Android Lint代码检查实践

  • 使用Android Studio和MAT进行内存泄漏分析

第二章 响应速度

  • Android App 启动优化全记录

  • Android 中如何计算 App 的启动时间?

  • 应用启动时间

  • 支付宝 App 构建优化解析

  • Redex 初探与 Interdex:Andorid 冷启动优化

第三章 流畅度

  • Android 中的卡顿丢帧原因概述

总结

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!

在这里我也分享一份自己收录整理的**Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料**帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值