Android Systrace(2) -- 应用启动时间

 

1.1 应用启动

 

我们平时在写应用的时候,一般会指定一个 mainActivity ,用户在桌面上点击这个 Activity 的时候,系统会直接起这个 Activity. 我们知道 Activity 在启动的时候会走 onCreate/onStart/onResume .这几个回调函数.

许多书里讲过,当执行完 onResume 函数之后,应用就显示出来了…其实这是一种不准确的说法,因为从系统层面来看,一个 Activity 走完 onCreate/onStart/onResume 这几个生命周期之后,只是完成了应用自身的一些配置,比如 window 的一些属性的设置/ View 树的建立(只是建立,并没有显示,也就是说只是调用了 inflate 而已) . 后面 ViewRootImpl 还会调用两次performTraversals ,初始化 Egl 以及 measure/layout/draw. 等.

所以我们定义一个 Android 应用的启动时间, 肯定不能在 Activity 的回调函数上下手.而是以用户在手机屏幕上看到你在 onCreate 的 setContentView 中设置的 layout 完全显示为准,也就是我们常说的应用第一帧.

上面扯得有点远,不感兴趣的话可以不看,下面直接说方法.

题主说的 adb shell am start -w packagename/activity,是可以完全应用的启动时间的.不过也要分场景.

 

1.2 应用第一次启动

 

也就是我们常说的冷启动,这时候你的应用程序的进程是没有创建的. 这也是大部分应用的使用场景.用户在桌面上点击你应用的 icon 之后,首先要创建进程,然后才启动 MainActivity.

这时候adb shell am start -w packagename/MainActivity 返回的结果,就是标准的应用程序的启动时间(注意 Android 5.0 之前的手机是没有 WaitTime 这个值的):

 

总结

应用的第一次启动时间(冷启动)为:点击icon到显示第一帧的时间

 

应用的第一次启动时间计算

方法1:

//大写的w
adb shell am start -w packagename/activity
ubuntu@ubuntu:~/桌面$ adb shell am start -W com.mytest.dtest1129/.MainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.mytest.dtest1129/.MainActivity }
Status: ok
LaunchState: COLD
Activity: com.mytest.dtest1129/.MainActivity
TotalTime: 354
WaitTime: 356
Complete

 

方法2:

//第一次启动时间systrace显示340.542ms,从这个应用开始到第一帧结束

 

 

activity进程启动

 

画第一帧doFrame,选择第一帧F,按m选中,F放大,帧的时间包含UI Thread(CPU 渲染)和RenderThread(GPU 渲染)渲染,每一个进程都有RenderThread线程

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章