Android系统启动流程

1. 启动电源以及系统启动

电源键按下以后,引导芯片代码从预定义的地方开始执行,加载引导程序BootLoader到RAM,然后开始执行。相当于电脑启动时候硬件自检并拉起主板自带启动程序的过程。

2. 引导程序BootLoader

引导程序 BootLoader是在 Android 操作系统开始运行前的一个小程序,它的主要作用是把安卓的定制Linux拉起来并运行。类似于电脑的主板程序拉动Window系统启动。

3. Linux内核启动

是整个系统的初始化,包括设置缓存、保护存储器、计划列表、加载驱动。在内核完成系统设置后,会去寻找init.rc文件,启动init进程。

4. init进程启动

  • 创建和挂载启动所需文件目录

    这里是通过入口函数来完成的,入口函数位于init.rc文件中,Linux内核加载后,会寻找init.rc文件,并执行该文件的main方法。

    main方法会挂载启动所需文件目录,这些文件只在系统运行时候才会存在,系统停止时候就会消失。

  • 初始化和启动属性服务

    在加载完所需文件目录后,init会去初始化和启动属性服务。

    属性服务类似于window平台上的注册表管理器。init进程会给属性服务分配内存用来存储这些属性,如果需要这些属性直接读取就可以了。

  • 解析init.rc文件并启动Zygote进程

    init.rc文件解析到最后,会启动Zygote进程,用来继续执行启动流程。

5. Zygote进程启动

​ Zygote 也被称为孵化器,他通过fock的形式来创建应用程序进程和SystemServer 进程。从Android5.0开始,Android 开始支持64位系统,然后Zygote也有了32位和64位的区别。

  • 创建 AppRuntime 并调动起 start 方法,启动 Zygote 进程

    Zygote进程懂事通过fock自身来创建子进程的,这样它的子进程都可以进入main函数,函数内部会判断是否是当前进程。

    如果是当前进程,会调用start函数,来创建虚拟机。

  • 创建虚拟机并为 java 虚拟机注册 JNI 方法

    通过一些列的调用,最终会调用ZygoteInit的Main方法,这里的调用是通过JNI来实现的。而ZygoteInit是通过java 语言编写的,这样Zygote 就从 Native 层进入了 Java框架层,换句话说是Zygote开创了Java框架层。

  • 通过 JNI 调用 Zygotelnit 的 main 函数进入 Zygote的 Java框架层。

    进入java层后,会去创建一个Server端的Socket,socketName 的值为“zygote”

  • 通过 registerZygoteSocket 方法创建服务器端 Socket,并通过 runSelectLoop 方法等待 AMS 的请求来创建新的应用程序进程。

    主要就是创建了一个Server端的Socket,然后预加载类和资源并启动SystemServer进程

  • 启动 SystemServer 进程

    启动这个进程以后,就可以开始创建系统服务了。

6. SystemServer进程启动

  • 启动 Binder线程池,这样就可以与其他进程进行通信。

    SystemServer进程复制了 Zygote 进程的地址空间,因此也会得到Zygote 进程创建的 socket ,这个 socket 对于 SystemServer 进程没用,于是会关闭该 socket 。然后调用 handleSystemServerProcess 方法来启动 SystemServer 进程。

    启动进程时候,会调用 ZygoteInit 的 zygoteInit 方法,该方法会调用 ZygoteInit.nativeZygoteInit() ,看方法名知道调用的是 Native 层的代码,用来启动 Binder 线程池,这样 SystemServer 进程就可以使用 Binder 与其他进程进行通信了。

  • 创建 SystemServiceManager,其用于对系统的服务进行创建、启动和生命周期管理。

    在 SystemServer 进程的 main 方法中,会调用本身的 run 方法,然后 run 方法会创建对应的 Looper 、加载动态库、启动引导服务、启动核心和其他服务。

  • 启动各种系统服务。

    这些服务的启动过程类似,首先通过对应的startServer方法启动对应的服务管理方法,然后将管理方法添加到 mServer 中,mServer 用来存储 SystemServer 的 ArrayList 。这些服务用于系统C/S架构中的 Binder 通信机制,家里通信通路,这样各个服务就可以正常运行了。

7. Launcher启动

​ 通俗的来讲 Launcher 就是 Android 系统的桌面,他主要用来作为系统的启动器,用来启动应用程序,同事显示和管理应用程序的快捷图标以及其他桌面组件。

  • Launcher 启动过程介绍

    启动 Launcher 的入口为 AMS 的 systemReady 方法,它在 SystemServer 的 startOtherServer 中调用。然后在 getHomeIntent 中创建了启动Launcher 的 Intent ,这个 Intent 会将 Launcher 启动,并执行对应的 onCreate () 方法,至此 Launcher 正式启动。

  • Launcher 中应用图标

    Launcher 是用工作区的形式来显示系统安装的应用程序的快捷图标的,每一个工作去都是用来描述一个抽象的桌面,它由n个屏幕组成,每个屏幕又分为n个单元格,每个单元格用来显示一个应用程序的快捷图标。

Launcher启动完成后,系统正式启动完成。我们可以可以通过launcher打开系统应用,正常使用手机,所以Android系统的启动流程主要分为以上的步骤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值