欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android AMS啟動(dòng)詳解

 更新時(shí)間:2021年03月30日 09:12:21   作者:kailaisi  
這篇文章主要介紹了Android AMS啟動(dòng)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下

啟動(dòng)

Android系統(tǒng)啟動(dòng)流程中中我們提到過(guò),AMS是在system_service中啟動(dòng)的,

 //frameworks/base/services/java/corri/android/server/SystemServer.java

//該方法主要啟動(dòng)服務(wù) ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。
//設(shè)置 ActivityManagerService,啟動(dòng)傳感器服務(wù)。
startBootstrapServices(); // 啟動(dòng)引導(dǎo)服務(wù)

//該方法主要
//啟動(dòng)服務(wù) BatteryService 用于統(tǒng)計(jì)電池電量,需要 LightService。
//啟動(dòng)服務(wù) UsageStatsService,用于統(tǒng)計(jì)應(yīng)用使用情況。
//啟動(dòng)服務(wù) WebViewUpdateService。
startCoreServices(); // 啟動(dòng)核心服務(wù)

//該方法主要啟動(dòng)服務(wù) InputManagerService,WindowManagerService。
//等待 ServiceManager,SurfaceFlinger啟動(dòng)完成,然后顯示啟動(dòng)界面。
//啟動(dòng)服務(wù) StatusBarManagerService,
//準(zhǔn)備好 window, power, package, display 服務(wù):
//	- WindowManagerService.systemReady()
//	- PowerManagerService.systemReady()
//	- PackageManagerService.systemReady()
//	- DisplayManagerService.systemReady()
startOtherServices(); // 啟動(dòng)其他服務(wù)

在啟動(dòng)核心服務(wù)功能中,會(huì)進(jìn)行AMS的啟動(dòng)。

 //frameworks/base/services/java/corri/android/server/SystemServer.java
 private void startBootstrapServices() {
 	...
 //這里會(huì)將ATMS注冊(cè)到ServiceManager中,然后調(diào)用ATMS的start方法。
 ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();
 //重點(diǎn)方法1。 注冊(cè)AMS服務(wù),并返回對(duì)應(yīng)的對(duì)象信息
 mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
 mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
 //設(shè)置app安裝器
 mActivityManagerService.setInstaller(installer);
 ...
 //重點(diǎn)方法2。 向ServiceManager中注冊(cè)Binder服務(wù)
 mActivityManagerService.setSystemProcess();
 }

這里我們只截取了AMS的啟動(dòng)代碼。

這里會(huì)通過(guò)startService方法來(lái)進(jìn)行AMS的注冊(cè)和啟動(dòng)過(guò)程。我們看一下具體的ActivityManagerService中的startService方法

startService

// 
	public static ActivityManagerService startService(SystemServiceManager ssm, ActivityTaskManagerService atm) {
  sAtm = atm;
  //調(diào)用SM的startService方法。創(chuàng)建AMS實(shí)例,并啟動(dòng)AMS
  return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
 }

我們?cè)?a target="_blank" href="http://www.dbjr.com.cn/article/208558.htm">ServiceManager的工作原理中講解過(guò),systemServiceManager.startService方法會(huì)將對(duì)應(yīng)的服務(wù)注冊(cè)到ServiceManager中,然后再調(diào)用start方法。

//frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
		public SystemService startService(String className) {
 final Class<SystemService> serviceClass;
 serviceClass = (Class<SystemService>)Class.forName(className);
 return startService(serviceClass);
 }

 @SuppressWarnings("unchecked")
 public <T extends SystemService> T startService(Class<T> serviceClass) {
 try {
  final String name = serviceClass.getName();
  final T service;
  try {
  //反射構(gòu)造函數(shù)
  Constructor<T> constructor = serviceClass.getConstructor(Context.class);
  //創(chuàng)建服務(wù)
  service = constructor.newInstance(mContext);
  ...
  //啟動(dòng)服務(wù)
  startService(service);
  return service;
 } finally {
  Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
 }
 }

 public void startService(@NonNull final SystemService service) {
 // Register it.
 //注冊(cè)到ServiceManager列表中
 mServices.add(service);
 //調(diào)用服務(wù)對(duì)應(yīng)的onStart方法
 service.onStart();
 }

在啟動(dòng)AMS的時(shí)候傳入的參數(shù)是:ActivityManagerService.Lifecycle.class。所以這里實(shí)際上會(huì)調(diào)用ActivityManagerService.Lifecycle 的構(gòu)造方法,然后調(diào)用它的onStart方法

 public static final class Lifecycle extends SystemService {
 private final ActivityTaskManagerService mService;
 public Lifecycle(Context context) {
  super(context);
  //創(chuàng)建AMS對(duì)象
  mService = new ActivityManagerService(context, sAtm);
 }
 @Override
 public void onStart() {
  //調(diào)用AMS的start方法
  mService.start();
 }

 public ActivityManagerService getService() {
  //返回了AMS實(shí)例
  return mService;
 }
 }

在Lifecycle對(duì)象的創(chuàng)建過(guò)程中,會(huì)創(chuàng)建AMS對(duì)象,然后通過(guò)start()方法進(jìn)行了啟動(dòng)。

AMS的創(chuàng)建

對(duì)于A(yíng)MS對(duì)象的創(chuàng)建是通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建的。

 //構(gòu)造方法,
 public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
 //獲取系統(tǒng)的ActivityThread
 mSystemThread = ActivityThread.currentActivityThread();
 //創(chuàng)建一個(gè)ServiceThread用來(lái)處理AMS接收到的命令
 mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
 mHandlerThread.start();
 mHandler = new MainHandler(mHandlerThread.getLooper());
 mUiHandler = mInjector.getUiHandler(this);
 //低內(nèi)存監(jiān)控
 mLowMemDetector = new LowMemDetector(this);
 //初始化廣播隊(duì)列。這里包含了前臺(tái)廣播,后臺(tái)廣播等
 mFgBroadcastQueue = new BroadcastQueue(this, mHandler, "foreground", foreConstants, false);
 mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", backConstants, true);
 mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler, "offload", offloadConstants, true);
 mBroadcastQueues[0] = mFgBroadcastQueue;
 mBroadcastQueues[1] = mBgBroadcastQueue;
 mBroadcastQueues[2] = mOffloadBroadcastQueue;
 //用于保存注冊(cè)的Service
 mServices = new ActiveServices(this);
 //map,用于保存注冊(cè)的ContentProvider
 mProviderMap = new ProviderMap(this);
 mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
 mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);

 //創(chuàng)建 /data/system目錄
 final File systemDir = SystemServiceManager.ensureSystemDir();
 //創(chuàng)建進(jìn)程統(tǒng)計(jì)服務(wù),保存在/data/system/proccstats目錄中。
 mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
 //賦值A(chǔ)TM,并進(jìn)行初始化
 mActivityTaskManager = atm;
 mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper());
 //CPU追蹤器進(jìn)程
 mProcessCpuThread = new Thread("CpuTracker") {
  @Override
  public void run() {
  ...
  }
 };

 }

在A(yíng)MS的構(gòu)造函數(shù)中進(jìn)行了一些初始化的東西:比如說(shuō)啟動(dòng)CPU監(jiān)控、啟動(dòng)進(jìn)程統(tǒng)計(jì)服務(wù)、啟動(dòng)低內(nèi)存監(jiān)控、初始化Service和ContentProvider對(duì)應(yīng)的保存類(lèi)等等。

start()

