Android内核开发:图解Android系统的启动过程

转载 2017年01月03日 09:53:46
Android内核开发:图解Android系统的启动过程
2015-06-07 20:36:07
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/1659473

本文是《Android内核开发》系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载、版本和分支介绍、编译和烧写等等,从本文起就要开始真正地进行Android内核的学习及实战了。


学习任何软硬件系统,研究系统启动过程都是一种非常有效地起步手段,搞Android内核开发也不例外。网上有很多文章对Android启动相关代码进行分析和走读,大家可以先搜索阅读一下,我个人更喜欢更加直观的方式去理解未知的东西,包括图、表、系统输出的log信息等等,因此,本文准备通过一些流程图和log信息,来探索一下Android的启动过程。


首先,给出一张图,图片来自这里,我觉得它画得很好,就引用过来了,帮助大家理解和分析。


wKioL1V0NLqz5WkHAAFZtLWnJvI406.jpg

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


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


第三阶段:Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并执行init程序,由此开启Android的世界。(这一步则是Android内核开发过程中需要涉及的地方)


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


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


对应的代码位于:system/core/init/init.c,工作内容如图所示(图片来自《Embedded Android》这本书):


wKiom1V0M1eT5QMVAAGjy48aLpE827.jpg


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


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


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


(3) 显示boot logo,默认是“Android”字样


其中,最重要的步骤是第二步,一系列的Android服务在这时被启动起来,其实Android系统的启动最重要的过程也就是各个系统服务的启动,因为系统所有的功能都是依赖这些服务来完成的比如启动应用程序,拨打电话,使用WIFI或者蓝牙,播放音视频等等,只要这些服务都能正常地启动起来并且正常工作,整个Android系统也就完成了自己的启动。


这些服务包含2部分,一部分是本地服务,另一部分是Android服务,所有的这些服务都会向ServiceManager进程注册,由它统一管理,这些服务的启动过程介绍如下:


(1)本地服务


本地服务是指运行在C++层的系统守护进程,一部分本地服务是init进程直接启动的,它们定义在init.rc脚本和init.<hardware>.rc中,如 ueventd、servicemanager、debuggerd、rild、mediaserver等。还有一部分本地服务,是由这些本地服务进一步创建的,如mediaserver服务会启动AudioFlinger, MediaPlayerService, 以及 CameraService 等本地服务。


我们可以通过查看init.rc和init.<hardware>.rc文件找出具体有哪些本地服务被init进程直接启动了,这些文件的位置:system/core/rootdir/


注意,每一个由init直接启动的本地服务都是一个独立的Linux进程,在系统启动以后,我们通过adb shell命令进入手机后,输入top命令就可以查看到这些本地进程的存在:


wKiom1V0M3mRuBOAAAiGldvIXg0202.jpg


(2)Android服务


Android服务是指运行在Dalvik虚拟机进程中的服务,这些服务的创建过程描述如下:


init进程会执行app_process程序,创建Zygote进程,它是Android系统最重要的进程,所有后续的Android应用程序都是由它fork出来的。


Zygote进程会首先fork出"SystemServer"进程,"SystemServer"进程的全部任务就是将所有的Android核心服务启动起来,这些服务包括:


wKiom1V0M6KDKc28AAUZgS6gxZ0002.jpg


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


注意,这些Android服务并没有各种运行在独立的进程中,它们由SystemServer以线程的方式创建,所以都运行在同一个进程中,即SystemServer进程中


(3) 小结


上面的几张图我总觉得还不够尽兴,因此文章最后,再给出一张图帮助大家加深一下理解,这幅图来自《Improving the Boot Time of the Android OS》这篇论文。


wKioL1V0NWmiHTYHAAJuMBfXId4365.jpg

关于图解Android系统的启动过程就介绍到这里了,有任何疑 问或者建议欢迎留言或者来信lujun.hust@gmail.com交流,或者关注我的新浪微博 @卢_俊 获取最新的文章和资讯。



本文出自 “Jhuster的专栏” 博客,请务必保留此出处http://ticktick.blog.51cto.com/823160/1659473

Android内核开发:图解Android系统的启动过程

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ticktick.blog.51cto.com/823160/1659473 ...
  • CODINGCS
  • CODINGCS
  • 2017年11月15日 22:31
  • 60

Android内核开发:图解Android系统的启动过程

本文是《Android内核开发》系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载、版本和分支介绍、编译和烧写等等,从本文起就要开始真正地进行A...
  • qq_23174861
  • qq_23174861
  • 2016年03月16日 22:26
  • 361

Android内核开发:图解Android系统的启动过程

本文是《Android内核开发》系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载、版本和分支介绍、编译和烧写等等,从本文起就要开始真正地进行A...
  • CODINGCS
  • CODINGCS
  • 2017年12月20日 22:24
  • 206

Android内核开发:图解Android系统的启动过程

Android内核开发:图解Android系统的启动过程
  • ztguang
  • ztguang
  • 2016年07月09日 23:35
  • 625

Android内核开发:图解Android系统的启动过程

本文是《Android内核开发》系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载、版本和分支介绍、编译和烧写等等,从本文起就要开始真正地进行A...
  • a675311
  • a675311
  • 2016年10月25日 16:33
  • 133

Android内核开发:图解Android系统的启动过程

本文是《Android内核开发》系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载、版本和分支介绍、编译和烧写等等,从本文起就要开始真正地进行A...
  • u010164190
  • u010164190
  • 2016年05月13日 20:02
  • 262

Android系统启动流程(一)解析init进程启动过程

作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。...
  • itachi85
  • itachi85
  • 2017年02月07日 11:29
  • 7744

Android内核开发:学会分析系统的启动log

本文是《Android内核开发》系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点。要学会分析系统的启动log信...
  • LoongEmbedded
  • LoongEmbedded
  • 2017年03月30日 11:33
  • 1537

Android Service的启动过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操作是会...
  • qq_35114086
  • qq_35114086
  • 2016年10月15日 19:51
  • 489

Android内核学习笔记

一、init 二、binder 《ANDROID框架揭秘》第六章 - 第十章 以生动的形式讲述了binder,但是不够详细。值得参考。 《Android系统源代码情景分析》第五章 描叙详细,但是不...
  • imyfriend
  • imyfriend
  • 2014年01月29日 10:42
  • 11385
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android内核开发:图解Android系统的启动过程
举报原因:
原因补充:

(最多只允许输入30个字)