启动分析前端
在真正动手开始优化以前,咱们应该先搞清楚从用户点击图标开始,...面试
启动过程分析算法
用户从桌面点击图标开始,会经历四个阶段前端框架
T1 预览窗口显示。系统在拉起微信进程以前,会先根据应用的Theme属性建立预览窗口,固然若是咱们禁用预览窗口或者将预览窗口指定为透明,用户在这段时间依然看到的是桌面微信
T2闪屏显示。在应用进程和闪屏窗口页面建立完毕,而且完成一系列inflate view onmeasure,onlayout等准备工做以后,用户能够看到flash架构
T3主页显示。在完成主窗口建立和页面显示的准备以后,用户能够看到主界面框架
T4界面可操做。在启动完成以后,应用会有比较多的工做须要继续执行,应用界面的预加载等等,在这些都完成以后才能够操做异步
2.启动问题分析函数
从启动流程的4个关键阶,咱们能够推测出用户启动过程会遇到的3个问题,这3个问题其实也是大多数应用在启动时可能会遇到的工具
1.点击图标好久都不响应
若是咱们禁用了预览窗口或者指定透明的皮肤,那用户点击图标以后,须要T2时间才能真正看到应用闪屏,对于用户体验来讲,点击了图标,过了几秒仍是停留在桌面,看起来像是没有点击成功,中低端机更加明显
2.首页显示太慢
如今应用启动流程愈来愈复杂,闪屏广告,热修复框架,插件化框架、大前端框架,全部准备工做都须要集中在启动阶段完成,上面说的T3首页显示时间对于中低端机来讲简直是噩梦
3,首页显示后没法操做
既然页面显示那么慢,那我能不能把尽可能多的工做都经过异步化延后执行呢?不少应用的确就是这么作的,但这会形成两种结果,要么首页会出现白屏,要么首页出来后用户根本没法操做
不少应用吧启动时间结束时间的统计放到首页刚出现时,这对用户是不负责的,看到一个首页,可是停住十几秒不能滑动,这对用户来讲彻底没有意义,启动优化不能过于kpi化,要从真实体验出发,着重于从点击图标到用户可操做的整个过程
启动优化
咱们但愿启动期间加载的每一个功能和业务都是必须的
1优化工具
综合来看 systrace+函数插桩 是比较理想的方案,并且还能够看到系统的一些关键事件,例如:GC、System Sever/CPU调度等
经过插桩咱们能够看到应用主线程和其余线程的函数调用流程,它的实现原理很是简单
2.优化方式
当拿到整个启动流程的全景图后,咱们能够清楚的看到这段时间内系统、应用各个进程和线程的运行状况
具体的优化方式、咱们分为闪屏优化、业务梳理、业务优化,线程优化、GC优化和系统调用优化
闪屏优化
今日头条把预览窗口实现成闪屏的效果,这样用户只须要很短的时间就能够看到“预览闪屏”这种彻底“跟手”的感受在高端机上体验很是的好,但对于中低端机,会把闪屏时间变得更长
合并闪屏和主页面的Activity,减小一个Activity会给线上带来100毫秒左右的优化,可是若是这样作的话,管理时会很是复杂,特别是有不少PWA扫一扫这样的第三方启动流程的时候
业务梳理
经过梳理以后,剩下的都是启动过程必定要用的模块,这个时候,咱们前期要“抓大放小” 经过算法进行优化,需注意过多的线程预加载会让咱们的逻辑变得更加复杂
页面优化到后面,会发现一些架构和历史包袱会拖累咱们前进的步伐,比较常见的是一些事件会被各个模块监听,大量的回调致使不少工做集中执行,部分的框架初始化“太厚”
线程优化
线程的优化主要在于减小CPU调度带来的波动,让应用的启动时间更加稳定
从具体的作法来看,线程的优化一方面试控制线程数量,线程数量太多会相互竞争cpu资源,所以要有统一的线程池,而且根据机器性能拉控制数量