2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

安卓端贝壳找房 APP 首页滑动卡顿问题的解决

  • 2019-09-23
  • 本文字数:1729 字

    阅读完需:约 6 分钟

安卓端贝壳找房APP首页滑动卡顿问题的解决

1. 背景

在研发初期,打开贝壳找房 app 后上下滑动界面, 明显感觉到顿挫感, 即使在安卓高端机(内存 6G)也如此, 说明不是硬件配置低的锅。

2. 解决思路

造成 UI 卡顿分为 3 方面原因;


CPU 太忙, 即手机运行了很多 app 和服务, 占用了大量的 CPU; CPU 是负责数据运算的, 通过 SurfaceFlinger 告诉 GPU 要显示什么。


GPU 太忙, GPU 接收 CPU 传来的指令, 如果指令太多可能会导致丢帧/卡顿, 渲染一帧图像要在 16ms 以内才能保证 UI 的流畅性;


内存不足, 手机运行太多的 app 和服务,没有充裕内存空间分配到当前 app,但现在市场安卓手机内存主流水平是 3G/4G/6G/8G,一般可以忽略该因素; 但当前 app 占用的内存空间太大可能导致卡顿。 通常是 app 出现内存泄漏或者占用内存太高(例如缓存了图片、文件或其它数据结构)。


PS: 分析 root cause 占用八成时间, 解决问题占用两成时间;


从哪个点入手分析问题???


我的建议是从简单到复杂, 即先分析 GPU 性能(专业叫法是过度绘制,即一个像素被绘制了多次)。


打开 系统设置 — 开发者选择 — 调试 GPU 过度绘制 — 显示过度绘制区域 和 系统设置 — 开发者选择 — GPU 呈现模式分析 — 在屏幕上显示为条形图, 然后再看看要调试的界面;



贝壳找房 App 首页



过度渲染示意图


通过安卓自带功能可以看出首页过度绘制问题很严重, 底部柱状图显示每帧图像渲染时间都超过 16ms, 意味着丢帧/卡段现象比较严重。


那么怎么解决过度绘制问题呢?

3. 问题原理

从叶节点 View/ViewGroup 向上找出所有的父/祖父/曾祖父的 ViewGroup, 一直到布局根节点,删除不必要的背景(设置背景就要多渲染一次);合理调整 UI 布局,尽量减少层级。


删除贝壳找房首页 Activity 的主题背景, 可以在 xml 样式里设置或在 onCreate 里赋空;


确认 Activity 布局根节点 ViewGroup 是否设置背景色, 如果有的话要删除,让子 View/ViewGroup 绘制背景; (减少一次绘制)


判断 Fragment 布局根节点 ViewGroup 是否设置背景色,如果有的话要删除;(减少一次绘制)


首页每个布局卡片是否设置了背景;


像上图显示的推荐房源 ListView 是否设置了背景;


代码里是否有不必要的 notifyDataSetChanged,invalidate,requestLayout 等行为;这都会导致对应 View/ViewGroup 重新绘制;


背景重叠可以通过重写 onDraw 函数, 在缓存 canvas 里绘制完后一次性刷新到界面;



优化后首页


按照如上方式优化后效果很明显, 柱状图基本都在 16ms 以下, 基本满足性能需要,但还是有优化的空间。


这时上下快滑首页还是能感觉到 UI 卡顿, 这时就要分析 CPU 性能了, 即在主线程里是否做了耗时操作; 这时我们可以借助 TraceView 分析每个函数的执行周期; 打开 sdk 的 monitor。



选中要调试的进程, 点击红圈内按钮开始, 再次点击结束; 按照降序排列所有记录。 Parent 表示当前函数被调用的地方, Children 表示当前函数调用的其它函数; 怀疑 MyScrollView 的 handleMessage 在搞事情。



点击


“com.homelink.midlib.view.MyScrollView$1.handleMessage"这一行, 可以看到 handleMessage 函数的执行情况; 可以看到 onScroll 函数执行了 358 毫秒,而且是在主线程, UI 不卡顿等啥呢。



看看 MyScrollView 的 Handler 都做了什么, 就是 sendMessageDelayed 给自己发送个延时消息, 然后就是调用回调了。 继续看看这个 onScroll 都做了什么。


1override fun onSrcoll(scrollY: Int) {2LjExposureUtil.statistics(mExposureCardList, mVisibleList)3mRecommendHouseCard?.childExposure() 4}
复制代码


