一文告诉你:闲鱼是怎么面向Flutter做技术体验升级的?

优化前如下图,(红色区域表示打脏的widget)可以看到刷新了整个容器。

[图片上传失败…(image-88d1df-1607610735943)]

优化后,仅对新增的卡片做刷新

[图片上传失败…(image-d1416d-1607610735943)]

滚动加载小图

feeds流卡片包含大量的图片,在快速滑动过程中,加载大量图片对于内存和IO都是比较大的考验,影响流畅度,在低端机上尤其明显。优化思路:在快速滚动过程中,只加载尺寸较小的模糊图,等到滚动停止后再渐进式的展示原图,并且在超出屏幕区域不加载原图,优化上屏体验。效果如图:(为了演示效果,这里的用的是缩小5倍的小图)

[图片上传失败…(image-853675-1607610735943)]

小结

在经过优化之后,闲鱼详情页和搜索页流畅度 FPS 提升了 3 个点,低端机大卡顿次数降低一半,中高端机型上流畅度提升到 57 或以上,大卡顿次数接近 0。

详情页线上高可用 fps 数据如下:

线上低端机 fps 曲线,横轴表示帧率区间,绿色为优化版本。曲线分布越靠右,流畅度越好。

线上高端机 fps 曲线。绿色为优化版本

搜索页线上高可用 fps 数据如下:

线上低端机 fps 曲线。绿色为优化版本

线上高端机 fps 曲线。绿色为优化版本


搜索结果页加载优化


在优化流畅度问题之后,再来看下对于页面加载需要做哪些优化。在优化之前,从搜索关键词到搜索结果展示过程中有较长loading。对于页面的加载速度优化,我们更多的从业务流程开始去找突破口,搜索结果页的打开过程如下:

搜索结果页由Flutter实现,但它是从Native页面点击打开,在混合栈的背景下导致路由拦截到打开容器这一步有一定耗时。我们可以通过 URL 携带预取信息,在 Native 进行跳转导航时同时进行异步并行的数据预取,可以减少页面打开的耗时。同时因为搜索页面的请求RT相对比较高,一般页面进来了,还仍然在等待网络请求回来,所以如果在网络请求回来的时候再去做模板的预加载,大概率会命中。

优化之后的流程如下:

通过一定的并行手段,采用数据预取、模板预加载的方案,我们在Android低端机上将搜索结果页加载时长优化300ms。同时在数据请求时展示骨架屏动画(lottie实现)代替小黄鱼loading,带给用户更好的使用体验。

优化前:

[图片上传失败…(image-45c8ba-1607610735943)]

优化后:

[图片上传失败…(image-e347e6-1607610735943)]


详情页加载优化


对于详情页的加载优化,我们主要通过下面3个手段做优化:

  • FlutterBoost优化

  • 数据透传

  • 转场动画

FlutterBoost优化

闲鱼目前还是Native+Flutter的混合开发模式,通过FlutterBoost来处理混合栈页面的映射和跳转。在FlutterBoost的open处理中,会通过startActivity()打开一个新的容器,而详情页的跳转场景中,大部分都是从Flutter页面跳转过来的,其实可以复用之前打开过的容器。针对这样的应用场景,我们在FlutterBoost增加了一个新的特性,在Flutter页面打开一个新的Flutter页面时,可以选择两个Flutter页面共用一个Flutter容器(Activity、ViewController), 以加快页面打开速度、减少内存消耗,并且支持了Flutter实现页面切换的动画。

数据透传

在搜索结果页跳详情和猜你喜欢跳详情的场景中,详情的部分数据已经可以通过上一个接口拿到,我们可以把这部分数据透传带到详情页,在请求详细数据的过程中,先展示简单的内容,比如主图、标题、价格,等详细数据回来后再更新详情页,带来直出的体验效果。

转场动画

在前面数据透传的基础上,我们又通过转场动画,实现沉浸式页面的切换的效果,进一步地提升用户使用体验。

实现思路:在路由导航过程中通过继承ModalRoute接管buildPage过程,对简化版详情页AnimateDetailPage做动画处理,监听动画状态,当动画完成后,再把详情页DetailPage挂到widget树上。

优化前:

[图片上传失败…(image-155316-1607611144523)]

优化后:

[图片上传失败…(image-f9445-1607611144523)]


总结展望


总结下来,闲鱼Flutter的性能体验升级中,在技术细节优化方面,我们对主要页面加载时长、流畅度做了优化,除了针对业务流程上的优化之外,我们也沉淀了一些通用优化能力,比如数据预取、widget分帧上屏、长列表加载更多优化、长列表局部刷新能力、长列表滚动差值器算法优化。在视觉优化方面,突出年轻化的主题,设计使用了大量的微动画元素,Flutter Lottie动画使用在各个页面随处可见,例如:发布页、搜索结果加载页、以及各个加载刷新动画。在优化之后,闲鱼App操作变得更加流畅如丝般顺滑。

未来,我们还需要对Flutter引擎启动有更多的探索和思考,尤其是在首页切换到Flutter之后,对Flutter启动优化的工作是必须的。另外,由于业务的快速迭代,前期的优化工作到后面很容易恶化。如何在业务快速变化的同时,既满足效率又保证性能,是接下来需要着手解决的问题,比如在代码集成合入前通过性能卡口,将性能不达标的代码打回并给出优化建议;将性能优化的手段内置到容器框架这一层。

References

[1] Flutter性能最佳实践: https://flutter.cn/docs/testing/best-practices

原文地址:闲鱼是怎么面向Flutter做技术体验升级的?

(无语……简书居然不能放那个效果动图,大家感兴趣可以去原文看看)

最后


Android的技术学习不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大。

千里之行始于足下,愿你我共勉。

本文在开源项目:https://github.com/xieyuliang/Note-Android(点击蓝色字体可以进入)中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

结尾

  • 腾讯T4级别Android架构技术脑图;查漏补缺,体系化深入学习提升

img

  • 一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

img

有Android开发3-5年基础,希望突破瓶颈,成为架构师的小伙伴,可以关注我

术脑图;查漏补缺,体系化深入学习提升

[外链图片转存中…(img-XIq05QQw-1712047690494)]

  • 一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

[外链图片转存中…(img-dqlwOYyz-1712047690494)]

有Android开发3-5年基础,希望突破瓶颈,成为架构师的小伙伴,可以关注我

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值