qcril:第2章 运行状态中的ril_event事件处理机制

第2章 运行状态中的ril_event事件处理机制

 

1.1 认识ril_event结构体

    ril_event结构体定义在hardware/ril/ril_event.h头文件中。

struct ril_event {

    struct ril_event *next; //下一个ril_event;

    struct ril_event *prev; //上一个ril_event;

    int fd; //文件描述符;

    int index; //当前ril事件的索引;

    bool persist; //保留当前ril事件标志;

    struct timeval timeout; //ril事件超时设置;

    ril_event_cb func; //ril事件回调函数的指针。

void *param;}

通过上面的结构体定义,ril_event结构体支持双向链表,每一个节点都有向上一节点和下一节点的指针,并且在此头文件中,定义了针对ril_event双向链表操作的6个函数,分别为:

Ril_event_init:ril_event双向链表初始化操作;

Ril_event_set:设置新创建的ril_event事件参数;

Ril_event_add:增加ril_event事件;

Ril_timer_add:增加ril_event计时器事件;

Ril_event_del:删除ril_event事件;

Ril_event_loop:循环处理ril_event事件。

上面ril_event双向链表的6个函数,处理逻辑都在ril_event.cpp文件中实现。

Ril_event.cpp中实现了ril_event.h头文件中定义的ril_event时间的多个处理函数,其作用是配合ril.cpp完成ril事件的封装和处理。

1.2 RIL事件生命周期控制的处理函数

Ril事件的处理中最重要的就是ril_event_init、ril_event_set、ril_event_add、ril_event_del,这四个函数包括了对ril事件的生命周期的控制。

1.2.1 ril_event_init

    在启动LibRIL运行环境的时候,调用eventLoop函数时首先会