當(dāng)AMS類(lèi)創(chuàng)建完成之后,會(huì)調(diào)用start()方法。

 private void start() {
 	 //移除所有的進(jìn)程組
 removeAllProcessGroups();
 //啟動(dòng)CpuTracker線(xiàn)程
 mProcessCpuThread.start();
 //啟動(dòng)電池統(tǒng)計(jì)服務(wù),能夠統(tǒng)計(jì)具體的應(yīng)用的電池消耗,從而來(lái)進(jìn)行一定的電量統(tǒng)計(jì)
 mBatteryStatsService.publish();
 //創(chuàng)建LocalService,并添加到LocalServices列表中
 LocalServices.addService(ActivityManagerInternal.class, new LocalService());
 mActivityTaskManager.onActivityManagerInternalAdded();
 mUgmInternal.onActivityManagerInternalAdded();
 mPendingIntentController.onActivityManagerInternalAdded();
 }

在start方法中,會(huì)將在構(gòu)造函數(shù)中創(chuàng)建的一些線(xiàn)程進(jìn)行啟動(dòng)。

setSystemProcess

在創(chuàng)建并啟動(dòng)完成之后,會(huì)通過(guò)setSystemProcess方法來(lái)向ServiceManager中注冊(cè)一些系統(tǒng)相關(guān)的服務(wù)。

 public void setSystemProcess() {
 try {
 	//注冊(cè)ActivityService服務(wù)
  ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
   DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
  //注冊(cè)進(jìn)程狀態(tài)服務(wù)
  ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
  //注冊(cè)內(nèi)存Binder
  ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,DUMP_FLAG_PRIORITY_HIGH);
  //注冊(cè)圖像Binder
  ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
  //注冊(cè)SQLite DB binder
  ServiceManager.addService("dbinfo", new DbBinder(this));
  if (MONITOR_CPU_USAGE) {
  	//注冊(cè)CPU使用情況的Binder
  ServiceManager.addService("cpuinfo", new CpuBinder(this),/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
  }
  //注冊(cè)權(quán)限控制Binder
  ServiceManager.addService("permission", new PermissionController(this));
  //注冊(cè)進(jìn)程管理Binder
  ServiceManager.addService("processinfo", new ProcessInfoService(this));
  //獲取“android”應(yīng)用的ApplicationInfo,并裝載到mSystemThread
  ApplicationInfo info = mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
  mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
  //創(chuàng)建ProcessRecord維護(hù)進(jìn)程的相關(guān)信息
  synchronized (this) {
  ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,...);
  app.setPersistent(true);
  app.pid = MY_PID;
  app.getWindowProcessController().setPid(MY_PID);
  app.maxAdj = ProcessList.SYSTEM_ADJ;
  app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
  mPidsSelfLocked.put(app);
  mProcessList.updateLruProcessLocked(app, false, null);
  updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
  }
 } catch (PackageManager.NameNotFoundException e) {
  throw new RuntimeException(
   "Unable to find android system package", e);
 }
 }

在這個(gè)方法中會(huì)設(shè)置一些系統(tǒng)進(jìn)程,主要功能為:

  • 注冊(cè)一些服務(wù):activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等。
  • 獲取包名為“android”的應(yīng)用的ApplicationInfo對(duì)象,并將該ApplicationInfo信息安裝設(shè)置到SystemThread(系統(tǒng)進(jìn)程主線(xiàn)程)。即可以理解,系統(tǒng)也是一個(gè)特殊的應(yīng)用。
  • 創(chuàng)建ProcessRecord維護(hù)進(jìn)程的相關(guān)信息,這里MY_PID即為SystemServer進(jìn)程ID。
  • 啟動(dòng) 檢測(cè)應(yīng)用運(yùn)行和交互。

后續(xù)

當(dāng)AMS創(chuàng)建并啟動(dòng)之后,會(huì)有一系列的后續(xù)的工作需要處理。這些操作都是在**startOtherServices()**中去調(diào)用的

 private void startOtherServices() {
  //注冊(cè)系統(tǒng)的ContentProvider信息
  mActivityManagerService.installSystemProviders();
 
  mActivityManagerService.setWindowManager(wm);
  	mActivityManagerService.systemReady(() -> {
  ......//goingCallback
  }, BOOT_TIMINGS_TRACE_LOG);
 }

