android设备的启动分为三个阶段:Boot Loader,Linux Kernel,Android 系统服务。Android系统实际上是运行在Linux Kernel之上的一系列系统服务进程。

首先,给出一张图,图片来自这里 ,帮助大家理解和分析,里面还有一些步骤节点介绍。

Android 内核发生死锁分析 深入理解android内核_本地服务

  • 第一阶段:Android设备打开电源后,首先会从处理器片上ROM的启动引导代码开始执行,寻找Bootloader代码,并加载到内存。(这一步由“芯片厂商”负责设计和实现)
  • 第二阶段:Bootloader开始执行,首先负责完成硬件的初始化,然后找到Linux内核代码,并加载到内存。(这一步由“设备厂商”负责设计和实现)
  • 第三阶段:Linux内核开始启动,初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并执行init程序,由此开启Android的世界。(这一步则是Android内核开发过程中需要涉及的地方)

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

因此,init程序是分析Android启动过程中最核心的程序。对应的代码位于:system/core/init/init.c

Android 内核发生死锁分析 深入理解android内核_加载_02

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

  1. 创建和挂载一些系统目录/设备节点,设置权限,如:/dev, /proc,  /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进程。

(2)Android服务

Android服务是指运行在Dalvik虚拟机进程中的服务,这些服务的创建过程描述如下:
init进程会执行app_process程序,在app_process程序中,最核心的代码是下面这句,创建Zygote进程。

...
runtime.start("com.android.internal.os.zygoteInit",startSystemServer?"start-system -server":"");
...

Zygote进程是Android系统最重要的进程,Android中大多数应用进程和系统进程都是通过Zygote fork的。zygote进程在内部会先启动虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态。在后续的运作中,当其他系统模块(比如AMS)希望创建新进程时,只需向zygote进程发出请求,zygote进程监听到该请求后,会相应地“分裂”fork出新的进程,于是这个新进程在初生之时,就先天具有了自己的Dalvik虚拟机以及系统资源。Zygote在init.rc中的描述如下所示

service zygote /system/bin/app_process /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system 
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onreatart restart netd

,Zygote进程主要包含:

  • 加载ZygoteInit类,注册Zygote Socket服务端套接字
  • 加载虚拟机
  • 提前加载类preloadClasses
  • 提前加载资源preloadResouces

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

Android 内核发生死锁分析 深入理解android内核_Android_03

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

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