2023年6月21日发(作者:)

1 Android系统的启动过程

1.1 启动过程

Android系统完整的启动过程,可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段,从开机到启动Home Launcher完成具体的任务细节可分为七个步骤。

1. 启动BootLoader

2. 加载系统内核

3. 启动Init和其它重要守护进程

4. 启动Zygote进程

5. 启动Runtime进程,初始化Service Manager。Service Manager用于binder通讯,负责绑定服务的注册与查找。

6. 启动SystemService

7. 启动Home Laucher

8. 启动其它应用程序

1.1.1 BootLoader

Android 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。

1.1.2 启动Init和守护进程

当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,进程号永远是1。当Init进程启动后,如(图 1-1)它还负责启动其他的一些重要守护进程,主要包括:

Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。

adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。

debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。

rild进程 (Radio Interface Layer Daemon): 无线接口层后台进程,负责管理无线通信服务。

图 1-1 Init和其它重要守护进程的启动,图片来源:

/~dr/XPOSE2008/android/

1.1.3 启动Zygote进程

如(图 1-2)所示,当Init进程和一些重要的守护进程启动完成之后,将启动Zygote 进程。Zygote进程在系统运行期间,当接收到创建虚拟机请求时,将孵化Dalvik VM实例。

图 1-2 Zygote进程的启动

Zygote 进程启动后,首先初始化一个Dalvik VM实例,然后为它加载资源与系统共享库,并开启Socket监听服务,当收到创建Dalvik VM实例请求时,会通过COW(copy on write)技术最大程度地复用自己,生成一个新的Dalvik VM实例。Dalvik VM实例的创建方法基于linux系统的fork原理。Zygote进程孵化Dalvik VM实例流程如(图 1-3)所示:

图 1-3 Zygote进程孵化Dalvik VM实例流程

1.1.4 启动Runtime进程和初始化Service Manager

当Zygote进程启动完成之后,Init进程会启动Runtime进程。Runtime进程首先初始化服务管理器(Service Manager),并把它注册为绑定服务(Binder services)的默认上下文管理器,负责绑定服务的注册与查找。 图 1-4 Runtime进程启动过程

1.1.5 启动系统服务

当Runtime进程启动Service Manager后,将会启动System Service。

System Service的启动流程如下所示:

1) 如(图 1-5)所示,Runtime进程向Zygote进程发送启动系统服务(System Service)的请求,Zygote进程收到请求后,会“孵化”出一个新的Dalvik VM实例并启动系统服务进程。

2) 如(图 1-6)所示,System Service首先启动两个本地服务(由C或C++编写的native服务): Surface Flinger和Audio Flinger。这两个本地系统服务向服务管理器注册成为IPC服务对象,以便在需要它们的时候很容易查找到。

3) 如(图 1-7所示),System Service然后启动一些Java层的Android系统管理服务,包括硬件服务和系统框架核心平台服务,并将它们注册成IPC服务对象。这些服务启动的代码位于的run函数当中。

4) 当SystemService加载完所有的系统服务后就意味着系统就准备好了,整个系统的进程图如(图 1-8)。然后SystemService会向所有服务发送一个系统准备完毕(systemready)的广播消息。

图 1-5 System Server启动过程

图 1-6 Android Native System service的启动

图 1-7 Android managed services的启动

图 1-8 系统准备完毕

1.1.6 启动Launcher

如(图 1-9)所示,当ActivityManagerService 接收到systemready广播后,会向Zygoute进程发送创建Dalvik 虚拟机实例的请求,Zygoute进程会负责生成一个新的Dalvik 虚拟机实例,然后ActivityManagerService在系统中查找具有

""/>属性(在中声明该属性)的Activity,并启动它,如果找到多个具有HOME属相的Activity,如果用户没有将其中一个设置成默认桌面,则会让使用者选择其中一个应用作为Launcher。

图 1-9 Launcher启动过程

当启动Launcher之后,整个系统的进程图如(图 1-10)所示。 图 1-10 Launcher启动后的进程图

1.1.7 启动其它应用程序

ActivityManagerService同时也会使用同样的方法启动Contact(联系人)等其它应用程序。每个应用都在自己的独立进程当中运行,如(图 1-11)所示。

图 1-11 系统进程图

1.2 开机画面与动画

android --启动画面制做 png图片-->

/sustzombie/article/details/6000696

android --bootanim(Android开机动画)

/sustzombie/article/details/5996051

开机动画的执行者:

frameworks/base/cmds/bootanimation

默认的动画资源: frameworks/base/core/res/assets/images

1.2.1 开机动画

自定义Android的开机动画

使用动画包:

目标路径:

/system/media/

bootanimation

|--

|-- part0

| |-- boot_

| |-- boot_

