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

下面呢,我们接着上一期的内容来讲解 lookup_keyword ,下面我们来具体看一下这个函数的实现

这个函数就是根据我们传进来的字符串来匹配一个和命令相关的结构体,我们来看一下我们结构体的定义

第一个就是一个name ,这个 name 和我们的命令相对应,第二个是我们这个命令所对应的一个函数,第三个对应的是我们 args 的一个参数,最后一个是结构体所对应的一个类型,我们再回过头来看我们的第一张图,看我们以 c 打头的所有的命令,包括我们的拷贝、 chdir chroot class 等一系列的操作命令都会在这里对应一个结构体,那我们再来看一下这个结构体是在哪里定义的

在这个文件中定义了一系列的操作,比如我们的do_chroot do_chdir 等,在下面会对应一个枚举类型,而他们又会和我们的 K_copy K_capacity 等相对应,这样我们就能知道每一个结构体的具体含义,包括我们的名字、类型、参数、以及执行函数,这样我们所有的脚本中的命令就和我们的结构相关联起来
下面我们来看一下我们的 parse_new_section

他在这里是解析三个状态的,第一个是解析我们的 service ,第二个解析 action ,第三个是 import ,和我们上一章所说的数据结构对应起来,如果说我们解析的是一个 service ,他会加入到我们的 service_list 列表中,同样的 action import 也是一样的,都会加入到他们相应的列表中, struct parse_state 是和我们 parse_service parse_action 相对应的一个函数,如果说我们调用的是一个 parse_service ,那么我们就会在解析这一行的时候就会调用 parse_line_service ,同样另一个也是这样的,下面我们来看一下我们是如何通过这几个函数把我们的数据添加到列表中,我们看一下 init 事件的列表

第一个是我们的service_list ,他是添加所有的服务列表,是被我们的 parse_service 调用的,而我们的 action_list 是被我们的 parse_action 调用的,在这时也会有一些选项,比如 on early 、这就相当于一个 session ,该 session 下的所有操作都会添加到一个相应的节点中,那我们的 action_list 他是把我们的 service_list action_list 中所有的一些服务插到 action_queue 中,这个 action_queue 是当我们启动服务的时候来使用的,那我们来看一下解析过程和数据是怎样对应起来的大家来看这个示意图

在我们parse 过程中我们主要使用四个函数,第一个是 parse_action ,它主要是把我们的 action 添加到 action_list 中,我们可以以 init.rc 来作为列子看一下,首先比如说我们遇到了一个 on early-init ,我们会认为他是一个新的 session ,然后我们就会将他添加到 action_list 中,在 on early-init 下也会有很多操作,比如 write setcon 等,我们都会认为他们是 action 下面的节点操作,也就是调用我们的 parse_line_action ,来把后边的这些操作添加到 action1 下面(一个 session 下面可以执行多个操作)这就是 parse_action parse_line_action 所做的事情。如果说我们后面遇到了第二个 session ,这时候我们就会添加一个新的节点,也就是 action2 ,相应的在节点下面的操作也会添加到 action2 下面。
然后再来看一下 parse_service ,主要是把 service 添加到我们的 service_list 列表中,如果说我们遇到了一个函数是 service 的话,他会把我们的 service 函数制成我们的 parse_line_service ,然后他就会解析 service 后面所有的参数,比如他的 flag user 等全部添加到 service1 的节点中,在 service 后面呢会跟一些参数。她的下面会加一些 class 属性,我们都会把他们解析出来,然后添加到 service 节点中,这就是 service on 事件的一个解析过程,当然他还有一个 parse_line_service ,也就是我们的一个导入的启动脚本,他也会有相关的操作,下面我们来看一下 parse_new_section 是如何来实现的

如果说我们的kw 返回的类型是 K_service ,那么我们就会认为他是一个 service session ,那么就会调用 parse_service ,我们来看一下 parse_service 的实现
我们首先看一下这个服务参数是否正常,有没有重定义的,如果这些都正常,他就会创建一个SVC结构,把这个结构添加到我们的service_list

这就是我们parse_service 所做的事情,当我们创建完这个 session 之后,我们会把我们的 parse_line 设置成 parse_line_service ,他所做的事情就是来解析我们后边的一些属相,并且把这些属相添加到我们的节点中。如果说我们碰到的是一个 on 打头的脚本,那么他就会认为是 parse_action ,并且把 parse_line 也定义为 parse_line_action parse_action 所做的事情就是申请一个节点,并且把这个节点添加到我们的 action_list 中, parse_line_action 的过程就是拿到了一个新的操作结构体,并且看一下结构的具体类型,然后把它添加到 act commands
这就是我们的 parse_line_action parse_action 所做的事情
最后呢我们看一下我们的 K_import

12.JPG (135.34 KB, 下载次数: 0)

下载附件  保存到相册

2015-9-25 16:21 上传

他的操作就是把我们的启动脚本加到我么的imoprt_list 中,当我们解析完一个脚本之后,他就会去解析其他的启动脚本
到这里我们的启动脚本的过程就算讲完了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值