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详解的主要内容,如果未能解决你的问题,请参考以下文章
详解广播机制,Broadcast Receiver,Android进阶必备知识。