前面几节讲解了SystemServer的架构、启动流程以及被Zygote 进程fork的流程,这一节重点讲解ActivityManagerService -AMS 服务是如何启动的。 Android 10.0系统启动之init进程(二)-「Android取经之路」 Android 10.0系统启动之init进程(二)-「Android取经之路」 Android 10.0系统启动之init进程(三)-「Android取经之路」 Android 10.0系统启动之init进程(四)-「Android取经之路」 Android 10.0系统启动之Zygote进程(一)-「Android取经之路」 Android 10.0系统启动之Zygote进程(二)-「Android取经之路」 Android 10.0系统启动之Zygote进程(三)-「Android取经之路」 Android 10.0系统启动之Zygote进程(四)-「Android取经之路」 Android 10.0系统启动之SystemServer进程(一) Android 10.0系统启动之SystemServer进程(二) 1.概述上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程。 ActivityManagerService简称AMS,具有管理Activity行为、控制activity的生命周期、派发消息事件、内存管理等功能。 2.核心源码/frameworks/base/services/java/com/android/server/SystemServer.java 3.架构ActivityManagerService启动共分为以下4个阶段: 阶段1:为SystemSerer进程创建Android运行环境。AMS运行与SystemServer进程中,它的许多工作依赖于该运行环境 createSystemContext() -> new ActvityThread() -->attach ->getSystemContext ->createSystemContext 阶段2:启动AMS,主要进行一些初始化工作 new ActivityManagerService() start() 阶段3:将SystemServer进程纳入到AMS的进程管理体系中 setSystemProcess() //将framework-res.apk的信息加入到SystemServer进程的LoadedApk中;构建SystemServer进程的ProcessRecord,保存到AMS中,以便AMS进程统一管理 installSystemProvider() //安装SystemServer进程中的SettingsProvider.apk 阶段4:AMS启动完成,通知服务或应用完成后续的工作,或直接启动一些进程 AMS.systemReady() //许多服务或应用进程必须等待AMS完成启动工作后,才能启动或进行一些后续工作;AMS就是在systemReady中,通知或者启动这些等待的服务和应用进程,例如启动桌面等。 ActivityManagerService时序图如下: 4.源码分析 ActivityManagerService启动流程: SystemServer启动服务方法: 4. ActivityManagerService启动流程-源码分析4.1 SystemServer启动 Zygote进行启动后,第一个Fork出SystemServer进程 SystemServer的启动流程可以参考我之前的文章,这里只分析与AMS相关的启动流程: 1.初始化 SystemContext 2.创建SystemServiceManager 对象,用来启动后面的服务 3.启动系统服务,共分为三种系统服务:系统引导服务(Boot Service)、核心服务(Core Service)和其他服务(Other Service) 4.在引导服务(Boot Service)中启动ATM、AMS服务 5.在其他服务(Other Service)中完成AMS的最后工作systemReady 源码: [SystemServer.java] 4.1.1 [SystemServer.java] startBootstrapServices() 说明:启动引导服务,在其中启动了ATM和AMS服务,通过AMS安装Installer、初始化Power,设置系统进程等。 源码: 4.1.2 [SystemServer.java] startOtherServices 说明:启动其他服务,AMS启动后,完成后续桌面启动等操作 源码: 4.2 System Context初始化 说明:在SystemServer的run函数中,在启动AMS之前,调用了createSystemContext函,主要用来是初始化 System Context和SystemUi Context,并设置主题 当SystemServer 调用createSystemContext()完毕后,完成以下两个内容: 1、得到了一个ActivityThread对象,它代表当前进程 (此时为系统进程) 的主线程; 2、得到了一个Context对象,对于SystemServer而言,它包含的Application运行环境与framework-res.apk有关。 源码: [SystemServer.java] 4.2.1 [ActivityThread.java] systemMain() 说明:systemMain函数主要作用是: 创建ActivityThread对象,然后调用该对象的attach函数。 源码: [ActivityThread.java] 4.2.2 ActivityThread 对象创建 说明:ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程,其职责就是调度及执行在该线程中运行的四大组件。 注意到此处的ActivityThread创建于SystemServer进程中。 由于SystemServer中也运行着一些系统APK,例如framework-res.apk、SettingsProvider.apk等,因此也可以认为SystemServer是一个特殊的应用进程。 AMS负责管理和调度进程,因此AMS需要通过Binder机制和应用进程通信。 为此,Android提供了一个IApplicationThread接口,该接口定义了AMS和应用进程之间的交互函数。 ActivityThread的构造函数比较简单,获取ResourcesManager的单例对象. 源码: 4.2.3 [ActivityThread.java] attach 说明:对于系统进程而言,ActivityThread的attach函数最重要的工作就是创建了Instrumentation、Application和Context 调用:attach(true, 0),传入的system为0 源码: Instrumentation Instrumentation是Android中的一个工具类,当该类被启用时,它将优先于应用中其它的类被初始化。 此时,系统先创建它,再通过它创建其它组件。 mInstrumentation = new Instrumentation(); mInstrumentation.basicInit(this); Context Context是Android中的一个抽象类,用于维护应用运行环境的全局信息。 通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等。 ActivityThread的attach函数中,通过下面的代码创建出系统应用对应的Context: ContextImpl context = ContextImpl.createAppContext( this, getSystemContext().mPackageInfo); Application: Android中Application类用于保存应用的全局状态。 在ActivityThread中,针对系统进程,通过下面的代码创建了初始的Application: mInitialApplication = context.mPackageInfo.makeApplication(true, null); mInitialApplication.onCreate(); 4.2.4 [ContextImpl.java] getSystemContext() 说明:创建并返回System Context 源码: 补充说明:createSystemContext的内容就是创建一个LoadedApk,然后初始化一个ContextImpl对象。 注意到createSystemContext函数中,创建的LoadApk对应packageName为”android”,也就是framwork-res.apk。 由于该APK仅供SystemServer进程使用,因此创建的Context被定义为System Context。 现在该LoadedApk还没有得到framwork-res.apk实际的信息。 当PKMS启动,完成对应的解析后,AMS将重新设置这个LoadedApk。 4.3 SystemServiceManager 创建 说明:通过 SystemServiceManager 的构造方法创建一个 SystemServiceManager 对象,并将该对象添加到 LocalServices 中。 源码: 4.3.1 [SystemServiceManager.java] SystemServiceManager() 说明:SystemServiceManager 对象主要用于管理 SystemService 的创建、启动等生命周期,SystemService 类是一个抽象类 在 SystemServiceManager 中都是通过反射创建 SystemService 中对象的,而且在 startService(@NonNull final SystemService service) 方法中,会将 SystemService 添加到 mServices 中,并调用 onStart() 方法 SystemServiceManager构造函数没有多少内容,主要是把传进来的system Context赋值给 mContext,供后续服务创建使用 源码:
说明:把SystemServiceManager的对象加入到本地服务的全局注册表中 源码: 4.4 ActivityTaskManagerService 服务启动 说明:ActivityTaskManagerService简称ATM,Android10中引入新功能,用来管理Activity的启动、调度等功能 源码: 4.4.1 ATM服务启动过程 说明:从4.3.1 中我们知道SystemServiceManager.startService最终调用的是启动对象中的onStart方法 因此ATM启动,最终会调用ActivityTaskManagerService.Lifecycle.onStart()来启动ATM服务 源码: 4.4.2 ActivityTaskManagerService 对象创建 说明:ActivityTaskManagerService简称ATM, Android10新引入功能,用来管理Activity的启动、调度等功能 Android10 中把原先在AMS中activity的管理移动到ATM中 从Android 10的代码路径可以看出,管理Activity的ATM被放入到的wm路径中,这个路径原先归WindowManagerService -WMS控制,谷歌的目的也是希望在将来把activity和window融合在一起,减少冗余代码以及AMS和WMS的协调工作 ATM的路径为: frameworks\base\services\core\java\com\android\server\wm AMS的路径为: frameworks\base\services\core\java\com\android\server\am ATM服务提供了AIDL接口供 4.4.3 [ActivityTaskManagerService.java] start() 说明:将 ActivityTaskManagerInternal添加到本地服务的全局注册表中,ActivityTaskManagerInternal为抽象类 源码: private void start() { 4.5 ActivityManagerService 服务启动 说明:ActivityManagerService简称AMS,在Android 10的版本中,Activity的管理和调度移到ATM中,AMS负责 service,broadcast,provider的管理和调度 源码: private void startBootstrapServices() { 4.5.1 AMS服务启动过程 说明:从4.3.1 中我们知道SystemServiceManager.startService最终调用的是启动对象中的onStart方法 因此AMS服务启动,最终会调用ActivityManagerService.Lifecycle.onStart()来启动ATM服务 源码: 4.5.2 AMS 对象创建 说明:Android10中,Activity的管理和调度放入到ATM中执行,AMS中保留 service,broadcast,provider的管理和调度 构造函数初始化主要工作就是初始化一些变量,供之后的service,broadcast,provider的管理和调度 源码: 4.5.3 [ActivityManagerService.java] start() 说明:start中做了两件事 1)启动 CPU 监控线程,在启动 CPU 监控线程之前,首先将进程复位 2)注册电池状态服务和权限管理服务 源码: 4.6 [SystemServer.java] setSystemProcess() 说明:为系统进程设置应用程序实例并开始 源码: private void startOtherServices() { 4.6.1 [ActivityManagerService.java] setSystemProcess() 说明:AMS的setSystemProcess主要有四个主要的功能: 1)注册一些服务:包括 activity、procstats、meminfo、gfxinfo、dbinfo、permission、processinfo 2)获取package名为“android”的应用的 ApplicationInfo; 3)为ActivityThread 安装 system application相关信息,将framework-res.apk对应的ApplicationInfo安装到LoadedApk中的mApplicationInfo 4)为systemserver 主进程开辟一个ProcessRecord来维护进程的相关信息 5)AMS进程管理相关的操作。 源码: 4.7 完成ActivityManagerService 最后工作 [ActivityManagerService.java] systemReady() 说明:AMS的systemReady 处理分为三个阶段 阶段1:主要是调用一些关键服务的初始化函数, 然后杀死那些没有FLAG_PERSISTENT却在AMS启动完成前已经存在的进程, 同时获取一些配置参数。 需要注意的是,由于只有Java进程才会向AMS注册,而一般的Native进程不会向AMS注册,因此此处杀死的进程是Java进程。 阶段2:执行goingCallback的处理,主要的工作就是通知一些服务可以进行systemReady、systemRunning相关的工作,并进行启动服务或应用进程的工作 阶段3:启动Home Activity,当启动结束,并发送 ACTION_BOOT_COMPLETED广播时,AMS的启动过程告一段落 源码: private void startOtherServices() { 4.7.1 systemReady 阶段1 说明:主要是调用一些关键服务的初始化函数, 然后杀死那些没有 FLAG_PERSISTENT 却在AMS启动完成前已经存在的进程, 同时获取一些配置参数。 需要注意的是,由于只有Java进程才会向AMS注册,而一般的Native进程不会向AMS注册,因此此处杀死的进程是Java进程。 源码: 4.7.2 systemReady 阶段2 说明:执行goingCallback的处理,主要的工作就是通知一些服务可以进行systemReady相关的工作,并进行启动服务或应用进程的工作 源码: 4.7.2.1 goingCallback.run() 说明:监控Native的crash,启动WebView,执行一些服务的systemReady 和systemRunning方法 源码: 4.7.2.2 [ActivityManagerService.java] startPersistentApps 说明:启动persistent为1的application所在的进程 源码: 4.7.2.3 启动systemUI startSystemUi 说明:启动system UI, 启动服务 服务名称:”com.android.systemui/.SystemUIService” 源码: [SystemServer.java] 4.7.3 systemReady 阶段3 说明:启动Home Activity,当启动结束,并发送ACTION_BOOT_COMPLETED广播时,AMS的启动过程告一段落 源码: 4.7.3.1 [ActivityTaskManagerService] startHomeOnAllDisplays 说明:启动Luncher 源码: [ActivityTaskManagerService.java] public boolean startHomeOnAllDisplays(int userId, String reason) { [RootActivityContainer.java] 5.Android10中AMS的一些变化在Android 10 中安卓为了将来的方案更设计更加明确,对AMS做了很多修改,安卓的最终目的是把activity 和window融合,在Android 10.0上只是简单的代码路径变化,整体逻辑还是跟Android 9.0 类似 Android 10中引入了ActivityTaskManager--ATM的概念。 5.1 Android P 的冗余问题 Android 9.0 及以前版本,Acitivity 管理由AMS 和WMS 协作完成,导致在AMS 和WMS 中都有相似功能的实体,除了大量的代码冗余之外,二者之间的协作也非常困难。 5.2 Android 10的变化 从Android 10.0 的代码变更看,google 最终的目的是把activity 和window融合,目前发布的版本虽然做了大量的代码变更,但和P 之前的版本的流程变化不大, 目前只是简单的把代码整理到一起了,还属于中间状态,按android文档介绍,完全融合在M 甚至更靠后的版本才能完成。 目前已完成的工作:
6.总结AMS的启动主要经历了如下几个阶段: 1)为SystemServer进程创建Android运行环境,例如System Context 2)启动AMS,做一些初始化的工作 3)将SystemServer进程纳入到AMS的进程管理体系中 4)AMS启动完成,通知服务或应用完成后续的工作,调用一些服务的systemReady()方法中, 5)启动Luncher,完成AMS的启动工作 |