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 个 Call 对象""1 对 多""持有 4 个 Call 对象""1 对 多"«abstract»CallTracker+CommandsInterface mCi+dial()+hangup()+acceptCall()+rejectCall()GsmCdmaCallTracker-GsmCdmaConnection[] mConnections-GsmCdmaConnection mPendingMO+GsmCdmaCall mRingingCall+GsmCdmaCall mForegroundCall+GsmCdmaCall mBackgroundCall+PhoneConstants.State mState+dialGsm()+dialCdma()+updatePhoneState()ImsPhoneCallTracker-ImsPhoneConnection mPendingMO+ImsPhoneCall mRingingCall+ImsPhoneCall mForegroundCall+ImsPhoneCall mBackgroundCall+ImsPhoneCall mHandoverCall+ImsManager mImsManager+dial()+dialInternal()«abstract»Call+State mState+ArrayListConnection mConnectionsGsmCdmaCall+GsmCdmaCallTracker mOwnerImsPhoneCall+ImsPhoneCallTracker mOwner«abstract»Connection+State mState+DisconnectCause mCauseGsmCdmaConnection+int mIndex+GsmCdmaCall mParentImsPhoneConnection+ImsCall mImsCall+ImsPhoneCall mParent3.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:初始状态发起拨号 (MO Call)收到呼入 (MT Call)被叫方开始振铃被叫方接听已有通话时收到新来电用户接听用户切换接听用户保持通话 / 接听新来电用户恢复通话用户挂断 / 对方挂断挂断保持中的通话拨号取消拨号取消拒接来电拒接等待中的来电断开完成
语音通话业务 (Voice Call) 架构设计
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 个 Call 对象""1 对 多""持有 4 个 Call 对象""1 对 多"«abstract»CallTracker+CommandsInterface mCi+dial()+hangup()+acceptCall()+rejectCall()GsmCdmaCallTracker-GsmCdmaConnection[] mConnections-GsmCdmaConnection mPendingMO+GsmCdmaCall mRingingCall+GsmCdmaCall mForegroundCall+GsmCdmaCall mBackgroundCall+PhoneConstants.State mState+dialGsm()+dialCdma()+updatePhoneState()ImsPhoneCallTracker-ImsPhoneConnection mPendingMO+ImsPhoneCall mRingingCall+ImsPhoneCall mForegroundCall+ImsPhoneCall mBackgroundCall+ImsPhoneCall mHandoverCall+ImsManager mImsManager+dial()+dialInternal()«abstract»Call+State mState+ArrayListConnection mConnectionsGsmCdmaCall+GsmCdmaCallTracker mOwnerImsPhoneCall+ImsPhoneCallTracker mOwner«abstract»Connection+State mState+DisconnectCause mCauseGsmCdmaConnection+int mIndex+GsmCdmaCall mParentImsPhoneConnection+ImsCall mImsCall+ImsPhoneCall mParent3.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:初始状态发起拨号 (MO Call)收到呼入 (MT Call)被叫方开始振铃被叫方接听已有通话时收到新来电用户接听用户切换接听用户保持通话 / 接听新来电用户恢复通话用户挂断 / 对方挂断挂断保持中的通话拨号取消拨号取消拒接来电拒接等待中的来电断开完成