【Android7.1.2源码解析系列】实战分析init.rc文件

实战分析init.rc文件

 

前言:经过上一篇的/system/core/init/readme.txt文件的翻译,对于init.rc的语法也有了一定的了解,这一篇就对/system/core/rootdir/init.rc文件进行一个分析,希望能够借此对android的开机过程有一定的了解。

 

关联文章:init.rc语法翻译init.rc全流程分析注释

一、综述

1rc文件语法综述:

 

首先抛出一个结论:

action是“触发器-执行功能”一对多的关系,一个触发条件然后执行多个程序。

Service是“触发器-执行功能”多对一的关系,针对于一个程序来设置多个触发的目标。

 

基于这个基础的认知,对于init.rc语法的学习就比较简单了。

 

Init.rc文件是android当中的启动脚本文件,语法非常的简单,可以认为init.rc文件中只有actionservice两种内容形式,对这两种内容分别给出一个例子:

 

Action:

 

on init

# 设置系统时钟

    sysclktz 0

# 设置日志等级

    loglevel 3

 

    # Backward compatibility

# 直译,增强兼容性

# system/etc链接到/etc,将sys/kernel/debug链接到/d

    symlink system/etc /etc

symlink sys/kernel/debug /d

……(省略后半部分)

 

说明:action中,语法为:

on ***

Command1

Command2

...

此处,***就是action的触发条件,后面的command1command2等等就是当***条件触发后将会执行的命令。

以此处的on init为例,当系统处于初始化时,触发了init条件(这里先不管init怎麼触发的),于是开始执行以下命令symlink system/etc /etc 建立两个目录的符号链接,同样的下一句symlink也是建立两个目录之间的符号链接。这样再依次执行以后省略号之中的内容。

 

Service:

 

service servicemanager /system/bin/servicemanager

    class core

    user system

    group system

    critical

    onrestart restart healthd

    onrestart restart zygote

    onrestart restart media

    onrestart restart surfaceflinger

    onrestart restart drm

 

说明:service中,语法为:

 

Service 名称 路径

描述1

描述2

...

如同之前提到的,与action不同,service是由多个条件触发一个行为,而这里的名称就是所要执行的文件的名称,路径是此文件所位于的路径,而描述1、描述2就是此文件运行的时机和条件(不完全是,有一部分是对于文件的分类、权限、等级的描述等,这里先不管)。

以此处的service为例,servicemanager所处的位置位于/system/bin/servicemanager,后面的class coreuser systemgroup systemcritical设置了service所处的类别、用户、用户组、以及严重的级别,这些是针对于进程属性的配置,这里先不管。后面的多个onrestart语句就是该程序能造成的触发结果,后面的几句onrestart的意思就是当此service重启的时候,重新启动healthdzygotemediasurfaceflingerdrm进程。


 

二、init.rc分析

对于init.rc文件的全面分析已经在之前的文章当中做过了,想要看的同学可以点击这里进行查看,而此处是对于init.rc的总体流程进行分析,如果有疑问或不清楚的地方欢迎留言进行讨论。

Init.rc的主要步骤:

1、导入其他预配置rc文件

2、进行early-init,设置init进程的信息(包括优先级、权限、selinux配置),开启ueventdearly-init的主要工作是对init进程进行初始化。

3、Init部分创建了一些目录结构,对于文件进行挂载,然后对于系统中的内存与进程进行了配置,cpu运行的数据以及一些权限的管理。总的来说,init部分主要进行了android目录下大的文件夹的创建工作,包括systemdatacacheconfig/mnt/storagesdcard),对于系统的内存配置、进程配置、权限配置进行了初始化。这里可以得知,对于操作系统来说,最基本的还是文件,所以init部分也是首先初始化了文件的分类存放位置,然后对于一些必要的可选项进行了配置,而配置的方式依然是写入文件当中。

4、设置有关充电模式的内容

5、Init-late部分,主要是创建更深层次的子目录并创建对应的数据。

 

总结一下:前五步可以说就是所有action当中的内容,我们可以看出,action部分主要完成了以下的工作:配置系统的文件目录结构与数据、配置系统的内存管理、进程管理以及权限管理的数据。 可以说,action部分是一些静态的配置,而接下来的service部分就是一些动态的进程的配置了。

 

6、对于动态进程的部分,进程很多,触发条件也很多,就不一一赘述了,而这些进程主要按照分级、分类、分依赖三种划分方式进行划分,其中分级指的是对于进程的关键性的分级,比如critical标识的进程就是关键性的进程,发生错误时会造成系统的严重错误。而分类指的是将进程的功能进行分类,比如属于core类别、属于healthd类别等。而分依赖指的是说明了进程当中的互相依赖关系,而init.rc文件中service的编写就是主要体现了这种划分的方式。

 

 

三、总结

Android系统博大精深,对于init过程的梳理非常有助于对其整体框架的了解,而在init过程当中,大量的文件操作,也加深了我对于系统中“万物皆文件”这一思想的理解。学习过程中也应该更加积极的思考,对于android系统中每个部分的运行在了解它的存在的方式的同时,还要了解它的存在的原因,也就是它设计的思想,保持积极的思考。

你可能感兴趣的:(一块砖的android源码之路,一块砖的android源码之旅)