`-- part1

|-- boot_

|-- boot_

文件格式:

宽 高 帧数

标志符 循环次数 阶段切换间隔时间 对应目录名

标志符 循环次数 阶段切换间隔时间 对应目录名

1.3 参考文档

经典文章(maxleng、sustzombie和caowenbin有很多专题)

android启动过程再研(最为经典, 该作者关于Android的其它文章:

/category/96313)

/blog/1533494

Android 启动过程<译>

/?tid=7966

/dlmu2001/article/details/6537304

/entry/Android-PhysiologyAndroid-Internal-3

/~dr/XPOSE2008/android/

Android 核心分析 之八——Android 启动过程详解

/maxleng/article/details/5508372

Android核心分析 之九-------Zygote Service

/maxleng/article/details/5508488

安卓 Android 系统启动流程介绍(附图)

/

Android源码学习之八—系统启动过程 /caowenbin/article/details/6110751

还不错的文章

// 有几篇专门介绍开机过程和开机画面&动画的文章

/sustzombie?viewmode=contents

Android 启动过程

/content/11/1221/11/3700464_

/view/

Android启动流程代码分析(eoe Android特刊第21期)

/view/

对Android启动过程的进一步研究(还介绍如何将busybox交叉编译到手机上对内核进行调试)

Android 启动过程总结-有3篇

/?uid=21091200&do=blog&id=1830690

/jacktu/archive/2010/07/02/

/html/201003/

分析Android 根文件系统启动过程(init守护进程分析)

/

Android 应用程序快速启动的秘诀(介绍了Android系统的一些基本理念)

/?mod=viewthread&tid=1201977

Android系统进程Zygote启动过程的源代码分析

/4/

Android开机启动流程初探

/zhixingwujiang/articles/

StartServiceBindService详细时序图

/zhixingwujiang/archive/2011/10/16/

LaunchActivityStartActivity详细时序图

/zhixingwujiang/archive/2011/10/10/

Android的StatusBar分析

/zhixingwujiang/archive/2011/10/25/

Android源码学习之六——ActivityManager框架解析

/caowenbin/article/details/6036726

Android 源码分析 -- (一) Android启动过程(介绍platform/system/core/init/init.c文件)

/art/1205831

/xwroyal/archive/2012/01/05/

Android 启动过程(1)(2)

/2712776/525563

/2712776/525565

/sustzombie/article/details/6659622(很可能是原文作者)

Android init 启动过程分析

/blog/static/6/

Android启动过程(运行环境的启动)

/Linux/2011-12/

FW:Android 启动过程(英文原版)

/s/blog_

/yajun0601/article/category/1065764

2023年6月21日发(作者:)

1 Android系统的启动过程

1.1 启动过程

Android系统完整的启动过程,可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段,从开机到启动Home Launcher完成具体的任务细节可分为七个步骤。

1. 启动BootLoader

2. 加载系统内核

3. 启动Init和其它重要守护进程

4. 启动Zygote进程

5. 启动Runtime进程,初始化Service Manager。Service Manager用于binder通讯,负责绑定服务的注册与查找。

6. 启动SystemService

7. 启动Home Laucher

8. 启动其它应用程序

1.1.1 BootLoader

Android 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。

1.1.2 启动Init和守护进程

当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,进程号永远是1。当Init进程启动后,如(图 1-1)它还负责启动其他的一些重要守护进程,主要包括:

Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。

adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。

debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。

rild进程 (Radio Interface Layer Daemon): 无线接口层后台进程,负责管理无线通信服务。

图 1-1 Init和其它重要守护进程的启动,图片来源:

/~dr/XPOSE2008/android/

1.1.3 启动Zygote进程

如(图 1-2)所示,当Init进程和一些重要的守护进程启动完成之后,将启动Zygote 进程。Zygote进程在系统运行期间,当接收到创建虚拟机请求时,将孵化Dalvik VM实例。

图 1-2 Zygote进程的启动

Zygote 进程启动后,首先初始化一个Dalvik VM实例,然后为它加载资源与系统共享库,并开启Socket监听服务,当收到创建Dalvik VM实例请求时,会通过COW(copy on write)技术最大程度地复用自己,生成一个新的Dalvik VM实例。Dalvik VM实例的创建方法基于linux系统的fork原理。Zygote进程孵化Dalvik VM实例流程如(图 1-3)所示:

图 1-3 Zygote进程孵化Dalvik VM实例流程

1.1.4 启动Runtime进程和初始化Service Manager

当Zygote进程启动完成之后,Init进程会启动Runtime进程。Runtime进程首先初始化服务管理器(Service Manager),并把它注册为绑定服务(Binder services)的默认上下文管理器,负责绑定服务的注册与查找。 图 1-4 Runtime进程启动过程

1.1.5 启动系统服务

当Runtime进程启动Service Manager后,将会启动System Service。

System Service的启动流程如下所示:

1) 如(图 1-5)所示,Runtime进程向Zygote进程发送启动系统服务(System Service)的请求,Zygote进程收到请求后,会“孵化”出一个新的Dalvik VM实例并启动系统服务进程。

2) 如(图 1-6)所示,System Service首先启动两个本地服务(由C或C++编写的native服务): Surface Flinger和Audio Flinger。这两个本地系统服务向服务管理器注册成为IPC服务对象,以便在需要它们的时候很容易查找到。

3) 如(图 1-7所示),System Service然后启动一些Java层的Android系统管理服务,包括硬件服务和系统框架核心平台服务,并将它们注册成IPC服务对象。这些服务启动的代码位于的run函数当中。

4) 当SystemService加载完所有的系统服务后就意味着系统就准备好了,整个系统的进程图如(图 1-8)。然后SystemService会向所有服务发送一个系统准备完毕(systemready)的广播消息。

图 1-5 System Server启动过程

图 1-6 Android Native System service的启动

图 1-7 Android managed services的启动

图 1-8 系统准备完毕

1.1.6 启动Launcher

如(图 1-9)所示,当ActivityManagerService 接收到systemready广播后,会向Zygoute进程发送创建Dalvik 虚拟机实例的请求,Zygoute进程会负责生成一个新的Dalvik 虚拟机实例,然后ActivityManagerService在系统中查找具有

""/>属性(在中声明该属性)的Activity,并启动它,如果找到多个具有HOME属相的Activity,如果用户没有将其中一个设置成默认桌面,则会让使用者选择其中一个应用作为Launcher。

图 1-9 Launcher启动过程

当启动Launcher之后,整个系统的进程图如(图 1-10)所示。 图 1-10 Launcher启动后的进程图

1.1.7 启动其它应用程序

ActivityManagerService同时也会使用同样的方法启动Contact(联系人)等其它应用程序。每个应用都在自己的独立进程当中运行,如(图 1-11)所示。

图 1-11 系统进程图

1.2 开机画面与动画

android --启动画面制做 png图片-->

/sustzombie/article/details/6000696

android --bootanim(Android开机动画)

/sustzombie/article/details/5996051

开机动画的执行者:

frameworks/base/cmds/bootanimation

默认的动画资源: frameworks/base/core/res/assets/images

1.2.1 开机动画

自定义Android的开机动画

使用动画包:

目标路径:

/system/media/

bootanimation

|--

|-- part0

| |-- boot_

| |-- boot_

`-- part1

