启动优化<上>-第7讲
启动分析
着手优化之前,首先分析启动过程。
- 首先预览窗口,系统拉起App进程之前,会根据app的Theme属性创建预览窗口。当然,我们禁用预览窗口或者预览窗口为透明时,用户依然可以看到桌面。
- 进程和闪屏页创建完毕,可以看到广告图片界面
- 主窗口创建完成可以看到首页了
- 首页加载完,才能操作起来
启动遇到的问题
- 点击图标很久都不响应。可能是禁用了预览窗口或者透明皮肤
- 首页显示太慢。闪屏广告、其它准备工作都要在启动阶段完成,如果耗时太多就慢
- 首页显示后无法操作。工作异步延后之后,首页就会出现白屏,或者首页出来无法操作
启动优化
优化工具:综合看来,在卡顿优化中提到的 “systrace + 函数插桩” 是比较理想的方案,而且还能看到一些关键事件:GC、SystemServer 、CPU 调度等
准确的评估之后,才能指引优化的方向
优化方式
- 闪屏优化。今日头条把预览窗口与是县城闪屏效果,用户在很短时间内看到“预览闪屏”,不过这种实现对于低端机型会把总的闪屏时间拉长。所以比较推荐在 6.0及以上的版本才采用“预览闪屏”
- 业务梳理。清楚启动过程中每一个运行的模块,哪些是一定需要的,哪些是可以砍掉,可以懒加载的。还有,懒加载要防止集中化,容易出现首页用户无法操作的情况。
- 线程优化。主要在于减少cpu调度带来的波动,让应用启动更加稳定。具体做法是,一方面控制县城的数量,要有线程池(我们是采用Rxjava,统一管理线程池);还有一个就是管理线程的锁,比如业务有先后顺序,或者优先级不同,这一点可以采用第三方启动框架来解决,比如阿里开源的Alpha、微信内部使用的mmkernel
启动优化<下>-第8讲
启动进阶方法
启动过程不建议出现网络io
还有,就是数据结构选择问题,在启动时,只需要读写很少量的 sp文件,如果与很大的sp文件一起解析,这个解析时间可能就要超过 100ms了(可以说我们的application中的sp解析是花了很长时间的)。
黑科技
应用加固对启动速度来说是灾难
启动监控
- 实验室监控,如果客观地反映启动耗时,视频录制是非常好的选择,尤其是我们拿不到竞品的数据(通过分析竞品,我们制定了秒开的标准,可以取平均值、最大值、最小值)
- 线上监控。我们使用talkingdata来监测。(但是我们要注意监测的耗时),最终衡量指标呢,使用平均法容易忽略掉性能差的手机,可以使用快开慢开比:比如2秒快开比,5秒快开比;另一种就是 90% 用户启动时间,如果90%用户启动时间都小于5秒,那我们90%区间启动耗时就是5秒。