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

Android AMS啟動詳解

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

啟動

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

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

//該方法主要啟動服務 ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。
//設置 ActivityManagerService,啟動傳感器服務。
startBootstrapServices(); // 啟動引導服務

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

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

在啟動核心服務功能中,會進行AMS的啟動。

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

這里我們只截取了AMS的啟動代碼。

這里會通過startService方法來進行AMS的注冊和啟動過程。我們看一下具體的ActivityManagerService中的startService方法

startService

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

我們在ServiceManager的工作原理中講解過,systemServiceManager.startService方法會將對應的服務注冊到ServiceManager中,然后再調用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 {
  //反射構造函數
  Constructor<T> constructor = serviceClass.getConstructor(Context.class);
  //創(chuàng)建服務
  service = constructor.newInstance(mContext);
  ...
  //啟動服務
  startService(service);
  return service;
 } finally {
  Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
 }
 }

 public void startService(@NonNull final SystemService service) {
 // Register it.
 //注冊到ServiceManager列表中
 mServices.add(service);
 //調用服務對應的onStart方法
 service.onStart();
 }

在啟動AMS的時候傳入的參數是:ActivityManagerService.Lifecycle.class。所以這里實際上會調用ActivityManagerService.Lifecycle 的構造方法,然后調用它的onStart方法

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

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

在Lifecycle對象的創(chuàng)建過程中,會創(chuàng)建AMS對象,然后通過start()方法進行了啟動。

AMS的創(chuàng)建

對于AMS對象的創(chuàng)建是通過構造函數來創(chuàng)建的。

 //構造方法,
 public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
 //獲取系統(tǒng)的ActivityThread
 mSystemThread = ActivityThread.currentActivityThread();
 //創(chuàng)建一個ServiceThread用來處理AMS接收到的命令
 mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
 mHandlerThread.start();
 mHandler = new MainHandler(mHandlerThread.getLooper());
 mUiHandler = mInjector.getUiHandler(this);
 //低內存監(jiān)控
 mLowMemDetector = new LowMemDetector(this);
 //初始化廣播隊列。這里包含了前臺廣播,后臺廣播等
 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;
 //用于保存注冊的Service
 mServices = new ActiveServices(this);
 //map,用于保存注冊的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)建進程統(tǒng)計服務,保存在/data/system/proccstats目錄中。
 mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
 //賦值ATM,并進行初始化
 mActivityTaskManager = atm;
 mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper());
 //CPU追蹤器進程
 mProcessCpuThread = new Thread("CpuTracker") {
  @Override
  public void run() {
  ...
  }
 };

 }

在AMS的構造函數中進行了一些初始化的東西:比如說啟動CPU監(jiān)控、啟動進程統(tǒng)計服務、啟動低內存監(jiān)控、初始化Service和ContentProvider對應的保存類等等。

start()

當AMS類創(chuàng)建完成之后,會調用start()方法。

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

在start方法中,會將在構造函數中創(chuàng)建的一些線程進行啟動。

setSystemProcess

在創(chuàng)建并啟動完成之后,會通過setSystemProcess方法來向ServiceManager中注冊一些系統(tǒng)相關的服務。

 public void setSystemProcess() {
 try {
 	//注冊ActivityService服務
  ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
   DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
  //注冊進程狀態(tài)服務
  ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
  //注冊內存Binder
  ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,DUMP_FLAG_PRIORITY_HIGH);
  //注冊圖像Binder
  ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
  //注冊SQLite DB binder
  ServiceManager.addService("dbinfo", new DbBinder(this));
  if (MONITOR_CPU_USAGE) {
  	//注冊CPU使用情況的Binder
  ServiceManager.addService("cpuinfo", new CpuBinder(this),/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
  }
  //注冊權限控制Binder
  ServiceManager.addService("permission", new PermissionController(this));
  //注冊進程管理Binder
  ServiceManager.addService("processinfo", new ProcessInfoService(this));
  //獲取“android”應用的ApplicationInfo,并裝載到mSystemThread
  ApplicationInfo info = mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
  mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
  //創(chuàng)建ProcessRecord維護進程的相關信息
  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);
 }
 }

在這個方法中會設置一些系統(tǒng)進程,主要功能為:

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

后續(xù)

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

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

這里的主要功能是:

  • 關鍵服務繼續(xù)進行初始化
  • 已經啟動的進程,如果沒有FLAG_PERSISTENT標志位,則會被kill掉
  • 運行goingCallBack
  • 啟動launcher的Activity,即桌面應用。

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

goingCallBack

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

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

在這個里面會繼續(xù)進行一些初始化的工作:

  • 啟動NativeCrash監(jiān)測
  • 啟動WebView相關服務
  • 啟動SystemUI

startHomeOnAllDisplays

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

總結:

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

以上就是Android AMS啟動詳解的詳細內容,更多關于Android AMS啟動的資料請關注腳本之家其它相關文章!

相關文章

最新評論