Android 4.4 Init进程分析二(init.rc文件的解析)

少年恃险若平地,独倚长剑凌清秋。这篇文章主要讲述Android 4.4 Init进程分析二:init.rc文件的解析相关的知识,希望能为你提供帮助。
国际惯例,我们先看一下源码:
http://androidxref.com/4.4_r1/xref/system/core/init/init.c#1039

1 init_parse_config_file("/init.rc");

在init进程的main()函数里,会调用init_parse_config_file()方法解析init.rc脚本,注意这里传递的参数是根目录下的 "/init.rc"文件路径。
 
 
init_parse_config_file()方法定义如下:
http://androidxref.com/4.4_r1/xref/system/core/init/init_parser.c#404
1 int init_parse_config_file(const char *fn) 2 { 3char *data; 4data = https://www.songbingjia.com/android/read_file(fn, 0); //读取/init.rc文件内容到内存,并返回起始地址存入data 5if (!data) return -1; 6 7parse_config(fn, data); //解析读入的字符内容 8DUMP(); 9return 0; 10 }

read_file()方法的定义非常简单,作用就是把指定的文件以字符的形式读入到内存中,并返回起始地址及读入的数据大小。
其源码如下:
【Android 4.4 Init进程分析二(init.rc文件的解析)】http://androidxref.com/4.4_r1/xref/system/core/init/util.c#142
1 /* reads a file, making sure it is terminated with */ 2 3 //该方法接收两个参数: 4 // fn: 要读取的文件路径 5 // _sz:unsigned int类型的指针,用于返回读入的字符个数 6 // 该方法返回读取的字符内容的起始地址,如果读取失败则返回 0 7 8 void *read_file(const char *fn, unsigned *_sz) 9 { 10char *data; 11int sz; 12int fd; 13struct stat sb; 14 15data = https://www.songbingjia.com/android/0; 16fd = open(fn, O_RDONLY); //以只读的方式打开文件 17if(fd < 0) return 0; 18 19// for security reasons, disallow world-writable 20// or group-writable files 21if (fstat(fd, & sb) < 0) { 22ERROR("fstat failed for ‘%s‘ ", fn); 23goto oops; 24} 25if ((sb.st_mode & (S_IWGRP | S_IWOTH)) != 0) { 26ERROR("skipping insecure file ‘%s‘ ", fn); 27goto oops; 28} 29 30sz = lseek(fd, 0, SEEK_END); // 获取文件长度,有多少个字节 31if(sz < 0) goto oops; 32 33if(lseek(fd, 0, SEEK_SET) != 0) goto oops; // 定位到文件开头 34 35data = https://www.songbingjia.com/android/(char*) malloc(sz + 2); //分配存储空间 36if(data == 0) goto oops; 37 38if(read(fd, data, sz) != sz) goto oops; // 读取文件内容 39close(fd); // 关闭文件 40data[sz] = ‘ ‘; // 设置结尾字符 41data[sz+1] = 0; 42if(_sz) *_sz = sz; 43return data; 44 45 oops: 46close(fd); 47if(data != 0) free(data); 48return 0; 49 }

将文件的内容读入内存后,接下来就可以进行解析了,调用parse_config()方法来解析init.rc的内容。
http://androidxref.com/4.4_r1/xref/system/core/init/init_parser.c#347

    推荐阅读