书中小结:
init进程启动做了很多的工作,总的来说主要做了以下三件事
- 创建和挂载启动所需的文件目录。
- 初始化和启动属性服务。
- 解析init.rc配置文件并启动Zygote进程。
Zygote进程启动共做了如下几件事
- 创建AppRuntime并调用其start方法,启动Zygote进程。
- 创建Java虚拟机并为Java虚拟机注册JNI方法。
- 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
- 通过registerZygoteSocket方法创建服务器端Socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程。
- 启动SystemServer进程。
SystemServer进程总结
- 启动Binder线程池,这样就可以与其他进程进行通信。
- 创建SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理。
- 启动各种系统服务。
Launcher的作用主要有以下两点
- 作为Android系统的启动器,用于启动应用程序。
- 作为Android系统的桌面,用于显示和管理应用程序的快捷图标或者其他桌面组件。
Android系统启动流程
- 启动电源以及系统启动当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行。加载引导程序BootLoader到RAM,然后执行。
- 引导程序BootLoader引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
- 当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程。
- 初始化和启动属性服务,并且启动Zygote进程。
- 创建Java虚拟机并为Java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。
- 启动Binder线程池和SystemServiceManager,并且启动各种系统服务。
- 被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。
Activity 启动流程
首先Launcher进程向AMS请求创建根Activity,AMS会判断根Activity所需的应用程序进程是否存在并启动,如果不存在就会请求Zygote进程创建应用程序进程。应用程序进程启动后,AMS 会请求创建应用程序进程并启动根Activity。
Context 使用场景总的来说分为两大类
- 使用Context调用方法,比如启动Activity、访问资源、调用系统级服务等。
- 调用方法时传入Context,比如弹出Toast、创建Dialog等。
Activity、Service和Application都间接地继承自Context,因此我们可以计算出一个应用程序进程中有多少个Context,这个数量等于Activity和Service的总个数加1,1指的是Application的数量。
ViewRootIMpl 职责
- View 树的跟并管理 View 树。
- 触发 View 的测量、 布局和重绘。
- 输入时间的中转站。
- 管理 Surface。
- 负责与 WMS 进行进程间通信。
WMS 职责
- 窗口管理(WindowManager)
- 窗口动画(WindowAnimator)
- 输入系统中转站(IMS, 即 InputManagerService)
- Surface 管理(SurfaceFlinger)
~
zygote
init 进程启动了 zygote 进程, zygote 在 c 层加载了 jvm 和注册了 jni 对于函数等, 启动了 ZygoteInit 函数的 mian, 其中 ZygoteInit 是 JAVA 层的代码, 所以是 jni 调用哈。 在之前从未 c 和 JAVA 的互动, 所以这里是进入 JAVA 世界的第一脚。
ZygoteInit
通过 zygote 初始化进入到 ZygoteInit main 中, 主要做了一下四件事
- 创建一个Server端的Socket。
- 预加载类和资源。
- 启动SystemServer进程。
- 等待AMS请求创建新的应用程序进程。
SystemServer
SystemServer 是 ZygoteInit 处理并启动的, SystemServer fock zygote 进程后, 首先先关闭 socket, 因为 zygote 中的 socket 在 SystemServer 中是无用的。
SystemServer 中会启动 Binder 线程池, 这样 ServiceServer 就可以和其他进程用过 Binder 进行通信啦。
SystemServer 在 main 中, 创建了 SystemServerManager 来处理管理服务, 然后启动了各种服务, 包括我们熟悉的 AMS, WMS 等。 SystemServer 把服务分成了三类: 引导服务、 核心服务、 其他服务。
Launcher
Launcher 是在 SystemServer 中启动好 AMS 后进行处理启动的。 AMS 启动后回调回来后启动 Launcher。
ASM -> Zygote
应用启动时如果发现当前应用未有进程的话, 需要请求 zygote 去创建进程呢。 简单的调用流程: asm 调用 startProcessLocked (如果 entryPoint 为空的话, 赋值为 android.app.ActivityThread) -> Process.start -> ZygoteProcess.start -> startViaZygote -> zygoteSendArgsAndGetResult (发送请求给 zygote)。
zygote 接受到 asm 的请求后, forkAndSpecialize方法来创建应用程序进程, 在子进程中, 调用到 ActivityThread 的 main。 注意这里跟启动 SystemServer 一样, 都是抛异常后在外部 catch 中去运行的呢, 这个是让当前入口更像是应用的真正入口函数。
ApplicationThread
ApplicationThread 是 ActivityThread 中的一个内部类, 其就是 AMS 和当前应用交换信息的桥梁, AMS 通过IApplicationThread 通过 Binder 与应用通讯。
Activity、 Service 启动共同点
都是 AMS 新建进程后, 通过 IApplicationThread 通知到应用进程, 然后通过 mH handler 发送 Message, 然后进行各自的处理。
BindService
BindService 比 Service 启动稍许复杂。 主要流程还是不变的, 肯定是应用到 AMS, AMS 再通过 IApplicationThread 到应用。 具体不再过多说, 其中我们要知道一点, 我们设置的 service connection 会在向 AMS 发送请求前进行包装成 IServiceConnection 也就是可以通过 Binder 去通讯, 然后 AMS 就可以通过这个 IServiceConnection 包装了进行调用从而回调给我们设置的接口运行。
Activity 任务栈模型
ActivityStack 管理及包含一个或者多个 TaskRecord(任务栈), TaskRecord 管理及包含了一个或者多个 ActivityRecord。 ActivityRecord 就是包含一个 Activity 中的各种信息的类。
Window、 WindowManager、 WMS 关系
WindowManger 其实现为 WindowManagerImpl, 通过它的命名我们可以知道其管理 window(window 是抽象出来的概念, 其实质是 View), 而 WindowManager 所提供的功能最终由 WMS 进行处理。
Window 层级 type
- 应用窗口层级: 1 ~ 99
- 子窗口层级: 1000 ~ 1999
- 系统窗口层级: 2000 ~ 2999