这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 芯灵思开发板安卓底层开发第十期

共1条 1/1 1 跳转至

芯灵思开发板安卓底层开发第十期

助工
2015-09-17 16:05:53     打赏

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



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]