【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 的顶部。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 12 SystemServer启动流程如下: 1. 引导加载:系统启动时,先加载引导程序,进行硬件初始化、内核加载等操作。 2. Zygote 进程启动:Zygote 是 Android 系统中的一个特殊进程,负责孵化其他应用进程。Zygote 进程会预加载一些常用的类和资源,以加快应用的启动速度。 3. SystemServer 进程启动:Zygote 进程会 fork 出 SystemServer 进程,该进程是 Android 系统中的核心服务进程。SystemServer 进程负责启动和管理系统级别的服务,例如 ActivityManagerService、PackageManagerService、WindowManagerService 等。 4. SystemServer 初始化:SystemServer 进程启动后,会进行一系列的初始化操作。首先会创建 Looper 线程,用于接收消息并处理各个服务的初始化工作。然后依次创建各个系统服务,并调用它们的启动方法。 5. 启动系统服务:SystemServer 进程会按照一定顺序启动各个系统服务。每个系统服务都有自己的初始化流程,例如 PackageManagerService 会加载应用程序列表、数据目录等;ActivityManagerService 会初始化进程间通信机制等。 6. 启动应用进程:在系统服务启动完成后,SystemServer 进程会通过 Zygote 孵化出其他应用进程。应用进程会根据 AndroidManifest.xml 中的配置进行初始化,包括创建 Application、加载资源等。 总结来说,Android 12 SystemServer启动流程包括引导加载、Zygote 进程启动、SystemServer 进程启动、SystemServer 初始化、启动系统服务和启动应用进程等步骤。这些步骤都是为了在系统启动时提供必要的服务和资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值