跟进代码看到 onScroll 就是触发了埋点, 但它是个耗时操作,在滑动过程中会多次执行 onScroll,导致卡顿的问题。


发现问题了, 解决就很简单了。 我们希望的是如丝般顺滑的滑动体验, 那就不要在滑动过程中阻塞主线程, 我们可以在滑动结束时做埋点操作;


1override fun onScrollStop() {2LjExposureUtil.statistics(mExposureCardList, mVisibleList)3mRecommendHouseCard?.childExposure()4}
复制代码


后续工作, 使用 RecyclerView 改造首页。


作者介绍:


高瑞,贝壳找房 Android 工程师,目前负责贝壳找房 app 安卓端研发工作。


本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。


原文链接:


https://mp.weixin.qq.com/s/1380W4dFRSP3KAWJ0lyKnw


2019-09-23 08:003349

评论

发布
暂无评论
发现更多内容

低代码实现探索(四十四)检查器待研究

零道云-混合式低代码平台

SAP ABAP 系统同微软 Office 套件进行 Desktop Integration 的工作原理

汪子熙

Office SAP abap Netweaver 7月月更

Kubernetes核心技术剖析和DevOps落地经验|研发效能

laofo

DevOps k8s 研发效能 工程效率

Python 入门指南之类

海拥(haiyong.site)

7月月更

内部排序——基数排序and总结

乔乔

7月月更

2022年数据库审计厂家排名看这里!

行云管家

数据库 行云管家 数据库审计

使用Gitlab Jenkins Docker建立CI部署方案

沃德

程序员 jenkins 7月月更

【Docker 那些事儿】如何安全地停止、删除容器

Albert Edison

Docker Kubernetes 容器 云原生 7月月更

活动报名|聚焦案例实践,Apache Pulsar 在线 Meetup 火热来袭

腾源会

开源 腾源会 Apache Pulsar 社区

web技术分享| 基于vue3实现自己的组件库第二章:Pagination组件

anyRTC开发者

前端 Web 音视频 Vue3 Pagination

“Shift”键——一直被人低估的功能键

极客天地

长安链研究笔记 - win10(goland)源码启动长安链,可调试源码

长安链

浅入浅出Mybatis(一)

ES_her0

7月月更

【LeetCode】实现一个魔法字典Java题解

Albert

LeetCode 7月月更

Qt 实现解压压缩包

小肉球

qt 7月月更

从虚拟中发展电网现实:数字孪生承载的能源变革

脑极体

如何提交一个PR?完成这 6 点就可以了

OpenAnolis小助手

开发者 pull request 龙蜥社区 【人人都可以参与开源】 社区建设

WWDC22 - In App Purchase 更新总结

37手游iOS技术运营团队

ios iap appstore WWDC22 In App Purchase

大厂都在玩的容器技术到底是什么?

慕枫技术笔记

容器 云原生 7月月更

2022年7月中国数据库排行榜:墨天轮榜单榜眼易主,PolarDB得分涨幅最大

墨天轮

数据库 TcaplusDB TiDB 国产数据库 polarDB

👨‍💻Mybatis源码我搞透了,面试来问吧!写了134个源码类,1.03万行代码!

小傅哥

源码分析 小傅哥 mybatis 大厂面试 面试经验

Kafka面试22连问,看完直接跟面试官聊骚都没问题

程序知音

Java kafka 程序员 后端 程序员面试

动态化UI在Qunar客户端首页的应用

Qunar技术沙龙

打造“拉动式”企业培训管理方案,释放人才潜能

明道云

双目立体匹配之代价聚合

秃头小苏

7月月更

阿里云机器学习平台PAI与华东师范大学论文入选SIGIR 2022

阿里云大数据AI技术

Transformer 机器学习/深度学习

开源协议详解

源字节1号

开源 软件开发 前端开发 后端开发

LED显示器好用吗?

Dylan

机器学习-聚类算法

AIWeker

机器学习 聚类算法 7月月更

WWDC22 - Apple 隐私技术探索

37手游iOS技术运营团队

ios macos apple appstore WWDC22

Git .ignore 文件规则不生效

攻城狮杰森

git IDEA 协同开发 7月月更

安卓端贝壳找房APP首页滑动卡顿问题的解决_文化 & 方法_高瑞_InfoQ精选文章