纵横资讯网欢迎您!

纵横资讯网
纵横资讯网 > 商讯 >Android 10.0系统服务之AMS启动流程--「Android取经之路」

Android 10.0系统服务之AMS启动流程--「Android取经之路」

2020-08-25 11:12:42
来源:互联网
阅读:

感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」微信公众号:大猫玩程序前面几节讲解了SystemServer的架构、启动流程以及被Zygote 进程fork的流程,这一节重点讲解Activity...

感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」

微信公众号:大猫玩程序


Android 10.0系统服务之AMS启动流程--「Android取经之路」

前面几节讲解了SystemServer的架构、启动流程以及被Zygote 进程fork的流程,这一节重点讲解ActivityManagerService -AMS 服务是如何启动的。


Android 10.0系统源码取经之路——启动篇

Android系统架构浅析-「Android取经之路」

Android是怎么启动的-「Android取经之路」

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
/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


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时序图如下:


Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.源码分析

ActivityManagerService启动流程:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

SystemServer启动服务方法:


Android 10.0系统服务之AMS启动流程--「Android取经之路」

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]

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.1.1 [SystemServer.java] startBootstrapServices()

说明:启动引导服务,在其中启动了ATM和AMS服务,通过AMS安装Installer、初始化Power,设置系统进程等。

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.1.2 [SystemServer.java] startOtherServices

说明:启动其他服务,AMS启动后,完成后续桌面启动等操作

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

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]

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.2.1 [ActivityThread.java] systemMain()

说明:systemMain函数主要作用是: 创建ActivityThread对象,然后调用该对象的attach函数。

源码:

[ActivityThread.java]

Android 10.0系统服务之AMS启动流程--「Android取经之路」

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的单例对象.

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.2.3 [ActivityThread.java] attach

说明:对于系统进程而言,ActivityThread的attach函数最重要的工作就是创建了Instrumentation、Application和Context

调用:attach(true, 0),传入的system为0

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

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

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

补充说明:createSystemContext的内容就是创建一个LoadedApk,然后初始化一个ContextImpl对象。

注意到createSystemContext函数中,创建的LoadApk对应packageName为”android”,也就是framwork-res.apk。

由于该APK仅供SystemServer进程使用,因此创建的Context被定义为System Context。

现在该LoadedApk还没有得到framwork-res.apk实际的信息。

当PKMS启动,完成对应的解析后,AMS将重新设置这个LoadedApk。

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.3 SystemServiceManager 创建

说明:通过 SystemServiceManager 的构造方法创建一个 SystemServiceManager 对象,并将该对象添加到 LocalServices 中。

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.3.1 [SystemServiceManager.java] SystemServiceManager()

说明:SystemServiceManager 对象主要用于管理 SystemService 的创建、启动等生命周期,SystemService 类是一个抽象类

在 SystemServiceManager 中都是通过反射创建 SystemService 中对象的,而且在 startService(@NonNull final SystemService service) 方法中,会将 SystemService 添加到 mServices 中,并调用 onStart() 方法

SystemServiceManager构造函数没有多少内容,主要是把传进来的system Context赋值给 mContext,供后续服务创建使用

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」


4.3.2 [LocalServices.java] addService(SystemServiceManager.class, mSystemServiceManager);

说明:把SystemServiceManager的对象加入到本地服务的全局注册表中

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.4 ActivityTaskManagerService 服务启动

说明:ActivityTaskManagerService简称ATM,Android10中引入新功能,用来管理Activity的启动、调度等功能

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.4.1 ATM服务启动过程

说明:从4.3.1 中我们知道SystemServiceManager.startService最终调用的是启动对象中的onStart方法

因此ATM启动,最终会调用ActivityTaskManagerService.Lifecycle.onStart()来启动ATM服务

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

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接口供


Android 10.0系统服务之AMS启动流程--「Android取经之路」

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服务

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.5.2 AMS 对象创建

说明:Android10中,Activity的管理和调度放入到ATM中执行,AMS中保留 service,broadcast,provider的管理和调度

构造函数初始化主要工作就是初始化一些变量,供之后的service,broadcast,provider的管理和调度

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.5.3 [ActivityManagerService.java] start()

说明:start中做了两件事

1)启动 CPU 监控线程,在启动 CPU 监控线程之前,首先将进程复位

2)注册电池状态服务和权限管理服务

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

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进程管理相关的操作。

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

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进程。

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.7.2 systemReady 阶段2

说明:执行goingCallback的处理,主要的工作就是通知一些服务可以进行systemReady相关的工作,并进行启动服务或应用进程的工作

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」


4.7.2.1 goingCallback.run()

说明:监控Native的crash,启动WebView,执行一些服务的systemReady 和systemRunning方法

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.7.2.2 [ActivityManagerService.java] startPersistentApps

说明:启动persistent为1的application所在的进程

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.7.2.3 启动systemUI startSystemUi

说明:启动system UI, 启动服务

服务名称:”com.android.systemui/.SystemUIService”

源码:

[SystemServer.java]

Android 10.0系统服务之AMS启动流程--「Android取经之路」

4.7.3 systemReady 阶段3

说明:启动Home Activity,当启动结束,并发送ACTION_BOOT_COMPLETED广播时,AMS的启动过程告一段落

源码:

Android 10.0系统服务之AMS启动流程--「Android取经之路」

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.0系统服务之AMS启动流程--「Android取经之路」

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 中都有相似功能的实体,除了大量的代码冗余之外,二者之间的协作也非常困难。


Android 10.0系统服务之AMS启动流程--「Android取经之路」

5.2 Android 10的变化

从Android 10.0 的代码变更看,google 最终的目的是把activity 和window融合,目前发布的版本虽然做了大量的代码变更,但和P 之前的版本的流程变化不大,

目前只是简单的把代码整理到一起了,还属于中间状态,按android文档介绍,完全融合在M 甚至更靠后的版本才能完成。

目前已完成的工作:

  1. 把AMS 下面只和activity 管理相关的代码移到WMS的目录下,actvityStack、activityRecord 等文件,全部移到WMS 目录下,和window 统一管理:
  2. AMS 中部分文件拆分,把原来activity和其他组件融合在一起处理的文件进行拆分,activity 相关部分单独拆分,移到WMS 中统一管理。比如ActivityManagerService.java 拆分成了ActivityManagerService.java 和ActivityTaskManagerService.java 两个文件,activity 的启动由ActivityTaskManagerService.java 负责。
  3. 因为Activity 和window的管理统一由WMS 完成,不再需要之前的DispayWindowController、stackWindowController 来居中协调,可以把display、stack、task 等统一管理。
  4. 最终要做到完全融合,以stack 为例,完成后会把taskstack的功能完全融合进activityStack,目前只做到了在activityStack 中包含taskstack。创建、管理流程也随之发生变化。


6.总结

AMS的启动主要经历了如下几个阶段:

1)为SystemServer进程创建Android运行环境,例如System Context

2)启动AMS,做一些初始化的工作

3)将SystemServer进程纳入到AMS的进程管理体系中

4)AMS启动完成,通知服务或应用完成后续的工作,调用一些服务的systemReady()方法中,

5)启动Luncher,完成AMS的启动工作

推荐阅读:梦妆时尚网

免责声明:本文仅代表企业观点,与纵横资讯网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。