前言:经过上一篇的/system/core/init/readme.txt文件的翻译,对于init.rc的语法也有了一定的了解,这一篇就对/system/core/rootdir/init.rc文件进行一个分析,希望能够借此对android的开机过程有一定的了解。
关联文章:init.rc语法翻译、init.rc全流程分析注释
1、rc文件语法综述:
首先抛出一个结论:
action是“触发器-执行功能”一对多的关系,一个触发条件然后执行多个程序。
Service是“触发器-执行功能”多对一的关系,针对于一个程序来设置多个触发的目标。
基于这个基础的认知,对于init.rc语法的学习就比较简单了。
Init.rc文件是android当中的启动脚本文件,语法非常的简单,可以认为init.rc文件中只有action和service两种内容形式,对这两种内容分别给出一个例子:
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的触发条件,后面的command1、command2等等就是当***条件触发后将会执行的命令。
以此处的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 core、user system、group system、critical设置了service所处的类别、用户、用户组、以及严重的级别,这些是针对于进程属性的配置,这里先不管。后面的多个onrestart语句就是该程序能造成的触发结果,后面的几句onrestart的意思就是当此service重启的时候,重新启动healthd、zygote、media、surfaceflinger、drm进程。
对于init.rc文件的全面分析已经在之前的文章当中做过了,想要看的同学可以点击这里进行查看,而此处是对于init.rc的总体流程进行分析,如果有疑问或不清楚的地方欢迎留言进行讨论。
Init.rc的主要步骤:
1、导入其他预配置rc文件
2、进行early-init,设置init进程的信息(包括优先级、权限、selinux配置),开启ueventd。early-init的主要工作是对init进程进行初始化。
3、Init部分创建了一些目录结构,对于文件进行挂载,然后对于系统中的内存与进程进行了配置,cpu运行的数据以及一些权限的管理。总的来说,init部分主要进行了android目录下大的文件夹的创建工作,包括system、data、cache、config、/mnt/storage(sdcard),对于系统的内存配置、进程配置、权限配置进行了初始化。这里可以得知,对于操作系统来说,最基本的还是文件,所以init部分也是首先初始化了文件的分类存放位置,然后对于一些必要的可选项进行了配置,而配置的方式依然是写入文件当中。
4、设置有关充电模式的内容
5、Init-late部分,主要是创建更深层次的子目录并创建对应的数据。
总结一下:前五步可以说就是所有action当中的内容,我们可以看出,action部分主要完成了以下的工作:配置系统的文件目录结构与数据、配置系统的内存管理、进程管理以及权限管理的数据。 可以说,action部分是一些静态的配置,而接下来的service部分就是一些动态的进程的配置了。
6、对于动态进程的部分,进程很多,触发条件也很多,就不一一赘述了,而这些进程主要按照分级、分类、分依赖三种划分方式进行划分,其中分级指的是对于进程的关键性的分级,比如critical标识的进程就是关键性的进程,发生错误时会造成系统的严重错误。而分类指的是将进程的功能进行分类,比如属于core类别、属于healthd类别等。而分依赖指的是说明了进程当中的互相依赖关系,而init.rc文件中service的编写就是主要体现了这种划分的方式。
Android系统博大精深,对于init过程的梳理非常有助于对其整体框架的了解,而在init过程当中,大量的文件操作,也加深了我对于系统中“万物皆文件”这一思想的理解。学习过程中也应该更加积极的思考,对于android系统中每个部分的运行在了解它的存在的方式的同时,还要了解它的存在的原因,也就是它设计的思想,保持积极的思考。