Android Framework系列第5章:AMS启动流程

访客 172 0

1 AMS简介

AMS(Activity Manager Service)是Android中最核心的服务,负责管理四大组件的启动、切换、调度以及应用进程的管理和调度等工作。在Android Q中,Activity被移至ActivityTaskManagerService

.

2 AMS启动流程

在我们之前的一篇文章中,我们详细介绍了Android Framework系列的第4章PMS原理。我们了解到,在开机或者安装应用程序时,PMS会解析APK文件中的AndroidManifest.xml,并将解析结果缓存在PMS中。 接下来,我们将对AMS进行分析。与PMS类似,PMS和AMS都是在SystemServer进程中启动的。系统启动后,Zygote进程会首先fork出SystemServer进程,并通过SystemServer:main()->run()->st等步骤进行初始化。

2.1 AMS被启动

我们了解到AMS是在SystemServer进程中启动的。现在让我们来详细了解一下AMS是如何启动的,它位于路径/frameworks/base/services/java/com/android/server/SystemServer.java。

348      public static void main(String[] args) {349          new SystemServer().run();350      }......370      private void run() {......507          // Start services.508          try {509              traceBeginAndSlog("StartServices"); // 引导服务510              startBootstrapServices(); // 核心服务511              startCoreServices(); // 其他服务512              startOtherServices();513              SystemServerInitThreadPool.shutdown();514          } catch (Throwable ex) {515              Slog.e("System", "******************************************");516              Slog.e("System", "************ Failure starting system services", ex);517              throw ex;518          } finally {519              traceEnd();520          }......543      }......623      private void startBootstrapServices() {......658          ActivityTaskManagerService atm = mSystemServiceManager.startService(659                  ActivityTaskManagerService.Lifecycle.class).getService();660          mActivityManagerService = ActivityManagerService.Lifecycle.startService(661                  mSystemServiceManager, atm);662          mActivityManagerService.setSystemServiceManager(mSystemServiceManager);663          mActivityManagerService.setInstaller(installer);664          mWindowManagerGlobalLock = atm.getGlobalLock();......779          mActivityManagerService.setSystemProcess();......818      }......874      /**875       * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.876       */877      private void startOtherServices() {......  // 安装ContentProvider982           mActivityManagerService.installSystemProviders();......1023          wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,1024                      new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);1025          ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,1026                      DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);1027          ServiceManager.addService(Context.INPUT_SERVICE, inputManager,1028                      /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);  // WMS与AMS/ATMS关联起来1032          mActivityManagerService.setWindowManager(wm);......  // 所有的服务已经准备就绪2035          mActivityManagerService.systemReady(() -> {......  // 启动阶段5002038              mSystemServiceManager.startBootPhase(2039                      SystemService.PHASE_ACTIVITY_MANAGER_READY);......2042              try {  // 监测Native Crash2043                  mActivityManagerService.startObservingNativeCrashes();2044              } catch (Throwable e) {2045                  reportWtf("observing native crashes", e);2046              }......2051              final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";2052              Future<?> webviewPrep = null;2053              if (!mOnlyCore && mWebViewUpdateService != null) {2054                  webviewPrep = SystemServerInitThreadPool.get().submit(() -> {2055                      Slog.i(TAG, WEBVIEW_PREPARATION);2056                      TimingsTraceLog traceLog = new TimingsTraceLog(2057                              SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);2058                      traceLog.traceBegin(WEBVIEW_PREPARATION);2059                      ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");2060                      mZygotePreload = null;  // 启动WebView相关2061                      mWebViewUpdateService.prepareWebViewInSystemServer();2062                      traceLog.traceEnd();2063                  }, WEBVIEW_PREPARATION);2064              }......2073              try {  // 启动SystemUi2074                  startSystemUi(context, windowManagerF);2075              } catch (Throwable e) {2076                  reportWtf("starting System UI", e);2077              }......  // 启动阶段6002154              mSystemServiceManager.startBootPhase(2155                      SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);......2249          }, BOOT_TIMINGS_TRACE_LOG);2250      }

SystemServerAMS启动并初始化主要两大阶段:

第一阶段,我们将通过调用startBootstrapServices()方法来启动引导服务。

  1. 创建ActivityTaskManagerService(ATMS)对象,用于管理Activity
  2. 创建AMS对象,并启动服务
  3. AMS所在的系统进程SystemServer,纳入到AMS的进程管理体系中
    setSystemProcess():将framewok-res.apk信息加入到SystemServer进程的LoadedApk中,构建SystemServe进程的ProcessRecord,保存到AMS中,以便AMS进程统一管理

在第二阶段的startOtherServices()方法中,启动其他服务。

  1. 为系统进程安装ContentProvider对象
    installSystemProviders():安装SystemServer进程中的SettingsProvider.apk,
  2. 初始化WMS,并关联AMS及ATMS两个服务。
    setWindowManager()方法将AMS与WMS关联起来,通过ATMS来管理Activity
  3. AMS启动完成,通知服务或应用完成后续工作,或直接启动新进程。
    AMS.systemReady():许多服务或应用进程必须等待AMS完成启动工作后,才能启动或进行一些后续工作,AMS就是在SystemReady()中,通知或启动这些等待的服务和应用进程,例如启动桌面等。

在第一阶段中,我们注意到创建AMSATMS时都使用了startService()方法。具体来说,AMS的创建调用了ActivityManagerService.Lifecycle.startService(),而ATMS

标签: 进程 方法 对象 初始化

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~