<think>我们正在分析一个Android RIL(无线接口层)相关的日志条目:`D RmcAtciRequestHandler onHandleEvent message 18520 RFX_MSG_EVENT_RAW_URC` ### 日志分解与含义 1. **日志级别与标签** - `D`: 表示 **DEBUG** 级别日志(开发调试用) - `RmcAtciRequestHandler`: 日志来源的Java类名,属于RIL模块中处理 **AT命令接口(ATCI)** 的组件 2. **关键事件描述** - `onHandleEvent`: 表明当前正在处理一个 **事件(Event)** - `message 18520`: 系统分配的 **消息ID**(用于跟踪消息流) - `RFX_MSG_EVENT_RAW_URC`: 事件类型,表示 **未经加工的URC(Unsolicited Result Code)** 3. **URC 核心概念** - **URC** 是调制解调器(Modem)主动上报给处理器的消息,无需先收到请求(例如:来电通知、短信到达、网络状态变化) - `RAW_URC` 表示原始URC数据尚未被解析,通常形如: ``` +CRING: VOICE +CMT: ,159 ``` --- ### 事件处理流程分析 当 `RmcAtciRequestHandler` 收到 `RFX_MSG_EVENT_RAW_URC` 事件时,会执行以下操作: ```mermaid sequenceDiagram Modem->>RILJ(RIL Java层): 主动上报原始URC数据 (e.g., "+CIEV: 1") RILJ->>RmcAtciRequestHandler: 封装为RFX_MSG_EVENT_RAW_URC事件 RmcAtciRequestHandler->>AtciService: 调用processUnsolicited() AtciService->>ATParser: 解析原始URC("+CIEV: 1") ATParser->>RIL: 转换RIL_UNSOL_XXX常量 RIL->>Phone进程: 广播Intent(如: TelephonyIntents.ACTION_UNSOLICITED_URC) ``` ### 典型场景与调试方法 #### 场景1:ATCI调试模式捕获URC 启用ATCI日志过滤: ```bash adb logcat -s RmcAtciRequestHandler adb logcat -b radio | grep URC ``` 观察输出: ``` D RmcAtciRequestHandler: onHandleEvent: RFX_MSG_EVENT_RAW_URC, data=+CIEV: 1 ``` #### 场景2:自定义URC处理 在 `RmcAtciRequestHandler.java` 中添加自定义解析逻辑: ```java // frameworks/opt/telephony/src/java/com/android/internal/telephony/RmcAtciRequestHandler.java @Override protected void onHandleEvent(Message msg) { switch (msg.what) { case RFX_MSG_EVENT_RAW_URC: String rawUrc = (String) ((AsyncResult) msg.obj).result; if (rawUrc.startsWith("+CIEV")) { handleCievUrc(rawUrc); // 自定义处理函数 } break; } } private void handleCievUrc(String urc) { // 示例:解析"+CIEV: <index>,<value>" String[] tokens = urc.split("[:,]"); int index = Integer.parseInt(tokens[1]); int value = Integer.parseInt(tokens[2]); broadcastUrcIntent("CUSTOM_URC_CIEV", index, value); } ``` #### 场景3:URC丢失问题排查 若未收到预期URC,检查: 1. **Modem配置**:确认AT通道已开启URC上报(AT+CIURC=1) 2. **RIL层过滤**:在 `RilMessageDecoder.java` 中检查是否被误过滤: ```java boolean shouldFilterUrc(String urc) { // 常见过滤条件:电池状态等非关键URC return urc.contains("+CBC") || urc.contains("+CSQ"); } ``` --- ### 技术原理深入 #### URC传递路径 1. **物理层**:Modem通过串口/USB发送二进制数据 2. **协议层**:`rild`守护进程解析为字符串(参考引用[1]的Socket传输逻辑) 3. **Java框架层**:`RILReceiver线程` 将字符串送入消息队列,最终由 `RmcAtciRequestHandler` 分发 #### 消息ID (18520) 的意义 - 由 `Message.obtain()` 动态生成,用于异步消息跟踪 - 可通过 `adb shell dumpsys activity broadcasts` 查找关联的PendingIntent --- ### 相关问题 1. Android RIL 中如何区分请求(Request)和URC? 2. `RmcAtciRequestHandler` 和 `RILJ` 的关系是什么? 3. 如何通过ADB命令模拟URC上报? 4. 哪些常见的系统事件是通过URC触发的? 5. 如何在AOSP中增加自定义URC的处理逻辑? [^1]: AOSP源码 RmcAtciRequestHandler.java [^2]: 3GPP TS 27.007 (AT命令集规范) [^3]: Android Telephony内部广播机制</think>### `D RmcAtciRequestHandler onHandleEvent message 18520 RFX_MSG_EVENT_RAW_URC` 日志分析 #### 日志分解与含义 1. **日志级别与组件** - `D`:DEBUG级别日志(开发/调试用) - `RmcAtciRequestHandler`:Android RIL(无线接口层)中处理 **AT命令接口(ATCI)** 的组件,负责调制解调器(Modem)与系统的AT指令交互[^1] 2. **关键事件描述** - `onHandleEvent`:表示正在处理一个 **异步事件** - `message 18520`:系统分配的 **消息ID**(用于跟踪消息生命周期) - `RFX_MSG_EVENT_RAW_URC`:事件类型,表示 **未经解析的URC(Unsolicited Result Code)** 3. **核心概念解释** - **URC (Unsolicited Result Code)**: 调制解调器主动上报的事件通知(无需先收到请求),例如: - 来电通知 (`RING`) - 短信到达 (`+CMTI`) - 网络状态变化 (`+CREG`) - **RAW_URC**:原始未处理的URC数据,通常形如: ```plaintext +CIEV: 1,1 // 示例:事件索引=1, 值=1 ``` --- ### 事件处理流程 当`RmcAtciRequestHandler`收到`RFX_MSG_EVENT_RAW_URC`时,会执行以下操作: ```mermaid sequenceDiagram Modem->>RIL: 主动上报原始URC数据 (e.g., "+CIEV: 1,1") RIL层->>RmcAtciRequestHandler: 封装为RFX_MSG_EVENT_RAW_URC事件 RmcAtciRequestHandler->>ATCI服务: 调用processUnsolicited() ATCI服务->>AT解析器: 解析URC格式 AT解析器->>Android框架: 转换为RIL_UNSOL_XXX常量 Android框架->>应用层: 广播Intent(如TelephonyIntents.ACTION_UNSOLICITED_URC) ``` --- ### 典型场景与调试方法 #### 场景1:捕获特定URC内容 1. **启用URC日志过滤** ```bash adb logcat -s RmcAtciRequestHandler | grep "RAW_URC" ``` 输出示例: ``` D RmcAtciRequestHandler: RAW_URC = +CIEV: 1,1 ``` 2. **解析URC含义** - `+CIEV: <index>,<value>`:表示**自定义事件值变化** - 索引`1`可能对应信号强度(需查Modem文档) - 值`1`表示事件触发 #### 场景2:自定义URC处理 在`RmcAtciRequestHandler.java`添加处理逻辑: ```java // frameworks/opt/telephony/src/java/com/android/internal/telephony/RmcAtciRequestHandler.java protected void processUnsolicited(String urc) { if (urc.startsWith("+CIEV")) { String[] tokens = urc.split("[:,]"); int index = Integer.parseInt(tokens[1]); int value = Integer.parseInt(tokens[2]); // 自定义处理逻辑 broadcastEvent("CUSTOM_URC", index, value); } } ``` #### 场景3:URC丢失问题排查 若未收到预期URC: 1. 检查Modem配置: ```bash adb shell atcmd +CIURC? # 预期响应:+CIURC: 1 # 1表示URC上报已开启 ``` 2. 验证RIL层过滤规则: ```java // 在RilMessageDecoder.java中检查 boolean isUrcFiltered(String urc) { return urc.contains("+CSCA"); // 示例:过滤短信中心URC } ``` --- ### 技术原理深入 1. **URC传输机制** - 物理层:通过`/dev/ttyACM0`等串口设备传输 - 协议层:`rild`守护进程用**长度前缀协议**接收数据(参考您提供的代码[^1]): ```cpp // 先接收4字节长度头 recv(fd, header, 4, 0); int length = (header[2] << 8) | header[3]; // 再接收length字节的URC数据 recv(fd, buffer, length, 0); ``` 2. **消息ID (18520) 作用** - 由`Message.obtain()`生成,用于异步消息跟踪 - 可通过`adb shell dumpsys activity broadcasts`查询关联的PendingIntent --- ### 相关问题 1. Android RIL 中如何区分请求(Request)和URC? 2. `RmcAtciRequestHandler` 和 `RilJ` 的关系是什么? 3. 如何通过ADB命令模拟URC上报? 4. 哪些常见的系统事件是通过URC触发的? 5. 如何在AOSP中增加自定义URC的处理逻辑? [^1]: AOSP源码 RmcAtciRequestHandler.java [^2]: 3GPP TS 27.007 (AT命令集规范) [^3]: Android Telephony内部广播机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值