【Android】AMS(二)SystemServer作用和启动一个新的Activity流程

SystemServer

在 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 服务。

启动一个新的 Activity

在 Android 设备上启动一个新的 Activity 时,系统会执行一系列的流程来启动新的 Activity 进程并将其展示在屏幕上。

1.检查是否需要创建新进程

系统会检查目标 Activity 是否已经存在于某个进程中。如果不存在,则需要创建新的进程。

在 ActivityManagerService (AMS) 中,会调用 ActivityStarter 的 executeRequest 方法。该方法会检查目标 Activity 是否已经启动,并返回一个 ActivityRecord 对象。如果目标 Activity 尚未启动,则 AMS 会调用requestRelaunchActivityLocked方法向 ActivityStackSupervisor 请求重启目标 Activity。如果当前进程不包含该 Activity,ActivityStackSupervisor 会返回 null。在这种情况下,executeRequest 方法会调用requestRelaunchActivity方法向 Zygote 进程请求创建新的进程。

2. 向 Zygote 进程发送请求

AMS 会调用 ActivityStarter 的 requestRelaunchActivity 方法,向 Zygote 进程发送启动新进程的请求。

AMS 构建一个 ZygoteArguments 对象,包含了应用程序的入口点、启动的 Activity 等信息,并将其序列化为一个字符串。然后,AMS 调用 ZygoteProcess 的 zygoteSendArgsAndGetResult 方法,向 Zygote 进程发送启动新进程的请求,并等待响应。在 Zygote 进程中,zygoteSendArgsAndGetResult 方法会读取请求数据并使用 fork 函数创建一个新的进程。然后,Zygote 进程会使用 execve 函数加载应用程序的入口点,并将进程的 PID 返回给 AMS。

3.启动新进程

新进程启动,并执行 ActivityThread 类的 main 函数。

在 ActivityThread 的 main 函数中,新进程会创建一个新的 Looper 和 Handler,用于处理消息循环和事件分发。此时,AMS 会通过 Binder 机制向新进程发送启动目标 Activity 的请求。

4.接收启动请求

新进程的 ApplicationThread 对象接收到了 AMS 发送的启动目标 Activity 的请求。

在 ActivityThread 类的 main 函数中,会创建一个 ApplicationThread 对象,并将其绑定到新进程的 Binder 线程池中。当 AMS 向新进程发送启动请求时,该请求会通过 Binder 机制传递给新进程的 ApplicationThread 对象。ApplicationThread 按照请求中包含的信息,找到目标 Activity 并调用其 onCreate 方法。

5.启动目标 Activity

目标 Activity 启动完成,并进行了界面布局的初始化等操作。在目标 Activity 的 onCreate 方法中,它会进行界面布局的初始化等操作。一旦目标 Activity 启动完成后,AMS 将其状态设置为 RESUMED,并将其添加到 ActivitiesStack 的顶部。

你可能感兴趣的:(Framework,Android学习笔记,android)