【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 7.1.2(也被称为Nougat)是Android操作系统的一个版本,它的源代码是公开可用的。源码包含了构建和运行Android操作系统所需的所有代码文件和资源。 Android操作系统是一个基于Linux内核的开源平台,用于移动设备和嵌入式系统。它提供了一个统一的操作系统环境,使开发者能够轻松地构建和定制自己的Android设备。 Android 7.1.2源码提供了一套开发工具和框架,使开发者能够创建功能丰富、稳定和安全的应用程序。该版本中引入了一些新的功能和改进,例如通知栏的增强、多任务处理的改进、Doze模式的优化等,以提供更好的用户体验。 通过查看源代码,开发者可以深入了解Android操作系统的内部工作原理,并理解其中的各个组件和模块是如何相互协作的。例如,开发者可以研究Android的用户界面框架、应用程序生命周期管理、通信和存储机制等。 修复和优化Android 7.1.2源码也是可能的,因为它是开源的。开发者可以根据自己的需求和想法对操作系统进行修改,并参与到Android社区中,与其他开发者分享和贡献代码。 总之,Android 7.1.2源码为开发者提供了一个定制和构建Android应用的平台。通过深入了解源码,开发者能够创建出更加出色和创新的应用程序,同时也有机会参与到Android开源社区中,为整个生态系统的发展做出贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值