感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」
微信公众号:大猫玩程序
前面几节讲解了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进程(二)
上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程。
ActivityManagerService简称AMS,具有管理Activity行为、控制activity的生命周期、派发消息事件、内存管理等功能。
/frameworks/base/services/java/com/android/server/SystemServer.java
/frameworks/base/core/java/android/app/ActivityThread.java
/frameworks/base/core/java/android/app/Instrumentation.java
/frameworks/base/core/java/android/app/ContextImpl.java
/frameworks/base/core/java/android/app/LoadedApk.java
/frameworks/base/core/java/android/app/Application.java
/frameworks/base/core/java/com/android/server/LocalServices.java
/frameworks/base/services/core/java/com/android/server/ServiceThread.java
/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
/frameworks/base/services/core/java/com/android/server/wm/RootActivityContainer.java
/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
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.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,供后续服务创建使用
源码:
4.3.2 [LocalServices.java] addService(SystemServiceManager.class, mSystemServiceManager);
说明:把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() {
LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
}
4.5 ActivityManagerService 服务启动
说明:ActivityManagerService简称AMS,在Android 10的版本中,Activity的管理和调度移到ATM中,AMS负责 service,broadcast,provider的管理和调度
源码:
private void startBootstrapServices() {
...
//启动AMS
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
...
}
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]
Set up the Application instance for the system process and get started.
mActivityManagerService.setSystemProcess();
}
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() {
mActivityManagerService.systemReady(() -> {xxxxxgoingCallbackxxx, BOOT_TIMINGS_TRACE_LOG);
}
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
阶段1:关键服务的初始化
阶段2:goingCallback处理
阶段3:启动Home Activity,完成AMS启动
}
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) {
synchronized (mGlobalLock) {
//调用RootActivityContainer的startHomeOnAllDisplays(),最终到startHomeOnDisplay()
return mRootActivityContainer.startHomeOnAllDisplays(userId, reason);
}
}
[RootActivityContainer.java]
在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 甚至更靠后的版本才能完成。
目前已完成的工作:
AMS的启动主要经历了如下几个阶段:
1)为SystemServer进程创建Android运行环境,例如System Context
2)启动AMS,做一些初始化的工作
3)将SystemServer进程纳入到AMS的进程管理体系中
4)AMS启动完成,通知服务或应用完成后续的工作,调用一些服务的systemReady()方法中,
5)启动Luncher,完成AMS的启动工作