android-27 APP的啓動流程 重點

一、系統的啓動過程

在學習APP的啓動之前先簡單瞭解下系統的啓動,有助於我們更好的學習APP的啓動。系統的啓動過程很複雜,這裏簡單化,只關心大致流程和涉及到的一些名詞以及相關類的作用

APP的啓動可以簡單總結爲一下幾個流程:

加載BootLoader --> 初始化內核 --> 啓動init進程 --> fork出Zygote進程 --> fork出SystemServer進程

 

 

  • 系統中的所有進程都是由Zygote進程fork出來的
  • SystemServer進程是系統進程,很多系統服務,例如ActivityManagerService、PackageManagerService、WindowManagerService…都是存在該進程被創建後啓動
  • ActivityManagerServices(AMS):是一個服務端對象,負責所有的Activity的生命週期,AMS通過Binder與Activity通信,而AMS與Zygote之間是通過Socket通信
  • ActivityThread:本篇的主角,UI線程/主線程,它的main()方法是APP的真正入口
  • ApplicationThread:一個實現了IBinder接口的ActivityThread內部類,用於ActivityThread和AMS的所在進程間通信
  • Instrumentation:可以理解爲ActivityThread的一個工具類,在ActivityThread中初始化,一個進程只存在一個Instrumentation對象,在每個Activity初始化時,會通過Activity的Attach方法,將該引用傳遞給Activity。Activity所有生命週期的方法都有該類來執行

 

二、從點擊桌面開始APP的啓動過程

APP的啓動,我們使用一張圖來說明這個啓動過程,順便也總結下上面所說的ActivityThread的main方法執行到Activity的創建之間的流程

 

  • 點擊桌面APP圖標時,Launcher的startActivity()方法,通過Binder通信,調用system_server進程中AMS服務的startActivity方法,發起啓動請求
  • system_server進程接收到請求後,向Zygote進程發送創建進程的請求
  • Zygote進程fork出App進程,並執行ActivityThread的main方法,創建ActivityThread線程,初始化MainLooper,主線程Handler,同時初始化ApplicationThread用於和AMS通信交互
  • App進程,通過Binder向sytem_server進程發起attachApplication請求,這裏實際上就是APP進程通過Binder調用sytem_server進程中AMS的attachApplication方法,上面我們已經分析過,AMS的attachApplication方法的作用是將ApplicationThread對象與AMS綁定
  • system_server進程在收到attachApplication的請求,進行一些準備工作後,再通過binder IPC向App進程發送handleBindApplication請求(初始化Application並調用onCreate方法)和scheduleLaunchActivity請求(創建啓動Activity)
  • App進程的binder線程(ApplicationThread)在收到請求後,通過handler向主線程發送BIND_APPLICATION和LAUNCH_ACTIVITY消息,這裏注意的是AMS和主線程並不直接通信,而是AMS和主線程的內部類ApplicationThread通過Binder通信,ApplicationThread再和主線程通過Handler消息交互。 ( 這裏猜測這樣的設計意圖可能是爲了統一管理主線程與AMS的通信,並且不向AMS暴露主線程中的其他公開方法,大神可以來解析下)
  • 主線程在收到Message後,創建Application並調用onCreate方法,再通過反射機制創建目標Activity,並回調Activity.onCreate()等方法
  • 到此,App便正式啓動,開始進入Activity生命週期,執行完onCreate/onStart/onResume方法,UI渲染後顯示APP主界面

 

 

參考https://www.jianshu.com/p/657336b545bd

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