转自参考链接:
- https://blog.csdn.net/itachi85/article/details/54783506
- https://blog.csdn.net/itachi85/article/details/55047104
- https://blog.csdn.net/itachi85/article/details/55053356
- https://blog.csdn.net/itachi85/article/details/56669808
1.linux系统启动
Android系统启动流程的前几步:
1.固化在ROM的引导芯片代码开始执行,加载引导程序Bootloader到RAM上。
2.引导程序Bootloader开始执行//相当于PC的BIOS
3.启动linux内核启动
设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。
这个阶段启动了Linux,Android是基于linux的,而Android系统是启动init后启动的
2.init进程启动
init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等。init进程是由多个源文件共同组成的,这些文件位于源码目录system/core/init。开机动画也是在里面启动的
init进程主要任务是:
- 挂在文件和目录
- 读取int.rc配置文件,启动Zygote和ServiceManger
- 启动属性服务,读取默认属性(定义在system/build.prop)和监听属性
- SurfaceFlinger服务启动时,它会通过修改系统属性ctl.start的值来通知init进程启动应用程序bootanimation,然后播放开机动画. 当System进程将系统中的关键服务都启动起来之后,ActivityManagerService服务就会通知SurfaceFlinger服务boot Finished接着修改系统属性ctl.stop的值,以便可以通知init进程停止执行应用程序bootanimation
- 最最主要的就是启动Zygote.
3.启动Zygote进程
在Android系统中,JavaVM(Java虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fock(复制进程)的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动时会创建JavaVM,因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个JavaVM的实例拷贝。
- Zygote在启动的时候创建了java虚拟机
- JNI调用ZygoteInit的main函数后,Zygote便进入了Java框架层
- Zygote启动SystemService
- Zygote创建Socket,等待AMS启动新进程的请求
4.启动SystemServer
1.启动Binder线程池,这样就可以与其他进程进行通信。
2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。
3.启动各种系统服务。
Zygote启动SyetemServer进程
- RuntimeInit.java的nativeZygoteInit函数主要做的就是启动Binder线程池
- 调用SyetemServer进程的Main函数
- SystemService启动引导服务,核心服务,其他服务
引导服务:
- Installer 系统安装apk时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务
- ActivityManagerService 负责四大组件的启动、切换、调度。
- PackageManagerService 用来对apk进行安装、解析、删除、卸载等等操作
- …
核心服务:
- BatteryService 管理电池相关的服务
- …
其他服务:
- InputManagerService 管理输入事件
- WindowManagerService 窗口管理服务
- AudioService 音频相关管理服务
- …