從startActivity()開始,最終都會調用startActivityForResult()java
在該方法裏面會調用Instrumentation.execStartActivity()執行(Instrumentation主要用來監控應用程序和系統的交互)啓動,execStartActivity()方法裏面有2個方法,一個是ActivityManagerNative.getDefault().startActivity()這個方法是執行act啓動的,另外還有一個方法checkStartActivityResult(result, intent),這個方法是用來檢測啓動結果的。app
再回到啓動流程上,ActivityManagerNative.getDefault()返回的是IActivityManager,IActivityManager也是一個接口,他是實現類是一個代理類ActvityManagerProxy(他是AMS的代理,他會獲取到IBinder類型的AMS的引用),他經過IBinder向ActivityManagerService(如下簡稱AMS)發送啓動Act請求,
接着AMS會通過一系列處理,中間會將須要建立的activity的具體信息初始化,並將其一路傳下去。最後經過app.thread.scheduleLauncherActivity來實現進程切換,啓動activity;佈局
app.thread指的是IApplicationThread,它的實現是ActivityThread的內部類ApplicationThread,其中ApplicationThread繼承了IApplicationThread.Stub。app指的是傳入的要啓動Activity所在的應用程序(就是你本身當前的app進程)。由於當前的AMS代碼運行在SystemServer進程中,經過這裏切換回來。同時也說明ApplicationThread是應用程序與SystemServer進程溝通的橋樑。優化
ApplicationThread經過scheduleLauncherActivity()向名爲H的hadnler發送類型爲LAUNCH_ACTIVITY的消息(此方法會將啓動act的參數封裝爲ActivityClientRecord並傳遞過去),H的handleMessage裏最後調用performLauncherActivity來完成act的啓動。ui
先獲取ActivityInfo(用於存儲代碼已以及manifest信息,好比theme和launchmode),獲取LoadedApk,獲取ComponentName(包含Act的包名類名),啓動act上下文環境,根據ComponentName獲取類名,用類加載器建立該activity實例,建立application(若是沒有的話),接着初始化act調用activity.attach(args...),這個方法會建立window對象,而後會將Decorview添加到window中,同時會建立viewRootImpl,將Decorview和viewRootImpl關聯起來。這個viewRootImpl是完成view繪製的三大流程的(具體的時機是onResume方法第一次執行後,這時候會調用WindowManager的addView()方法,這個方法裏會建立viewRootImpl對象,隨後將他跟decorview關聯起來,而後調用setview(方法),這裏面調用requestlayout()來執行繪製三個流程)。線程
AMS內部維護者ActivityStack(act棧),同時AMS經過ActivityThread同步activity的生命週期。代理
①點擊桌面App圖標,Launcher進程採用Binder IPC向system_server進程發起startActivity請求;
②system_server進程接收到請求後判斷,若是不存在目標進程則經過AMS向zygote進程發送建立進程的請求(經過Socket);
③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的主界面。orm
zygote意爲「受精卵「。Android是基於Linux系統的,而在Linux中,全部的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。
在Android系統裏面,zygote是一個進程的名字。Android是基於Linux System的,當你的手機開機的時候,Linux的內核加載完成以後就會啓動一個叫「init「的進程(安卓的第一個進程)。在Linux System裏面,全部的進程都是由init進程fork出來的,咱們的zygote進程也不例外。
咱們都知道,每個App其實都是
● 一個單獨的dalvik虛擬機
● 一個單獨的進程
因此當系統裏面的第一個zygote進程運行以後,在這以後再開啓App,就至關於開啓一個新的進程。而爲了實現資源共用和更快的啓動速度,Android系統開啓新進程的方式,是經過fork第一個zygote進程實現的。因此說,除了第一個zygote進程,其餘應用所在的進程都是zygote的子進程,這下你明白爲何這個進程叫「受精卵」了吧?由於就像是一個受精卵同樣,它能快速的分裂,而且產生遺傳物質同樣的細胞!server
SystemServer也是一個進程,並且是由zygote進程fork出來的。
知道了SystemServer的本質,咱們對它就不算太陌生了,這個進程是Android Framework裏面兩大很是重要的進程之一——另一個進程就是上面的zygote進程。
爲何說SystemServer很是重要呢?由於系統裏面重要的服務都是在這個進程裏面開啓的,好比 ActivityManagerService、PackageManagerService、WindowManagerService等等。xml
ActivityManagerService,簡稱AMS,服務端對象,負責系統中全部Activity的生命週期。
ActivityManagerService進行初始化的時機很明確,就是在SystemServer進程開啓的時候,就會初始化ActivityManagerService。
1.資源文件打包(佈局文件xml,manifest),生成R.java。
2.AIDL文件生成對應的java文件
3.編譯項目源碼,生成.class文件
4.將java文件轉換成dex文件,將java字節碼轉化爲Dalvik本身餓啊,壓縮常量池
以及清除冗餘信息等。
5.經過該APKBuilder將資源文件,dex生成apk文件
6.keystore對apk簽名
7.若是是正式版的apk,還會做對齊處理,就是將全部的資源文件其實距離4字節
的整數倍,這樣經過內存訪問apk文件會更快。
一、複製APK到/data/app目錄下,解壓並掃描安裝包。 二、資源管理器解析APK裏的資源文件。 三、解析AndroidManifest文件,並在/data/data/目錄下建立對應的應用數據目錄。 四、而後對dex文件進行優化,並保存在dalvik-cache目錄下。 五、將AndroidManifest文件解析出的四大組件信息註冊到PackageManagerService中。 六、安裝完成後,發送廣播。