Android源碼分析--應用程序啓動

應用程序的啓動,又可稱爲根Activity的啓動。可是在講應用程序啓動以前,咱們有必要對應用程序進程(AppProcess)啓動有所瞭解,那是由於啓動一個應用程序首先要保證該應用程序的進程已經被啓動。AMS在啓動應用程序時,會先檢查應用程序進程是否存在,若是不存在就須要請求Zygote進程建立並啓動應用程序進程。這裏我不會貼上大段大段的代碼,只是一些總結,並提供了相關源碼的連接。java

應用程序進程(AppProcess)啓動

啓動大綱

  1. AMS發送啓動應用程序進程請求.
  2. Zygote接收請求並建立應用程序進程.

AMS發送啓動應用程序進程請求

在這裏插入圖片描述

  • AMS經過調用startProcessLocked方法向Zygote進程發送請求。android

  • Process調用start方法,使用ZygoteProcessstart方法。微信

  • 在ZygoteProcess的start方法中,前後調用了startViaZygotezygoteSendArgsAndGetResultopenZygoteSocketIfNeeded等方法,最後在openZygoteSocketIfNeeded方法中調用了ZygoteState的connect方法創建與Zygote進程的鏈接。app

AMS發送啓動應用程序進程請求

在這裏插入圖片描述

  • ZygoteServer執行runSelectLoop方法,一直等待AMS的請求數據到來。svg

  • 當AMS請求到來,與Zygote進程創建鏈接後,由ZygoteConnectionprocessOneCommand方法處理請求的數據。對請求數據進行解析,獲取程序進程的啓動參數,並經過ZygoteforkAndSpecialize方法進行應用程序進程的建立。oop

  • 進程建立完成後,交由ZygoteInitzygoteInit方法和RuntimeInitapplicationInit方法分別進行進程和應用的初始化。在zygoteInit方法中,爲應用程序進程建立了Binder線程池,這樣進程就能夠跨進程進行通訊了。而applicationInit方法經過反射最終會調用ActivityThreadmain方法,從而完成應用程序進程的建立。線程


應用程序(App)啓動

講完了應用程序進程(AppProcess)啓動的相關內容後,接下來咱們就來看看應用程序是如何一步一步啓動的。code

啓動大綱

  1. Launcher請求AMS。orm

  2. AMS請求ApplicationThread。cdn

  3. ActivityThread啓動Activity。

啓動時序圖

在這裏插入圖片描述

Launcher請求AMS

在這裏插入圖片描述

  • 當咱們點擊應用程序的圖標時,就會自動調用LauncherstartActivitySafely方法, 最終會調用ActivitystartActivity方法。

  • 在Activity的startActivity中又調用了startActivityForResult方法,而startActivityForResult方法內部又調用了InstrumentationexecStartActivity方法。

  • 在Instrumentation的execStartActivity方法中又經過ActivityManagergetService方法獲取了IBinder類型的AMS引用IActivityManager,最後調用了AMSstartActivity方法。

AMS請求ApplicationThread

在這裏插入圖片描述

  • 在AMS的startActivity方法中,又調用了其自己的startActivityAsUser方法,進行權限的檢查。

  • 權限檢查完後,調用ActivityStarterstartActivityMayWait方法,並在該方法中解析處理應用程序須要的參數,並進行相關參數的初始化,最終會調用其startActivity方法。而在startActivity方法中又調用了startActivityUnchecked方法來處理與棧管理相關的邏輯。

  • 在處理完棧的關係後,緊接着會調用ActivityStackSupervisorresumeFocusedStackTopActivityLocked方法獲取須要啓動的Activity所在棧的棧頂。

  • 當須要啓動的Activity的狀態不是RESUMED狀態,就須要調用ActivityStackresumeTopActivityUncheckedLocked方法,而它的內部又調用了resumeTopActivityInnerLocked方法進行一系列的棧狀態的判斷,最終又回調了ActivityStackSupervisor的startSpecificActivityLocked方法。

  • ActivityStackSupervisorstartSpecificActivityLocked方法中先是獲取了即將啓動的Activity所在的應用程序進程(就是在這個地方判斷應用所在進程是否存在且已啓動,若是沒有啓動,就須要啓動應用程序進程),而後調用realStartActivityLocked方法。

  • ActivityStackSupervisorrealStartActivityLocked方法中,對啓動的應用程序進程進行一系列的判斷和處理,最終會調用IBinder類型的ApplicationThread引用IApplicationThread,經過傳入IApplicationThread創建ClientTransaction,加入執行LaunchActivityItem任務,最終實現跨進程執行調用ActivityThreadhandleLaunchActivity方法。

ActivityThread啓動Activity

在這裏插入圖片描述

  • 在ActivityThread調用了它的handleLaunchActivity方法中,會先調用其performLaunchActivity方法,以後調用handleResumeActivity,將Activity的狀態置爲Resume。

  • 在ActivityThread的performLaunchActivity方法中作了不少事情。

  1. 首先,執行了createBaseContextForActivity方法,建立要啓動Activity的上下文;
  2. 其次,調用執行了Instrumentation的newActivity方法來建立Activity實例;
  3. 接着,調用LoadedApkmakeApplication方法,建立應用程序的Application;
  4. 以後,調用須要啓動的Activity的attach方法初始化Activity,建立Window對象並與Activity自身進行關聯。
  5. 最後,調用執行了InstrumentationcallActivityOnCreate方法來啓動Activity。
  • 在Instrumentation執行了callActivityOnCreate方法中,會調用ActivityperformCreate方法,最終會調用Activity的onCreate方法,這樣應用程序也就啓動了。

應用程序啓動的進程關係圖

應用程序啓動的過程當中,主要涉及了Launcher進程、SystemServer進程、Zygote進程和應用程序進程這四個進程,它們之間的關係以下。

在這裏插入圖片描述

聯繫方式

在這裏插入圖片描述

微信公共號

在這裏插入圖片描述
相關文章
相關標籤/搜索