在 Android 系统启动过程中,init
进程会执行一系列初始化操作,并最终启动 Zygote 进程。Zygote 进程是一个特殊的进程,它会在系统启动时先行启动,并负责处理应用程序进程的创建请求。当一个应用程序需要启动时,Zygote 进程会 fork 出一个新的进程,并为其分配独立的资源空间。这个新进程就是应用程序的进程。应用程序进程启动后,将会运行应用程序中的代码,并提供相应的功能或服务。
在 Zygote 进程启动之后,它会执行 handleSystemServerProcess
函数。该函数会进行 SystemServer 进程的初始化,并启动 SystemServer 进程。
SystemServer
是 Android 系统中非常重要的进程,它管理着大量的系统服务,并为其他应用程序提供了基础功能支持。
例如,在 SystemServer 进程中,PackageManagerService 负责管理所有应用程序的安装和卸载,ActivityManagerService 负责管理应用程序的进程和任务,WindowManagerService 负责管理应用程序的窗口、布局等等。SystemServer 进程还负责初始化各种服务和资源,如启动 Binder 服务、注册本地服务等。因此,SystemServer 进程的启动是整个 Android 系统启动过程中的关键环节之一。
SystemServiceManager
是 Android 系统中用于管理系统服务的一个类。它负责管理所有注册的系统级别服务,并在需要时启动和停止它们。
例如,当 SystemServer 进程启动时,SystemServiceManager 会注册 PackageManagerService、WindowManagerService、ActivityManagerService 等服务,并在需要时启动它们。SystemServiceManager 通过调用 registerService 函数来注册系统服务,并可以通过 startService、stopService 函数来启动或停止这些服务。当系统不再需要某个服务时,SystemServiceManager 也会负责将其停止并卸载。
ServerManager
是另一个重要的组件,它负责管理 Binder 服务。Binder 是 Android 系统中的进程间通信(IPC)机制,它允许不同进程之间共享数据、调用接口等。
ServerManager 维护了一个 ServiceManager 对象,用于跟踪系统中正在运行的 Binder 服务。当一个新的 Binder 服务被创建时,ServerManager 会调用 addService 函数来向 ServiceManager 注册这个服务。当其他应用程序需要使用某个 Binder 服务时,它可以通过 getService 函数从 ServiceManager 中获取相应的服务。例如,在 ActivityManagerService 中,它注册了一个名为 “activity_task” 的 Binder 服务,并提供了一些用于启动、停止、重启应用程序等操作的接口。其他应用程序可以通过调用 Context.getSystemService(Context.ACTIVITY_TASK_SERVICE) 函数来获取这个 Binder 服务。
在 Android 设备上启动一个新的 Activity 时,系统会执行一系列的流程来启动新的 Activity 进程并将其展示在屏幕上。
系统会检查目标 Activity 是否已经存在于某个进程中。如果不存在,则需要创建新的进程。
在 ActivityManagerService (AMS) 中,会调用 ActivityStarter 的 executeRequest
方法。该方法会检查目标 Activity 是否已经启动,并返回一个 ActivityRecord 对象。如果目标 Activity 尚未启动,则 AMS 会调用requestRelaunchActivityLocked
方法向 ActivityStackSupervisor 请求重启目标 Activity。如果当前进程不包含该 Activity,ActivityStackSupervisor 会返回 null。在这种情况下,executeRequest 方法会调用requestRelaunchActivity
方法向 Zygote 进程请求创建新的进程。
AMS 会调用 ActivityStarter 的 requestRelaunchActivity 方法,向 Zygote 进程发送启动新进程的请求。
AMS 构建一个 ZygoteArguments 对象,包含了应用程序的入口点、启动的 Activity 等信息,并将其序列化为一个字符串。然后,AMS 调用 ZygoteProcess 的 zygoteSendArgsAndGetResult
方法,向 Zygote 进程发送启动新进程的请求,并等待响应。在 Zygote 进程中,zygoteSendArgsAndGetResult
方法会读取请求数据并使用 fork 函数创建一个新的进程。然后,Zygote 进程会使用 execve 函数加载应用程序的入口点,并将进程的 PID 返回给 AMS。
新进程启动,并执行 ActivityThread 类的 main 函数。
在 ActivityThread 的 main
函数中,新进程会创建一个新的 Looper 和 Handler,用于处理消息循环和事件分发。此时,AMS 会通过 Binder 机制向新进程发送启动目标 Activity 的请求。
新进程的 ApplicationThread 对象接收到了 AMS 发送的启动目标 Activity 的请求。
在 ActivityThread 类的 main 函数中,会创建一个 ApplicationThread
对象,并将其绑定到新进程的 Binder 线程池中。当 AMS 向新进程发送启动请求时,该请求会通过 Binder 机制传递给新进程的 ApplicationThread 对象。ApplicationThread 按照请求中包含的信息,找到目标 Activity 并调用其 onCreate 方法。
目标 Activity 启动完成,并进行了界面布局的初始化等操作。在目标 Activity 的 onCreate 方法中,它会进行界面布局的初始化等操作。一旦目标 Activity 启动完成后,AMS 将其状态设置为 RESUMED,并将其添加到 ActivitiesStack 的顶部。