Android系统服务-AMS

一,前导知识:系统进程运行环境的初始化

Context是一个抽象类,它可以访问Application环境全局信息和各种资源信息和类,其常用功能如下:
-对Activity、Service生命周期的管理
-通过Intent发送广播/注册广播接收者
-访问APK各种资源,如Resources,AssertManager等
-访问Package的相关信息
-APK的权限管理
总而言之,Context就像一个无所不知的大管家,需要什么东西,找它要就好了,它的家族关系如下图:
在这里插入图片描述
由图可知,Activity、Service、Application都实现了Context的包装类,调用的各种方法,最终都是由ContextImpl来实现,所以实际上ContextImpl才是那个无所不知的大管家。
Android的进程分为两种:系统进程和应用进程。而ActivityThread就是应用进程的主线程,应用进程启动后首先要执行的就是它的ActivityThread的main方法,应用进程也是通过ActivityThread来和AMS通信,调度和执行四大组件。
系统进程:SystemServer是Android的系统进程,由于它也有Activity和一些系统资源,所以为了保证调用方式的统一,它也需要Activity和Context等运行环境,因此SystemServer也是一个特殊的应用程序。
系统Context的创建过程:
开机->加载引导程序到RAM->进入到Kernel层启动第一个进程swapper(pid=0),加载各种驱动,初始化进程管理、内存管理->启动kthread进程(pid=2),这是所有内核进程的鼻祖->init进程(pid=1),所有用户空间进程的鼻祖,启动一些守护进程和servicemanager等重要服务->孵化出zygote进程(已经进入运行层),加载虚拟机,注册JNI->启动SystemServer进程(管理所有JAVA API Framework),同时zygote也会启动多个APP进程,第一个是Launcher进程,所有APP进程都是由zygote孵化而来。
在SystemServer启动之后,执行createSystemContext()方法,在该方法内部会完成系统进程运行环境的初始化,包括创建ActivityThread线程,ResourcesManager对象的创建和初始化,LoadedAPK的创建和初始化,LoadedAPK代表一个系统进程APK,它里面存储资源文件的位置、JNI包的位置等,代表的就是Framework-res-apk,ContextImpl的构造方法创建一个Context,会将ResourcesManager、LoadedAPK加载进去,最终生成一个和系统进程相关的Context。
ActivityThread和Context就构成了Android程序的运行环境。

二,AMS简介

AMS(ActivityManagerService)是Android中最核心的服务,位于应用框架层,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要;
ActivityTaskManagerService(以下简称ATMS)是Android 10新增加的系统服务类,承担了ActivityManagerService(AMS)的部分工作(activities、task, stacks, displays相关),比如将Activity的启动相关的调用转移到了ATMS中。

AMS功能:
-组件状态管理:包括四大组件的开启,关闭等一系列操作,如startActivity,startActivityAndWait,activityPaused,startService,stopService,removeContentProvider等;
-组件状态查询:查询组件当前运行等情况。如getCallingActivity,getService等;
-Task相关:包括removeTask,removeSubTask,moveTaskBackwards,moveTaskToFront等;
-AMS是通过ActivityStack及其他数据结构来记录,管理系统中的Activity及其他组件状态的,并提供查询功能的一个系统服务;

三,AMS启动流程

Zygote进程会创建SystemServer进程,AMS是在SystemServer中启动的:
在这里插入图片描述
SystemServer.run()方法源码如下:

在这里插入图片描述
在run()方法中新建一个SystemServiceManager对象,然后将其加入到本地服务列表中,接着启动三类服务:引导服务、核心服务、其他服务,AMS就是引导服务中的一个:

1.private void startBootstrapServices() {
2.        // Activity manager runs the show.
3.     mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
4.     mActivityManagerService.setSystemProcess();
5.……
6.     mActivityManagerService.installSystemProviders();
7.……
8.     mActivityManagerService.systemReady(new Runnable() {
9.            @Override
10.            public void run() {
11.                Slog.i(TAG, "Making services ready");
12.                mSystemServiceManager.startBootPhase(
13.                     SystemService.PHASE_ACTIVITY_MANAGER_READY);
14.                try {
15.                    mActivityManagerService.startObservingNativeCrashes();
16.                } catch (Throwable e) {
17.                    reportWtf("observing native crashes", e);
18.                }

以上几个方法就是AMS启动的几个主要方法,其作用如下:
1,创建AMS对象,并启动服务
2:将AMS所在的系统进程,添加到进程管理中去(这一步即完成了AMS注册到SystemManager中)
3:为系统进程安装ContentProvider对象
4:在systemReady方法中做善后操作

startService方法:
在这里插入图片描述
方法的参数是Lifecycle.class,它继承自SystemService,通过反射创建一个Lifecycle实例,然后将新得到的service添加到ArrayList类型的mService中完成注册,Lifecycle也是AMS的内部类,其结构如下:
在这里插入图片描述
可以看出,在Lifecycle创建实例时也会创建一个AMS实例,当Lifecycle调用onStart()方法时,实际上是调用AMS的onStart()方法,调用getService()方法时,其实返回的是AMS,于是AMS就被创建、启动并返回。
AMS的构造方法:
AMS的构造方法很复杂,主要做了一些初始化的相关操作,先保存了自己运行环境ActivityThread和Context,初始化了四大组件和电量统计服务等。
AMS的start方法:启动了一些服务,并且把AMS自己也加入到localService中供程序内部调用,总之构造方法和start方法都是在做一些初始化相关操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值