在之前的Android SystemServer启动(二)中,分析到在SystemServer中会启动大量的Service,其中就有一个比较特殊的Service,它就是ActivityManagerService。
今天我们就来了解一下ActivityManageerService的启动,下面都将其简称为AMS。
启动AMS
AMS的启动发生在SystemServer启动过程中的BootPhase 0阶段。
在三大分类服务的启动服务中,即startBootstrapServices方法中
1 | private void startBootstrapServices() { |
AMS的是通过AMS的内部类Lifecycle来创建的,同时调用Lifecycle.onStart()来启动AMS。
1 | public static final class Lifecycle extends SystemService { |
Lifecycle继承于SystemService,通过ssm即SystemServiceManager来启动这个Service。
内部是通过反射来创建Lifecycle实例,而在Lifecycle实例的过程中会创建AMS。
所以接下来我们来看下AMS实例化过程中做了什么
1 | public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) { |
所以这里主要做的事是创建ActivityManager、proc与CpuTracker线程;同时创建对应的广播接收器。
创建完AMS实例之后会调用start()方法来启动AMS
1 | private void start() { |
这个时候AMS就已经启动完毕。
下面我们在来看下AMS在SystemServer中都干了什么
startBootstrapServices
1 | private void startBootstrapServices() { |
initPowerManagement
首先会初始化PowerManagement
1 | public void initPowerManagement() { |
最终会通过BatterStateService来初始化PowerManagement。
setSystemProcess
接下来是setSystemProcess,注册相关的服务。
1 | public void setSystemProcess() { |
需要注意的是,这里将AMS注册到ServiceManager中,后续通过ActivityManager来获取注册的AMS。
接下来就进入了startCoreServices,启动核心服务
startCoreServices
1 | private void startCoreServices() { |
这里做的事情很简单,设置UsageStateManager
startOtherServices
继续来到启动其它的服务模块
1 | private void startOtherServices() { |
在这里主要做的是安装系统的Provider、设置WindowManagerService与systemReady的准备工作。
installSystemProviders
1 | public final void installSystemProviders() { |
这里主要做的就是安装系统的Providers
WindowManagerService
1 | public void setWindowManager(WindowManagerService wm) { |
设置WindowManagerService服务
systemReady
systemReady的逻辑比较多,我们拆开来说
1 | public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { |
在调用goingCallback.run之前
1 | public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { |
主要做的事情杀掉procsToKill中的进程,此时系统与进程都已经准备就绪
之后再调用goingCallback.run
1 | mActivityManagerService.systemReady(() -> { |
这个在Android SystemServer启动(二)中已经分析了,这里就不多介绍了。
主要是对一些服务进行systemReady与systemRuning操作。
最后来到systemReady的最后一个步骤
1 | public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { |
其中startUser会回调之前的SystemService的onStartUser方法
1 | public void startUser(final int userHandle) { |
startHomeOnAllDisplays最终会来到RootActivityContainer的startHomeOnDisplay方法
1 | boolean startHomeOnDisplay(int userId, String reason, int displayId, boolean allowInstrumenting, |
总结一下,在goingCallback.run之后,该阶段主要做的事情是:
- 调用所有之前添加的SystemService的onStartUser方法
- 启动Persistent进程
- 启动系统桌面Activity
- 发送USER_STARTED广播
- 发送USER_STARTING广播
- 恢复栈顶Activity
- 发送User_SWITCH广播
以上就是AMS在SystemServer中的全部过程, 也是AMS的启动过程。
整个过程主要做的事情是:
- 通过Lifecycle创建AMS实例,同时调用onStart()方法启动AMS
- 通过setSystemProcess注册AMS、meminfo、gfxinfo、dbinfo、cpuinfo等服务到ServiceManager中
- 通过installSystemProviders来加载系统的providers
- 通过systemReady来ready与running各种服务,同时启动桌面应用,发送相关广播与恢复栈顶Activity
项目
android_startup: 提供一种在应用启动时能够更加简单、高效的方式来初始化组件,优化启动速度。不仅支持Jetpack App Startup的全部功能,还提供额外的同步与异步等待、线程控制与多进程支持等功能。
AwesomeGithub: 基于Github的客户端,纯练习项目,支持组件化开发,支持账户密码与认证登陆。使用Kotlin语言进行开发,项目架构是基于JetPack&DataBinding的MVVM;项目中使用了Arouter、Retrofit、Coroutine、Glide、Dagger与Hilt等流行开源技术。
flutter_github: 基于Flutter的跨平台版本Github客户端,与AwesomeGithub相对应。
android-api-analysis: 结合详细的Demo来全面解析Android相关的知识点, 帮助读者能够更快的掌握与理解所阐述的要点。
daily_algorithm: 每日一算法,由浅入深,欢迎加入一起共勉。