1. 程式人生 > 其它 >Android-AMS(二)-APP啟動流程分析

Android-AMS(二)-APP啟動流程分析

APP的啟動過程很複雜,程式碼錯綜交橫,這裡分析了大概流程,例如知道了AMS與主執行緒的關係,主執行緒main方法中就是APP的入口,Binder通訊機制和handler訊息機制在這個過程中的重要作用,Application的建立時機以及Application為什麼是單例,為什麼有幾個程序就建立幾個Application…等等 。

一. 系統建立ActivityThread流程分析:createSystemContext(),由SystemServer的run()呼叫。程式碼如下:

 

  通過呼叫systemMain()會建立一個ActivityThread.這個ActivityThread是給systemServer程序使用的。程式碼如下:

 

 

   在attach()中主要是做了4件事情:(這裡是SystemServer程序)

    1>.建立Instrumentation物件

    2>.createAppContext()建立SystemServer程序的Context

    3>.通過makeApplication建立SystemServer的Application

    4>.呼叫Application的onCreate()          程式碼如下:

 

   通過上面的程式碼我們可以找到getSystemContext()和makeApplication()  先看看是如何建立SystemServer的Context物件的,跟蹤getSystemContext()   程式碼如下:

 

   這裡,呼叫了createSystemContext(),繼續跟:

 

   可以看到建立SystemServer程序的Context的過程,主要是做了以下2件事情:

      1>.建立LoadedApk物件

      2>.建立Context物件,並設定Resources   

  首次執行getSystemContext會建立LoadedApk和ContextImpl物件,後面獲取的Context都是利用這裡建立的LoadedApk物件創建出新的Context.

  我們再看看makeApplication(),程式碼如下:

 

 分析到這裡。我們可以得出SystemServer程序建立Context的整個過程。我已經將整個流程整理成xmind文件了,如下圖。App的啟動流程大致與此相同,在細節上或有所差別。我們藉助這個脈絡分析App的啟動流程。請接著往下看:

 

二:APP啟動流程分析。

  當Zygote收到請求:建立一個新的APP程序,之後,會呼叫ActivityThread的main()方法,程式碼如下:

 

 可以看到在這裡主要做了兩件事情:

  1>.建立並執行主執行緒的Looper迴圈

  2>.建立ActivityThread物件,並呼叫attach(),這裡與SystemServer程序不同的是APP的attch的引數是false SystemServer程序的是true.  attrch為false時,程式碼如下:

 

 在attachApplication()中,會找到attachApplicationLocked(),跟蹤該方法。會看到如下程式碼區域:

 

 這裡的bindApplication又會通過Binder呼叫ActivityThread的bindApplication().程式碼如下:

 

   這裡看到主要做了兩件事情:

    1>.建立AppBindData

    2>.通過呼叫sendMessage()傳送Handler訊息來呼叫handBindApplication()。跟到該方法。我們可以看App的Application的建立過程和執行。程式碼如下:

 

   由上可知應用的Application在建立時的一些動作:

    1>.獲取到LoadedApk物件   一個應用對應一個LoadedApk

    2>.建立應用所需的Context物件。

    3>.建立Instrumentation物件。

    4>.建立應用的Application

    5>.通過呼叫Instrumentation的callApplicationOnCreate()呼叫Application的onCreate().

 我們梳理一下Android APP啟動流程:

  如下圖所示,系統從Launcher出發,SystemServer程序在收到Launcher程序的啟動一個APP的請求後。會先去請求Zygote程序建立一個新的應用程序,此時還是一個空程序。然後Zygote程序就會呼叫ActivityThread去初始化這個程序,包括Instrumentation,ApplicationThread,AppBindData等物件,建立完以後才會去真正建立APP的根Activity,並呼叫他的生命週期。

 

這裡主要分析的是上圖的第三步的過程。Zygote在收到請求以後,ActivityThread和AMS之間是如何協同工作的,或者說第三步主要做了一些什麼。我已經整理成xmind文件,如下圖所示: