前段时间看了下Android的启动的源代码,大致的理了下,很多底层的一些机制,实现什么都没过多的研究。对于Android架构理解有很大的帮助
---------------------------------------------------------------------------------------------------------
首先是 init进程启动
(一些native服务启动)
如: servicemanager启动
Zygote启动
SysytemServer启动,在
init1
init2函数中启动Android服务
init进程起来后,解析init.rc和init.xxx.rc建立基本的服务
之后进入循环,并没有退出
分析init.c@/system/core/init的main函数主要实现过程
...
mkdir("/dev", 0755) //创建具有可读写的目录 ”/dev“
。。。
log_init(); //初始化log系统
。。。
parse_config_file("/init.rc"); /*解析init.rc文件,parse_config_file这个 函数是在/system/core/init/parse.c这个类中实现的,讲解析得到的service信息储存到
service_list这个数据解构中*/
get_hardware_name();
snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
parse_config_file(tmp); /*解析init.xxx.rc,和硬件相关*/
action_for_each_trigger("early-init", action_add_queue_tail);
drain_action_queue(); /*执行解析得到的”early-init”的action*/
INFO("device init/n");
device_fd = device_init(); /*设备的初始化。挂载结点倒/dev下还有下载
firmwares*/
property_init();
。。。 /*property初始化*/
/*读取/initlogo.rle(一张位图),如果成功则在/dev/graphics/fb0 显示Logo,如果失败则将/dev/tty0,设为TEXT模式并打开/dev/tty0,输出文本ANDROID。具体实现可看
/system/core/init/log.c
*/
if( load_565rle_image(INIT_IMAGE_FILE) ) {
fd = open("/dev/tty0", O_WRONLY);
if (fd >= 0) {
。。。
。。。
}
/* 判断cmdline 中的參數,并设置属性系统中的参数:
* 1、 如果 bootmode为
* - factory,设置ro.factorytest值为1
* - factory2,设置ro.factorytest值为2
* - 其他的設