Android进阶——AMS详解

Posted Yawn,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android进阶——AMS详解相关的知识,希望对你有一定的参考价值。

1. 简介

AMS是android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在Android中非常重要。

Activity与WIndow:

  • Activity只负责生命周期和事件处理
  • Window只控制视图
  • 一个Activity包含一个Window,如果Activity没有Window,那就相当于Service

AMS与WMS:

  • AMS统一调度所有应用程序的Activity
  • WMS控制所有Window的显示与隐藏以及要显示的位置

让我们我们从问题来学习AMS:

  • (1)AMS是如何启动的?
  • (2)startActivity的启动流程?
    app,ams如何通信的?——binder
    ams如何控制activity的生命周期
    如何去启动一个没有在AndroidManifest注册的组件

2. AMS 启动流程

首先我们看看系统启动流程:
在这里插入图片描述

  • Boot ROM: 加载一个引导程序Boot Loader
  • Kernel: Android基于Linux,所以首先启动Linux内核,为系统做一些准备工作:缓存,加载驱动之类的,
  • init进程: 然后就会启动init进程,从系统里面寻找并解析init.rc文件(system-core-init),init进程是用户态的第一个进程,开始启动系统,init中有一个main函数入口,其中会解析一个很重要的脚本文件Zygote.
    在这里插入图片描述
  • Zygote: 孵化器,用于孵化APP进程,APP进程都是由Zygote通过fork机制孵化出来的。
    最开始Zygote孵化出SystemServer,Zygote的入口是app_main.cpp。
    在这里插入图片描述
  • SystemServer: 启动各种服务:包括AMS,WMS,之类:Zygote的入口是app_main.cpp,它首先回去准备AndroidRuntime运行时环境,然后会启动虚拟机,然后会注册一个Socket监听registerZygoleSocket()用于接受AMS这边创建进程的请求,然后运行一些preload()加载一些class文件
    在这里插入图片描述

接下来从源码的角度看看AMS的启动流程:

  • 当Zygote起来以后,首先会启动大儿子进程:SystemServer进程的入口在这儿:SystemServer().run();
    在这里插入图片描述
  • SystemServer.main -> new SystemServer().run(),我们来看看这个run 方法:设置校准时间,设置一些属性,初始化虚拟机
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    android.R.xxx.xxx之类的一些资源
    在这里插入图片描述
    用这三个函数加载各种系统服务,我们的AMS就是在startBootstrapServices(加载核心服务)中加载的,加载后就startCoreServices启动核心服务,然后startOtherServices启动其他服务,最后Looper.loop进入循环
  • 在startBootstrapServices中:通过SystemServiceManager.startservice,在通过反射创建的LifeCycle中真正创建了AMS服务
    在这里插入图片描述
  • 我们来看看ActivityManagerService服务中干了什么:负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,这里面大概有3W行代码,下面简单例举一些
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
未完待续:

以上是关于Android进阶——AMS详解的主要内容,如果未能解决你的问题,请参考以下文章

Android进阶笔记:AIDL内部实现详解

详解广播机制,Broadcast Receiver,Android进阶必备知识。

Android进阶之路-详解MVC

android matrix 详解与进阶

详解广播机制,Broadcast Receiver,Android进阶必备知识。

Android进阶——AIDL详解