作者:余浩斐(浩斐)
拥有 6.8 亿人口的东南亚市场正在经历爆发式增长,作为东南亚领先的电商平台和阿里巴巴全球化战略的重要增长引擎,Lazada 已成长为当地领先和增长快速的旗舰电子商务平台,推动了东南亚数字经济基础设施的进步,目前Lazada业务在东南亚印尼、菲律宾、泰国、马来西亚、新加坡和越南等六国运营,员工来自全世界50个不同的国家和地区,实现了各国业务的同步推进,在买家和商家数量上继续保持了强劲的持续增长态势。
数据显示 D11 当天有超过800,000品牌和商家参与,Lazada越南首小时同比去年销售额翻番,Lazada新加坡首小时销售额较平日增长10倍!这些增量数字的背后,离不开Lazada各个团队、商家、品牌和用户的共同努力,其中无线技术团队坚持数据驱动、技术赋能,高效稳定的支撑D11期间的多方购物场景,同时在启动耗时、会场渲染、包体积和主链路体验方面都有显著的进步。
去年我们已经进行了大量布局优化等基本技术策略,在2021年我们将优化场景在一步下沉到更加细化的领域,结合“页面合并和任务重编”对应用启动进行了大幅优化,开展了针对低端机所进行的“全链路路由动态预请求”,为了进一步增强数据复用性也开展了“购物车增量更新”和“下单页首屏预判”......链接针对Lazada 启动、首页、PDP、Cart、Checkout等基础链路核心场景所进行的多方面体验优化,形成了链路级别的用户体验再升级,量变的过程也势必将引发质变的结果,最终提升整体的业务转化效率.
启动任务编排&懒加载
应用启动作为用户进入首页的第一必经环节,启动性能带给用户的体感很大程度决定了用户接下来是否选择继续留存,因此对App的启动优化我们一直是持续精进,同时随着业务的不断复杂以及可优化空间的逐渐压缩,优化遇到的挑战也是非常大,也经历了不断的探索。
应用启动阶段大大小小有几十个任务,这些任务需要主线程进行调度并行,同时主线程自身也需要执行一些必须执行的任务,任务之间还有逻辑上的依赖和锁依赖,因此我们将任务分成若干个组,组内并行可以达到最大并发效果,组间串行解决依赖问题,组和组之间由主线程进行同步调度,在任务并发和依赖之间达到平衡的调度框架。
启动任务优化的宗旨就是要让组内任务并行更快,减少主线程的占用,让主线程能够更快地调度下一组, 因此每一组的启动时长由组内的最长耗时任务决定,通过对任务进行编排,让有逻辑依赖和锁依赖的任务尽量不分在相同的组,基于这个原则我们通过systrace等工具对短板任务和锁进行了进一步的梳理并进行了针对性优化:
- 对耗时过长任务进一步进行拆分,缩短任务在单组中的耗时;
- 尽量在保持依赖关系的前提下对下列使用loadLibrary锁的任务进行分散编排,最大程度减少锁竞争;
- 对耗时任务进行优化,对不必要在系统启动阶段使用的任务在可交互后初始化。
通过以上的优化策略,本期优化启动时间相对去年双11有较大幅度的改善,随着优化的进一步进展,后续的启动优化,需要有更多的积少成多的决心和耐心,不断地引入新的工具、新的思想,结合线上数据的完善更加精确地进行治理和优化。
启动页合并
在启动任务编排的基础上,我们在启动过程中可以观察到,一次完整的启动过程,APP会经历Application的创建,闪屏页Activity的创建,最后才是用户真正看到的首页Activity,即LazadaApplication.onCreate() -> EnterActivity.onCreate() -> MainTabActivity.onCreate()
如果将这两个页面合并为一个Activity,用户启动即首页。在Activity内部通过Vie