站在GITYUAN大神的肩膀上學習,用一張神圖表示進程基本的啟動流程.
93730-5121eb1d162d109e.png
上圖還需對照源碼進行查看,簡述一下啟動流程
<p>
在Android系統全貌描述到了Zygote孵化了第一個進程是system_server進程,而且孵化第一個App進程是Launcher,也就是桌面App。
<p>
當點擊
桌面App
的時候,發起進程就是Launcher
所在的進程,啟動遠程進程,利用Binder
發送消息給system_server進程
;<p>
在
system_server進程
中啟動了N多服務,例如ActiivityManagerService,WindowManagerService
等。啟動進程的操作會先調用AMS.startProcessLocked
方法,內部調用 Process.start(android.app.ActivityThread);
而后通過socket
通信告知Zygote進程fork子進程
,即app進程。進程創建后將ActivityThread
加載進去,執行ActivityThread.main()
方法。<p>
在
app進程
中,main方法
會實例化ActivityThread
,同時創建ApplicationThread,Looper,Hander對象
,調用attach方法
進行Binder
通信,looper
啟動循環。attach
方法內部獲取ActivityManagerProxy
對象,其實現了IActivityManager
接口,作為客戶端調用attachApplication(mAppThread)
方法,將thread
信息告知AMS
。<p>
在
system_server進程
中,AMS
中會調用ActivityManagerNative.onTransact
方法,真正的邏輯在服務端AMS.attachApplication
方法中,內部調用AMS.attachApplicationLocked
方法,方法的參數是IApplicationThread
,在此處是ApplicationThreadProxy
對象,用于跟前面通過Process.start()
所創建的進程中ApplicationThread
對象進行通信。attachApplicationLocked
方法會處理Provider, Activity, Service, Broadcast
相應流程,調用ApplicationThreadProxy.bindApplication
方法,通過Binder
通信,傳遞給ApplicationThreadNative.onTransact
方法。
在app進程
中,真正的邏輯在ActivityThread.bindApplication
方法中。bindApplication
方法的主要功能是依次向主線程發送消息H.SET_CORE_SETTINGS 和H.BIND_APPLICATION
。后續創建Application,Context
等。Activity
的回調也會是通過Binder通信,然后發送不同消息處理。
.