Android系统启动的过程

关于Android系统启动的过程,以前一直觉得离自己很遥远。随着不断深入的学习,是时候要了解一下。这里就综合网上的很多资料来分析一下Android系统启动的过程。

图示

首先贴上两张图,展示Android系统启动的过程。

图一:

这里写图片描述

图二:

这里写图片描述

通过以上两张图,我们能清晰地了解Android系统启动的过程。

下面就开始切入正题。

Android系统启动的过程

第一阶段:Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。(这一步由“芯片厂商”负责设计和实现)

第二阶段Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。(这一步由“设备厂商”负责设计和实现)

第三阶段:Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统。

第四阶段:执行init程序,由此开启Android的世界。(这一步则是Android内核开发过程中需要涉及的地方)

Android系统以及各大Linux的发行版,他们的Linux内核部分启动过程都是差不多的,他们之间最大的区别就在于init程序的不同,因为init程序决定了系统在启动过程中,究竟会启动哪些守护进程和服务,以及呈现出怎样的一个用户UI界面。

因此,init程序是分析Android启动过程中最核心的程序

init

启动过程是代码system\core\init\init.cpp的 main 函数的执行过程。在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket 监听等。在rc文件解析中会启动 ServiceManager 服务和 Zygote 进程

init程序最核心的工作主要有3点:

  • 创建和挂载一些系统目录/设备节点,设置权限,如:/dev, /proc, and /sys

  • 解析 init.rc 和 init.< hardware >.rc,并启动属性服务,以及一系列的服务和进程

  • 启动Launcher主界面,将已经安装的app程序的快捷图标展示到桌面

ServiceManager

ServiceManager 用来管理系统中所有的 binder service,不管是c++实现的本地服务还是Java语言实现的Android服务都需要这个进程来统一管理,最主要的管理就是,注册添加服务,获取服务。所有的 Service 使用前都必须先在 ServiceManager 中进行注册

本地服务是指运行在C++层的系统守护进程,而Android服务是指运行在Dalvik虚拟机进程中的服务

Zygote

Zygote进程启动才算建立起真正的 Android 的运行空间。不过 Init 进程不会直接启动 Zygote 进程,而是使用 app_process 命令来通过 Android Runtime 来启动Android Runtime 会启动第一个 Davlik 虚拟机,并调用 Zygote 的 main 方法,启动服务。

Zygote Android系统最重要的进程,所有后续的Android应用程序都是由它fork出来的。

Zygote进程会首先fork出SystemServer进程,SystemServer进程的全部任务就是将所有的Android核心服务启动起来。而这些Android服务并没有各种运行在独立的进程中,它们由SystemServer以线程的方式创建,所以都运行在同一个进程中,即SystemServer进程中。

启动Launcher

当所有的服务都启动完毕后,SystemServer会打印出“Making services ready”,然后通过ActivityManager启动Launcher主界面,并发送“ACTION_BOOT_COMPLETED”广播消息。

如果用户点击app的图标,就和ActivityManager开始通信,然后ActivityManager向Zygote发送消息Zygote意为受精卵,这个时候Zygote就分裂了,fork出一个新的进程,就是我们要启动的应用。

至此Android系统启动的过程和重点大致分析完了。

如果想进一步研究可以参考源码和我下边列出的文章。

参考:
1.Android内核开发:图解Android系统的启动过程
2.Android 系统启动流程
3.【Android 系统开发】 Android 系统启动流程简介
4.Android系统启动过程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值