2024年5月12日发(作者:仇涵阳)
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)的默认上下文管
理器,负责绑定服务的注册与查找。
2024年5月12日发(作者:仇涵阳)
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)的默认上下文管
理器,负责绑定服务的注册与查找。