android CALL 之 RIL、TELEDCOM、PHONE
系统架构
分层架构
层级 | 功能 | 关键组件 |
---|---|---|
应用层 | 用户交互界面(如 Dialer.apk ) | InCallService 实现 |
策略控制层 | Telecom 服务:管理通话状态、音频路由、权限 | CallsManager , CallAudioManager |
网络交互层 | Phone 进程(com.android.phone ):协议转换、状态管理 | TelephonyConnectionService |
硬件抽象层 | RIL(Radio Interface Layer):与 Modem 通信 | RILD (守护进程), Vendor RIL |
RIL
RIL(Radio Interface Layer,无线接口层)是 Android 系统中连接上层电话服务框架(如 Telecom
、Phone
)与底层 Modem(基带处理器)的核心中间层。其作用类似于“翻译官”和“调度中心”,负责将应用层的电话操作(如拨号、接听)转换为 Modem 能理解的指令(如 AT 命令),并将 Modem 的硬件事件(如来电、短信)上报给上层系统。
一、RIL 的定位与作用
- 核心职责
- 协议转换:将 Java 层的电话请求(如
RIL_REQUEST_DIAL
)转换为 Modem 可执行的 AT 命令(如ATD<号码>
)。 - 事件上报:监听 Modem 的主动事件(如来电
RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
),并通知上层服务(如Telecom
)。 - 抽象硬件差异:通过标准接口屏蔽不同 Modem 的硬件差异,使 Android 能适配多种基带芯片(如高通、联发科)。
- 协议转换:将 Java 层的电话请求(如
二、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 交互。
- libril.so:核心框架,处理 Socket 通信、事件循环(
- 工作流程:
三、关键通信机制
1. 与 Modem 的交互方式
- AT 命令:文本指令(如
ATD
拨号、AT+CMGS
发短信),通过串口/USB 发送。 - 专有协议:部分厂商使用二进制协议(如高通 QMI)提升效率。
2. 事件处理模型
- Solicited Response:对主动请求的响应(如拨号结果),需匹配请求序列号(
mSerial
)。 - Unsolicited Response (URC):Modem 主动上报的事件(如来电),直接触发回调
onUnsolicitedResponse()
。
3. 线程模型
- RILSender 线程:专用于发送请求,避免阻塞。
- RILReceiver 线程:监听 Socket,解析响应(区分 URC 和主动响应)。
四、支持的典型功能
功能类型 | 请求/事件示例 | 应用场景 |
---|---|---|
通话控制 | RIL_REQUEST_DIAL 、RIL_REQUEST_ANSWER | 拨号、接听 |
短信收发 | RIL_REQUEST_SEND_SMS | 发送短信 |
网络状态管理 | RIL_REQUEST_DATA_REGISTRATION_STATE | 查询数据网络状态 |
SIM 卡操作 | RIL_REQUEST_GET_SIM_STATUS | 检测 SIM 卡是否在位 |
信号强度监测 | RIL_UNSOL_SIGNAL_STRENGTH | 实时更新信号强度图标 |
五、开发与调试要点
-
厂商适配
- 实现
Vendor RIL
库(如libril-samsung.so
),重写onRequest()
处理厂商特定的 AT 命令。 - 需适配不同网络制式(GSM/CDMA/LTE)的指令差异。
- 实现
-
调试工具
- logcat:查看
RILJ
/RILD
日志(adb logcat -b radio
)。 - AT 指令模拟器:如
atinout
测试 Modem 响应。 - QXDM/QCAT:高通平台抓取 Modem 原始数据。
- logcat:查看
-
常见问题
- 命令超时:需在
Vendor RIL
中设置合理的响应超时机制。 - 事件丢失:确保
URC
被正确注册和解析。
- 命令超时:需在
六、总结
RIL 是 Android 电话系统的核心通信枢纽,其核心价值在于:
- 解耦硬件与软件:通过标准化接口支持多厂商 Modem。
- 高效协议转换:将 Java 请求翻译为 AT 命令,保障实时性。
- 事件驱动架构:双向处理主动请求与 Modem 事件,支撑通话/短信等基础功能。
Telecom
Android Telecom 框架是系统中管理通话功能的核心服务,负责协调通话生命周期、音频路由、跨进程通信等关键功能。以下从架构设计、核心模块、交互机制及开发应用四个维度进行详细解析:
一、Telecom 的定位与架构
1. 系统级服务
- 进程归属:运行于
system
进程(com.android.server.telecom.TelecomService
)。 - 核心角色:作为 通话控制中枢,桥接上层应用(如拨号器)与底层实现(SIM 卡、VoIP、蓝牙等)。
二、核心功能模块
1. 通话生命周期管理
- 控制流:
- 状态机:由
CallsManager
维护通话状态(拨号中、接通、挂断),并通过ParcelableCall
对象跨进程同步。
2. 音频路由控制
- 决策机制:
CallAudioRouteStateMachine
:根据场景切换设备(听筒/扬声器/蓝牙)。- 车机场景优先:蓝牙连接时强制路由至车载扬声器,并通过 HFP 协议建立 SCO 音频通道。
- 冲突处理:音频焦点竞争(如音乐播放)时,压制非通话音频。
3. 多方通话管理
支持三方通话合并(Conference Call):
// Telecom 合并两路通话
CallsManager#conference(Call call1, Call call2)
- 实现逻辑:
- 蓝牙协议发送合并命令(如 AT+CHLD=3)。
- 创建
ConferenceCall
对象替代独立通话。
三、跨进程交互机制
1. Telecom ↔ Phone 进程
-
通信接口:
AIDL 接口 方向 功能 IConnectionService.aidl
Telecom → Phone 下发通话操作(拨号/接听) IConnectionServiceAdapter.aidl
Phone → 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 的核心价值在于:
- 统一管控:抽象 SIM/VoIP/蓝牙等通话来源,简化应用开发。
- 策略分离:Telecom 专注状态调度,Phone 进程处理协议转换,Modem 执行硬件操作。
- 扩展灵活:通过
ConnectionService
支持 VoIP 集成,适应 5G/WiFi Calling 等新场景。
关键点:
- 定制音频路由 → 修改
CallAudioRouteStateMachine
策略。- 调试通话链路 → 使用
adb logcat -b telecom
追踪跨进程交互。
Phone
一、Phone 模块的定位与作用
Phone 模块(位于 com.android.phone
进程)是 Android 电话系统的核心中介层,负责桥接上层策略(Telecom)与底层硬件(Modem/RIL),主要作用包括:
- 协议转换:将 Telecom 的抽象请求(如拨号、接听)转换为 Modem 可理解的指令(如 AT 命令、QMI 消息)。
- 状态管理:维护通话状态机(拨号中/接通/挂断),处理 Modem 上报的事件(如来电、信号变化)。
- 多制式支持:封装 GSM/CDMA/5G 等网络差异,为上层提供统一接口。
- 多 SIM 卡管理:在双卡设备中,为每张 SIM 卡创建独立的
Phone
实例(如GsmPhone
),通过PhoneAccountHandle
路由操作。
二、核心组件与类结构
1. 关键类继承关系
Phone
接口:定义通话基础操作(拨号、挂断等)。PhoneProxy
:作为Phone
接口的动态代理,根据网络类型(如 GSM)切换实际实现类(如GsmPhone
)。GsmPhone
:实现 GSM 网络协议逻辑,关联关键功能模块:CallTracker
:跟踪通话状态,发送 AT 指令(如ATD
拨号)。ServiceStateTracker
:监控网络注册状态(如 4G→5G 切换)。
2. 支撑服务
PhoneInterfaceManager
:实现ITelephony.aidl
,为第三方应用提供电话 API(如获取信号强度)。TelephonyRegistry
:系统级服务,广播 Modem 事件(信号变化、来电)到注册组件(如状态栏)。
三、交互流程示例
1. 拨号请求传递链
- 关键点:
- Phone 将拨号请求转换为 RIL 指令(如
RIL_REQUEST_DIAL
),由 RIL 层转发给 Modem。 - 状态回调通过
IConnectionServiceAdapter
通知 Telecom。
- Phone 将拨号请求转换为 RIL 指令(如
2. 来电事件处理
- Modem 通过 RILD 上报
RIL_UNSOL_RING
事件。 RILJ
→GsmPhone
→CallNotifier
创建Connection
对象。TeleService
→Telecom
→InCallUI
触发来电界面。
四、定制与扩展
1. 新增网络制式
- 实现
Phone
子类(如NRPhone
对应 5G NR),重写dial()
方法生成专属信令。 - 在
RILJ
中扩展新制式的 AT 命令解析逻辑。
2. 调试技巧
- 日志追踪:
adb logcat -b radio # 查看 RIL-Phone 交互 adb logcat -s GsmPhone # 过滤 GSM 协议日志
- 关键线程:
RILReceiver
:监听 Modem 上报事件。AsyncChannel
:处理跨进程异步消息。
五、 总结:Phone 模块的核心价值
功能 | 实现机制 |
---|---|
硬件抽象 | 通过 RILJ 和 CommandsInterface 屏蔽 Modem 差异(高通 QMI/MTK AT) |
状态机管理 | CallTracker 隔离 Modem 事件抖动,保证状态稳定 |
多卡支持 | PhoneFactory 为每张 SIM 卡创建独立实例 |
异常隔离 | Modem 无响应时,本地重试或回滚状态,避免 Telecom 崩溃 |
六、 注意点
定制通话功能(如 VoNR)时,优先扩展 Phone
子类而非修改 Telecom,以保持架构稳定性。