在重(万)要(恶)且漫长的性能优化道路上,启动优化我们最重要的第一步。作为用户交互最频繁的启动页面,如果总是白屏、闪屏、加载漫长,那么用户根本无心继续探索,更有甚者可能就直接把App卸载了,我们开发的各种精美功能也就无法与用户见面了(8s定律了解一下)。
所谓的启动优化,基本都是针对冷启动阶段,一般都是从两个方面着手处理。
启动主题优化
启动主题优化-所谓的主题优化,就是应用程序在冷启动的时候(1~2阶段),设置启动窗口的主题。因为现在 App 应用启动都会先进入一个闪屏页来展示应用信息。一般大家会通过透明主题优化、设置闪屏图片主题等方式来进行优化。其实这种方式并没有真正的加速应用进程的启动速度,只是通过用户视觉效果带来的优化体验,治标不治本。
代码优化
想要从根本上进行启动优化,我们还是要通过代码来解决问题。首先可以统计下程序冷启动的时间。一般我们可以通过adb 命令统计,还有就是系统日志统计。启动时间统计好之后,就是对Application 优化。
Application 作为应用程序的整个初始化配置入口,时常担负着它不应该有的负担。有很多第三方组件(包括App应用本身)都在 Application 中抢占先机,完成初始化操作。但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能。
所以对于Application来说,采用异步或者延迟的方式进行加载是我们最常用的手段。
异步优化虽然逻辑上并不难,但实际操作过程中,还是会踩到很多坑:
-
代码不优雅:例如使用线程池实现多个并行异步任务时会有多个executorService.submit代码块
-
场景不好处理:各个初始化任务之间存在依赖关系,例如推送sdk的初始化任务需要依赖于获取设备id的初始化任务。此外,有些任务是需要在某些特定的时候就初始化完成,例如需要在Application的onCreate方法执行完之前就初始化完成
-
维护成本高
-
不符合异步要求
-
……
如何真正掌握启动优化
常用的启动优化手段虽然我们都有了解,但如果在面试中,只能用设置窗口背景,或同时采用异步或延迟的方式来回答启动优化问题,估计面试官肯定会让你回家。
在实际开发过程中,绝大多数的应用在启动过程中会包含很多基础 SDK,SDK 的初始化有着一定的先后顺序,业务 SDK 又是围绕着多个基础 SDK 建立的。那么如何保证这些 SDK 在正确的阶段、按照正确的依赖顺序、高效地初始化?怎么合理调度任务,才不至于让系统负载过高?如何最大化利用设备的性能,承接越来越多的业务?异步加载中线程的管理如何完成线程的同步异步?
为了帮助大家更好地掌握启动优化以及性能优化的关键核心,在这里给大家分享一份腾讯大佬历时三个月整理出来的《Android性能优化-大厂实战全解析》,我们可以看下已经在大厂中的开发者,对于性能优化有着怎样的心得:
目录
注:文章收集来源于各个大厂对外分享,按照各个大厂团队进行聚合,该文档仅用于学习使用。 关注微信公众号:Android老皮,直接lingqu