【Android系统启动流程笔记】

Android系统启动概述

  对于Android系统启动流程一直想输出一片文章做总结,今天终于有时间写了
  对于系统的启动流程,我们没有必要深挖,如果深挖有很大概率会进去从而出不来,导致自己好不容易梳理的整个Android系统启动流程会变得模糊不清。

1. 从开机说起

  当按下开机键时引导芯片的代码会从预先定义在ROM的地方开始读取执行,ROM是指只读存储器,哪怕手机关机了信息也不会丢失。
在ROM读取的代码是引导程序Boot loader,是Android系统开始运行前的一个小程序,负责把系统os拉起并运行。
然后首先是启动Linux内核,他启动时会设置缓存,加载驱动等操作,然后会去文件系统查找init.rc文件,根据rc文件信息启动init进程。

1.1 了解.rc格式文件

  .rc格式的文件是配置文件,也可以认为是脚本,由Android初始化语言编写包含五种类型语句分别是Action、Command、Service、Option、Import。
启动init进程、zygote进程都是通过.rc的方式来启动的

2. init进程

  init进程是用户空间第一个进程,他做了很多重要的事情,重点关注zygote和属性服务。init进程主要做了以下的事情

  1. 创建和挂载了启动所需的的文件目录共五种文件系统,都是系统运行时目录,系统运行时存在,系统停止时消失。
  2. 初始化属性服务并启动。
  3. 为防止子进程成为僵尸进程,调用sinal_handler_init监听SIGGHLD信号,这个信号是在子进程暂停和终止的时候发出的,假设进程A发出了这个信号,那么sinal_handler_init函数内部会找到这个进程并清除与之相关的信息,再重启这个进程的脚本

2.1 init进程启动zygote

   init.rc通过import类型语句引入zygote启动脚本,init.rc会调用每种类型的解析类来解析对应的类型,zygote是servicer类型,解析类首先会解析service对应的.rc然后根据解析的.rc信息构造一个service对象加入service链表中。
  当init.rc有一个action类型的触发器,当执行到这个action类型时会根据信息去遍历service链表,寻找class name为main的service而zygote的class name就是main,找到zygote对应的service后启动service会进行一系列条件判断,然后启动这个service,如果子进程没有启动则Fock一个出来,根据pid判断当前是不是在子进程,如果是则启动。这样zygote就启动了

2.2 init的属性服务

   init进程启动时会给属性服务分配内存用于储存属性,需要使用的时候直接读取就可以,属性服务其实就一个非阻塞的socket,可以同时为8个用户提供设置属性的服务。属性有两种,一个普通属性,一个控制属性,控制属性用来执行一些命令最常见的就是开机动画。

2.3 总结

  1. init创建和挂在了系统运行时所需要的目录。
  2. 初始化和启动了属性服务
  3. 解析init.rc文件并启动了zygote进程

3 zygote进程

  1. zygote创建了DVM(dalvik虚拟机)
  2. 创建了ART
  3. 创建了System Server进程
  4. 启动了java虚拟机
  5. 通过Fock的方式来创建应用程序进程和System Server进程,通过Fock创建出来的应用程序进程和System Server进程内部会获取一个DVM或者ART的实例。
  6. zygote启动路径对应的cpp文件的main函数调用了AppRuntime的start方法启动了zygote进程
  7. 在start中启动了java虚拟机,并为虚拟机注册了JNI方法,通过Main函数的class name找到zygoteinit的路径然后通过jni调用 zygoteinit的main方法,从而zygote进入了java框架层
  8. zygote init方法创建了一个socket用于ams请求创建应用创新进程,预加载了一些资源,启动了system Server进程
  9. system server的进程创建是在java层,首先初始化创建system server所需的信息,然后调用zygote的fock创建system server进程

System Server进程

  1. 启动了一个binder线程池便于system server进程使用binder进行通信
  2. 通过反射拿到system server类并找到main方法,然后通过异常抛出去,抛出异常时为了清除创建system server进程过程的堆栈信息,然后在执行system server的mian方法。
  3. 在systemserver的mian方法中创建了systemservermanage 用于系统服务的创建启动和管理,启动系统服务的方式有两种。

Launcher进程

  1. launcher进程时被system server进程启动的,是系统启动的最后一步
  2. launcher是一个应用程序,用来显示系统中已经安装的应用
  3. launcher在启动过程中通过请求pms拿到系统已经安装的应用信息,将这些信息封装在一个快捷图列表中

总结

上述总结都是通过查阅各种文章书籍结合个人理解梳理的笔记,目前看梳理的思路还不够清晰,后续随着理解的加深会慢慢修改这篇文章。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值