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 }
SystemServer
将AMS
启动并初始化主要两大阶段:
在第一阶段,我们将通过调用startBootstrapServices()
方法来启动引导服务。
- 创建
ActivityTaskManagerService(ATMS)
对象,用于管理Activity - 创建
AMS
对象,并启动服务 - 将
AMS
所在的系统进程SystemServer
,纳入到AMS的进程管理体系中setSystemProcess()
:将framewok-res.apk信息加入到SystemServer进程的LoadedApk中,构建SystemServe进程的ProcessRecord,保存到AMS中,以便AMS进程统一管理
在第二阶段的startOtherServices()
方法中,启动其他服务。
- 为系统进程安装ContentProvider对象
installSystemProviders()
:安装SystemServer进程中的SettingsProvider.apk, - 初始化WMS,并关联AMS及ATMS两个服务。
setWindowManager()
方法将AMS与WMS关联起来,通过ATMS来管理Activity - AMS启动完成,通知服务或应用完成后续工作,或直接启动新进程。
AMS.systemReady()
:许多服务或应用进程必须等待AMS完成启动工作后,才能启动或进行一些后续工作,AMS就是在SystemReady()
中,通知或启动这些等待的服务和应用进程,例如启动桌面等。
在第一阶段中,我们注意到创建AMS
和ATMS
时都使用了startService()
方法。具体来说,AMS
的创建调用了ActivityManagerService.Lifecycle.startService()
,而ATMS