Android
通过Linux
启动init
进程,再通过init
进程fork
出Zygote
进程。在Zygote
中有一个重要的步骤就是启动system_server
进程,并且创建SystemServer
。
下面我们来深入了解一下SystemServer
的创建过程。
此次分析过程基于Android 10.0
forkSystemServer
在ZygoteInit
中会通过forkSystemServer
来创建system_server
进程。
|
|
在这里会准备fork
的进程参数,从参数信息可以看出,system_server
进程的uid=1000、gid=1000
,进程名称为system_server
,后续启动的SystemServer
路径为com.android.server.SystemServer
。
从zygote
进程fork
新进程之后会将原来的zygote
的socket
关闭,同时对于有两个zygote
进程的情况,需要等待第2
个zygote
创建完成。
|
|
nativeForkSystemServer
最终会通过JNI
映射到com_android_internal_os_Zygote.cpp
中的com_android_internal_os_Zygote_nativeForkSystemServer
方法.
nativeForkSystemServer
|
|
在这里会通过ForkCommon
来创建子进程
ForkCommon
|
|
fork
创建进程采用的是copy on write
方法,这个是Linux
创建进程的标准方式,会有两次返回值。
返回0
时代表子进程,返回值大于0
为父进程。
进程创建完毕之后,会返回Java
层,并进入handleSystemServerProcess
来处理system_server
进程逻辑。
handleSystemServerProcess
|
|
设置进程名称system_server
,并通过zygoteInit
进入。
|
|
在这里会通过调用RuntimeInit.commonInit
来初始化一些公用的东西。并通过nativeZygoteInit
调用对于映射的Linux
方法,即app_main.cpp
中的onZygoteInit
方法来初始化zygote
。
|
|
ProcessState::self()
是单例模式,主要工作是调用open()
打开/dev/binder
驱动设备,再利用mmap()
映射内核的地址空间,将Binder
驱动的fd
赋值ProcessState
对象中的变量mDriverFD
,用于交互操作。startThreadPool()
是创建一个新的binder
线程,不断进行talkWithDriver()
。
applicationInit
继续回到Java
,调用applicationInit
方法:
|
|
通过之前的参数列表信息,可以知道这里的startclass
就是com.android.server.SystemServer
。
findStaticMain
最后进入findStaticMain
方法来创建SystemServer
|
|
该方法也很简单,通过Java
反射来获取对应的Class
、Method
,这里对应的就是SystemServer
的main
方法。
最后返回MethodAndArgsCaller
。
|
|
所以如果调用run
方法就会通过反射来执行SystemServer
中的main
方法。
而这个Runnable
最终在ZygoteInit
的main
方法中通过forkSystemServer
创建并返回。
|
|
创建并返回Runnable
之后,调用r.run()
来执行SystemServer
的main
方法。
最终进入SystemServer
的流程。
现在我们已经找到了进入SystemServer
的入口,后续继续分析SystemServer
的作用与内部执行的逻辑。
项目
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: 每日一算法,由浅入深,欢迎加入一起共勉。