Android系统启动过程
- Android手机的启动过程
- init进程
- init.rc文件
- service_manager进程
- surface_flinger进程
- media_server进程
- Zygote进程
- system_server进程
- ActivityManagerService启动
所有的软件都是存放在硬盘上的,程序执行时需要将程序从硬盘上读取到内存中然后加载到CPU中来运行。当我们按下开机键时,此时内存中什么都没有,因此需要借助某种方式,将操作系统加载到内存中,而完成这项任务的就是BIOS。
Android手机的启动过程
Android没有PC的BIOS程序,取而代之的是Bootloader--系统启动加载器。它类似于BIOS,在系统加载前,用以初始化硬盘设备,建立内存空间的映像图,为最终调用系统内核准备好环境。在Android里没有硬盘,而是ROM,它类似于硬盘存放操作系统,用户程序等。ROM跟硬盘一样也会划分为不同的区域,用于放置不同的程序,在Android中主要划分为以下几个分区:
1 . /boot:存放引导程序,包括内核和内存操作程序;
2 . /system:相当于电脑c盘,存放Android系统及系统应用;
3 . /recovery:恢复分区,可以进入该分区进行系统恢复;
4 . /data:用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序;
5 . /cache:安卓系统缓存区,保存系统最常访问的数据和应用程序;
6 . /misc:包好一些杂项内容,如系统设置和系统功能启用禁用设置;
7 . /sdcard:用户自己的存储区,可以存放照片、音乐、视频等文件;
跟PC启动过程类似,当开机通电时首先会加载Bootloader,Bootloader会读取ROM,找到操作系统并将Linux内核加载到RAM中。当Linux内核启动后会初始化各种软硬件环境,加载驱动程序,挂载根文件系统,Linux内核加载的最后阶段会启动执行第一个用户空间进程init进程。
init进程
init是Linux系统中用户空间的第一个进程(pid = 1),Kernel启动后会调用/system/core/init/Init.cpp的main()方法。
- Init.main()
首先初始化Kernel log,创建一块共享的内存空间,加载/default.prop文件,解析init.rc文件。
init.rc文件
init.rc文件是Android系统的重要配置文件,位于/system/core/rootdir/目录中。主要功能是定义了系统启动时需要执行的一系列action及执行特定动作、设置环境变量和属性和执行特定的service。
init.rc脚本文件配置了一些重要的服务,init进程通过创建子进程启动这些服务,这里创建的service都属于native服务,运行在Linux空间,通过socket向上层提供特定的服务,并以守护进程的方式运行在后台。
通过init.rc脚本系统启动了以下几个重要的服务:
- servicemanager:启动bingder IPC,管理所有的Android系统服务;
- mountd:设备安装Daemon,负责设备安装及状态通知;
- debuggerd:启动debug system,处理调试进程的请求;
- rild:启动radio interface layer daemon服务,处理电话相关的事件和请求;
- media_server:启动AudioFlinger,MediaPlayerService和CameraService,负责多媒体播放和相关的功能,包括音视频解码;
- surface_flinger:启动SurfaceFlinger负责显示输出;
- zygote:进程孵化器,启动Android Java VMRuntime和systemserver,负责Android应用进程的孵化工作;
在这个阶段可以在设备的屏幕上看到"Android"logo了。以上工作执行完,init进程就会进入loop状态。
service_manager进程
ServiceManager是Binder IPC通信过程中的守护进程,本身也是一个Binder服务。ServiceManager进程主要是启动Binder,提供服务的查询和注册。
surface_flinger进程
SurfaceFlinger负责图像绘制,是应用UI的核心,其功能是合成所有Surface并渲染到显示设备。SurfaceFlinger进程主要是启动FrameBuffer,初始化显示系统。
media_server进程
MediaServer进程主要是启动AudioFlinger音频服务,CameraService相机服务。负责处理音频解析播放,相机相关的处理。
Zygote进程
Zygote进程孵化了所有的Android应用进程,是Android Framework的基础,该进程的启动也标志着Framework框架初始化启动的开始。
Zygote服务进程的主要功能:
- 注册底层功能的JNI函数到虚拟机;
- 预加载Java类和资源;
- fork并启动system_server核心进程;
- 作为守护进程监听处理“孵化新进程”的请求;
当Zygote进程启动后,便会执行到frameworks/base/cmds/app_process/App_main.cpp文件的main()方法。然后Zygote进程会进入loop状态,等待下次fork进程。
system_server进程
system_server进程由Zygote进程fork而来。
system_server进程启动后将初始化上下文,创建系统服务管理SystemServiceManager,然后启动各种系统服务。
//启动引导服务;
startBootstrapServices();
//启动核心服务;
startCoreServices();
//启动其他服务;
startOtherServices();
所有的服务启动完成后会注册到ServiceManager。ActivityManagerService服务启动完成后,会在startOtherServices()方法中进入到ActivityManagerService.systemReady(),然后启动SystemUI,WebViewFactory,Watchdog,最后启动桌面Launcher App。
ActivityManagerService启动
启动桌面Launcher App需要等待ActivityManagerService启动完成。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-----------------------last line for now----------------------