在之前的Android SystemServer启动(二)中,分析到在SystemServer
中会启动大量的Service
,其中就有一个比较特殊的Service
,它就是ActivityManagerService
。
今天我们就来了解一下ActivityManageerService
的启动,下面都将其简称为AMS
。
启动AMS
AMS
的启动发生在SystemServer
启动过程中的BootPhase 0
阶段。
在三大分类服务的启动服务中,即startBootstrapServices
方法中
|
|
AMS
的是通过AMS
的内部类Lifecycle
来创建的,同时调用Lifecycle.onStart()
来启动AMS
。
|
|
Lifecycle
继承于SystemService
,通过ssm
即SystemServiceManager
来启动这个Service
。
内部是通过反射来创建Lifecycle
实例,而在Lifecycle
实例的过程中会创建AMS
。
所以接下来我们来看下AMS
实例化过程中做了什么
|
|
所以这里主要做的事是创建ActivityManager
、proc
与CpuTracker
线程;同时创建对应的广播接收器。
创建完AMS
实例之后会调用start()
方法来启动AMS
|
|
这个时候AMS
就已经启动完毕。
下面我们在来看下AMS
在SystemServer
中都干了什么
startBootstrapServices
|
|
initPowerManagement
首先会初始化PowerManagement
|
|
最终会通过BatterStateService
来初始化PowerManagement
。
setSystemProcess
接下来是setSystemProcess
,注册相关的服务。
|
|
需要注意的是,这里将AMS
注册到ServiceManager
中,后续通过ActivityManager
来获取注册的AMS
。
接下来就进入了startCoreServices
,启动核心服务
startCoreServices
|
|
这里做的事情很简单,设置UsageStateManager
startOtherServices
继续来到启动其它的服务模块
|
|
在这里主要做的是安装系统的Provider
、设置WindowManagerService
与systemReady
的准备工作。
installSystemProviders
|
|
这里主要做的就是安装系统的Providers
WindowManagerService
|
|
设置WindowManagerService
服务
systemReady
systemReady
的逻辑比较多,我们拆开来说
|
|
在调用goingCallback.run
之前
|
|
主要做的事情杀掉procsToKill
中的进程,此时系统与进程都已经准备就绪
之后再调用goingCallback.run
|
|
这个在Android SystemServer启动(二)中已经分析了,这里就不多介绍了。
主要是对一些服务进行systemReady
与systemRuning
操作。
最后来到systemReady
的最后一个步骤
|
|
其中startUser
会回调之前的SystemService
的onStartUser
方法
|
|
startHomeOnAllDisplays
最终会来到RootActivityContainer
的startHomeOnDisplay
方法
|
|
总结一下,在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: 提供一种在应用启动时能够更加简单、高效的方式来初始化组件。开发人员可以使用android-startup
来简化启动序列,并显式地设置初始化顺序与组件之间的依赖关系。 与此同时android-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: 算法进阶,由浅入深,欢迎加入一起共勉。