一、测量方式
1. 使用AM服务启动App的第一个界面并输出应用启动时间。
通过adb命令执行am命令启动App并出界应用启动时间。
命令格式:
adb shell am start -W packagename/packagename.首页Activity
示例:
adb shell am start -W com.example.demoapp/com.example.demoapp.MainActivity2
结果:
➜ DemoApp adb shell am start -W com.example.demoapp/com.example.demoapp.MainActivity2 Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.demoapp/.MainActivity2 } Status: ok Activity: com.example.demoapp/.MainActivity2 ThisTime: 967 TotalTime: 967 WaitTime: 1011 Complete
ThisTime:最后启动的Activity的耗时。
TotalTime:所有Activity启动耗时。
WaitTime:是AMS启动Activity耗时。
由于例子中只启动了一个Activity,所以ThisTime和TotalTime时间一致。
使用adb shell am命令很方便的输出了应用启动时间及Activity启动耗时,但是,时间并不太精准。
在实际场景也不会有应用去执行adb shell am命令收集指定应用的启动耗时。
应用启动耗时统计从App启动到首页第一屏展示过程的时间,而不是单指应用首页Activity启动耗时。
2. 手动打点
需要明确应用启动到首页第一屏UI展示为结束的时间点计算为应用启动时间。
从桌面launch触发应用启动到首页Activity展示,这个过程中哪些是应用中可以控制的,哪些是系统控制的。
launch App -> AMS -> zygote -> create app process -> attachApplication -> bindApplication -> attachBaseContext -> create activity。 这个过程应用最早被调用的函数是Application.attachBaseContext()。
应用启动时间从Application.attachBaseContext()函数中开始计时,一直到首页Activity第一屏UI展示结束,是应用启动的耗时。
在网上大部分资源都是到首页Activity.onWindowFocusChanged(hasFocus: Boolean)函数,这个函数是Activity的首帧渲染时间,并不是首页第一屏展示时间。