背景:
近来有学员朋友在群里问到关于开机动画结束时间优化对于整体开机时间减少的话题,针对这一个话题其实大家可能会感觉的很惊奇,居然开机动画还会影响开机的时间?认为开机时间优化都应该是各个业务的耗时中寻找瓶颈,然后把一些业务的耗时减少从而达到开机时间的优化。
那么到底开机动画部分的优化是否可以真的减少开机时间呢?是什么原理呢?下面将分几个部分来说明
开机时间测试方式
一般公司的测试都是使用高速摄像头,对整个开机过程画面进行摄像和计算
一般统计画面第一帧看到到logo阶段开始统计,到画面第一帧出现锁屏或者桌面结束时,即下图红框部分。
测试人员一般不会说看系统log来,因为log只是程序上的一个统计,并不符合真实用户看到的开机时间,高速摄像头这种测试方式属于真实用户的开机时间统计。
为啥开机动画影响开机时间?是否有优化空间?
要了解开机动画是否会对开机时间有影响,这里需要有framework课程相关的基础知识就会轻松一些。
首先开机动画图层的layer对应的z轴一般都是非常大的,即主要为了确保开机动画一直处于最顶层,等系统完全已经启动完成,会让开机动画进行结束,开机动画结束会把自己图层移除掉,移除后就可以看到手机的锁屏或者桌面的画面了,到这里就代表开机过程结束。
所以上面过程中有一个重要的点,开机动画处于z轴最顶层,它的结束是等系统属性service.bootanim.exit控制,这个属性的设置条件是系统接受到Activity的idel消息。而且开机动画收到service.bootanim.exit为1难道就立即结束吗?其实并不一定哈,得具体看bootanimation中的逻辑,比如自定义动画收到后很可能就是退出循环播放动画阶段,进入播放结束动画阶段,其实这里主要是为了动画完整性提高用户体验,等结束动画播放完毕开机动画才完全消失。
所以这里就开机动画的彻底消失就可能存在较大延时,主要有两个部分可以考虑优化:
优化空间
1、针对开机动画属性service.bootanim.exit设置时间,这里是否可以考虑变成只要有画面Activity画面就直接设置service.bootanim.exit呢?
2、针对service.bootanim.exit属性设置后,开机动画就理解停止画面,不做任何其他操作
优化后带来的体验上变化
上面也说明了开机动画的2个优化空间,如果说完全按上面优化思路后带来什么样结果呢?
如果把上面优化空间都进行了优化,那么就会导致开机动画在结束时间有较大的提前,可以第一时间看到Activity相关的画面,但是会有体验上的巨大差异。主要有以下两个方面
1、Activity是否真的显示完成,比如fallbackhome一般是透明看底部,一旦壁纸没有显示,那么会导致看到一个黑色背景,误以为系统黑屏,大大增加闪黑的不好体验
2、开机动画收到service.bootanim.exit是立即结束动画,没有播放结束收尾动画,这种如果设计不好的话,会给用户造成非常不好的体验,感觉过度太过突兀生硬。
当然带来的相关的体验性问题,其实也是可以设计上进行修改从而规避,比如开机动画有的公司就设计成静态的图片,不是动画,这种其实就关系不大。
一种方法验证是否有优化空间大小
有了上面知识,那么如何验证自己开机动画是否有优化空间呢?
修改如下:
把开机动画图层的z轴设置成0,这样让开机动画处于最底部,一旦有Activity等图层出现就会覆盖掉开机动画的。
演示效果如下:
正常开机动画内容
一旦有Activity已经展示了,可以看到自己开机动画位于Activity下面,还执行了一段时间,那么就可以考虑让开机动画在Activity画面一出现时候就隐藏。
总结
针对开机时间优化,如果其他地方实在做不出来更多优化后,可以考虑看看自己开机动画是否有优化的空间,确定有优化空间后再考虑具体方案进行,这里注意一定要考虑交互体验等结合起来。不然优化后会引入一堆的闪黑,开机动画播放不完整等问题就得不偿失。