一、系统整体架构
Android Telephony 系统是一个分层的通信管理框架,负责管理语音通话、短信/彩信、数据连接和各种电信功能。
┌─────────────────────────────────────────┐
│ 应用层 API (Java Framework) │
│ TelephonyManager, SmsManager, │
│ TelecomManager, TelephonyCallback │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Framework 服务层 (packages_services_ │
│ Telephony) │
│ PhoneGlobals, PhoneInterfaceManager, │
│ TelephonyConnectionService │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ 核心业务逻辑层 (frameworks_opt_ │
│ telephony) │
│ Phone, GsmCdmaPhone, CallTracker, │
│ ServiceStateTracker, ImsPhone │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ RIL 通信层 (CommandsInterface) │
│ 与底层 modem/RIL 通信 │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ 硬件层 (Modem/RIL) │
│ 2G/3G/4G/5G 无线电收发 │
└─────────────────────────────────────────┘
二、核心类体系
2.1 Phone 接口与实现
Phone (抽象基类)
├── GsmCdmaPhone (主要实现)
│ ├── GSM 呼叫处理
│ ├── CDMA 呼叫处理
│ └── IMS 融合通信
│
└── ImsPhone (IMS 专用)
├── VoLTE (Voice over LTE)
├── VoWiFi (Voice over WiFi)
└── RCS (Rich Communication Services)
Phone 的关键职责:
- 呼叫管理(接通、挂断、转接等)
- 短信/彩信收发
- 信号强度和服务状态跟踪
- SIM 卡管理
- 数据连接控制
2.2 关键类清单
| 类名 | 所属模块 | 功能 |
|---|---|---|
| GsmCdmaPhone | frameworks_opt_telephony | GSM/CDMA/LTE 通用 Phone 实现 |
| Phone | frameworks_opt_telephony | Phone 接口定义 |
| GsmCdmaCallTracker | frameworks_opt_telephony | 呼叫状态追踪器 |
| GsmCdmaCall | frameworks_opt_telephony | 呼叫对象(前景/背景/来电) |
| GsmCdmaConnection | frameworks_opt_telephony | 单个连接对象 |
| ServiceStateTracker | frameworks_opt_telephony | 网络服务状态跟踪 |
| ServiceState | frameworks_base | 服务状态数据结构 |
| SignalStrengthController | frameworks_opt_telephony | 信号强度管理 |
| TelephonyManager | frameworks_base | 应用 API 入口 |
| SmsManager | frameworks_base | 短信管理 API |
| TelecomManager | frameworks_base | 通话管理 API |
| InboundSmsHandler | frameworks_opt_telephony | 短信接收处理 |
| PhoneInterfaceManager | packages_services_Telephony | Binder 接口实现 |
| TelephonyConnectionService | packages_services_Telephony | Telecom 集成 |
三、呼叫管理系统
3.1 Call 状态机
GsmCdmaCall 的 3 种主要状态:
┌─────────────┐
│ RINGING │ ← 来电响铃或来电等待
└─────────────┘
│
├─ acceptCall() ──→ ┌─────────────┐
│ │ ACTIVE │
└─ rejectCall() ──→ │ (已接通) │
└─────────────┘
│
┌─────────────┐ ├─ hold() ──→ ┌─────────────┐
│ IDLE │◄────────────────┤ │ HOLDING │
│ (无呼叫) │ hangup() │ │ (保持中) │
└─────────────┘ └─────────────┘
3.2 GsmCdmaCallTracker 核心功能
public class GsmCdmaCallTracker extends CallTracker {
// 三个主要的 Call 容器
public GsmCdmaCall mRingingCall; // 来电 / 来电等待
public GsmCdmaCall mForegroundCall; // 前景呼叫(活跃)
public GsmCdmaCall mBackgroundCall; // 背景呼叫(保持)
// 连接数组(单个通话的底层连接)
public GsmCdmaConnection[] mConnections;
// 核心方法
public void dial(String dialString, DialArgs dialArgs);
public void acceptCall(); // 接听来电
public void rejectCall(); // 拒接来电
public void switchWaitingOrHoldingAndActive(); // 切换活跃/保持
public void conference(); // 会议
public void explicitCallTransfer(); // 呼叫转移
public void hangupForegroundResumeBackground(); // 挂断前景恢复背景
public void hangupWaitingOrBackground(); // 挂断背景/等待
}
GsmCdmaCallTracker 的工作流程:
1. 拨号 (Outgoing Call)
├─ dial() → 发送 ATD 命令给 RIL
├─ 状态: DIALING → ALERTING → ACTIVE
└─ 通知 mForegroundCall
2. 来电 (Incoming Call)
├─ RIL 上报 CALL_STATE_CHANGE
├─ pollCalls() 获取最新呼叫列表
├─ 状态: INCOMING → WAITING (如已有活跃呼叫)
└─ 通知 mRingingCall
3. 接听
├─ acceptCall() 或 switchWaitingOrHoldingAndActive()
├─ 前景呼叫进入 HOLDING
├─ 来电进入 ACTIVE
└─ 触发 CallStateChanged 回调
4. 挂断
├─ hangup(call)
├─ 状态转移到 IDLE
└─ 清理连接资源
四、服务状态与信号管理
4.1 ServiceState 数据结构
public class ServiceState {
// 网络注册状态
private int mVoiceRegState; // 语音: IN_SERVICE, OUT_OF_SERVICE, etc.
private int mDataRegState; // 数据
// 运营商信息
private String mOperatorAlphaLong; // 如"China Mobile"
private String mOperatorAlphaShort; // 如"CMCC"
private String mOperatorNumeric; // MCC/MNC 如"46000"
// 网络信息
private List<NetworkRegistrationInfo> mNetworkRegistrationInfos;
// 特殊状态
private boolean mIsEmergencyOnly; // 仅紧急呼叫
private boolean mIsManualNetworkSelection; // 手动选网
private int mNrFrequencyRange; // 5G 频段信息
// 关键方法
public int getState(); // 整体服务状态
public boolean isInService(); // 是否在网
public int getDataNetworkType(); // 数据网络类型
public int getVoiceNetworkType(); // 语音网络类型
}
服务状态常量:
public static final int STATE_IN_SERVICE = 0; // 在网
public static final int STATE_OUT_OF_SERVICE = 1; // 无信号
public static final int STATE_EMERGENCY_ONLY = 2; // 仅紧急
public static final int STATE_POWER_OFF = 3; // 关机
4.2 SignalStrength 与 SignalStrengthController
public class SignalStrengthController {
// 信号强度等级
public static final int SIGNAL_STRENGTH_POOR = 0;
public static final int SIGNAL_STRENGTH_MODERATE = 1;
public static final int SIGNAL_STRENGTH_GOOD = 2;
public static final int SIGNAL_STRENGTH_GREAT = 3;
// 不同 RAT 的信号阈值
static class ThresholdsEntry {
public static final int[] GERAN_RSSI; // GSM 信号
public static final int[] UTRAN_RSCP; // 3G 信号
public static final int[] EUTRAN_RSRP; // LTE 信号
public static final int[] NGRAN_SSRP; // 5G 信号
}
}
五、短信系统
5.1 短信发送流程
SmsManager.sendTextMessage()
│
├─ 权限检查 (SEND_SMS)
│
├─ 获取 ISms (Binder 接口)
│
├─ iSms.sendTextForSubscriber(
│ subscriptionId,
│ destinationAddress,
│ scAddress, // Service Center Address
│ text,
│ sentIntent, // 发送结果回调
│ deliveryIntent // 递送结果回调
│ )
│
└─ 触发 sentIntent
├─ RESULT_OK (成功)
├─ RESULT_ERROR_GENERIC_FAILURE
├─ RESULT_ERROR_RADIO_OFF
├─ RESULT_ERROR_NULL_PDU
└─ 其他错误
5.2 短信接收流程
RIL 上报 SMS_ON_COMPLETE_MESSAGE
│
└─→ InboundSmsHandler.handleMessage(MSG_NEW_SMS)
│
├─ 解析 PDU (Protocol Data Unit)
│
├─ 检查是否为来自应用的 SMS (AppSmsManager)
│
├─ 向默认 SMS 应用投递
│ ├─ 广播 Intent SMS_DELIVER_ACTION
│ └─ 或发送给特定应用组件
│
└─ 写入 SMS 数据库 (content://sms)
SmsManager 关键方法:
// 发送
public void sendTextMessage(String destinationAddress, String scAddress,
String text, PendingIntent sentIntent,
PendingIntent deliveryIntent)
// 发送多部分短信
public ArrayList<String> divideMessage(String text)
public void sendMultipartTextMessage(String destinationAddress,
String scAddress,
ArrayList<String> parts,
ArrayList<PendingIntent> sentIntents,
ArrayList<PendingIntent> deliveryIntents)
// 发送数据短信
public void sendDataMessage(String destinationAddress, String scAddress,
short destinationPort, byte[] data,
PendingIntent sentIntent,
PendingIntent deliveryIntent)
六、数据连接管理
6.1 DataNetworkController 架构
DataNetworkController (管理数据网络)
├── DataNetwork (单个数据连接)
│ ├── APN 配置
│ ├── QoS 参数
│ ├── 路由规则
│ └── 统计信息
│
├── DataNetworkManager (多连接管理)
│ ├── 互联网 PDN (Primary)
│ ├── IMS PDN (语音视频)
│ └── 其他特殊 PDN
│
└── DataProfileManager (APN 配置管理)
├── 默认 APN
├── MMS APN
├── SUPL APN
└── IMS APN
6.2 NetworkRegistrationInfo
public class NetworkRegistrationInfo {
// 域类型
public static final int DOMAIN_CS = 1; // Circuit Switch (语音)
public static final int DOMAIN_PS = 2; // Packet Switch (数据)
public static final int DOMAIN_CS_PS = 3; // 两者
// 传输类型
public static final int TRANSPORT_TYPE_WWAN = 1; // 移动网络
public static final int TRANSPORT_TYPE_WLAN = 2; // WiFi
// 注册状态
public static final int REGISTRATION_STATE_NOT_REGISTERED = 0;
public static final int REGISTRATION_STATE_HOME = 1;
public static final int REGISTRATION_STATE_SEARCHING = 2;
public static final int REGISTRATION_STATE_DENIED = 3;
public static final int REGISTRATION_STATE_UNKNOWN = 4;
public static final int REGISTRATION_STATE_ROAMING = 5;
// 关键字段
private int mDomain;
private int mTransportType;
private int mRegistrationState;
private int mAccessNetworkTechnology; // NETWORK_TYPE_*
}
七、Telecom 集成
7.1 TelecomManager 与 InCallService
public class TelecomManager {
// 呼叫管理 API
public void acceptRingingCall() // 接听来电
public boolean endCall() // 挂断通话
public void silenceRinger() // 静音铃声
public void holdCall(String callId)
public void unholdCall(String callId)
public void disconnect(String callId)
public void transfer(String callId, Uri address)
public void conference(String callId1, String callId2)
// 查询 API
public boolean isInCall() // 是否在通话
public boolean isRinging() // 是否有来电
public int getCallState() // 获取通话状态
}
7.2 TelephonyConnectionService
TelephonyConnectionService 集成 Telecom Framework
│
├─ 接收 onCreateOutgoingConnection()
│ └─→ 创建 TelephonyConnection
│
├─ 接收 onCreateIncomingConnection()
│ └─→ 投递来电 Intent
│
└─ 处理来自 Telecom 的命令
├─ answer(), disconnect()
├─ hold(), unhold()
└─ conference(), transfer()
八、IMS 与 VoLTE
8.1 ImsPhone 架构
ImsPhone (IMS 实现)
├── IMS 注册管理
│ ├─ 注册到 IMS 服务器
│ ├─ 心跳保活
│ └─ 连接管理
│
├── VoLTE 呼叫处理
│ ├─ 拨号
│ ├─ 接听
│ └─ 呼叫管理
│
├── VoWiFi 支持
│ ├─ WiFi 上的 VoIP
│ └─ WiFi-Cellular 切换
│
├── RCS 功能
│ ├─ 文件传输
│ ├─ 群聊
│ └─ 富媒体
│
└── VoNR (Voice over NR)
└─ 5G 语音服务
8.2 VoLTE 的优势
- 语音质量更优: AMR-WB 编码 (16kHz 采样)
- 更快接通: 无需建立 CS 连接
- 通话中可用数据: PS 域可同时传输
- 电池效率: 功耗更低
九、通知与回调机制
9.1 TelephonyCallback 体系
public abstract class TelephonyCallback {
// 服务状态变化
public interface ServiceStateListener {
void onServiceStateChanged(ServiceState state);
}
// 信号强度变化
public interface SignalStrengthsListener {
void onSignalStrengthsChanged(SignalStrength signalStrength);
}
// 数据连接状态
public interface DataConnectionStateListener {
void onDataConnectionStateChanged(int state, int networkType);
}
// 数据活动
public interface DataActivityListener {
void onDataActivity(@DataActivity int direction);
}
// 呼叫状态
public interface PreciseCallStateListener {
void onPreciseCallStateChanged(PreciseCallState callState);
}
// 显示信息
public interface DisplayInfoListener {
void onDisplayInfoChanged(TelephonyDisplayInfo displayInfo);
}
}
9.2 注册回调
// 应用层注册监听
TelephonyManager tm = context.getSystemService(TelephonyManager.class);
MyCellback callback = new MyCallback();
tm.registerTelephonyCallback(executor, callback);
// 取消注册
tm.unregisterTelephonyCallback(callback);
十、权限模型
10.1 Telephony 权限
| 权限 | 功能 | 风险级别 |
|---|---|---|
| READ_PHONE_STATE | 读取电话状态 | 危险 |
| READ_CALL_LOG | 读取通话记录 | 危险 |
| READ_SMS | 读取短信 | 危险 |
| RECEIVE_SMS | 接收短信 | 危险 |
| SEND_SMS | 发送短信 | 危险 |
| CALL_PHONE | 拨号 | 危险 |
| MODIFY_PHONE_STATE | 修改电话状态 | 系统级 |
十一、GsmCdmaPhone 核心方法
public class GsmCdmaPhone extends Phone {
// 呼叫相关
public void dial(String dialString, DialArgs dialArgs);
public void rejectCall();
public void acceptCall();
public void conference();
public void explicitCallTransfer();
// 信息相关
public String getImei() // 获取 IMEI
public String getSubscriberId() // 获取 IMSI
public String getGroupIdLevel1() // 获取 GID1
// SIM 卡相关
public IccRecords getIccRecords() // 获取 SIM 记录
public int getSimState() // 获取 SIM 状态
public void setSimPowerState(int state, Message result) // SIM 电源控制
// 网络相关
public ServiceState getServiceState() // 获取服务状态
public void setNetworkSelectionModeAutomatic() // 自动选网
public void selectNetworkManually(OperatorInfo operator, Message onComplete) // 手动选网
// 语音邮件
public void updateVoiceMail()
public String getVoiceMailNumber()
// 数据相关
public DataNetworkController getDataNetworkController()
}
十二、关键流程示例
12.1 拨号完整流程
应用层: TelecomManager.placeCall(uri)
│
└──→ Telecom Service
│
├─ 选择合适的 PhoneAccount
├─ 权限检查
└──→ TelephonyConnectionService.onCreateOutgoingConnection()
│
└──→ GsmCdmaPhone.dial(dialString, dialArgs)
│
├─ 检查电话状态 (IDLE/RINGING/OFFHOOK)
├─ 创建 GsmCdmaConnection 对象
├─ 发送 AT+ATD 命令给 RIL
│
└──→ RIL 处理
│
├─ 建立 CS 连接
├─ 发送信令建立呼叫
│
└──→ 上报 CALL_STATE_CHANGE 事件
│
├─ 状态: DIALING → ALERTING → ACTIVE
├─ 触发 CallStateChanged 回调
└──→ UI 更新显示
12.2 来电接听流程
RIL 上报 CALL_STATE_CHANGE (新的来电)
│
└──→ GsmCdmaCallTracker.pollCalls()
│
├─ 发送 AT+CLCC (列出当前呼叫)
├─ 解析 RIL 返回的呼叫列表
│
└──→ updateCallsFromNewCallList()
│
├─ 创建新的 GsmCdmaConnection
├─ 更新 mRingingCall
├─ 触发 CallStateChanged 事件
│
└──→ Telecom 框架
│
└──→ 显示来电 UI
│
用户点击接听
│
└──→ TelephonyConnectionService.onAnswer()
│
└──→ GsmCdmaCallTracker.acceptCall()
│
├─ 发送 ATA 命令给 RIL
├─ 前景呼叫进入 HOLDING
├─ 来电进入 ACTIVE
│
└──→ RIL 处理呼叫切换
十三、面试核心知识点
✅ 必须掌握:
-
Phone 框架
- Phone 接口 vs GsmCdmaPhone 实现
- 何时使用 ImsPhone
-
Call 管理
- 3 个 Call 对象的用途
- 呼叫状态转移图
- Connection 与 Call 的关系
-
ServiceState
- 注册状态含义
- NetworkRegistrationInfo 的作用
- 数据/语音分域管理
-
短信系统
- 发送流程和错误处理
- 接收处理和应用分发
- PDU 编码
-
IMS/VoLTE
- VoLTE 优势
- IMS 注册流程
- VoNR 概念
-
权限模型
- 危险权限列表
- 系统权限范围
这个完整的分析涵盖了 Android Telephony 系统的所有主要功能和核心类,可以作为深入学习或面试准备的参考。