启动 Activity 时,ActivityManager 会自动打印:
06-25 15:09:32.519 1440-1502/? I/ActivityManager: Displayed com.gdeer.hub/.MainActivity: +1s412ms (total +1s978ms)
在 ActivityRecord 的 reportLaunchTimeLocked 方法中执行。
- thisTime:从启动到绘制完成的时间
- totalTime:thisTime + 目标 Activity 启动前的 Activity 启动时间(如 A 的 onCreate 中启动了 B,B 的 totalTime 就跟 thisTime 不一样了)
(ADB 命令的 -W 启动,也会输出 thisTime、totalTime,与这里打印的一致)
核心代码是:
final long thisTime = curTime - displayStartTime;
curTime 就是方法调用时的时间,displayStartTime 是一个成员变量。
那么问题就是:
- displayStartTime 在哪里赋值?
- reportLaunchTimeLocked 方法在哪里调用?
两种方法查看:断点看调用栈、自己分析源码。断点发现看不了,只能自己分析了。
displayStartTime
在 ActivityStack 的 setLaunchTime 方法中赋值。
setLaunchTime 有两个地方调用
* setLaunchTime
* minimalResumeActivityLocked(ActivityStack)
* realStartActivityLocked(ActivityStackSupervisor)
* attachApplicationLocked
* attachApplicationLocked (ActivityManagerService)
* attachApplication
* attach(ActivityThread)
* main
* startSpecificActivityLocked
* makeVisibleAndRestartIfNeeded(ActivityStack)
* ensureActivitiesVisibleLocked
* ensureActivitiesVisibleLocked(ActivityStackSupervisor)
* goToSleep(ActivityStack)
* startActivityLocked
* positionChildAt
* positionTaskInStack(ActivityManagerService)
* resumeTopActivityInnerLocked
* startSpecificActivityLocked(ActivityStackSupervisor)
reportLaunchTimeLocked
reportLaunchTimeLocked 两个地方调用
* reportLaunchTimeLocked(ActivityRecord)
* reportFullyDrawnLocked
* reportActivityFullyDrawn(ActivityManagerService)
* reportFullyDrawn(Activity)
* onWindowsDrawn
* handleMessage(NOTIFY_WINDOWS_DRAWN)(AppWindowContainerController.H)
* reportWindowsDrawn(AppWindowContainerController)
* updateReportedVisibilityLocked(AppWindowToken)
* onFirstWindowDrawn
* performShowLocked(WindowState)
* showAllWindowsLocked(AppWindowAnimator)
* HandleOpeningApps(WindowSurfacePlacer)
* handleAppTransitionReadyLocked
* performSurfacePlacement(RootWindowContainer)
* WindowManagerService
结论
大约是在从启动、到绘制完成需要的时间。
开始的点:
- 冷启动:ActivityThread 执行
attach
时。(在ApplicationThread.bindApplication()
执行后,在LoadedApk.newApplication()
执行前,所以在Application.attachBaseContext()
之前) - 热启动:ActivityStackSupervisor 执行
startSpecificActivityLocked
时。(在Activity.performLaunchAcitivity()
之前,所以在Activity.onCreate()
之前)
结束的点:
不知道。(比 onWindowFocusChanged 晚一丢丢)
(按这张图,开始计时的点是 581-285=294)