1. ROM 阶段
Android设备上电后,首先从处理器片上ROM的启动引导代码开始执行。ROM寻找Bootloader代码,并加载到内存。
2. Bootloader 阶段
Bootloader完成硬件初始化,然后找到Linux内核代码,并加载到内存。
3. Linux Kernel 阶段
Linux内核初始化各种软硬件环境,加载驱动程序,挂载根文件系统,并执行init程序。Android世界由此开启。
4. Android Init 阶段
init 程序是Android启动过程中最核心的程序。init 工作包括:
- 创建和挂载一些系统目录和设备节点,并设置权限。如:/dev、/proc、/sys等。
- 解析 init.rc 和 init.<hardware>.rc,启动属性服务,启动一系列服务和进程。
- 显示boot logo。默认是“Android”字样。
Android启动过程中,最重要的是启动各个系统服务。系统所有的功能都依赖这些服务来完成。比如启动应用程序,拨打电话,使用WIFI或者蓝牙,播放音视频等。只要这些服务能正常地启动并正常工作,整个Android系统的启动也就完成了。
4.1 本地服务
本地服务是指运行在C++层的系统守护进程。
- 一部分本地服务由init直接启动。它们定义在init.rc和init.<hardware>.rc中。如 ueventd、servicemanager、debuggerd、rild、mediaserver等。
- 还有一部分本地服务由前面的本地服务创建。如mediaserver会启动AudioFlinger,MediaPlayerService, 以及 CameraService 等本地服务。
4.2 Android服务
Android服务是指运行在Dalvik虚拟机进程中的服务。
init执行app_process程序,创建Zygote进程。Zygote是Android系统最重要的进程,所有后续的Android应用程序都由它fork出来。
Zygote首先fork出SystemServer,后者启动所有的Android核心服务,包括ActivityManager,WindowManager,PowerManager等。这些Android服务并不是运行在独立的进程中,而是运行在SystemServer进程中,以线程的方式存在。
android_boot.jpg参考资料
Android内核开发:图解Android系统的启动过程
https://blog.51cto.com/ticktick/1659473
Zygote
https://blog.csdn.net/tfygg/article/details/52086621
Android 系统开机日志
https://blog.csdn.net/zhangbijun1230/article/details/79776711
网友评论