简介
ShareChat 是印度领先的社交媒体平台,用户可以在母语中分享观点、记录生活并结交新朋友。其他功能包括聊天室和私信,用户可以分享视频、笑话、歌曲和其他基于语言的社交内容。ShareChat 致力于引领印度互联网革命,正在改变未来十亿用户如何互动。
应用数据
- 1 亿+ 下载量
- 1.8 亿+ 月活跃用户
- 3200 万+ 内容创作者
- 15 种不同的印度语言
- 约 150 万 条每日创建的帖子
挑战
随着 ShareChat 每天获得数千人的喜爱,该应用面临着一项挑战,即持续交付新帧,导致响应时间较慢,从而影响用户体验。
结果,应用中出现越来越多的帧丢失或延迟(也称为“卡顿”)。通过改进缓慢和冻结的帧来解决这些卡顿问题对于为所有用户提供无缝体验至关重要。这对于延长用户在应用上的停留时间、增加参与度以及提高 ShareChat 在 Android Play 商店的评分也至关重要。
他们的方法
ShareChat 与 Google 的开发者关系团队合作,通过改进应用中的缓慢和冻结的帧(卡顿)来减少卡顿并产生积极的业务影响。具体来说,他们致力于改进以下问题:
共享 RecyclerView 池 - 通过分析,他们发现创建不同的 ViewHolder 需要更长时间,为了最大限度地减少这种情况,他们创建了一个共享 RecyclerView 池。这也有助于消除类似 Feed 的 ViewHolder 创建成本。
过度布局流程 - 通过性能分析,我们还观察到一些视图持有者请求了额外的requestLayouts。为了优化,代码已更新为在创建时获取值,而不是在每次绑定时获取,从而节省了额外的requestLayout开销。
过度绘制 - 简化了布局以减少图层数量,并删除了为每个图层单独设置的颜色。
扁平化层级结构 - 通过性能分析和手动检查许多屏幕,观察到漫长的布局膨胀过程。我们使用ConstraintLayout 来扁平化层级结构,从而解决了这个问题。
过度视图膨胀 - 在性能分析期间,我们确定了某些视图的漫长膨胀时间。这些视图已转换为ViewStub。
将繁重的任务从UI线程移除 - 使用性能分析器,我们发现一些地方在主线程上执行了繁重的任务,例如创建带有标记和样式的SpannableStringBuilder(在每个RecyclerView绑定中),BlurHash解码等。这些任务已从UI线程移至后台线程。
从Rx迁移到协程 - 内存消耗也导致频繁的GC调用,并且通过>100个Rx线程导致线程数量非常高。许多用例已迁移到协程以解决这些问题。
采用Coil进行图片加载 - Glide在加载图片时,尤其是在使用Jetpack Compose构建的组件中,造成了问题。我们还发现,在LazyColumn中加载图片时,渲染阈值很高。这些情况导致我们采用Coil进行图片加载。
旧代码清理和重构 - 删除旧代码和实验性代码有助于从UI中删除不必要的隐藏视图,并帮助我们更好地重写一些屏幕。
结果
通过分析改进领域和确定优化策略,ShareChat能够提升用户的整体体验,同时提高用户参与度和Play商店评分。以下是ShareChat取得的成果的量化概述:
- Play商店中“渲染缓慢”帧减少约45%
- Play商店中“冻结”帧减少约30%
- 每渲染1万帧的卡顿帧率从10.72%降低到3.98%
- Feed滚动速度提高60%
- 商店整体评分从约4.0提升到4.3
- 帖子消费量增加10%
“在ShareChat,我们的目标是成为最好的社交媒体应用程序,让我们的用户感到满意。这也意味着在应用程序性能方面做到最好。我们与Google开发者关系团队的合作帮助我们确定了在大多数低端用户设备上改进的领域。我们学习了最佳性能实践和工具,以识别和修复冻结帧、卡顿、过度绘制和ANR。”
– Vihaan Verma,ShareChat Android团队工程经理