博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android init launch
阅读量:4075 次
发布时间:2019-05-25

本文共 4072 字,大约阅读时间需要 13 分钟。

android: v2.3.41. init.clinux内核起来后,init是android的第一个用户进程system/core/init/init.cint 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.rcinit.rc被安装到根文件系统中,被init可执行程序解析init.rc脚本的使用可以参考system/core/init/readme.txt所有的都是以行为单位,各种记号由空格来隔开反斜杠号可用于在记号间插入空格1) Action 动作其实就是一系列的命令commands,Actions都有一个trigger触发器,用来决定action的执行时间Actions take the form of:on 
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
[
]*

转载地址:http://exkni.baihongyu.com/

你可能感兴趣的文章
Solr及Spring-Data-Solr入门学习
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>
从mysql中 导出/导入表及数据
查看>>
HQL语句大全(转)
查看>>
几个常用的Javascript字符串处理函数 spilt(),join(),substring()和indexof()
查看>>
javascript传参字符串 与引号的嵌套调用
查看>>
swiper插件的的使用
查看>>
layui插件的使用
查看>>
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>