一、Android 系统的启动流程
在分析AMS之前,我们先看看Android系统的启动流程。
1.当用户按下电源开机键,引导芯片会加载BootLoader到内存中,开始拉起Linux OS,待Linux内核启动完毕后,它就会在系统文件中找init.rc文件,并启动init进程。
2.init进程在处理了一系列任务后,会进行一项非常关键的步骤:启动Zygote进程。Zygote进程是Android 进程的鼻祖。
在Android系统中,Dalvik虚拟机或者ART虚拟机,应用程序进程以及运行系统关键服务的SystemService进程都是由Zygote进程通过fork复制进程创建的。
3.Zygote进行了一系列复杂的操作后,会从Native层进入Java层,进入到
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java。
然后ZygoteInit主要做了如下4件事
- 创建了一个Service端的socket
- 预加载类和资源
- 启动SystemService进程
- 等待ActivityManagerService请求创建新的应有程序进程。
前面说了SystemService进程是主要创建系统服务的,我们熟知的ActivityManagerService、WindowManagerService、PackageManagerService都是它创建的。
插入一个ServiceManager,系统创建的服务,如WindowManagerService、PackageManagerService,创建成功后都会在ServiceManager里面注册,后续如果哪个客户端向调用这些服务必须通过ServiceManager
二、应用程序的启动过程
1.用户点击桌面app的图标,Launcher进程通过Binder向SystemServer进程发起startActivity的请求。
2.SystemServer进程收到请求后,向Zygote进程发送创建进程的请求
3.Zygote收到创建进程的请求后,就会fork出新的子进程,即App进程。
4.App进程通过Binder向SystemServer进程发起attachApplication的请求。
5.SystemServer收到请求后,进行一系列 工作,在通过Binder向App进程发送scheduleLaunchActivity的请求。
6.App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY的消息。
7.主线程在收到handler的消息后,通过发射机制创建目标Activity,并回调Activity.onCreate()等生命周期的方法。到这里,App已经启动了。