一直做应用,感觉没什么发展,想要学习下framework,苦于没有学习的资料和方向,只能慢慢去摸索了,如果有人有过经历可以给个意见,谢谢。
Android的开机启动流程:
Step1 系统加电,执行bootloader。Bootloader负责初始化软件运行所需要的最小硬件环境,最后加载内核到内存。
Step2 内核加载进内存后,将首先进入内核引导阶段,在内核引导阶段的最后,调用start_kernel进入内核启动阶段。start_kernel最终启动用户空间的init程序。
Step3 init程序负责解析init.rc配置文件,开启系统守护进程。两个最重要的守护进程是zygote进程和ServiceManager,zygote是Android启动的第一个Dalvik虚拟机,ServiceManager是Binder通讯的基础。
Step4 zygote虚拟机启动子进程system_server,在system_server中开启了核心系统服务,并将系统服务添加到ServiceManager中,然后系统进入SystemReady状态。
Step5 在SystemReady状态,ActivityManagerService与zygote中的socket通信,通过zygote启动home应用,进入系统桌面。
**从Step3开始,init启动后,上层的实现:
Step1 init启动的核心Daemon服务包括Android的第一个Dalvik虚拟机zygote。
Step2 zygote定义一个socket,用于接受ActivityManagerService启动应用的请求。
Step3 zygote通过fork系统调用创建system_server进程
Step4 在system_server进程中,将会启动系统核心服务以及其他服务。
Step5 系统服务启动后会注册到ServiceManager中,用于Binder通信。
Step6 ActivityManagerService进入systemReady状态。
Step7 在systemReady状态,ActivityManagerService会与zygote的Socket通信,请求启动Home。 Step8 zygote收到AMS的连接请求后,执行runSelectLoopMode处理请求。 Step9 zygote处理请求会通过forkAndSpecialize启动新的应用进程,并最终启动Home。
******************************************
init.c(启动)文件分析:创建目录,klog_init()将log重定向到proc、kmsg中,property_init()初始化环境变量,get_hardware_name()得到硬件信息和版本,process_kernel_cmdline()解析内核启动参数,property_load_boot_defaults()导入默认环境变量,get_kernel_cmdline_partitions()得到系统分区
******************************************
init.rc(启动脚本)分析:1import(导入其他脚本rc),2on(设置某些操作时间),3services(比如system/bin/install等被init守护),4cmd
********************************************
init进程分析 1 init_parse_config_file解析启动脚本 2action_for_each_tragger 将解析脚本中对应操作加入action_queue队列中 3queue_builtin_action将解析脚本中对应操作加入action_queue队列中 4创建并守护进程
*****************************************************

附录:https://blog.csdn.net/dd864140130/article/details/57624948
文档摘抄自(https://blog.csdn.net/h655370/article/details/77727554)
网友评论