Android Framework 之 启动流程

Android 系统的启动流程

Android 系统的启动流程可以分为以下几个主要步骤:

  1. 引导加载器(Bootloader)启动:当你打开一个 Android 设备时,首先启动的是引导加载器。引导加载器负责启动 Android 的核心操作系统。

  2. Linux 内核启动:引导加载器加载并启动 Linux 内核。Linux 内核负责启动系统的底层硬件,并启动 init 进程。

  3. Init 进程启动:init 进程是 Linux 系统中的第一个进程(PID = 1)。在 Android 系统中,init 进程负责启动一些重要的守护进程和服务,例如 Zygote 进程。

  4. Zygote 进程启动:Zygote 是 Android 中的一个特殊进程,负责孵化(Fork)出所有其他的应用进程。Zygote 进程在启动时会预加载大量的系统类和资源,以此来提高应用启动的速度。

  5. SystemServer 进程启动:Zygote 进程会 fork 出一个新的进程来启动 SystemServer。SystemServer 是 Android 系统中的核心服务,它管理并提供了许多系统级别的服务,例如窗口管理服务、活动管理服务等。

  6. 系统服务启动:在 SystemServer 进程中,会启动各种系统服务。这些服务在系统启动完成后,将一直运行,为应用程序提供各种服务。

  7. 启动 Launcher 应用:系统服务启动完毕后,Activity Manager Service 会启动设备的 Launcher 应用,此时,用户可以开始与设备进行交互。

这就是 Android 系统启动的整个过程。请注意,这个过程可能会因设备制造商的定制和 Android 版本的不同而有所不同,但大体流程是相同的。

Launcher的启动流程

Launcher 的启动过程更具体的说明如下:

  1. 当 Android 系统启动完成,并且所有的系统服务都已经启动后,ActivityManagerService (AMS)会开始处理用户的交互。AMS 是 Android 中负责管理所有活动的系统服务。

  2. AMS 会发送一个包含 ACTION_MAIN 和 CATEGORY_HOME 的 Intent。这个 Intent 的目的是寻找并启动设备上配置为主屏幕(HOME)的应用,通常这就是 Launcher 应用。

  3. 这个 Intent 会通过 Android 的 Intent 解析系统,寻找所有能够响应这个 Intent 的应用。由于 Launcher 在其清单文件(AndroidManifest.xml)中声明了相应的 ,因此它会被选中来响应这个 Intent。

  4. 一旦 Launcher 被选中,AMS 就会请求 Launcher 启动。如果这是设备第一次启动,或者 Launcher 进程尚未启动,那么 AMS 会请求 Zygote 启动一个新的进程来托管 Launcher。如果 Launcher 进程已经存在,AMS 就会在该进程中启动新的 Launcher 活动实例。

  5. 当 Launcher 启动后,它会创建并显示用户的主屏幕。这个屏幕上会显示应用的图标、小部件等,用户可以通过这个界面启动和切换应用。

startActivity 详细说明

  1. 发送 Intent:源应用程序(App1)调用 startActivity 方法,传递一个 Intent。该 Intent 包含要启动的目标应用程序(App2)的 Activity 的信息。

  2. 验证权限和 Intent:在 ActivityManagerService (AMS) 中,startActivity 方法会对 Intent 进行检查和验证。这包括验证调用者的权限,查找 Intent 对应的 Activity,处理各种启动模式等。

  3. 判断目标应用程序进程状态:接着,AMS 会判断目标应用程序 App2 的进程是否已经存在。如果已经存在,AMS 会使用已经存在的进程;如果不存在,AMS 会向 Zygote 发送请求,要求它创建一个新的进程。

  4. 创建新的应用程序进程:Zygote 在收到 AMS 的请求后,会创建一个新的应用程序进程,然后在这个进程中创建一个 Application 对象,并执行其 onCreate 方法。

  5. 创建 ActivityRecord:与此同时,AMS 会创建一个新的 ActivityRecord 对象,来代表要启动的 Activity。

  6. 调度启动 Activity:然后,AMS 会通过 Binder IPC 向新的应用程序进程发送一个 LAUNCH_ACTIVITY 消息。

  7. 接收 LAUNCH_ACTIVITY 消息:新的应用程序进程在接收到 LAUNCH_ACTIVITY 消息后,会创建目标 Activity 的实例,然后调用其 onCreate、onStart 和 onResume 方法。

ActivityManagerService 启动

**ActivityManagerService (AMS) **是 Android 中最为关键的系统服务之一,它负责管理系统中的进程,以及四大组件(Activity、Service、BroadcastReceiver 和 ContentProvider)的生命周期。这里将详细解释 AMS 的内部启动流程和工作流程:

AMS的启动流程:

实例化:AMS 是在 SystemServer 中被实例化的。SystemServer 会首先创建一个 ContextImpl 对象,然后利用这个 ContextImpl 创建 AMS。

服务初始化:接下来,调用 AMS 的 init 方法进行初始化,这个方法会创建和初始化一些需要的数据结构和服务,比如 BroadcastQueue、IntentFirewall 和 ActivityStackSupervisor 等。

准备完成:完成初始化后,调用 systemReady 方法来通知 AMS 系统准备就绪。在这个方法中,AMS 会完成一些后期初始化的工作,例如启动系统的 Home Activity。

AMS的工作流程:

AMS 主要的工作就是管理系统中的四大组件和进程。以下是它们分别的工作流程:

Activity的管理:AMS 使用 ActivityStackSupervisor 来管理系统中所有的 Activity。当应用程序调用 startActivity 方法时,会通过 Binder IPC 机制调用 AMS 中的 startActivity 方法。AMS 会根据 Intent 解析出需要启动的 Activity,创建一个 ActivityRecord 对象并添加到 ActivityStack 中。然后,AMS 会向应用程序发送 LAUNCH_ACTIVITY 消息,告诉应用程序启动新的 Activity。

Service的管理:当应用程序调用 startService 或 bindService 方法时,AMS 会创建一个 ServiceRecord 对象来保存 Service 的状态。然后,AMS 会向应用程序发送 CREATE_SERVICE 或 BIND_SERVICE 消息,告诉应用程序创建或绑定 Service。

BroadcastReceiver的管理:当应用程序调用 sendBroadcast 方法时,AMS 会创建一个 BroadcastRecord 对象,保存广播的信息。然后,AMS 会将 BroadcastRecord 添加到 BroadcastQueue 中,等待处理。

ContentProvider的管理:当应用程序调用 getContentResolver().query() 或其他方法时,AMS 会查找对应的 ContentProviderRecord,然后通过 Binder IPC 机制向目标 ContentProvider 发送请求。

进程的管理:AMS 使用 ProcessList 和 ProcessRecord 来管理系统中的进程。当需要创建新的进程时,AMS 会向 Zygote 发送请求,然后由 Zygote 创建新的进程。同时,AMS 也负责进程的调度和回收。

你可能感兴趣的:(android)