android init launch

android: v2.3.4
1. init.c
linux内核起来后,init是android的第一个用户进程
system/core/init/init.c
int main(int argc, char **argv)
{
/******创建linux 根文件系统的目录***********/
	mkdir("/dev", 0755);
    mkdir("/proc", 0755);
    mkdir("/sys", 0755);

    mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
    mkdir("/dev/pts", 0755);
    mkdir("/dev/socket", 0755);
    mount("devpts", "/dev/pts", "devpts", 0, NULL);
    mount("proc", "/proc", "proc", 0, NULL);
    mount("sysfs", "/sys", "sysfs", 0, NULL);
	//打开标准输入,输出,错误文件描述符
	open_devnull_stdio();
	//读取并解析init.rc
    init_parse_config_file("/init.rc");
	
	//通过/proc/cmdline得到启动命令
	//从/proc/cmdline 中提取信息内核启动参数,并保存到全局变量
    import_kernel_cmdline(0);
	
	//通过/proc/cpuinfo 得到硬件名
	get_hardware_name(hardware, &revision);
	//读取并且解析硬件相关的Init脚本文件
	snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);
    init_parse_config_file(tmp);
/******触发在init脚本文件中名字为early-init的action并且执行命令*******/
	 action_for_each_trigger("early-init", action_add_queue_tail);
	 //串口初始化
	 queue_builtin_action(console_init_action, "console_init");

}

static int console_init_action(int nargs, char **args)
{
/***判断是否有控制台,如果没有就用默认的*********/
   if (console[0]) {
        snprintf(tmp, sizeof(tmp), "/dev/%s", console);
        console_name = strdup(tmp);
    }
/*****打开console,如果cmdline中没有指定console则打开/dev/console
	    fd = open(console_name, O_RDWR);
/*****#define INIT_IMAGE_FILE	"/initlogo.rle"
@*读取initlogo.rle.是放在根文件系统下的一张565 rle压缩的开机logo
@*如果打开成功则在/dev/graphics/fb0显示logo,如果失败,则打开/dev/tty0显示
@*ANDROID 文本*/
		 if( load_565rle_image(INIT_IMAGE_FILE) ) {
		   fd = open("/dev/tty0", O_WRONLY);
        if (fd >= 0) {
            const char *msg;
                msg = "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"  // console is 40 cols x 30 lines
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "\n"
            "             A N D R O I D ";
            write(fd, msg, strlen(msg));
            close(fd);
        }
    }

}

2. init脚本语言
Android中使用启动脚本init.rc,init启动脚本的路径
system/coer/rootdir/init.rc
init.rc被安装到根文件系统中,被init可执行程序解析
init.rc脚本的使用可以参考system/core/init/readme.txt
所有的都是以行为单位,各种记号由空格来隔开
反斜杠号可用于在记号间插入空格
1) Action 动作
其实就是一系列的命令commands,Actions都有一个trigger触发器,用来决定action的执行时间
Actions take the form of:

on <trigger>
   <command>
   <command>
   <command>
 
 on early-init 
 on init
 on fs
 on post-fs
 on boot
 on property:ro.secure=0
 on property:ro.kernel.qemu=1
 on property:persist.service.adb.enable=1
 这些触发是由init.c里的函数action_for_each_trigger来决定的
  action_for_each_trigger("early-init", action_add_queue_tail);
  action_for_each_trigger("init", action_add_queue_tail);
  action_for_each_trigger("early-fs", action_add_queue_tail);
  action_for_each_trigger("fs", action_add_queue_tail);
  action_for_each_trigger("post-fs", action_add_queue_tail);
  action_for_each_trigger("early-boot", action_add_queue_tail);
  action_for_each_trigger("boot", action_add_queue_tail);
2)services服务
services表示启动一个可执行程序,options选项是服务的附加内容用于配合服务使用
service <name> <pathname> [ <argument> ]*
   <option>
   <option>
name: 服务名
pathname:当前服务对应的程序位置
options:当前服务设置的选项
3)options 选项
Options are modifiers to services.  They affect how and when init
runs the service.

critical:
如果服务四分钟内退出大于四次,系统将会重启并进入恢复模式
service ueventd /sbin/ueventd
    critical

disabled:
服务不会同与它同trigger下的服务自动启动,他必须被明确的按名称启动
service adbd /sbin/adbd
    disabled

socket:
创建套接字
service vold /system/bin/vold
    socket vold stream 0660 root mount
    ioprio be 2

user:
改变服务的用户名
service media /system/bin/mediaserver
    user media

group:
改变服务的组名
service bootanim /system/bin/bootanimation
    user graphics
    group graphics

oneshot:
服务退出时不重启
service flash_recovery /system/etc/install-recovery.sh
    oneshot

ifup:
启动网络接口
on boot
   ifup lo
   ifup usb0
   hostname localhost
hostname:
设置主机名

insmod:
加载path中的模块

mount:
挂载设备
mount tmpfs tmpfs /mnt/asec mode=0755,gid=1000

setprop:
设置系统属性

init.rc中重要的服务
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
创建Dalvik Java虚拟机,然后启动SystemServer,启动所有的Android服务,最终启动Android系统
service servicemanager /system/bin/servicemanager
打开binder驱动,binder是Android Service通信机制的底层实现,该service里封装了binder的操作接口 

 
 
	

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值