天天看点

Android基础系列-----------Android系统启动过程简析

        Android设备的启动必须经历3个阶段。即BootLoader,Linux Kernel和Android系统服务,默认情况下它们都有各自的启动画面。严格来说,Android系统实际上是运行于Linux内核之上的一系列“服务进程”,这些进程是维持设备正常工作的关键,而它们的“老祖宗”就是init。作为android系统第一个被启动的进程,init的PID值为0。它通过解析init.rc脚本来构建出系统的初始运行形态。当你按下电源开关后Android设备执行了以下步骤。

Android基础系列-----------Android系统启动过程简析

第一步:启动电源以及系统启动

当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM,然后执行。

第二步:引导程序

引导程序是在Android操作系统开始运行前的一个小程序。引导程序是运行的第一个程序,因此它是针对特定的主板与芯片的。设备制造商要么使用很受欢迎的引导程序比如redboot、uboot、qi bootloader或者开发自己的引导程序,它不是Android操作系统的一部分。引导程序是OEM厂商或者运营商加锁和限制的地方。

引导程序分两个阶段执行。第一个阶段,检测外部的RAM以及加载对第二阶段有用的程序;第二阶段,引导程序设置网络、内存等等。这些对于运行内核是必要的,为了达到特殊的目标,引导程序可以根据配置参数或者输入数据设置内核。

Android引导程序可以在\bootable\bootloader\legacy\usbloader找到。

传统的加载器包含两个文件,需要在这里说明:

init.s初始化堆栈,清零BBS段,调用main.c的_main()函数;

main.c初始化硬件(闹钟、主板、键盘、控制台),创建linux标签。

第三步:内核

Android内核与桌面linux内核启动的方式差不多。内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。

第四步:init进程

init是第一个进程,我们可以说它是root进程或者说有进程的父进程。init进程有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本。

init进程可以在/system/core/init找到。

init.rc文件可以在/system/core/rootdir/init.rc找到。

readme.txt可以在/system/core/init/readme.txt找到。

对于init.rc文件,Android中有特定的格式以及规则。在Android中,我们叫做Android初始化语言。

Android初始化语言由四大类型的声明组成,即Actions(动作)、Commands(命令)、Services(服务)、以及Options(选项)。

Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。

语法

on <trigger>

    <command>

    <command>

    <command>

Service(服务):服务是init进程启动的程序、当服务退出时init进程会视情况重启服务。

service <name> <pathname> [<argument>]*

    <option>

    <option>

    ...

Options(选项)

选项是对服务的描述。它们影响init进程如何以及何时启动服务。

Action/Service 描述
on early-init 设置init进程以及它创建的子进程的优先级,设置init进程的安全环境
on init 设置全局环境,为cpu accounting创建cgroup(资源控制)挂载点
on fs 挂载mtd分区
on post-fs 改变系统目录的访问权限
on post-fs-data 改变/data目录以及它的子目录的访问权限
on boot 基本网络的初始化,内存管理等等
service servicemanager 启动系统管理器管理所有的本地服务,比如位置、音频、Shared preference等等…
service zygote 启动zygote作为应用进程

在init中启动起来的服务按照init.rc中的先后顺序,大致有:

console: start a shell,code path: system/bin/sh,其源码中包含常用的shell命令,如ls,cd等。

adbd: start adb daemon,通常带有disabled的选项,表明需要按名字启动,code path:system/bin/adb。

servicemanager:这个服务管理着系统内所有binder services。code path: frameworks/base/cmds/servicemanager。

Vold: android 的udev,code path: system/vold。

Netd: start ntd daemon, code path: system/netd。

Debuggerd: start debug system, code path: system/core/debuggerd。

zygote: ['zaigəut]这是一个非常重要的服务,稍后详解。start Android  Java Runtime  and start systemserver。code path:frameworks/base/cmds/app_process。

media: add AudioFlinger,AudioPolicyService,MediaPlayerService and CameraService to servicemanager,

同时启动管理binder通讯的机制,依靠这两个类来完成binder机制在android中间层所体现的功能:ProcessState 和IPCThreadState。Code path:frameworks/base/media/mediaserver。

bootanim: 开机动画和铃声,code path:frameworks/base/cmds/bootanimation。

接下来就是关于modem的服务,如:ccci_fsd、ccci_mdinit、pppd_gprs、pppd、gsm0710muxd、muxtestapp、sockcli、socksrv、muxreport、ril-daemon等,除了前面2个,后面的都带有disabled的参数,需要按名启动。

Installd: start install package daemon, code path:

frameworks/base/cmds/installd。

后面还有很多关于其他硬件的服务,比如BT、WIFI等。

Android基础系列-----------Android系统启动过程简析

从这里可以看出,linux的init在启动若干守护进程之后,就启动了Android的runtime和zygote,zygote再启动虚拟机,系统服务,系统服务再启动完本地服务后,又启动了若干Android服务,并完成向ServiceManager的注册工作,最后系统启动完成。Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service。系统的进程空间如下图所示:

Android基础系列-----------Android系统启动过程简析

可见,由zygote孵化器为各进程以写时复制的方式用最小的代价实现了虚拟机。zygote服务,这个服务会启动一个叫做zygote的进程,zygote是Android世界的万物之源,所以的进程都有它孵化。在启动zygote时又会启动System Server进程,System Server是所有系统服务的栖息地,也是应用与Zygote进程通信的中枢,例如需要启动某个应用时会通过System Server通知zygote fork一个新的进程。在System Server启动之后会调用com_ android_ server_ SystemServer. cpp类中的android_server_SystemServer_nativeInit函数,在该函数中会获取ServiceManager实例以及启动一些Native服务。最后会调用SystemServer内部类ServerThread的initAndLoop函数将WindowManagerService、ActivityManagerService等系统服务注册到ServiceManager中,这些服务为系统提供各种各样的功能,最后启动系统消息循环,此时Android的运行环境基本构建起来了。

核心服务:

启动电源管理器;

创建Activity管理器;

启动电话注册;

启动包管理器;

设置Activity管理服务为系统进程;

启动上下文管理器;

启动系统Context Providers;

启动电池服务;

启动定时管理器;

启动传感服务;

启动窗口管理器;

启动蓝牙服务;

启动挂载服务。

其他服务:

启动状态栏服务;

启动硬件服务;

启动网络状态服务;

启动网络连接服务;

启动通知管理器;

启动设备存储监视服务;

启动定位管理器;

启动搜索服务;

启动剪切板服务;

启动登记服务;

启动壁纸服务;

启动音频服务;

启动耳机监听;

启动AdbSettingsObserver(处理adb命令)。

一旦系统服务在内存中跑起来了,Android就完成了引导过程。在这个时候“ACTION_BOOT_COMPLETED”开机启动广播就会发出去。

第五步:Home启动

Android基础系列-----------Android系统启动过程简析