Android系统的启动学习记录

一、安卓系统启动流程

安卓系统的启动过程涉及多个阶段和组件,以下是一个大致的安卓系统启动流程的简要说明:

  1. Bootloader(引导加载程序): 当你开机时,系统首先加载引导加载程序(bootloader),这是一个小型的程序,其主要作用是初始化硬件和加载操作系统的引导映像。引导加载程序通常位于设备的存储介质(如闪存)上,并由硬件固定在特定的位置。

  2. Kernel(内核)启动: 引导加载程序会加载操作系统内核(kernel)。内核是操作系统的核心,负责管理硬件、内存、进程和设备驱动等。Android 设备通常使用 Linux 内核。

  3. init 进程启动: 内核启动后,会启动名为 init 的用户空间进程。这个进程的主要任务是初始化用户空间,并根据 init.rc 配置文件定义的规则来启动系统服务和应用。

  4. init.rc 配置解析: init 进程会解析 init.rc 配置文件,该文件定义了系统启动时要执行的一系列初始化步骤、系统服务和属性设置。

  5. Zygote 启动:init.rc 中定义的服务中,会有一个名为 zygote 的服务。zygote 进程是 Android 应用程序的孵化器,它是新应用程序进程的模板。

  6. System Server 启动:init.rc 中定义的另一个重要服务是 system_serversystem_server 是 Android 系统的核心服务,负责启动和管理系统的各种组件,如 Activity Manager、Package Manager、Notification Manager 等。

  7. 应用启动: 一旦 system_server 启动,Android 系统就准备好了正常运行应用程序。用户界面被加载,用户可以与设备进行交互。应用程序可以通过用户的操作或后台事件触发启动。

二、关于init.rc文件

init.rc 文件的目的是在系统引导时启动核心服务、设置属性以及执行一些初始化脚本。这些服务和属性在整个系统运行过程中都起着重要的作用。

  1. Service 定义: init.rc 文件中的最重要部分是服务(Service)的定义。服务代表着系统中的一个组件,可以是一个后台进程、守护进程或者其他系统级别的任务。每个服务由一个名字和一组属性定义,属性包括启动命令、启动级别、依赖关系等。以下是一个示例服务定义:

    service servicename /system/bin/executable arg1 arg2 {
        class classname
        user username
        seclabel u:r:servicename:s0
        oneshot
    }
    

    在这里,servicename 是服务的名字,/system/bin/executable 是要执行的二进制可执行文件,arg1 arg2 是传递给可执行文件的参数。class 定义了服务的类型,比如 mainzygotemedia 等。user 指定了服务的运行用户,seclabel 定义了安全标签,oneshot 表示服务只会在引导时运行一次。

  2. 属性设置: init.rc 文件还用于设置系统属性。属性是一种键值对,用于控制系统的行为和配置。属性可以在系统的不同组件之间共享,影响进程运行、权限控制等。例如:

setprop ro.build.type user
setprop persist.sys.language en
  1. 这些属性可以在 Android 系统中通过系统属性服务(property_service)访问。

  2. 启动级别和依赖关系: init.rc 文件中的服务可以通过指定启动级别和依赖关系来确保在正确的时间和顺序启动。启动级别(on boot phases)定义了何时启动服务,如 early-initinitsystem-server 等。依赖关系可以确保某些服务在其他服务之前启动。例如:

    on early-init
        start servicename
    

    这段代码表示在 early-init 阶段启动 servicename 服务。

三、关于Zygote

Zygote 是 Android 系统中的一个特殊进程,它起到了应用程序孵化器的角色,用于创建新的应用程序进程。

  1. Zygote 进程的创建: 在 Android 系统启动过程中,Zygote 进程是由 init 进程(第一个用户空间进程)启动的。Zygote 进程在系统启动时预加载并初始化了常用的类、资源和状态,以减少后续应用程序进程的启动时间。

  2. 共享状态和资源: Zygote 进程初始化时加载了许多常用的类和资源,这些内容可以在应用程序进程之间共享,从而加速新应用程序进程的启动。这种共享包括预加载的类、系统资源、部分虚拟机状态等。

  3. 应用程序孵化: 当用户启动一个新的应用程序时,Android 系统不会为该应用程序创建一个全新的进程,而是通过复制 Zygote 进程来创建新的应用程序进程。这样可以减少内存占用和启动时间。新的应用程序进程被称为 "app process",它会继承 Zygote 进程的状态和资源。

  4. 应用程序初始化: 在应用程序进程中,Zygote 进程中的类和资源已经被预加载,这使得应用程序能够更快地启动。应用程序进程会执行自己的 main() 方法,初始化应用程序的组件、资源和业务逻辑。

  5. 应用程序隔离: 尽管应用程序进程继承了 Zygote 进程的某些状态,但它们之间仍然是隔离的。每个应用程序都运行在自己的进程中,彼此之间不能直接访问内存或资源。这有助于提高应用程序的安全性和稳定性。

猜你喜欢

转载自blog.csdn.net/weixin_53324308/article/details/132451373