APP的启动时间计算
本文转自https://juejin.im/entry/5aa24615f265da237b21aede
➜ adb shell am start -W com.media.painter/com.media.painter.PainterMainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.media.painter/.PainterMainActivity }
Status: ok
Activity: com.media.painter/.PainterMainActivity
ThisTime: 355
TotalTime: 355
WaitTime: 365
Complete
“adb shell am start -W ”的实现在 frameworks\base\cmds\am\src\com\android\commands\am\Am.java 文件中。其实就是跨Binder调用ActivityManagerService.startActivityAndWait() 接口(后面将ActivityManagerService简称为AMS),这个接口返回的结果包含上面打印的ThisTime、TotalTime时间.
WaitTime = endTime - startTime。
- startTime:记录刚准备调用startActivityAndWait()的时间点;
- endTime:记录startActivityAndWait()函数调用返回的时间点
- WaitTime:startActivityAndWait()调用耗时
ThisTime、TotalTime 的计算在 frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java 文件的 reportLaunchTimeLocked() 函数中。
代码里curTime、displayStartTime、mLaunchStartTime三个时间变量:
- curTime表示该函数调用的时间点
- displayStartTime表示一连串启动Activity中的最后一个Activity的启动时间点
- mLaunchStartTime表示一连串启动Activity中第一个Activity的启动时间点
正常情况下点击桌面图标只启动一个有界面的 Activity,此时 displayStartTime 与mLaunchStartTime 便指向同一时间点,此时 ThisTime=TotalTime。另一种情况是点击桌面图标应用会先启动一个无界面的 Activity 做逻辑处理,接着又启动一个有界面的Activity,在这种启动一连串 Activity 的情况下(知乎的启动就是属于这种情况),displayStartTime 便指向最后一个 Activity 的开始启动时间点,mLaunchStartTime 指向第一个无界面Activity的开始启动时间点,此时 ThisTime!=TotalTime。这两种情况如下图:
①②③分别标注了三个时间段:
- 在第①个时间段内,AMS 创建 ActivityRecord 记录块和选择合理的 Task、将当前Resume 的 Activity 进行 pause;
- 在第②个时间段内,启动进程、调用无界面 Activity 的 onCreate() 等、 pause/finish 无界面的 Activity;
- 在第③个时间段内,调用有界面 Activity 的 onCreate、onResume
ThisTime、TotalTime、WaitTime 三个时间的关系:
- WaitTime 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间;
- ThisTime 表示一连串启动 Activity 的最后一个 Activity 的启动耗时;
- TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用 Activity pause 的耗时。也就是说,开发者一般只要关心 TotalTime 即可,这个时间才是自己应用真正启动的耗时。
Event log中 TAG=am_activity_launch_time 中的两个值分别表示 ThisTime、TotalTime,跟通过 “adb shell am start -W ” 得到的值是一致的。
例:
am_activity_launch_time: [0,267963642,com.android.settings/.FallbackHome,597,597]
am_activity_launch_time: [0,18472980,com.android.launcher/com.android.launcher2.Launcher,1351,1351]
am_activity_launch_time: [0,226256788,com.android.settings/.Settings,659,659]
am_activity_launch_time: [0,176144538,com.android.settings/.Settings$ConnectedDeviceDashboardActivity,1024,1024]
am_activity_launch_time: [0,199665464,com.android.settings/.deviceinfo.UsbModeChooserActivity,390,390]
am_activity_launch_time: [0,18056767,com.android.settings/.deviceinfo.UsbModeChooserActivity,280,280]