description: “语音通话业务的核心架构设计,剖析 Android 手机从拨号到挂断的完整 CS/IMS 通话流程、呼叫路由决策、通话状态机及 SRVCC 切换机制。”
语音通话是 Telephony 最核心的业务之一。Android 16 的语音通话架构同时支持传统的 CS 域通话(2G/3G 电路交换)和基于 IMS 的 VoLTE/VoWiFi 通话(4G/5G 分组交换),并通过智能路由机制在两者之间自动选择。
架构演进提示:
Android 16 中,GsmCdmaCallTracker统一了 GSM 和 CDMA 两种无线接入技术的 CS 通话处理,而ImsPhoneCallTracker则负责所有 IMS 承载的语音/视频通话。两者通过GsmCdmaPhone.dial()中的路由逻辑实现无缝切换。
1. 核心概念与术语
- CS Call (Circuit Switched Call):电路交换通话,传统的 2G/3G 语音通话方式。通话期间独占一条无线信道。
- IMS Call (IP Multimedia Subsystem Call):基于 IP 的多媒体通话,包括 VoLTE (Voice over LTE)、ViLTE (Video over LTE)、VoWiFi (Voice over WiFi)。
- MO Call (Mobile Originated Call):手机主动发起的呼出通话。
- MT Call (Mobile Terminated Call):手机接收的呼入通话。
- SRVCC (Single Radio Voice Call Continuity):当用户在 VoLTE 通话过程中移出 LTE 覆盖范围时,将通话从 IMS 域无缝切换到 CS 域的技术。
- Conference Call:多方通话(电话会议),将多个通话合并为一个会议。
- Call Waiting:呼叫等待,当用户正在通话中时收到新的呼入。
2. 核心类与源码锚点 (Source Code Anchors)
2.1 CS 域通话核心类
- [GsmCdmaCallTracker.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaCallTracker.java):CS 域通话的"总指挥",位于
frameworks/opt/telephony。负责管理 GSM/CDMA 通话的完整生命周期,包括拨号、接听、挂断、三方通话、呼叫等待等。 - [GsmCdmaCall.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaCall.java):代表一个 CS 通话组(如前台通话、后台通话、振铃通话),内部维护一组
GsmCdmaConnection。 - [GsmCdmaConnection.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaConnection.java):代表一个具体的 CS 通话连接(即一路通话),包含通话地址、通话状态、断开原因等信息。
- [Call.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java):所有通话类的抽象基类,定义了
Call.State枚举和通话的基本操作。 - [Connection.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/Connection.java):所有通话连接的抽象基类,定义了连接的生命周期和状态。
2.2 IMS 域通话核心类
- [ImsPhoneCallTracker.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java):IMS 域通话的"总指挥",负责管理所有 IMS 承载的语音/视频通话。通过
MmTelFeature与 Vendor IMS 服务交互。 - [ImsPhoneCall.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhoneCall.java):代表一个 IMS 通话组。
- [ImsPhoneConnection.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhoneConnection.java):代表一个具体的 IMS 通话连接。
2.3 通话路由核心类
- [GsmCdmaPhone.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaPhone.java):代表一个物理 SIM 卡槽对应的 Phone 实例。其
dial()方法是通话路由的决策中心,决定呼叫走 CS 域还是 IMS 域。 - [ImsPhone.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/imsphone/ImsPhone.java):IMS Phone 实例,作为
GsmCdmaPhone的伴生对象存在,专门处理 IMS 承载的通话。
2.4 通话状态定义
- [PhoneConstants.java](file:///d:/Resource/Android%2016/android-16/frameworks/base/telephony/java/com/android/internal/telephony/PhoneConstants.java):定义了 Phone 级别的三个宏观状态:
IDLE(空闲)、RINGING(振铃)、OFFHOOK(摘机/通话中)。
3. 通话对象模型 (Call Object Hierarchy)
Android 框架通过严格的层级关系在内存中模拟了通话的物理和逻辑结构。
3.1 三个核心 Call 对象的设计意图
GsmCdmaCallTracker 和 ImsPhoneCallTracker 都维护了多个 Call 对象,这是为了模拟 GSM/CDMA 协议中通话的多路复用模型:
| Call 对象 | 含义 | 典型场景 |
|---|---|---|
mRingingCall |
振铃通话 | 有新来电正在振铃,或呼叫等待中 |
mForegroundCall |
前台通话 | 当前正在进行的活跃通话 |
mBackgroundCall |
后台通话 | 被保持(Hold)的通话 |
mHandoverCall |
切换通话 (仅 IMS) | SRVCC 切换过程中临时持有的通话 |
GSM 通话容量:最多 19 个连接(MAX_CONNECTIONS_GSM = 19),每个 Call 最多 5 个连接(MAX_CONNECTIONS_PER_CALL_GSM = 5)。其中 7 个用于 GSM 自身,12 个预留给 IMS SRVCC 切换。
CDMA 通话容量:最多 8 个连接(MAX_CONNECTIONS_CDMA = 8),每个 Call 最多 1 个连接(MAX_CONNECTIONS_PER_CALL_CDMA = 1)。
4. 通话状态机 (Call State Machine)
4.1 Call.State — 单个通话组的状态
定义在 [Call.java](file:///d:/Resource/Android%2016/android-16/frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java) 中,映射自底层 DriverCall.State:
305



被折叠的 条评论
为什么被折叠?



