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線程

 

 

 

 

 

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