
點選桌面App圖示,Launcher程序采用Binder IPC向system_server程序發起startActivity請求;
system_server程序接收到請求後,向zygote程序發送建立程序請求;
Zygote程序fork出新的子程序,即App程序;
App程序,通過Binder IPC向sytem_server程序發起attachApplication請求;
system_server程序在收到請求後,進行一系列準備工作後,再通過binder IPC向App程序發送scheduleLaunchActivity請求;
App程序的binder線程(ApplicationThread)在收到請求後,通過handler向主線程發送LAUNCH_ACTIVITY消息;
主線程在收到Message後,通過發射機制建立目标Activity,并回調Activity.onCreate()等方法。
至此,App進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束後便可以看到App的主界面。
完整監控
要完整的監控App啟動時間,需要從使用者點選桌面應用圖示開始,但是因為那時我們的應用還沒有啟動,無法在代碼裡完成監控.
應用内監控
方案描述
監控從Application初始化開始到首頁的activity完成展示為止.
PS:當activity調用onWindowFocusChanged時,UI就完全展示了.
冷啟動和熱啟動
冷啟動是App沒有被啟動過,程序不在記憶體中,點選桌面圖示到看到首頁.
熱啟動是App曾經啟動過,程序還在記憶體中,點選桌面圖示到看到首頁.
冷啟動時間: 從Application到首頁Activity的onWindowFocusChanged.
熱啟動時間:從第一個Activity的onCreate到首頁Activity的onWindowFocusChanged.
時間計算陷阱
雖然上圖的時間計算看似非常簡單,但是實際還有陷阱.
因為啟動應用到首頁的過程中還可能出現歡迎界面,請求權限界面,登陸界面等等.這些場景出現時,統計時間應該廢棄,不算做正常的啟動時間.
https://www.jianshu.com/p/59a2ca7df681