安卓底层开发学习经验第十期

时间:2021-07-28 13:54:14
这一期呢我们来学习一下 Android 的启动脚本,也就是 init.rc ,那么我们首先来看一下我们的 init.rc 中都包含有哪些内容
安卓底层开发学习经验第十期
我们来看一下init.rc 中都包含了哪些内容,先打开 init.rc
安卓底层开发学习经验第十期
首先是录入了一些其他的脚本,有我们的init.environ.rc  init.usb.rc 等,剩下的就是我们脚本真正所做的内容了,首先是有一个 on early-init  ,在后面是一些命令,有 write 命令、 setcon 命令、 start 命令等,后面呢还有一些 service  , 我们的 service 其实就是当我们启动 Android 时的一些后台服务,那么接下来我们来看一下 import
Import 就是导入一些其他的脚本,在上面那幅图片中我们就可以看到, import 导入了一些其他的脚本。接下来我们使用 grep 命令来看一下 init.environ.rc 是在哪里定义的
安卓底层开发学习经验第十期
我们可以看到我们的init.environ.rc 是动态生成的,我们来打开这个文件
安卓底层开发学习经验第十期
可以看到他是由我们的init.environ.rc.in 经过一些命令生成的,那么我们来看一下 init.environ.rc.in 这个文件
安卓底层开发学习经验第十期
他呢主要是设置一些我们的环境变量,还定义了一些其他的环境变量
那我们再来看一下init.usb.rc
安卓底层开发学习经验第十期
他在这里主要是做一些相关命令,改一下我们第一个文件的用户和用户组,并且修改一些权限,这就是init.usb.rc 所做的事情
那我们再来看一下我们的 init.${ro.hardware}.rc  , 也就是我们当前应用平台所对应的 rc  ,他在 device/softwinner/fiber-a31stm/init.sun6i.rc  目录下,我们来看一下他所做的事情
安卓底层开发学习经验第十期
首先是创建一些目录,然后设置了一些环境变量,创建一些软连接,插入一些设备的驱动,这个驱动是在我们系统启动之后,在脚本中动态插入的,这些动态插入的驱动只和我们的硬件平台相关,也就是和我们的一些外设是相关的,所以说他在这里插入的驱动,是在脚本中自动插入的,如果说我们换了一外设,那我们要去修改相应的驱动,这就是我们init.${ro.hardware}.rc 所做的事情
我们再来看一下 init.trace.rc  ,他是在我们的 system/core/rootdir/init.trace.rc  目录下,我们打开它来看一下,
安卓底层开发学习经验第十期
他在这里所做的就是修改一些文件的权限,这就是他所做的事情了。
那么接下来我们来看一下on  这个选项的具体含义,
安卓底层开发学习经验第十期
我们的 on  选项可以分成下面几个小选项, on early-init  on early-boot  on boot  on init 
这四种方式下面都会跟一些相关的命令,在我们的 init.c 文件中会解析这个相关的 on 选项,
然后根据后边设置的这些字段来定义后面这些命令所执行的时间。 On 语法还有另外一种用法,就是 on trigger 事件,其中这个 trigger 是我们的一个条件变量,比如我们设置的环境变量,比如我们设置的环境变量是真的话,那么我们就会执行下面的命令,这个就是 on 字段所做的事情。
那么接下来我们来看一下我们的 services 这个字段
安卓底层开发学习经验第十期
Services 字段后面会加一些参数,其中 name 这个参数呢是指我们系统服务的名称, path 参数他是我们可执行文件的一个路径, arg 参数就是我们 path 后面所跟的一个启动参数,我们的 services 是一种系统的服务,这种服务呢,既可以是启动一次的,也可是被我们 init 进程守护的,在我们 services 后面呢,我们也可以加一些相关的参数,比如 user xxx , 也就是代表这个服务的用户是 xxx ,后面加一个 group xxx  ,代表我们的用户组是 xxx  ,后面加一个 oneshot/disable  ,分别代表我们只启动一次,或者说我们这个服务是关闭的。
下面我们来看一下我们的 netd
安卓底层开发学习经验第十期
Netd 是我们一个服务的名字,我们 netd 所对应的可执行文件是、 system/bin/netd  ,它属于我们的 main  ,他在这里会建立一些相应的 socket ,这个是可以被我们 init 进程所守护的,我们切到我们的 adb 下,我们来看一下我们的 netd 他的进程号是 1263 ,现在我们来把这个进程杀掉  kill 1263   然后我们在 ps  ,就没有我们的 netd 进程了,我们在通过 ps  grep  netd ”,就会发现 netd 又启了一个相关服务,这个服务进程号是 5006 ,和我们刚才那个是
不一样的,这说明我们杀掉一个守护的进程之后,我们的 init 会把我们所守护的进程重新启动。 那么我们使用 stop netd  来把进程给 stop 掉我们在使用 ps  grep  netd ”就会发现当我们使用 stop 时,我们的 netd 就不会重启了,现在我们只有使用 start netd 才能重新启动,而这所有的相关事情,都是由我们的 init 进程来做的
安卓底层开发学习经验第十期
下面我们来看一下我们的 cmd ,我们的 cmd 包括写文件,启动服务,插入我们的驱动,建立一些软连接,修改我们的权限,修改我们的用户,以及用户组,然后挂载一些分区和目录,
还有就是 setprop
安卓底层开发学习经验第十期
我们所有的一些环境变量都是在我们的启动脚本中事先设置好的,而这个设置的字段就是我们的setprop, 我们可以在 adb 下看一下我们设置的 net.tcp.buffersize.wifi  ,是不是和我们设置的值一样
安卓底层开发学习经验第十期
我们可以看到和我们设置的环境变量是一样的,而这个设置的过程也是由我们的启动脚本所定义的,但是是由我们 init 进程所设置的,这就是我们 cmd 所做的事情
我们 init 脚本主要分为四种类型,第一个是我们的 import 导入其他的脚本,第二个是我们的 on 字段,他用来设置我们某一些操作所用的时间,通过 early-init  init  等字段来设置,还有就是使用我们的 on trigger 变量,来决定我们的操作是否执行,第三种就是我们的 services
Services 是启动我们的一些服务,这些服务是可以被我们 init 进程所守护的,最后就是我们所执行的一些操作,比如: write 等操作,这些就是我们 init 脚本的一些基本语法了。