刚进公司就把祖传代码优化了,让公司的APP稳定性提高一半,大幅提升了用户体验是什么体验?
一个字!爽!
大佬降临
去年金三银四帮公司面试的时候认识了一个挺有意思的朋友,他是专科学历,非科班出身的Android程序员。
他来了三个月后,对我们公司的那堆历史代码做了一波优化,将整体 OOM 与卡顿问题降低了77%,让公司的APP稳定性数据提高 50%,大幅提升了用户体验,一鸣惊人。
其实此前我司并不是没有尝试做过性能优化,只不过用的都是市面上比较常见的方案。
对于内存优化:
- 我们使用了 LeakCanary来在开发阶段发现内存泄露;
- 对于大家提交的代码,我们有一套静态检测机制,来发现一些常见的内存泄露的 case,例如 Cursor 没关闭,io 没关闭等等;
- 我们还有一些Code Review 机制,来发现常见的一些内存泄露,例如单例持有了 Activity对象,以及一些内存抖动的 case,比如在 onDraw 里面频繁的创建对象;
相信这些也是大多数同学现在所处项目所实施的方案,那为什么做了这么多,线上的性能问题还是一塌糊涂呢?
因为我们仅仅处理了“明面”上的问题。
为什么这么说呢?
对于内存,想要彻底的了解它,仅依赖一些写代码时的指导建议、以及 LeakCanary 去发现页面相关泄露是不足够的。
例如很多单例对象持有大量内存,例如:一些同学为了做页面打开速度,疯狂做数据缓存;一堆 Bitmap 留在内存中常驻。
想要了解全貌,该怎么做呢?
分析用户运行之后的内存快照。
大多数同学可能会说,我们也有分析内存的,比如我会在 Android Studio 的 Profiler 中对内存情况进行分析,以及我还会利用 MAT 去详细的查看内存。
这种分析确实能发现当时所处机器在特定路径上的内存问题。
但是,线上用户不同:
线上用户机器硬件配置多变,其实最主要的是线上用户的用户行为、操作路径,我们很难完全知道,等到用户 OOM 之后,报上来的堆栈,仅仅是最后申请内存达到阈值的崩溃,实际上根本的原因可能根本不在那最后一次内存申请。
如下图:
错误发生在 b.xf 第五行,导致OOM的原因,到底是此处申请了太大的内存,还是其他地方申请了太多内存导致可用内存不足亦或者程序存在内存抖动问题,导致连续内存不足,我们不得而知。
所以,我们需要线上内存监控。
对于卡顿:
我们也经常收到用户说,app 卡死了,研发对于「卡死」第一反应是不是 ANR 了?
其实用户可能只是说页面不流畅而已。
当然不管是不流畅、还是 ANR,对于客户端同学来说,都是比较难解的问题。
难解在于两点:
- 不知道用户的行为路径,ANR 还好,可能还会上报一些 ANR_INFO,不流畅可能什么信息都没有,只能看看用户的机型是不是低端机,然后问下用户的操作路径。
- 没有线上卡顿检测埋点,一般开发时我们用的都是高端机,很多卡顿是感知不出来的,而且线上我们 debug环境下打印的一些埋点信息对于线上完全起不到作用。
所以,我们需要线上卡顿监控。
那么如何进行线上的性能监控呢?
在这里我也分享一份收录整理的Android性能优化系列资料
如果你有需要的话,可以前往GitHub自行领取
这个机会希望想补习线上性能监控提高APP调优内功,跳槽进大厂的朋友好好把握,抓紧时间提升!
除此之外,在这里我还分享一份收录整理的Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料
这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在面试季取到一份不错的答卷。
当然,你也可以拿去查漏补缺,提升自身的竞争力。
如果你有需要的话,可以前往GitHub自行领取
喜欢本文的话,不妨顺手给我点个赞、评论区留言或者转发支持一下呗~
我相信,只要大家认真学习完这套体系化资料,你就有勇气在简历上写下熟悉Android线上性能监控,精通APP性能调优与项目实战这些点。从此吊打所有向你提问线上性能监控的面试官,成为一个名副其实的面霸!
转载:https://blog.csdn.net/River_ly/article/details/115874157