|-- boot_

|-- boot_

文件格式:

宽 高 帧数

标志符 循环次数 阶段切换间隔时间 对应目录名

标志符 循环次数 阶段切换间隔时间 对应目录名

1.3 参考文档

经典文章(maxleng、sustzombie和caowenbin有很多专题)

android启动过程再研(最为经典, 该作者关于Android的其它文章:

/category/96313)

/blog/1533494

Android 启动过程<译>

/?tid=7966

/dlmu2001/article/details/6537304

/entry/Android-PhysiologyAndroid-Internal-3

/~dr/XPOSE2008/android/

Android 核心分析 之八——Android 启动过程详解

/maxleng/article/details/5508372

Android核心分析 之九-------Zygote Service

/maxleng/article/details/5508488

安卓 Android 系统启动流程介绍(附图)

/

Android源码学习之八—系统启动过程 /caowenbin/article/details/6110751

还不错的文章

// 有几篇专门介绍开机过程和开机画面&动画的文章

/sustzombie?viewmode=contents

Android 启动过程

/content/11/1221/11/3700464_

/view/

Android启动流程代码分析(eoe Android特刊第21期)

/view/

对Android启动过程的进一步研究(还介绍如何将busybox交叉编译到手机上对内核进行调试)

Android 启动过程总结-有3篇

/?uid=21091200&do=blog&id=1830690

/jacktu/archive/2010/07/02/

/html/201003/

分析Android 根文件系统启动过程(init守护进程分析)

/

Android 应用程序快速启动的秘诀(介绍了Android系统的一些基本理念)

/?mod=viewthread&tid=1201977

Android系统进程Zygote启动过程的源代码分析

/4/

Android开机启动流程初探

/zhixingwujiang/articles/

StartServiceBindService详细时序图

/zhixingwujiang/archive/2011/10/16/

LaunchActivityStartActivity详细时序图

/zhixingwujiang/archive/2011/10/10/

Android的StatusBar分析

/zhixingwujiang/archive/2011/10/25/

Android源码学习之六——ActivityManager框架解析

/caowenbin/article/details/6036726

Android 源码分析 -- (一) Android启动过程(介绍platform/system/core/init/init.c文件)

/art/1205831

/xwroyal/archive/2012/01/05/

Android 启动过程(1)(2)

/2712776/525563

/2712776/525565

/sustzombie/article/details/6659622(很可能是原文作者)

Android init 启动过程分析

/blog/static/6/

Android启动过程(运行环境的启动)

/Linux/2011-12/

FW:Android 启动过程(英文原版)

/s/blog_

/yajun0601/article/category/1065764