這里的主要功能是:

  • 關(guān)鍵服務(wù)繼續(xù)進(jìn)行初始化
  • 已經(jīng)啟動(dòng)的進(jìn)程,如果沒(méi)有FLAG_PERSISTENT標(biāo)志位,則會(huì)被kill掉
  • 運(yùn)行g(shù)oingCallBack
  • 啟動(dòng)launcher的Activity,即桌面應(yīng)用。

這里繼續(xù)跟蹤一下goingCallBack的具體執(zhí)行內(nèi)容。

goingCallBack

 mActivityManagerService.systemReady(() -> {
  try {
  //啟動(dòng)NativeCrash的監(jiān)測(cè)
  mActivityManagerService.startObservingNativeCrashes();
  } catch (Throwable e) {
  reportWtf("observing native crashes", e);
  }
  if (!mOnlyCore && mWebViewUpdateService != null) {
  webviewPrep = SystemServerInitThreadPool.get().submit(() -> {
   //啟動(dòng)WebView相關(guān)
   mWebViewUpdateService.prepareWebViewInSystemServer();
  }, WEBVIEW_PREPARATION);
  }

  try {
  //啟動(dòng)systemUI
  startSystemUi(context, windowManagerF);
  } catch (Throwable e) {
  reportWtf("starting System UI", e);
  }
  ...
 }

在這個(gè)里面會(huì)繼續(xù)進(jìn)行一些初始化的工作:

  • 啟動(dòng)NativeCrash監(jiān)測(cè)
  • 啟動(dòng)WebView相關(guān)服務(wù)
  • 啟動(dòng)SystemUI

startHomeOnAllDisplays

該功能主要是進(jìn)行桌面程序的啟動(dòng),和AMS的啟動(dòng)流程關(guān)聯(lián)不大,在這里不再詳細(xì)進(jìn)行解析。

總結(jié):

  • AMS是在SystemServer進(jìn)程中進(jìn)行創(chuàng)建并啟動(dòng)的
  • 在A(yíng)MS的服務(wù)啟動(dòng)過(guò)程中,通過(guò)構(gòu)造函數(shù)進(jìn)行了一些對(duì)象的創(chuàng)建和初始化工作(初Activity外其他3大組件的列表和調(diào)度對(duì)象的創(chuàng)建;內(nèi)存、電池、權(quán)限、CPU等的監(jiān)控等等相關(guān)對(duì)象的創(chuàng)建),并且通過(guò)start()方法啟動(dòng)服務(wù)(移除進(jìn)程組、啟動(dòng)CPU線(xiàn)程、權(quán)限注冊(cè)、電池服務(wù)等等)。
  • AMS創(chuàng)建并將對(duì)應(yīng)服務(wù)啟動(dòng)之后,會(huì)通過(guò)setSystemProcess方法,將framework-res.apk的信息加入到SystemServer進(jìn)程的LoadedApk中,并創(chuàng)建了SystemServer進(jìn)程的ProcessRecord,加入到了mPidsSelfLocked,交給AMS來(lái)統(tǒng)一管理
  • AMS啟動(dòng)之后的后續(xù)工作,主要調(diào)用systemReady()和傳入的goingCallBack來(lái)執(zhí)行。主要是各種服務(wù)或者進(jìn)程,等AMS啟動(dòng)完成后需要進(jìn)一步完成的工作以及系統(tǒng)相關(guān)的初始化。
  • 桌面應(yīng)用是在systemReady()方法中啟動(dòng),systemUI是在goingCallback中完成。
  • 當(dāng)桌面應(yīng)用啟動(dòng)完成以后,發(fā)送開(kāi)機(jī)廣播ACTION_BOOT_COMPLETED。

以上就是Android AMS啟動(dòng)詳解的詳細(xì)內(nèi)容,更多關(guān)于A(yíng)ndroid AMS啟動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論