这一期呢我们来学习一下
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
脚本的一些基本语法了。