写点什么

安卓端贝壳找房 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:003374

评论

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

NineData支持全版本的企业级Oracle客户端,现已发布

NineData

人工智能 数据库 oracle Oracle ACE NineData

“金税四期”背景下企业税务风险管控有哪些具体措施?

用友BIP

金税四期

ChaosBlade 项目指南:我是如何为社区贡献 Redis 故障场景

阿里巴巴云原生

redis 阿里云 云原生 ChaosBlade

硬核来袭!中国AI大模型峰会,开发者不容错过这场夏季盛会

dvlinker

人工智能 百度飞桨 AI大模型 文心大模型

百度APP iOS端包体积50M优化实践(五) HEIC图片和无用类优化实践

百度Geek说

ios 性能优化 企业号 8 月 PK 榜

加速智慧税务建设,拥抱税务数智化转型

用友BIP

税务管理

Spring Boot Starter 剖析与实践

京东科技开发者

Spring Boot spring Boot Starter 依赖 企业号 8 月 PK 榜

什么是跨境数据传输。如何避免跨境数据传输出现的问题

镭速

跨境数据传输

PoseiSwap:首个基于模块化设施构建的订单簿 DEX

鳄鱼视界

硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过!

herosunly

大语言模型

状态机的介绍和使用 | 京东物流技术团队

京东科技开发者

dsl 状态机 数学模型 企业号 8 月 PK 榜

企业诊断屋:服饰美妆电商如何用A/B测试赋能业务

字节跳动数据平台

大数据 A/B 测试 对比实验 企业号 8 月 PK 榜

中企全球化发展:用友联合山海图以数字化引领印尼工程建筑行业转型

用友BIP

中企出海

助力618-Y的混沌实践之路 | 京东云技术团队

京东科技开发者

测试 混沌工程 系统稳定性 企业号 8 月 PK 榜

基于YonGPT 的企业收入/利税经营分析,让企业经营决策更从容

用友BIP

【专家观点】贸易企业的数智化绩效管理

用友BIP

贸易

企业税务管理为什么需要数智化转型

用友BIP

税务管理

大文件传输的有效可用方式

镭速

大文件传输 传输大文件

深度解读陕西省国资委最新发文,聚焦国资国企建设一流司库

用友BIP

全球司库 国资国企

直播软件APP源码iOS提交到APP store系列之上架指南

山东布谷科技

软件 直播 源码搭建 iOS APP上架 app store

2023年开放原子校源行(清华大学站)成功举行

开放原子开源基金会

开源 开放原子开源基金会 清华大学

直播丨如何用最新的 Serverless 技术让文化古籍“活过来”?

阿里巴巴云原生

阿里云 Serverless 云原生

数仓性能优化:倾斜优化-表达式计算倾斜的hint优化

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

医疗知识图谱问答 ——Neo4j 基本操作

北桥苏

nosql neo4j 数据库、

5分钟get:Uni-App网络请求完美封装指南!

陇锦

微信小程序 uni-app 前端开发 uniapp 前端开发框架

这 4 个系统可靠性评估指标,可能比 MTTR 更靠谱!

LigaAI

研发管理 质量指标 研发效能度量 可靠性度量 企业号 8 月 PK 榜

MySQL 的 Join 查询及 Hash Join 优化 | StoneDB 技术分享会 #3

StoneDB

MySQL 数据库 HTAP StoneDB 企业号 8 月 PK 榜

CGLIB动态代理对象GC问题排查 | 京东云技术团队

京东科技开发者

GC cglib CGLIB 动态代理 企业号 8 月 PK 榜

构建高效物理计划:从逻辑查询到算子实现

KaiwuDB

KaiwuDB SQL编译 物理计划构建

“年中技术盘点:新兴技术的影响与未来展望”征文获奖作品合集

InfoQ写作社区官方

内容合集 征文活动 热门活动

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