【学习资料】Android中如何计算App的启动时间?
发布时间:2016年03月21日 17:26分 来源:博为峰教育网采编 关键词:Android App开发 | 上一篇 | 下一篇 |
正常情况下点击桌面图标只启动一个有界面的 Activity,此时 displayStartTime 与mLaunchStartTime 便指向同一时间点,此时 ThisTime=TotalTime。另一种情况是点击桌面图标应用会先启动Android App开发一个无界面的 Activity 做逻辑处理,接着又启动一个有界面的Activity,在这种启动一连串 Activity 的情况下( 知乎的启动就是属于这种情况 ),display Start Time 便指向最后一个 Activity 的开始启动时间点,mLaunch Start Time 指向第一个无界面Activity的开始启动时间点,此时 ThisTime!=TotalTime。这两种情况如下图:
在上面的图中,用①②③分别标注了三个时间段,在这三个时间段内分别干了什么事呢?
●在第①个时间段内,AMS 创建 Activity Record 记录块和选择合理的 Task、将当前Resume 的 Activity 进行 pause;
●在第②个时间段内,启动进程、调用无界面 Activity 的 onCreate() 等、 pause / finish 无界面的 Activity;
●在第③个时间段内,调用有界面 Activity 的 onCreate、onResume。
看到这里应该清楚 ThisTime、TotalTime、WaitTime 三个时间的关系了吧。WaitTime 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间;ThisTime 表示一连串启动 Activity 的最后一个 Activity 的启动耗时;TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个Android App开发应用 Activity pause 的耗时。也就是说,开发者一般只要关心 TotalTime 即可,这个时间才是自己应用真正启动的耗时。
Event log中TAG=am_activity_launch_time中的两个值分表表示 ThisTime、TotalTime,跟通过 “adb shell am start -W ”得到的值是一致的。
下系统根据什么来判断应用启动结束。我们知道应用启动包括进程启动、走 Activity生命周期 onCreate/onResume 等。在第一次 onResume 时添加窗口到WMS中,然后measure/layout/draw,窗口绘制完成后通知 WMS,WMS 在合适的时机控制界面开始显示(夹杂了界面切换动画逻辑)。记住是窗口界面显示出来后,WMS 才调用reportLaunchTimeLocked() 通知 AMS Activity 启动完成。
最后总结一下,如果只关心某个应用自身启动耗时,参考TotalTime;如果关心系统启动应用耗时,参考WaitTime;如果关心应用有界面Activity启动耗时,参考ThisTime。
计算机最让人着迷的一点就是其准确性,1+1永远等于2,启动耗时多久就是多久,每一次可能不一样,但每一次的时间都是这一次的准确时间。不过每个公司由于对应用的定位不同,所以对应用Android App开发启动的要求也不一样。比如有的做ROM的公司,其内置应用的启动时间一定是要非常快的,这样给用户的第一感觉就是快、流畅;互联网公司的 App 则不是很关心启动速度,大部分互联网公司的应用都有一个启动页,用来展示广告或者功能介绍之类的,然后才会进入到主界面。需求不一样,这么做也无可厚非,不过从消费者的角度来看,越早见到主界面当然越好。
所以关于Android App开发 ,开发者在做的时候一定要记得将应用的启动时间作为一个性能指标,毕竟天下武功,唯快不破!