【Android framework】AndroidManagerService初始化流程

來源:互聯網
上載者:User

標籤:

源碼基於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初始化流程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.