RILD - 第二章 - EventLoop机制的建立

本文详细介绍了Android RIL中的EventLoop机制,包括EventLoop的相关预备知识,如Event结构和处理函数。接着阐述了EventLoop的执行流程,创建线程、开启EventLoop以及Event响应的过程。重点讨论了watch_table、timer_list和pending_list三张链表的作用。此外,还介绍了select函数和struct timeval结构在EventLoop中的应用。通过对这些概念的理解,可以更好地掌握RIL如何处理来自RILJ的事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、EventLoop机制

LibRIL负责接收来自RILJ的数据,并传递给ReferenceRIL。实现这一功能的主要机制就是EventLoop机制。
分析LibRIL主要就是分析EventLoop。

2.1 EventLoop相关预备知识

2.1.1 EventLoop中的Event

在ril_event.h头文件中可以看到ril_event的结构体定义

//定义Event回调函数指针
typedef void (*ril_event_cb)(int fd, short events, void *userdata);

struct ril_event {
    struct ril_event *next;//Event为链式结构
    struct ril_event *prev;
    int fd;//文件句柄,一个重要的句柄是RILD与RILC的Socket句柄
    int index;//Event在对应watch_table中的序列号
    bool persist;//是否在watch_table中持久化
    struct timeval timeout;
    ril_event_cb func;//event触发的回调函数
    void *param;//对应event回调函数的参数
};
2.1.2 EventLoop中对Event的处理函数

在ril_event.h头文件中定义了一些关键方法

//@ril_event.h
// Initialize internal data structs
//初始化EventLoop数据结构
void ril_event_init();

// Initialize an event
//初始化一个Event
void ril_event_set(struct ril_event * ev, int fd, bool persist, ril_event_cb func, void * param);

// Add event to watch list
//添加一个Event到watch_table
void ril_event_add(struct ril_event * ev);

// Add timer event
//添加一个event到timer表,注意这里会将ev放到一个time_list中时间大与ev的节点前面,这样可以维护time_list链表节点的timeval属性是递增的
void ril_timer_add(struct ril_event * ev, struct timeval * tv);

// Remove event from watch list
//移除一个Event
void ril_event_del(struct ril_event * ev);

// Event loop
//开启EventLoop机制
void ril_event_loop();
void traverse_timer_list();

还有一些函数定义在ril_event.cpp中,并声明为static,只供文件内部调用:

//Event的初始化,其实就是对3个主要链表的初始化  
static void init_list(struct ril_event * list)  
//添加Event到参数所指定的list
static void addToList(struct ril_event * ev, struct ril_event * list)  
//从链表删除Event,直接在其上下链节点中断开,无
参考资源链接:[Android RIL通信机制及短信电话实现学习文档](https://wenku.youkuaiyun.com/doc/47rsyfva8e?utm_source=wenku_answer2doc_content) 在Android系统中,RIL层是连接应用层和硬件通信模块的关键桥梁,它负责管理短信的发送和接收。要实现发送短信的基本流程,开发者首先需要理解RIL层的工作原理,特别是rild-daemon服务进程如何处理短信发送请求。 当应用层需要发送短信时,会调用Android提供的API,如SmsManager类,将短信内容和目的地地址发送给系统。这个请求随后被传递给RIL层,由rild-daemon进程接收。rild-daemon负责将应用层的请求转换为AT命令格式,这些AT命令是与移动网络模块通信的标准语言。 具体到AT命令的使用,rild-daemon会发送类似'AT+CMGS'这样的命令来启动短信发送流程,这个命令后跟手机号码、短信内容等参数。基带处理器接收到这些命令后,会执行相应的操作,将短信发送到目的地。一旦短信发送完毕,基带处理器会返回一个确认信号,例如通过'OK'或者'ERROR'等响应,告知rild-daemon操作结果。 rild-daemon接收到这些响应后,会将结果转换为Android系统可以理解的格式,并通过Binder通信机制通知给原始发起请求的应用程序。这样,应用程序就可以了解短信是否成功发送,并根据需要进行后续操作。 了解这一流程对于开发者来说至关重要,特别是当需要在定制ROM中修改RIL层的行为以支持特定的硬件时。在《Android RIL通信机制及短信电话实现学习文档》中,你可以找到更多关于RIL层架构、AT命令格式、以及如何使用rild-daemon交互的具体细节,帮助你更深入地理解并开发Android系统的通信功能。 参考资源链接:[Android RIL通信机制及短信电话实现学习文档](https://wenku.youkuaiyun.com/doc/47rsyfva8e?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值