安卓 App 的启动流程可以分为冷启动和热启动两种情况。冷启动是指在后台没有该应用的进程时,系统重新创建一个新的进程来启动应用;热启动则是指在后台已有该应用的进程时,从已有的进程中启动对应的进程组件。
一般来说,冷启动包括以下几个步骤:
1. 启动 App 进程:当点击 launcher 桌面程序的 app 图标时,launcher 程序会调用 startActivity() 函数,通过 binder 跨进程通信,发送消息给 system_server 进程。在 system_server 进程中,由 ams 通过 socket 通信告知 zygote 进程 fork 出一个子进程(app 进程);
2. 开启 App 主线程:app 进程启动后,会实例化一个 activityThread ,并执行其 main 函数,同时会创建 applicationThread 、 looper 、 handler 对象,开启主线程消息循环 looper.loop() ;
3. 创建并初始化 application 和 activity: activityThread 的 main 函数通过调用 attach 方法进行 binder 通信,通知 system_server 进程执行 ams 的 attachApplication 方法。在 attachApplication 方法中, ams 分别通过 bindApplication 、 scheduleLaunchActivity 方法,通知 app 进程的主线程 handler ,对 app 进程的 application 和 activity 进行初始化,并执行 application 、 activity 的生命周期;
4. UI 布局和绘制:主线程 handler 初始化 activity 时,会执行创建 phoneWindow 、初始化 decorView 的操作,并且添加布局到 decorView 的 contentView 中。 contentView 对应着 activity 的 setContentView 中设置的 layout.xml 布局文件所在的最外层父布局。
启动过程中涉及到的关键角色包括:
- zygote 进程:android 系统启动过程中,会先启动 linux 内核,然后加载 init.rc 文件,启动 init 进程。然后, init 进程通过解析 init.rc 文件 fork 生成 zygote 进程,该进程也是 android 系统的首个 java 进程。之后 zygote 进程负责孵化 system_server 进程和 app 进程;
- system_server 进程:由 zygote 进程 fork 生成, system_server 是 zygote 孵化的第一个进程。负责启动、管理整个 java framework,系统里面重要的服务都是在这个进程里面开启的,比如 ams (activityManagerService)、 pms (packageManagerService)、 wms (windowManagerService);
- app 进程: zygote 进程在 app 层中孵化出的第一个进程是 launcher 进程,即手机的桌面 app。 zygote 还会孵化出 browser 、 email 、 phone 等 app 进程,每个 app 至少运行在一个进程上。所有 app 进程都由 zygote 进程 fork 生成;
- android 系统里的 client/server 模式:平时所熟知的前端(web\android\ios)通过网络与服务器通信是客户端-服务端模式的体现,而在 android framework 中,四大组件的创建、生命周期也是通过这样的模式进行通信;
- android binder 机制:在 android 系统中,一个进程的空间,分为用户空间和内核空间两部分。进程内的用户空间和内核空间可以进行数据交互。进程间的用户空间是隔离开来的,只有内核空间能进行数据交互。