客户端稳定性优化实战,Crash率最高下降40%

618期间今年与去年对比crash走势

迎难而上,各显神通

面对内存带来的挑战,我们2年以来,一直在摸索中前行,沉淀一套内存治理的经验。

面向大促,当出现了问题后,我们要去思考当前的机制与规范,于是我们制定了内存标准与业务的上线验收。同时,提供了内存分析的一套工具,方便很快很准找到问题。同时,我们制定了三套内存优化策略:

  1. 精打细算,提升内存的使用率
  2. 兜底容灾,尽量让应用延长生命
  3. 提升内存上限,突破系统的天花板

验收标准-----一夫当关

由于内存天花板的存在,从稳定性角度综合考虑,引入了大促的验收标准。标准的制定过程中,我们统计了发生OOM时的水位内位,分析出了高危,危险,正常水位线,以此为内存标准的制定指引。

内存问题之所以复杂,是因为内存是一个全局共享池子,当出现溢出问题时,在没有明显问题时,很难去界定哪个业务存在问题,因此,在考虑标准的时候,我们定义了两种场景。单页面及链路。

单页面场景主要是为了减少单个业务过多的占用内存引发的风险。前面提到内存池子是全局且有限的,当单页面占据内存过多,就会导致系统整体可用的内存大幅减少,在浏览相同页面次数的情况,增加整体内存风险。

链路场景是对常见浏览链路的内存检测,比如从首页-会场-互动-店铺-详情-下单这样的常规玩法进行多页面叠加检测,判断用户正常场景下的内存风险。

同时,在制度内存标准时,也考虑了不同技术栈之间的差异。比如H5,weex,native,包括多tab的会场形式及直播,3D等。

测试同学研发的TMQ自动化测试工具

内存优化三板斧

前面提到内存优化主要有三种策略,这里分开详述。

精打细算-提升内存的利用率

在业务屡屡触及内存天花板的情况下,每1KB的内存,都显得非常珍贵。

在实际对内存占用的分析中,我们偶尔会发现有些场景加载的图片远大于视图的大小,造成内存的浪费。或者在某些场景下,图片在内存中持有过久,比如在后台或是压栈很久后,图片所持有的空间仍不能释放出来给当前界面使用,面对这样的场景,我们在高可用体系中引用了对应的功能,能够检测出这些case,以便把内存交给用户正在使用的组件,以此来提升内存的利用率。

从图片库的数据流转以及View生命周期出发,来设计图片自动回收和恢复的实现,即当View不可见的时候,自动释放图片到图片库缓存,只保留图片的key值;当View可见的时候,又通过key恢复图片。图片片自带三级缓存策略,回收后的图片如果还在缓存,能立马恢复,对体验几乎无损。

同时,针对一些内存大户,也和各业务方约定一些实例数限制,比如详情页,有大图,还带视频,webview等,内存使用相对较大,这种情况下会对实例数做要求。目前有限制包括详情页,播放器实例等。

为了更好的体验,在降级策略上我们也做了一些优化,不再一刀切,而是根据各设备自身的能力,有选择的进行降级。要更好的达成目标,我们首先对设备进行分级,依赖于创建的智能分级。

统一降级在设备评分的基础上,提供默认的高中低端机型的设备分级能力,增加了配置化能力,为每个核心业务分配一个orange,支持业务对系统、品牌、机型、设备分、应用版本、生效时间等多个维度进行配置化降级。

依赖于统一降级,可以做到精准的体验分级,高端机型,可以采用各种特效和高清图片,能保障最优体验。中端机型,降级掉一部分特效,可以获得较好效果,低端机型,保障稳定性和基础体验。实现 “高端设备最炫体验,低端设备流畅优先,紧急问题快速降级”

统一降级后的效果

兜底容灾–尽量延长生命周期

在应用内存最危险的时候,也许下一次的内存申请即面临崩溃,在这最危险的时候,我们是否有能力缓解一下,让用户多下一单呢,为此我们设计了内存容灾SDK。

具体原理是基于gc和lowmemorykiller原理实现(Android的OOM要区分jvm heap内存不足和native的内存不足),通过监听系统的gc和lowmemorykiller,去计算系统当前所处的内存状态,当内存不足的时候,销毁掉优先级较低的Activity,从而保障用户可见面Activity能尽可能多的使用内存而不出现稳定性问题。

内存容灾基本原理

扩充上限-突破系统天花板

手淘的战略一直是航母战略,前面的打法只能缓解当前的稳定性问题,只能治标,不能治本。业务技术对内存的需求有增无减,无限坑位,会场上的直播视频等,都带来进一步的压力。只有提升端内的内存容量,才是解决内存问题的最终解法。

多进程

多进程的使用是突破系统天花板的方法之一。由于大促态的变化新增以H5的页面居多,所以我们重点希望在webview上能有一些突破。这时苹果的WKWebivew被纳入到研究范围,关于WKWebview在内存的优势,经过我们的分析结论如下:

WKWebView的内存并不计算在主应用的内存中,而是作为独立进程单独进行计算,因此对于应用来说使用WKWebView相比UIWebView,应用整体可以使用更多的内存,因为Web的内存都在WKWewbView的Web进程中,并不影响主应用的内存上限。

对于Android来说,平台本身则支持的多进程方式,因此,我们最初的设计中,是依赖于Activity的独立进程方式,即使BrowserActivity独立出来。

在99大促的AB实验中,对比对照组,在访问过淘金币/互动的用户中,主进程native crash率下降15%-18%,Crash计数(主+子) 下降1万次以上。在所有用户中,下降3%-5%,对内存的优化效果还是比较明显。

但是考虑到很多基础SDK在设计之初并没有考虑到多进程的方式,且多进程下应用的生命周期也有一些变化,整体方案不确认的风险较大。最终采用的是UC内核的多进程方案,它将整个H5页面的解析、排版、js执行等实现抽离封装到一个独立的进程中,分担了主进程一部分内存压力,从而实现突破单进程内存容量天花板的目标。

UC多进程示意图

uc多进程对crash率的影响

根据严格AB实验的结果评估,手淘开启UC多进程之后,Crash率能有30-40%的下降收益。

64位升级

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

题外话

我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

3598038347)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值