作为一个Android应用开发工程师,Android系统的启动流程还是需要了解一下的。
前面我们讲了计算机的启动流程和Linux系统的启动流程,而Android作为一个基于Linux内核的系统,要了解清楚它的启动流程前面两位的流程也需要了解一下的。
好了,下面直接进入主题:
流程图
借助图片我们了解到,从Boot ROM开始到 init进程,这四个步骤是属于Linux的启动,从init进程才开始真正进入Android的世界。
我们逐步分析一下,希望读者对应几张图来理解:
才开机时,CPU 处于未初始化状态,还没有设定内部时钟,仅仅只有内部 RAM 可用。当电源稳定后会开始执行 BOOT ROM 代码,这是一小块代码被硬编码在 CPU ASIC 中。
boot loader 是一个特殊的独立于 Linux 内核的程序,它用来初始化内存和装载内核到 RAM 中,桌面系统的 boot loader 程序有 GRUB,嵌入式系统常用 uBoot,
设备制造商常常使用自己专有的 boot loader 程序。
Linux 内核在 Android 上跟在其他系统上的启动方式一样,它将设置系统运行需要的一切,初始化中断控制器,设定内存保护,高速缓存和调度
init进程是所有其他系统进程的 “祖母 ”,系统的每一个其他进程将从该进程中或者该进程的子进程中启动
init程序最核心的工作主要有3点:
其中,最重要的步骤是第二步,一系列的Android服务在这时被启动起来,其实Android系统的启动最重要的过程也就是各个系统服务的启动,因为系统所有的功能都是依赖这些服务来完成的,比如启动应用程序,拨打电话,使用WIFI或者蓝牙,播放音视频等等,只要这些服务都能正常地启动起来并且正常工作,整个Android系统也就完成了自己的启动。
这些服务包含2部分,一部分是本地服务,另一部分是Android服务,所有的这些服务都会向ServiceManager进程注册,由它统一管理,这些服务的启动过程介绍如下:
本地服务是指运行在C++层的系统守护进程,一部分本地服务是init进程直接启动的,它们定义在init.rc脚本和init..rc中,如 ueventd、servicemanager、debuggerd、rild、mediaserver等。还有一部分本地服务,是由这些本地服务进一步创建的,如mediaserver服务会启动AudioFlinger, MediaPlayerService, 以及 CameraService 等本地服务。
我们可以通过查看init.rc和init..rc文件找出具体有哪些本地服务被init进程直接启动了,这些文件的位置:system/core/rootdir/
注意,每一个由init直接启动的本地服务都是一个独立的Linux进程,在系统启动以后,我们通过adb shell命令进入手机后,输入top命令就可以查看到这些本地进程的存在。
init进程会执行app_process程序,创建Zygote进程,它是Android系统最重要的进程,所有后续的Android应用程序都是由它fork出来的。
Zygote进程会首先fork出”SystemServer”进程,”SystemServer”进程的全部任务就是将所有的Android核心服务启动起来。
Zygote 被init进程启动,开始运行和初始化 dalvik 虚拟机
系统服务是在系统中运行的第一个 java 组件,它会启动所有的 android 服务,比如:电话服务,蓝牙服务,每个服务的启动被直接写在 SystemServer.java 这个类的 run 方法里面
代码: frameworks/base/services/java/com/android/server/SystemServer.java
一旦系统服务启动并运行,android 系统启动就完成了,同时发出 ACTION_BOOT_COMPLETED 广播