Android Framework Started process follow in user space
Android 系统是在linux kernel基础上开发出来的.所以
android内核核心是和linux kernel差不多的.
内核启动大致为:
bootloader 加载内核image到内存
然后执行内核初始化程序
包括内存的初始化 中断向量的初始 外部设备的初始 ....
内核初始化 需要进一步学习啊 还不明白
用户空间的初始是从sys/core/init/ 目录下的init.cpp 的main函数
开始的,我们重点来学习用户空间的初始化流程:
在main函数中,如果传入了ueventd 或者watchdogd 参数.
会调用ueventd_main or watchdogd_main 进行初始化
如果没有上面两个参数 会进行下面的初始化流程:
1. 设置环境变量PATH
2. 如果是第一次启动, 会挂载文件系统 创建文件目录等
3. 调用open_devnull_stdio 将stdin out err 都指向/sys/fs/selinux/null
4. 初始化日志文件句柄klog_init,设置日志级别
5. 如果不是首次启动, 会去进行一些 property_init
process_kernel_dt process_kernel_cmdline export_kernel_boot_props
6. 进行selinux_initialize 一些策略的初始化
7. 加载完策略, 如过是第一次启动 会重新在启动一次
8. 创建一个epoll 句柄, 进行后面的事件监听做准备
9. 信号处理的初始化 signal_handler_init
注册SIGCHLD 信号的处理 来回收该进程fork后进程
退出后的资源(从后面我们可以看到, 所有的服务都是通过
这个主进程启动起来的,所有子进程退出后, 会向父进程
发送SIGCHLD 信号)
10. 系统属性的初始化load 以及启动属性设置的socket
property_load_boot_defaults export_oem_lock_status
start_property_service
11. 解析android自定义的启动脚本文件(位于sys/core/rootdir/), 然后根据
命令行和匹配的事件 进行相关的服务启动 action的执行
这里主要分以下几种脚本命令:
a. 针对'service'的命令
主要通过ServiceParser 来对这些命令的解析
一个service命令就是一个service实例,最后会被
加入到ServiceManager list中去.所有的service都在里面
b. 针对'on'的命令
主要是通过ActionParser 来解析on以及后面的子动作
每个子动作就是一个command,所有的command都加入到
on这个action里面.最后action会加入到ActionManager这个实例内
每个action都有一个事件标识,只有发生的事件与action里面的事件
一致的时候,才会触发action执行里面的所有command
c. 针对'import' 命令
主要通过ImportParser 来解析
相当于include 一样,去引入其他脚本文件
12. 通过 ActionManager 类添加Event 到等待处理的事件队列中
然后进入循环去epoll_wait等待外面连接
在循环中:
a. 会去处理ActionManager内的事件,如果还有事件等待处理
b. epoll_wait主要监听 服务程序退出信号和property_set服务
如果需要重新启动 则再次启动该服务
property
以上就是init.cpp处理的所有流程。
我们的所有服务都是通过service命令来定义
最后通过脚本的start来启动的
在系统.rc文件中定义了如下的服务 用于启动核心模块
最后启动jvm 进入到java语言环境
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
writepid /dev/cpuset/foreground/tasks
上面这段service命令会定义一个名为
zygote的服务.该服务是通过程序/system/bin/app_process来启动的
而/system/bin/app_process对应的源文件
在platform_frameworks_base/cmds/app_process/app_main.cpp
在app_main里启动jvm 进行一些初始化
然后跳转到java程序com.android.internal.os.ZygoteInit
去执行main方法,会去启动startSystemServer(com.android.server.SystemServer)
阅读(1246) | 评论(0) | 转发(0) |