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。

  1. startTime:记录刚准备调用startActivityAndWait()的时间点;
  2. endTime:记录startActivityAndWait()函数调用返回的时间点
  3. WaitTime:startActivityAndWait()调用耗时

ThisTime、TotalTime 的计算在 frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java 文件的 reportLaunchTimeLocked() 函数中。

curTime/displayStartTime/mLaunchStartTime

代码里curTime、displayStartTime、mLaunchStartTime三个时间变量:

  1. curTime表示该函数调用的时间点
  2. displayStartTime表示一连串启动Activity中的最后一个Activity的启动时间点
  3. mLaunchStartTime表示一连串启动Activity中第一个Activity的启动时间点

正常情况下点击桌面图标只启动一个有界面的 Activity,此时 displayStartTime 与mLaunchStartTime 便指向同一时间点,此时 ThisTime=TotalTime。另一种情况是点击桌面图标应用会先启动一个无界面的 Activity 做逻辑处理,接着又启动一个有界面的Activity,在这种启动一连串 Activity 的情况下(知乎的启动就是属于这种情况),displayStartTime 便指向最后一个 Activity 的开始启动时间点,mLaunchStartTime 指向第一个无界面Activity的开始启动时间点,此时 ThisTime!=TotalTime。这两种情况如下图:

curTime/displayStartTime/mLaunchStartTime

①②③分别标注了三个时间段:

  1. 在第①个时间段内,AMS 创建 ActivityRecord 记录块和选择合理的 Task、将当前Resume 的 Activity 进行 pause;
  2. 在第②个时间段内,启动进程、调用无界面 Activity 的 onCreate() 等、 pause/finish 无界面的 Activity;
  3. 在第③个时间段内,调用有界面 Activity 的 onCreate、onResume

ThisTime、TotalTime、WaitTime 三个时间的关系:

  1. WaitTime 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间;
  2. ThisTime 表示一连串启动 Activity 的最后一个 Activity 的启动耗时;
  3. 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]

猜你喜欢

转载自blog.csdn.net/u011386173/article/details/83338964