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.apk InCallService 实现
策略控制层 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):

java 复制代码
// Telecom 合并两路通话
CallsManager#conference(Call call1, Call call2)
  • 实现逻辑
    1. 蓝牙协议发送合并命令(如 AT+CHLD=3)。
    2. 创建 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

    kotlin 复制代码
    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. 调试技巧
  • 日志追踪

    bash 复制代码
    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,以保持架构稳定性。

相关推荐
花花鱼2 小时前
android studio 设置让开发更加的方便,比如可以查看变量的类型,参数的名称等等
android·ide·android studio
alexhilton3 小时前
为什么你的App总是忘记所有事情
android·kotlin·android jetpack
AirDroid_cn7 小时前
OPPO手机怎样被其他手机远程控制?两台OPPO手机如何相互远程控制?
android·windows·ios·智能手机·iphone·远程工作·远程控制
尊治7 小时前
手机电工仿真软件更新了
android
xiangzhihong810 小时前
使用Universal Links与Android App Links实现网页无缝跳转至应用
android·ios
车载应用猿10 小时前
基于Android14的CarService 启动流程分析
android
没有了遇见11 小时前
Android 渐变色实现总结
android
雨白14 小时前
Jetpack系列(四):精通WorkManager,让后台任务不再失控
android·android jetpack
mmoyula15 小时前
【RK3568 驱动开发:实现一个最基础的网络设备】
android·linux·驱动开发
sam.li16 小时前
WebView安全实现(一)
android·安全·webview