應用程序的啓動,又可稱爲根Activity的啓動。可是在講應用程序啓動以前,咱們有必要對應用程序進程(AppProcess)啓動有所瞭解,那是由於啓動一個應用程序首先要保證該應用程序的進程已經被啓動。AMS在啓動應用程序時,會先檢查應用程序進程是否存在,若是不存在就須要請求Zygote進程建立並啓動應用程序進程。這裏我不會貼上大段大段的代碼,只是一些總結,並提供了相關源碼的連接。java
AMS經過調用startProcessLocked方法向Zygote進程發送請求。android
Process調用start
方法,使用ZygoteProcess的start
方法。微信
在ZygoteProcess的start
方法中,前後調用了startViaZygote
、zygoteSendArgsAndGetResult
和openZygoteSocketIfNeeded
等方法,最後在openZygoteSocketIfNeeded
方法中調用了ZygoteState的connect方法創建與Zygote進程的鏈接。app
ZygoteServer執行runSelectLoop
方法,一直等待AMS的請求數據到來。svg
當AMS請求到來,與Zygote進程創建鏈接後,由ZygoteConnection的processOneCommand
方法處理請求的數據。對請求數據進行解析,獲取程序進程的啓動參數,並經過Zygote的forkAndSpecialize
方法進行應用程序進程的建立。oop
進程建立完成後,交由ZygoteInit的zygoteInit
方法和RuntimeInit的applicationInit
方法分別進行進程和應用的初始化。在zygoteInit
方法中,爲應用程序進程建立了Binder線程池,這樣進程就能夠跨進程進行通訊了。而applicationInit
方法經過反射最終會調用ActivityThread的main
方法,從而完成應用程序進程的建立。線程
講完了應用程序進程(AppProcess)啓動的相關內容後,接下來咱們就來看看應用程序是如何一步一步啓動的。code
Launcher請求AMS。orm
AMS請求ApplicationThread。cdn
ActivityThread啓動Activity。
當咱們點擊應用程序的圖標時,就會自動調用Launcher的startActivitySafely
方法, 最終會調用Activity的startActivity
方法。
在Activity的startActivity
中又調用了startActivityForResult
方法,而startActivityForResult
方法內部又調用了Instrumentation的execStartActivity
方法。
在Instrumentation的execStartActivity
方法中又經過ActivityManager的getService
方法獲取了IBinder類型的AMS引用IActivityManager
,最後調用了AMS的startActivity
方法。
在AMS的startActivity
方法中,又調用了其自己的startActivityAsUser
方法,進行權限的檢查。
權限檢查完後,調用ActivityStarter的startActivityMayWait
方法,並在該方法中解析處理應用程序須要的參數,並進行相關參數的初始化,最終會調用其startActivity
方法。而在startActivity
方法中又調用了startActivityUnchecked
方法來處理與棧管理相關的邏輯。
在處理完棧的關係後,緊接着會調用ActivityStackSupervisor的resumeFocusedStackTopActivityLocked
方法獲取須要啓動的Activity所在棧的棧頂。
當須要啓動的Activity的狀態不是RESUMED狀態,就須要調用ActivityStack的resumeTopActivityUncheckedLocked
方法,而它的內部又調用了resumeTopActivityInnerLocked
方法進行一系列的棧狀態的判斷,最終又回調了ActivityStackSupervisor的startSpecificActivityLocked
方法。
在ActivityStackSupervisor的startSpecificActivityLocked
方法中先是獲取了即將啓動的Activity所在的應用程序進程(就是在這個地方判斷應用所在進程是否存在且已啓動,若是沒有啓動,就須要啓動應用程序進程),而後調用realStartActivityLocked
方法。
在ActivityStackSupervisor的realStartActivityLocked
方法中,對啓動的應用程序進程進行一系列的判斷和處理,最終會調用IBinder類型的ApplicationThread引用IApplicationThread
,經過傳入IApplicationThread
創建ClientTransaction
,加入執行LaunchActivityItem
任務,最終實現跨進程執行調用ActivityThread的handleLaunchActivity
方法。
在ActivityThread調用了它的handleLaunchActivity
方法中,會先調用其performLaunchActivity
方法,以後調用handleResumeActivity
,將Activity的狀態置爲Resume。
在ActivityThread的performLaunchActivity方法中作了不少事情。
createBaseContextForActivity
方法,建立要啓動Activity的上下文;newActivity
方法來建立Activity實例;makeApplication
方法,建立應用程序的Application;attach
方法初始化Activity,建立Window對象並與Activity自身進行關聯。callActivityOnCreate
方法來啓動Activity。callActivityOnCreate
方法中,會調用Activity的performCreate
方法,最終會調用Activity的onCreate
方法,這樣應用程序也就啓動了。應用程序啓動的過程當中,主要涉及了Launcher進程、SystemServer進程、Zygote進程和應用程序進程這四個進程,它們之間的關係以下。
![]()