继续上篇文章的SystemServer
启动分析。
此次分析过程基于Android 10.0
run
在之前已经分析到,通过SystemServer
的run
方法进入到SystemServer
内部逻辑。
所以我们直接来看run
方法
|
|
在SystemServer
的run
方法中主要做的事情是:
- 创建当前线程的
Looper
- 加载
native services
原生库android_servers
- 创建
SystemContext
,通过ActivityThread
来获取SystemContext
- 创建
SystemServiceManager
,用来启动后续的各项服务 - 开启各项服务
- 开启
Looper
循环,等待消息的来临并执行
SystemContext
其中SystemContext
的创建是通过ActivityThread
来获取的
|
|
最终获取到的SystemContext
是由ContextImpl
创建的
|
|
SystemServiceManager
它是SystemServer
的服务大管家,提供启动服务的相关方法。
主要涉及的方法有
startService
: 通过反射创建相关服务,并且调用对应服务的onStart()
方法来开启服务startBootPhase
: 开启特殊的启动阶段节点,各项服务会根据不同的阶段节点执行不同的逻辑。
启动的阶段节点分别为:
|
|
这些启动阶段会穿插在各项的服务启动序列中,每一个启动阶段节点的插入,都会伴随着该启动阶段节点之前的服务执行相关逻辑。
所以这里启动阶段节点相对于标识或者说依赖关系,即后续的启动阶段需要依赖于前面某些服务的特色处理逻辑之后才能进行。
而这些启动阶段的节点体现都分布在这些方法中
|
|
具体的节点插入时机为
|
|
对应的响应各个阶段的处理逻辑是在对应service
的onBootPhase()
方法中
|
|
下面我们来看下各个阶段都启动了哪些服务。
startBootstrapServices
|
|
在开始插入启动阶段节点之前,也可以称之为BootPhase 0
,启动的服务有:
|
|
由于PackageManager
启动需要DisplayManagerService
的相关信息,所以设置BootPhase 100
,执行DisplayManagerService
中的onBootPhase
方法来处理BootPhase 100
的逻辑
|
|
处理完之后继续启动PackageManagerService
与其他的服务。
从BootPhase 100
到BootPhase 480
会启动大量的服务。
包括初始化的服务、核心服务与其他服务。分别从startBootstrapServices
、startCoreServices
到startOtherServices
。
|
|
在BootPhase 100
阶段,startBootstrapServices
启动以下服务
|
|
随后进入startCoreServices
startCoreServices
|
|
以上是启动的核心服务;继续进入startOtherServices
startOtherServices
|
|
在startOtherServices
中启动了大量服务,总共差不多有80
多种,这里就不一一列举出来。
我这里将其与BootPhase
做了个归总,来看一下各个启动阶段节点都启动了哪些服务与对应服务的操作。
|
|
最后经过以上一系列的服务调用,会调用ActivityManagerService
的finishBooting
方法来执行最后一个BootPhase 1000
。
|
|
至此,系统服务启动阶段完成就绪,system_server
进程启动完成则进入Looper.loop()
状态,等待消息队列MessageQueue
中的消息到来,然后执行对应的Message
。
以上是SystemService
的启动过程,主要通过BootPhase 0 ~ BootPhase 1000
来分别启动不同的Service
,根据不同的BootPhase
,相应的Service
执行不同的逻辑。后续Service
启动逻辑与执行逻辑可能依赖于之前的Service
,而它们之间的依赖管理是通过BootPhase
来建立的。
项目
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: 每日一算法,由浅入深,欢迎加入一起共勉。