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 {
 3     char *data;
 4     data = read_file(fn, 0); //读取/init.rc文件内容到内存,并返回起始地址存入data
 5     if (!data) return -1;
 6
 7     parse_config(fn, data); //解析读入的字符内容
 8     DUMP();
 9     return 0;
10 }

read_file()方法的定义非常简单,作用就是把指定的文件以字符的形式读入到内存中,并返回起始地址及读入的数据大小。

其源码如下:

http://androidxref.com/4.4_r1/xref/system/core/init/util.c#142

 1 /* reads a file, making sure it is terminated with \n \0 */
 2
 3 //该方法接收两个参数:
 4 // fn: 要读取的文件路径
 5 // _sz:unsigned int类型的指针,用于返回读入的字符个数
 6 // 该方法返回读取的字符内容的起始地址,如果读取失败则返回 0
 7
 8 void *read_file(const char *fn, unsigned *_sz)
 9 {
10     char *data;
11     int sz;
12     int fd;
13     struct stat sb;
14
15     data = 0;
16     fd = open(fn, O_RDONLY); //以只读的方式打开文件
17     if(fd < 0) return 0;
18
19     // for security reasons, disallow world-writable
20     // or group-writable files
21     if (fstat(fd, &sb) < 0) {
22         ERROR("fstat failed for ‘%s‘\n", fn);
23         goto oops;
24     }
25     if ((sb.st_mode & (S_IWGRP | S_IWOTH)) != 0) {
26         ERROR("skipping insecure file ‘%s‘\n", fn);
27         goto oops;
28     }
29
30     sz = lseek(fd, 0, SEEK_END); // 获取文件长度,有多少个字节
31     if(sz < 0) goto oops;
32
33     if(lseek(fd, 0, SEEK_SET) != 0) goto oops; // 定位到文件开头
34
35     data = (char*) malloc(sz + 2); //分配存储空间
36     if(data == 0) goto oops;
37
38     if(read(fd, data, sz) != sz) goto oops; // 读取文件内容
39     close(fd); // 关闭文件
40     data[sz] = ‘\n‘; // 设置结尾字符
41     data[sz+1] = 0;
42     if(_sz) *_sz = sz;
43     return data;
44
45 oops:
46     close(fd);
47     if(data != 0) free(data);
48     return 0;
49 }

将文件的内容读入内存后,接下来就可以进行解析了,调用parse_config()方法来解析init.rc的内容。

http://androidxref.com/4.4_r1/xref/system/core/init/init_parser.c#347

原文地址:https://www.cnblogs.com/roger-yu/p/12199121.html

时间: 2024-10-08 10:17:22

Android 4.4 Init进程分析二:init.rc文件的解析的相关文章

Android Init进程分析番外篇:9.0的init进程

1 前言 在之前的几篇文章中,我们基于Android 4.4源码分析了init进程的启动及事件处理逻辑.目前Android版本已然更新到Android 10了,很多代码及服务架构都做了大范围的调整重构,这其中也包括init相关的代码. 但是,万变不离其宗,很多核心思想和处理逻辑Android还是都保留了下来,只是在写作上做了更好的功能封装和逻辑分割. 接下来笔者就非常简略的说一下Android 9.0 的init进程. 2 Android 9.0 init 分析 对于9.0的init笔者不想做过

Android启动流程分析(二) init进程的启动

############################################# 本文为极度寒冰原创,转载请注明出处 ############################################# 分析init进程,首先要分析init进程是如何启动的, init的源码位于(system/core/init),我们先来看看init进程的android.mk 下面是从system/core/init模块拿出来的一段code: LOCAL_MODULE:= init LOCAL_

Android之init进程分析(1)

本文介绍init进程中的action触发方式 一,什么是action 在android中,使用action来管理并执行命令.action是一个数据结构,里面包含了命令集合command,action的名字等.Android系统通过action来执行一组命令. struct action { /* node in list of all actions */ struct listnode alist; /* node in the queue of pending actions */ stru

android init进程分析 基本流程

(懒人最近想起我还有csdn好久没打理了,这个android init躺在我的草稿箱中快5年了,稍微改改发出来吧) android设备上电,引导程序引导进入boot(通常是uboot),加载initramfs.kernel镜像,启动kernel后,进入用户态程序.第一个用户空间程序是init, PID固定是1.在android系统上,init的代码位于/system/core/init下,基本功能有: 管理设备 解析并处理启动脚本init.rc 实时维护这个init.rc中的服务 init进程的

android init进程分析

android的init进程用来启动zygote进程,用来启动android世界.init进程的源码在顶层目录的/system/core/init使用 find -name Android.mk -exec grep -l "init" {} \;来查找源码,接下来的android服务程序也是使用这个指令来查找源码. /system/core/init/init.c 整个init进程的入口函数669 int main(int argc, char **argv) init_parse_

android init进程分析 init脚本解析和处理

(懒人近期想起我还有csdn好久没打理了.这个android init躺在我的草稿箱中快5年了.略微改改发出来吧) RC文件格式 rc文件是linux中常见的启动载入阶段运行的文件.rc是run commands的缩写.基本上能够理解为在启动阶段运行的一些列命令.android init进程启动时,也会运行此启动脚本文件,init.rc.init.rc的写法稍有点复杂,具体可參考 /system/core/init下的readme文件.脚本基本组成是由四类,为: commands: 命令 act

android init进程分析 ueventd

转自:http://blog.csdn.net/freshui/article/details/2132299 (懒人最近想起我还有csdn好久没打理了,这个Android init躺在我的草稿箱中快5年了,稍微改改发出来吧) ueventd主要是负责设备节点的创建.权限设定等一些列工作.服务通过使用uevent,监控驱动发送的消息,做进一步处理.ueventd实际和init是同一个binary,只是走了不同分支,可参看前一部分. ueventd的整体代码比较简单,主要是三部分: 解析ueven

构建根文件系统之init进程分析

busybox是ls.cp等命令的集合. 执行ls时,实际上是执行了busybox ls 执行cp时,实际上是执行了busybox cp 分析init程序之前,再让我们回想一下我们的目标:u-boot启动内核,内核启动应用程序,内核是怎样启动应用程序呢,内核启动了init进程,位于/sbin/init中.我们最终的目的是启动客户程序,也就是说假如你是做手机的,希望启动一个手机的程序,假如是做监控的,那么就启动一个监控的程序的.客户各有不同,但都使用了linux系统,那么怎样加以区分呢? init

android中init.rc文件的解析问题

init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值的. 这个ro.hardware值设置是在/system/core/init.c中实现的,其通过hardware来赋值.hardware首先被/proc/cpuinfo赋值.然后会检測comandline. 假设comandline中有參数为androidboot.hardware,那这个參数在in