写点什么

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

评论

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

YashanDB 知识库|轻松打通多库数据,YashanDB DBLink 使用指南!

数据库砖家

数据库

信息混乱、协作低效?一文教你打造团队的单一事实来源

跟YY哥学Jira

知识管理 Confluence 知识管理软件 企业知识库 单一事实来源

GPUStack v0.5:模型Catalog、图生图功能上线,多维优化全面提升产品能力与使用体验

GPUStack

人工智能 大模型 模型推理 生成式AI GPU集群

行业热点丨可持续建筑新纪元:GFRP如何重塑混凝土的未来

Altair RapidMiner

仿真 hyperworks GFRP 建筑仿真软件 可持续建筑

WebGIS 开发的性能优化

北京木奇移动技术有限公司

软件外包公司 webGIS开发 webGIS软件外包

大胆试错、持续推进,拓展 GenAI 在客户服务领域的新场景

亚马逊云科技 (Amazon Web Services)

等保二级测评国家标准详解

黑龙江陆陆信息测评部

GPUStack v0.6超重磅更新:vLLM多机分布式、昇腾MindIE、模型兼容性检测、模型故障自动恢复,上百项增强打造最好用的模型推理平台

GPUStack

人工智能 大模型 模型推理 生成式AI GPU集群

Coze工作流+DeepSeek模型,躺着管理100个账号的终极秘籍

测试人

人工智能

WebGIS 开发框架的调试工具

北京木奇移动技术有限公司

软件外包公司 webGIS开发 GIS开发

Arthas redefine(加载外部的.class文件,redefine到JVM里 )

刘大猫

人工智能 监控 Arthas 大模型 redefine

TVM虚拟机

上海茶芯科技

编程语言 虚拟机

TVM虚拟机应用实例

上海茶芯科技

编程语言 软件开发 虚拟机

WebGIS 开发框架及性能

北京木奇移动技术有限公司

软件外包公司 webGIS开发 webGIS软件外包

AI与机器人外科手术:如何用智能化技术提升手术精度与安全性?

天津汇柏科技有限公司

人工智能 机器人 AI 人工智能

Python 实战 | 1688 商品详情 API 接口调用全流程解析

tbapi

1688商品详情接口 1688API 1688数据采集 1688商品详情采集

解决方案评测|告别复杂配置!基于阿里云云原生应用开发平台CAP快速部署Bolt.diy

Geek_b7ce72

国产法律AI亮相香港!爱问法AI参加香港国际创科展InnoEX

极客天地

Easysearch 迁移数据之 Reindex From Remote

极限实验室

easysearch

【Workshop 第一期 - 北京站】搜索服务统一治理(跨引擎多个集群监控管理、流量管控、服务编排)

极限实验室

Gateway Cloud Workshop easysearch

快速理解 MCP(模型上下文协议)核心价值

柯杰

MCP

过去一年的工作总结

yuanyxh

JavaScript 总结 前端

从被动救火到主动预防,StarRocks 监控与告警全攻略

StarRocks

数据库 数据处理 StarRocks 数据查询 物化视图

一文看懂iVX:技术架构、功能特性、性能优化手段

代码制造者

夸克新入口:重构AI“视界观”,望见阿里AI新版图

脑极体

AI

三级等保的法定审核周期与形式

黑龙江陆陆信息测评部

人工智能与智能教育:AI如何帮助实现个性化学习与在线教育的未来?

天津汇柏科技有限公司

人工智能 AI 人工智能

强强联合,智见未来:麦杰科技将携手视源股份亮相数字中国,以“集团级生产管理平台”赋能数实融合

麦杰科技

强强联合,智见未来:麦杰科技将携手视源股份亮相数字中国,以“集团级生产管理平台”赋能数实融合

麦杰研究院

过来人给1-3 年技术新人的几点小小的建议,帮助你提升职场竞争力

Y11

找工作 招聘 简历 实习 校招

Python 实战!手把手教你调用淘宝商品列表 API 接口

tbapi

淘宝商品详情接口 淘宝数据采集 淘宝API 天猫商品数据采集 淘宝商品详情API

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