当前位置: 移动技术网 > IT编程>移动开发>Android > 当我们按下电源键,Android 究竟做了些什么?

当我们按下电源键,Android 究竟做了些什么?

2018年11月13日  | 移动技术网IT编程  | 我要评论

泰山论坛,7天假日,清风qq

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由发表于云+社区专栏

相信我们对android系统都不陌生,而android系统博大精深,被各种各样的智能设备承载的同时,我们会否好奇过,如此复杂的android究竟是怎么运作起来的呢?借本文给大家分享,笔者对android 系统启动流程的整体理解~

imghi, i'm android

现在,按下电源键

下面是android启动的核心步骤流程图,看文字的时候,记得回来对照图来理解喔,希望阅读全文后,回观流程图,会有恍然大悟的感觉,那么文章的目的就达到啦~

img整体流程

一、启动电源及系统启动

系统从 rom 中开始启动,加载引导程序到 ram ,然后执行。

二、引导程序

引导程序是 android 操作系统开始运行前的一个小程序,因此它需要针对特定主板与芯片,并不是 android 操作系统的一部分。引导程序是 oem 厂商或运行商进行加锁、限制的地方。

1 两个阶段

  1. 检测外部 ram 以及为第二阶段加载程序
  2. 设置网络、内存等,搭建内核运行环境(为了达到特殊目的时,引导程序可以根据配置参数或者输入数据来设置内核)

2 引导程序的加载器

android引导程序可以在\bootable\bootloader\legacy\usbloader找到,传统的加载器包含的两个文件:

  1. init.s 初始化堆栈,清零bss段,会调用 main.c 中的 _main()函数 (bss segment:通常是指用来存放程序中未初始化的全局变量的一块内存区域;bss - block started by symbol。bss段属于静态内存分配)
  2. main.c 初始化硬件,创建 linux 标签

三、内核启动

android 内核启动方式类似桌面 linux,主要步骤:

1. 设置缓存

2. 被保护存储器

3. 计划列表

4. 加载驱动

当内核完成系统设置,接下来即将启动系统的第一个进程 -- init 进程

四、init 进程

作为 android 系统的第一个进程,其pid为0,通过解析 init.rc 脚本来构建出系统初始运行形态,这一阶段中,“android” logo 会显示出来

(系统中,大多数系统服务程序都是在该脚本中描述并被相继启动的)

init.rc 由4种类型声明组成:actions、commands、services、options

  • actions:响应某事件的过程。当“trigger”所描述的触发事件产生时,则依次执行各种“command” 源码角度:系统会对 init.rc 中各“trigger”进行匹配,当发现符合条件的 action,就将它加入“命令执行队列”尾部(除非 action 已存在队列中),然后系统再对这些命令按顺序进行。on
  • commands:命令将在所属事件发生时被一个个执行
  • services:可执行程序,它们在特定选项的约束下会被 init 程序运行或者重启(service 可以在配置中指定是否需要退出重启,那么,当 service 出现异常 crash 时,可有机会复原)service
  • options:对 service 的约束选项

五和六、 servicemanager、zygote、systemserver

科普:daemons - 守护进程

init进程通过解析 init.rc 来陆续启动其他关键的系统服务进程,其中最重要的是 servicemanager、zygote 和 systemserver 三者,下面我们逐一解析:

1 servicemanager -- binder 机制支撑者

概述:servicemanager 是 binder 机制中的支撑者,负责某 binder 服务注册信息到底层 binder 驱动分配的值解析。

servicemanager 由 init 进程解析 rc 脚本时启动,属于 core 类,其他同类进程包括:uenetd、console、adbd等。根据 core 组的特性,这些进程会同时启动或停止。另外,servicemanager 配置含有 critical 属性,这意味着它是系统关键进程(如果进程不幸在4分钟内异常退出超过4次,设备将重启并进入还原模式)。当 servicemanager 每次重启时,其他关键进程:zygote、media、surfaceflinger 等也会被 restart。

2. zygote -- “孕育”新线程与进程

android 中大多数应用进程与系统进程都是通过 zygote 来生成的。zygote 同样由 init 解析 rc 脚本时启动,属于 main 类,同属 main 类的系统进程有:netd、debuggerd、rild等。zygote并不是处于独立的程序中的,它所在程序名为“app_process”,观察 app_process 主函数实现知道,如果 init.rc 中指定了 --zygote选项,app_process 接下来将启动“zygoteinit”,并传入“start-system-server”,这样,zygoteinit 就会运行在虚拟机上(dalvik vm)上了。

  • zygoteinit 函数有两项重要工作

  • 预装载各种系统类

  • 搭建 systemserver 环境,并启动 systemserver(大部分的 android 系统服务都在其中,由 java 编写)

  • zygoteinit 流程总结

    摘自:gityuan -- android 系统启动-zygote 篇

    1. 解析init.zygote.rc中的参数,创建appruntime并调用appruntime.start()方法;
    2. 调用androidruntime的startvm()方法创建虚拟机,再调用startreg()注册jni函数;
    3. 通过jni方式调用zygoteinit.main(),第一次进入java世界;
    4. registerzygotesocket()建立socket通道,zygote作为通信的服务端,用于响应客户端请求;
    5. preload()预加载通用类、drawable和color资源、opengl以及共享库以及webview,用于提高ap启动效率;
    6. zygote完毕大部分工作,接下来再通过startsystemserver(),fork得力帮手system_server进程,也是上层framework的运行载体。
    7. zygote功成身退,调用runselectloop(),随时待命,当接收到请求创建新进程请求时立即唤醒并执行相应工作。

zygoteinit 结束后,开机logo就出来了。

(注意:这里并不包括开机动画,而是开机前 “android” logo 出现的那个画面,开机动画出现之前还需要进行各种加载,开机动画是在“android” logo 出现之后才播放的)

3. systemserver -- 大部分 android 系统服务所在地

systemserver 是 android 进入 launcher 前的最后准备,它提供了众多的由“java”语言编写的系统服务

如果 init.rc 中为 zygote 指定启动参数 --start-system-server,那么 zygotyeinit 就会调用 startsystemserver 来进入 systemserver。

  • startsystemserver函数解析:
  • 首先 zygoteinit 通过 zygote.forksystemserver 来生成一个新的线程(fork),用于承载各种系统服务。(源码角度:zygote 内部由 native 函数 dalvik_dalvik_system_zygote_forksystemserver 来进一步实现,最终调用底层接口的 fork 接口来实际产生进程)
  • 根据fork特性,子进程与父进程将获得相同的代码环境pid为0为子进程,否则为父进程;如果是前者,则进一步调用 handlesystemserverprocess(parseargs) 函数来完成最核心的工作 -- “启动各系统服务”(源码角度:handlesystemserverprocess 方法将 startsystemserver 中的 parsedargs.remainingargs 参数传给 runtimeinit.zygoteinit,后者又调用 nativezygoteinit 函数
  • nativezygoteinit 调用后,接着,三个重要的 static 函数就要被执行了:init1 - 完成本地service(surfaceflinger、audioflinger等)启动,完成后调用 init2init2 - 新建一个新的带 looper 的线程 serverthread来启动 java层各 service

后语

上面对 android 系统启动做了一个简述,意在给大家展现一个整体流程,其中每个环节涉及的知识点只是浅浅掠过,笔者也尚在学习与探索中,希望在后续再作详细分析。

资源推荐

  • 《深入理解 android 内核设计思想》 由浅入深,落实到源码层面上进行探索,知识很有深度

相关阅读
【每日课程推荐】机器学习实战!快速入门在线广告业务及ctr相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网