ARM技术william hill官网
直播中

kjfd

9年用户 218经验值
擅长:嵌入式技术
私信 关注
[资料]

芯灵思开发板安卓底层开发学习经验第十期

` 本帖最后由 kjfd 于 2015-9-21 09:52 编辑

这一期呢我们来学习一下Android的启动脚本,也就是init.rc,那么我们首先来看一下我们的init.rc中都包含有哪些内容
图片1.png
我们来看一下init.rc中都包含了哪些内容,先打开init.rc
图片2.png
首先是录入了一些其他的脚本,有我们的init.environ.rc init.u***.rc等,剩下的就是我们脚本真正所做的内容了,首先是有一个on early-init ,在后面是一些命令,有write命令、setcon命令、start命令等,后面呢还有一些service , 我们的service其实就是当我们启动Android时的一些后台服务,那么接下来我们来看一下import
Import就是导入一些其他的脚本,在上面那幅图片中我们就可以看到,import导入了一些其他的脚本。接下来我们使用grep命令来看一下init.environ.rc是在哪里定义的
图片3.png
我们可以看到我们的init.environ.rc是动态生成的,我们来打开这个文件
图片4.png
可以看到他是由我们的init.environ.rc.in经过一些命令生成的,那么我们来看一下init.environ.rc.in这个文件
图片5.png
他呢主要是设置一些我们的环境变量,还定义了一些其他的环境变量
那我们再来看一下init.u***.rc
图片6.png
他在这里主要是做一些相关命令,改一下我们第一个文件的用户和用户组,并且修改一些权限,这就是init.u***.rc所做的事情
那我们再来看一下我们的init.${ro.hardware}.rc , 也就是我们当前应用平台所对应的rc ,他在device/softwinner/fiber-a31stm/init.sun6i.rc 目录下,我们来看一下他所做的事情
图片7.png
首先是创建一些目录,然后设置了一些环境变量,创建一些软连接,插入一些设备的驱动,这个驱动是在我们系统启动之后,在脚本中动态插入的,这些动态插入的驱动只和我们的硬件平台相关,也就是和我们的一些外设是相关的,所以说他在这里插入的驱动,是在脚本中自动插入的,如果说我们换了一外设,那我们要去修改相应的驱动,这就是我们init.${ro.hardware}.rc所做的事情
我们再来看一下init.trace.rc ,他是在我们的system/core/rootdir/init.trace.rc 目录下,我们打开它来看一下,
图片8.png
他在这里所做的就是修改一些文件的权限,这就是他所做的事情了。
那么接下来我们来看一下on 这个选项的具体含义,
图片9.png
我们的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
图片11.png
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进程来做的
图片12.png
下面我们来看一下我们的cmd,我们的cmd包括写文件,启动服务,插入我们的驱动,建立一些软连接,修改我们的权限,修改我们的用户,以及用户组,然后挂载一些分区和目录,
还有就是setprop
图片13.png
我们所有的一些环境变量都是在我们的启动脚本中事先设置好的,而这个设置的字段就是我们的setprop,我们可以在adb下看一下我们设置的net.tcp.buffersize.wifi ,是不是和我们设置的值一样
图片14.png
我们可以看到和我们设置的环境变量是一样的,而这个设置的过程也是由我们的启动脚本所定义的,但是是由我们init进程所设置的,这就是我们cmd所做的事情
我们init脚本主要分为四种类型,第一个是我们的import导入其他的脚本,第二个是我们的on字段,他用来设置我们某一些操作所用的时间,通过early-init init 等字段来设置,还有就是使用我们的on trigger变量,来决定我们的操作是否执行,第三种就是我们的services
Services是启动我们的一些服务,这些服务是可以被我们init进程所守护的,最后就是我们所执行的一些操作,比如:write等操作,这些就是我们init脚本的一些基本语法了。

` 图片10.png

更多回帖

发帖
×
20
完善资料,
赚取积分