微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 安卓底层开发学习经验第十二期

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

时间:10-02 整理:3721RD 点击:

下面呢,我们接着上一期的内容来讲解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



他的操作就是把我们的启动脚本加到我么的imoprt_list中,当我们解析完一个脚本之后,他就会去解析其他的启动脚本

到这里我们的启动脚本的过程就算讲完了


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top