当前位置: 首页 > news >正文

android CALL 之 RIL、TELEDCOM、PHONE

系统架构

InCallUI Telecom Phone RIL Modem placeCall(号码) createConnection() RIL_REQUEST_DIAL ATD<号码> OK/CONNECT 更新Call状态 onStateChanged(CONNECTING) 刷新界面(“拨号中”) InCallUI Telecom Phone RIL Modem

分层架构

层级功能关键组件
应用层用户交互界面(如 Dialer.apkInCallService 实现
策略控制层Telecom 服务:管理通话状态、音频路由、权限CallsManager, CallAudioManager
网络交互层Phone 进程(com.android.phone):协议转换、状态管理TelephonyConnectionService
硬件抽象层RIL(Radio Interface Layer):与 Modem 通信RILD(守护进程), Vendor RIL

RIL

RIL(Radio Interface Layer,无线接口层)是 Android 系统中连接上层电话服务框架(如 TelecomPhone)与底层 Modem(基带处理器)的核心中间层。其作用类似于“翻译官”和“调度中心”,负责将应用层的电话操作(如拨号、接听)转换为 Modem 能理解的指令(如 AT 命令),并将 Modem 的硬件事件(如来电、短信)上报给上层系统。

一、RIL 的定位与作用

  1. 核心职责
    • 协议转换:将 Java 层的电话请求(如 RIL_REQUEST_DIAL)转换为 Modem 可执行的 AT 命令(如 ATD<号码>)。
    • 事件上报:监听 Modem 的主动事件(如来电 RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED),并通知上层服务(如 Telecom)。
    • 抽象硬件差异:通过标准接口屏蔽不同 Modem 的硬件差异,使 Android 能适配多种基带芯片(如高通、联发科)。

二、RIL 的分层架构

RIL 分为 Java 层(RILJ)Native 层(RILD),通过 Socket 通信:

1. RIL-Java (RILJ)
  • 位置frameworks/opt/telephony/java/com/android/internal/telephony/RIL.java
  • 功能
    • 接收 Telecom/Phone 的请求(如拨号、挂断),封装为 RILRequest 对象。
    • 通过 Socket 将请求发送给 Native 层的 rild 守护进程。
    • 解析 rild 返回的响应,通过 Handler 机制回调上层。
2. RILD (RIL Daemon)
  • 守护进程:由 init.rc 启动,驻留后台。
  • 组成
    • libril.so:核心框架,处理 Socket 通信、事件循环(ril_event_loop)。
    • Vendor RIL (.so):厂商实现的库,通过 AT 命令 或专有协议与 Modem 交互。
  • 工作流程
    RILJ RILD Vendor RIL Modem 发送 RIL_REQUEST_DIAL (Socket) 调用 onRequest() 发送 ATD<号码> 返回 OK 回调 onRequestComplete() 返回响应 (Socket) RILJ RILD Vendor RIL Modem

三、关键通信机制

1. 与 Modem 的交互方式
  • AT 命令:文本指令(如 ATD 拨号、AT+CMGS 发短信),通过串口/USB 发送。
  • 专有协议:部分厂商使用二进制协议(如高通 QMI)提升效率。
2. 事件处理模型
  • Solicited Response:对主动请求的响应(如拨号结果),需匹配请求序列号(mSerial)。
  • Unsolicited Response (URC):Modem 主动上报的事件(如来电),直接触发回调 onUnsolicitedResponse()
3. 线程模型
  • RILSender 线程:专用于发送请求,避免阻塞。
  • RILReceiver 线程:监听 Socket,解析响应(区分 URC 和主动响应)。

四、支持的典型功能

功能类型请求/事件示例应用场景
通话控制RIL_REQUEST_DIALRIL_REQUEST_ANSWER拨号、接听
短信收发RIL_REQUEST_SEND_SMS发送短信
网络状态管理RIL_REQUEST_DATA_REGISTRATION_STATE查询数据网络状态
SIM 卡操作RIL_REQUEST_GET_SIM_STATUS检测 SIM 卡是否在位
信号强度监测RIL_UNSOL_SIGNAL_STRENGTH实时更新信号强度图标

五、开发与调试要点

  1. 厂商适配

    • 实现 Vendor RIL 库(如 libril-samsung.so),重写 onRequest() 处理厂商特定的 AT 命令。
    • 需适配不同网络制式(GSM/CDMA/LTE)的指令差异。
  2. 调试工具

    • logcat:查看 RILJ/RILD 日志(adb logcat -b radio)。
    • AT 指令模拟器:如 atinout 测试 Modem 响应。
    • QXDM/QCAT:高通平台抓取 Modem 原始数据。
  3. 常见问题

    • 命令超时:需在 Vendor RIL 中设置合理的响应超时机制。
    • 事件丢失:确保 URC 被正确注册和解析。

六、总结

RIL 是 Android 电话系统的核心通信枢纽,其核心价值在于:

  1. 解耦硬件与软件:通过标准化接口支持多厂商 Modem。
  2. 高效协议转换:将 Java 请求翻译为 AT 命令,保障实时性。
  3. 事件驱动架构:双向处理主动请求与 Modem 事件,支撑通话/短信等基础功能。

Telecom

Android Telecom 框架是系统中管理通话功能的核心服务,负责协调通话生命周期、音频路由、跨进程通信等关键功能。以下从架构设计、核心模块、交互机制及开发应用四个维度进行详细解析:

一、Telecom 的定位与架构

1. 系统级服务
  • 进程归属:运行于 system 进程(com.android.server.telecom.TelecomService)。
  • 核心角色:作为 通话控制中枢,桥接上层应用(如拨号器)与底层实现(SIM 卡、VoIP、蓝牙等)。

二、核心功能模块

1. 通话生命周期管理
  • 控制流
    拨号请求
    TelecomManager#placeCall
    CallsManager
    创建Call对象
    通知Phone进程执行RIL请求
  • 状态机:由 CallsManager 维护通话状态(拨号中、接通、挂断),并通过 ParcelableCall 对象跨进程同步。
2. 音频路由控制
  • 决策机制
    • CallAudioRouteStateMachine:根据场景切换设备(听筒/扬声器/蓝牙)。
    • 车机场景优先:蓝牙连接时强制路由至车载扬声器,并通过 HFP 协议建立 SCO 音频通道。
  • 冲突处理:音频焦点竞争(如音乐播放)时,压制非通话音频。
3. 多方通话管理

支持三方通话合并(Conference Call):

// Telecom 合并两路通话
CallsManager#conference(Call call1, Call call2)
  • 实现逻辑
    1. 蓝牙协议发送合并命令(如 AT+CHLD=3)。
    2. 创建 ConferenceCall 对象替代独立通话。

三、跨进程交互机制

1. Telecom ↔ Phone 进程
  • 通信接口

    AIDL 接口方向功能
    IConnectionService.aidlTelecom → Phone下发通话操作(拨号/接听)
    IConnectionServiceAdapter.aidlPhone → Telecom上报通话状态变更(如来电、挂断)
  • 数据封装

    • ConnectionRequest:传递拨号请求参数(号码、视频标识)。
    • PhoneAccountHandle:标识通话来源(SIM 卡1/SIM 卡2/VoIP)。
2. Telecom ↔ InCallUI(拨号器)
  • 双向绑定
    • IInCallService:Telecom 控制界面刷新(如来电显示)。
    • IInCallAdapter:界面操作(如挂断)回调至 Telecom。

四、开发集成与扩展

1. 自定义通话应用
  • 替代系统拨号器
    实现 InCallService API,需处理所有通话类型(SIM/VoIP)且不假设来源。
  • 独立通话解决方案
    使用 自管理 ConnectionService
    class MyConnectionService : ConnectionService() {override fun onCreateOutgoingConnection(...): Connection {// 自定义 VoIP 拨号逻辑}
    }
    

五、 总结

Android Telecom 的核心价值在于:

  1. 统一管控:抽象 SIM/VoIP/蓝牙等通话来源,简化应用开发。
  2. 策略分离:Telecom 专注状态调度,Phone 进程处理协议转换,Modem 执行硬件操作。
  3. 扩展灵活:通过 ConnectionService 支持 VoIP 集成,适应 5G/WiFi Calling 等新场景。

关键点

  • 定制音频路由 → 修改 CallAudioRouteStateMachine 策略。
  • 调试通话链路 → 使用 adb logcat -b telecom 追踪跨进程交互。

Phone

一、Phone 模块的定位与作用

Phone 模块(位于 com.android.phone 进程)是 Android 电话系统的核心中介层,负责桥接上层策略(Telecom)与底层硬件(Modem/RIL),主要作用包括:

  1. 协议转换:将 Telecom 的抽象请求(如拨号、接听)转换为 Modem 可理解的指令(如 AT 命令、QMI 消息)。
  2. 状态管理:维护通话状态机(拨号中/接通/挂断),处理 Modem 上报的事件(如来电、信号变化)。
  3. 多制式支持:封装 GSM/CDMA/5G 等网络差异,为上层提供统一接口。
  4. 多 SIM 卡管理:在双卡设备中,为每张 SIM 卡创建独立的 Phone 实例(如 GsmPhone),通过 PhoneAccountHandle 路由操作。

二、核心组件与类结构

1. 关键类继承关系
«interface»
Phone
+dial()
+acceptCall()
+rejectCall()
PhoneProxy
-mActivePhone: PhoneBase
+handleMessage()
PhoneBase
+mCi: CommandsInterface
+mCT: CallTracker
+mSST: ServiceStateTracker
GsmPhone
+handleMessage()
  • Phone 接口:定义通话基础操作(拨号、挂断等)。
  • PhoneProxy:作为 Phone 接口的动态代理,根据网络类型(如 GSM)切换实际实现类(如 GsmPhone)。
  • GsmPhone:实现 GSM 网络协议逻辑,关联关键功能模块:
    • CallTracker:跟踪通话状态,发送 AT 指令(如 ATD 拨号)。
    • ServiceStateTracker:监控网络注册状态(如 4G→5G 切换)。
2. 支撑服务
  • PhoneInterfaceManager:实现 ITelephony.aidl,为第三方应用提供电话 API(如获取信号强度)。
  • TelephonyRegistry:系统级服务,广播 Modem 事件(信号变化、来电)到注册组件(如状态栏)。

三、交互流程示例

1. 拨号请求传递链
InCallUI Telecom Phone RIL Modem placeCall(号码) createConnection() RIL_REQUEST_DIAL ATD<号码> OK/CONNECT 更新Call状态 onStateChanged(CONNECTING) 刷新界面(“拨号中”) InCallUI Telecom Phone RIL Modem
  • 关键点
    • Phone 将拨号请求转换为 RIL 指令(如 RIL_REQUEST_DIAL),由 RIL 层转发给 Modem。
    • 状态回调通过 IConnectionServiceAdapter 通知 Telecom。
2. 来电事件处理
  1. Modem 通过 RILD 上报 RIL_UNSOL_RING 事件。
  2. RILJGsmPhoneCallNotifier 创建 Connection 对象。
  3. TeleServiceTelecomInCallUI 触发来电界面。

四、定制与扩展

1. 新增网络制式
  • 实现 Phone 子类(如 NRPhone 对应 5G NR),重写 dial() 方法生成专属信令。
  • RILJ 中扩展新制式的 AT 命令解析逻辑。
2. 调试技巧
  • 日志追踪
    adb logcat -b radio    # 查看 RIL-Phone 交互
    adb logcat -s GsmPhone # 过滤 GSM 协议日志
    
  • 关键线程
    • RILReceiver:监听 Modem 上报事件。
    • AsyncChannel:处理跨进程异步消息。

五、 总结:Phone 模块的核心价值

功能实现机制
硬件抽象通过 RILJCommandsInterface 屏蔽 Modem 差异(高通 QMI/MTK AT)
状态机管理CallTracker 隔离 Modem 事件抖动,保证状态稳定
多卡支持PhoneFactory 为每张 SIM 卡创建独立实例
异常隔离Modem 无响应时,本地重试或回滚状态,避免 Telecom 崩溃

六、 注意点

定制通话功能(如 VoNR)时,优先扩展 Phone 子类而非修改 Telecom,以保持架构稳定性。

相关文章:

  • SpringCloud Alibaba场景实践(Nacos篇)
  • c++ algorithm常用算法汇总
  • 13分钟讲解主流Linux发行版
  • 数据库优化实战分享
  • 设备健康管理系统搭建全技术解析:从架构设计到智能运维实践
  • Flink CDC MySQL 时区相差 8 小时问题优雅解决方式
  • 华为OD机试-考勤信息-双指针(JAVA 2025B卷)
  • 第五章:执行计划分析 - 读懂MySQL的执行策略
  • Nginx 配置中·IP地址变量
  • leetcode148-排序链表
  • SimpleQtLogger 使用总结
  • Nginx全面深入学习目录
  • 我的JavaWeb软件开发作品学生信息管理系统项目/JavaWeb软件开发 课程考察标准
  • OmniMeetProTrack 全维会议链智能追录系统——山东大学软件学院创新实训项目博客(六)
  • 零基础学前端-传统前端开发(第四期-JS基础-语法,语句)
  • 【SQLAlchemy系列】 SQLAlchemy 中的多条件查询:or*与 in*操作符
  • 【Docker基础】Docker核心概念:命名空间(Namespace)之PID详解
  • java+vue+SpringBoo旅游网(程序+数据库+报告+部署教程+答辩指导)
  • Spring-ai 1.0.0 学习(二)——最小化样例
  • 网络安全相关概念与技术详解
  • 现在允许做网站吗/有产品怎么找销售渠道
  • 汕头手机模板建站/semseo
  • 玉溪网站建设/网络推广工作室
  • 专业做私募网站/站长工具无忧
  • 个人网站主页设计/全国疫情最新情报
  • 动态网站 教程/重庆高端品牌网站建设