Android启动过程_大致流程
Android大致启动过程如图(基于O版本 使用draw.io画的)。
注:这是通过查询结合自己了解的,还有不少不明确的,后续有进展完善,欢迎指正。
说明:绿色是主要几个的阶段。其他围绕这几个阶段的重要过程。
启动过程(绿色的):
1.按下电源,引导芯片从预定义的地方(固化在ROM中),加载引导程序到RAM。
2.引导程序:BootLoader,Android内核启动前的程序,为内核运行提供必要的条件。a,检测外部的RAM以及加载对第二阶段有用的程序;b,引导程序设置网络、内存等。
3.内核:内核的启动后,设置缓存,受保护的内存,调度和加载驱动程序。 当内核完成系统设置时,它会在系统文件中查找“init”。
4.init进程:两个主要责任(1)挂在目录(2)运行init.rc脚本。
5.Zygote:虚拟器进程,预加载和初始化核心库。
Zygote会执行一个app_process可执行文件,在这个文件中首先添加了Android运行时环境,在Android运行时中调用了ZygoteInit.java,这就从c++代码跳到了java代码。
在ZytofeInit.java代码中首先设置了Java虚拟机的堆内存空间,然后启动一个类加载器加载Android启动依赖的类比如Activity等四大组件,dialog等UI的类,然后分出一个子进程启动SystemServer系统服务
6.系统服务:如电源管理器,电话注册,上下文管理器等。
7.引导完成:ACTION_BOOT_COMPLETED开机启动广播发出。
开机过程的关键log[串口log]
- "Preparing for EL3 exit to normal world, LK"
如果串口log里面没有走到这里,说明在PL就卡住了,这句表示进入LK
- "lk finished --> jump to linux kernel"
如果串口log里面没有走到这里,但是上面走到了,说明在lk卡住了,这句表示进入kernel
- "Kernel_init_done"
这句表示kernel初始化完成了,正准备启动init进程,如果这就没有走到:请搜索关键字initcall,
initcall是顺序执行例如module_init注册的init函数,看看卡在哪个call back上
- "BOOTPROF"
这是开机过程中,每走过一个重要阶段都会打印的标志,例如上面Kernel_init_done这一句就会打上这个标志
- "init: init first stage started"
这句表示init进程正常起来执行
- "fs_mgr" 和"e2fsck"
这里标志是在检查和mount 文件系统,如果失败会有如下log:fs_mgr_mount_all returned an error fs_mgr_mount_all returned unexpected error 255
- "zygote"
Starting service 'zygote':这里表示要启动zygote,如果没有这一句表示zygote还没启动,则要检查之前的initrc 执行情况,文件系统mount情况
- "SysServerInit_START"
启动system_server
- "system_server"
这里表示system_server有起来
- "BOOT_Animation:END"
表示开机动画正常结束,进入安卓