標籤:gem http ams off installer oncreate 並且 emma 是什麼
http://www.jianshu.com/p/6037f6fda285
zygote是什嗎?有什麼作用?
zygote意為“受精卵“。
在Android系統裡面,zygote是一個進程的名字。Android是基於Linux System的,當你的手機開機的時候,Linux的核心載入完成之後就會啟動一個叫“init“的進程。在Linux System裡面,所有的進程都是由init進程fork出來的,我們的zygote進程也不例外。
所以當系統裡面的第一個zygote進程運行之後,在這之後再開啟App,就相當於開啟一個新的進程。而為了實現資源共用和更快的啟動速度,Android系統開啟新進程的方式,是通過fork第一個zygote進程實現的。所以說,除了第一個zygote進程,其他應用所在的進程都是zygote的子進程,這下你明白為什麼這個進程叫“受精卵”了吧?因為就像是一個受精卵一樣,它能快速的分裂,並且產生遺傳物質一樣的細胞!
SystemServer是什嗎?有什麼作用?它與zygote的關係是什嗎?
SystemServer也是一個進程,而且是由zygote進程fork出來的。
系統裡面重要的服務都是在這個進程裡面開啟的,比如
ActivityManagerService、PackageManagerService、WindowManagerService等等
public final class SystemServer { //zygote的主入口 public static void main(String[] args) { new SystemServer().run(); } public SystemServer() { // Check for factory test mode. mFactoryTestMode = FactoryTest.getMode(); } private void run() { ...ignore some code... //載入本地系統服務庫,並進行初始化 System.loadLibrary("android_servers"); nativeInit(); // 建立系統上下文 createSystemContext(); //初始化SystemServiceManager對象,下面的系統服務開啟都需要調用SystemServiceManager.startService(Class<T>),這個方法通過反射來啟動對應的服務 mSystemServiceManager = new SystemServiceManager(mSystemContext); //開啟服務 try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } ...ignore some code... } //初始化系統內容物件mSystemContext,並設定預設的主題,mSystemContext實際上是一個ContextImpl對象。調用ActivityThread.systemMain()的時候,會調用ActivityThread.attach(true),而在attach()裡面,則建立了Application對象,並調用了Application.onCreate()。 private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); } //在這裡開啟了幾個核心的服務,因為這些服務之間相互依賴,所以都放在了這個方法裡面。 private void startBootstrapServices() { ...ignore some code... //初始化ActivityManagerService mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); //初始化PowerManagerService,因為其他服務需要依賴這個Service,因此需要儘快的初始化 mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); // 現在電源管理已經開啟,ActivityManagerService負責電源管理功能 mActivityManagerService.initPowerManagement(); // 初始化DisplayManagerService mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class); //初始化PackageManagerService mPackageManagerService = PackageManagerService.main(mSystemContext, mInstaller, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); ...ignore some code... }}
這段代碼很重要。
ActivityManagerService是什嗎?什麼時候初始化的?有什麼作用?
ActivityManagerService,簡稱AMS,服務端對象,負責系統中所有Activity的生命週期。
ActivityManagerService進行初始化的時機很明確,就是在SystemServer進程開啟的時候,就會初始化ActivityManagerService。
經過上面這些步驟,我們的ActivityManagerService對象已經建立好了,並且完成了成員變數初始化。而且在這之前,調用createSystemContext()建立系統內容相關的時候,也已經完成了mSystemContext和ActivityThread的建立。注意,這是系統進程開啟時的流程,在這之後,會開啟系統的Launcher程式,完成系統介面的載入與顯示。
Android-Activity啟動流程