標籤:
源碼基於Android 4.4。 system_server的初始化system_server受AMS管理,負責啟動framework-res.apk和SettingsProvider.apk。system_server調用AMS介面初始化需要的成員。
system_server.java::ServerThread.run()
context = ActivityManagerService.main(); //獲得一個context,提供給system_server做運行環境——AThread thr = new AThread().start(); //建立AMS對象,此線程名為ActivityManager————new ActivityManagerService();————Lopper.loop(); //訊息迴圈——ActivityManagerService m = thr.mService; //通過運行AThread得到的AMS執行個體——mSelf = m;——ActivityThread at = ActivityThread.systemMain(); //建立ActivityThread對象,提供給system_server做運行環境————ActivityThread thread = new ActivityThread();————thread.attach(); //建立Instrumentation,Application和Context(ContextImpl)對象。一個進程支援多個Application,儲存在mApplications中——————app.onCreate(); //調用Application的onCreate函數——m.mContext = at.getSystemContext(); //得到一個system的Context對象,單例模式(只有為null的時候才會初始化)————LoadedApk info = newLoadApk(); //代表一個載入到系統中的apk————context.init(); //此處初始化沒有綁定ApplicationInfo,僅僅建立一個運行環境——m.MainStact = new ActivityStack(); //ActivityStack管理Activity的啟動和調度——m.startRunning(); //標記變數,啟動systemReady()(此次不啟動)————systemReady(); ActivityManagerService.setSystemProcess(); //這樣system_server可加到AMS中,並被他管理——ServiceManager.addService(); //添加activity,meminfo,gfxinfo,cpuinfo,permission服務——Application info = mSelf.mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS) //使用AMS的context對象,查詢名為android的ApplicationInfo,即frameworks-res.apk——mSystemThread.installSystemApplicationInfo(); //載入framework-res.apk————ContextImpl context = getSystemContext(); //和在AMS的main中擷取的system contxt是同一個Context,由於在上面已經初始化,這裡就直接return mSystemContext了————context.init(); //此處重新初始化,加入了來源於framewrok-res.apk的ApplicationInfo——ProcessRecord app = mSelf.newProcessRecordLocked(); //進程的資訊都儲存在這,此處該ProcessRecord名為system。ProcessRecord會初始化電量統計batteryStats,ApplicationInfo,進程名processName,與應用進程互動的IApplicationThread(調用schdduleLaunchActivity,scheduleStopActivity等方法),調度優先順序,OOM_adj,進程是否常駐persistent(AMS為system_server設定了常駐)——mSelf.mProcessNames.put(app...); //儲存ProcessRecord對象——mSelf.mPidsSelfLocked.put(app...); //儲存ProcessRecord對象——mSelf.updateLruProcessLocked(app); //調整進程調度優先順序和OOM_Adj ActivityManagerService.installSystemProviders(); //將SettingsProvider放到system_server進程中來運行,和framework-res.apk運行在一起,這就是多個APK運行在一個線程的執行個體——ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID); //查詢滿足條件的ProviderInfo資訊,將他分別儲存到AMS和ProcessRecord中——providers = mSelf.generateApplicationProcidersLocked(app); //返回ProviderInfo List——mSystemThread.installSystemPrividers(providers); //為該進程安裝ContentProvider(該函數是標準的ContentProvider安裝時調用的程式),此處為SettingsProvider,因為SettingsProvider的uid為android.uid.system,processName為system。framework-res.apk中也是這樣的。這兩個apk放在同一個進程裡,提高了通訊效率。//此處不再區分系統進程還是應用進程,只和ActivityThread互動 ActivityManagerService.self().setWindowManager(); //內部儲存WMS//暫無分析 ActivityManagerService.self().systemReady();第一階段——new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);——broadcastIntentLocked(); //發送ACTION_PRE_BOOT_COMPLETED廣播,暫時沒有接收該廣播的地方,估計和系統升級有關。第二階段——removeProcessLocked(); //將AMS還未啟動完畢就先啟動的應用進程殺掉。——retrieveSettings(); //從Settings資料庫中擷取配置資訊,這裡只擷取了4個設定:debug_app,wait_for_debugger,always_finish_activities,font_scale第三階段——goingCallback.run(); //調用回呼函數————startSystemUi(); //啟動SystemUi.apk,即系統的狀態列————*.systemReady(); //調用其他服務的systemReady()————Watchdog.getInstance().start(); //啟動Watchdog——addAppLocked(info); //啟動ApplicationInfo對應的Application所在的進程。在這裡persistent為1的App都會被啟動。——mMainStack.resumeTopActivityLocked(null); //啟動位於ActivityStack最上方Activity,如果為空白則啟動HOME————mService.startHomeAcgtivityLocked(); //因為這是系統初次啟動,所以ActivityStack為空白。mService即AMS——————(ActivityStack.java)activityIdleInternal() //HOME activity啟動完畢後,該函數被調用————————mService.finishBooting(); //AMS的finishBooting函數——————————broadcasrIntentLocked(new Intent (Intent.ACTION_BOOT_COMPLETED)) //發送ACTION_BOOT_COMPLETED
著作權,轉載請註明出處:
http://www.cnblogs.com/sickworm/p/4220149.html
【Android framework】AndroidManagerService初始化流程