Android Telephony 系统 - 完整功能与核心类分析

158 阅读8分钟

一、系统整体架构

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 关键类清单

类名所属模块功能
GsmCdmaPhoneframeworks_opt_telephonyGSM/CDMA/LTE 通用 Phone 实现
Phoneframeworks_opt_telephonyPhone 接口定义
GsmCdmaCallTrackerframeworks_opt_telephony呼叫状态追踪器
GsmCdmaCallframeworks_opt_telephony呼叫对象(前景/背景/来电)
GsmCdmaConnectionframeworks_opt_telephony单个连接对象
ServiceStateTrackerframeworks_opt_telephony网络服务状态跟踪
ServiceStateframeworks_base服务状态数据结构
SignalStrengthControllerframeworks_opt_telephony信号强度管理
TelephonyManagerframeworks_base应用 API 入口
SmsManagerframeworks_base短信管理 API
TelecomManagerframeworks_base通话管理 API
InboundSmsHandlerframeworks_opt_telephony短信接收处理
PhoneInterfaceManagerpackages_services_TelephonyBinder 接口实现
TelephonyConnectionServicepackages_services_TelephonyTelecom 集成

三、呼叫管理系统

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 处理呼叫切换

十三、面试核心知识点

✅ 必须掌握

  1. Phone 框架

    • Phone 接口 vs GsmCdmaPhone 实现
    • 何时使用 ImsPhone
  2. Call 管理

    • 3 个 Call 对象的用途
    • 呼叫状态转移图
    • Connection 与 Call 的关系
  3. ServiceState

    • 注册状态含义
    • NetworkRegistrationInfo 的作用
    • 数据/语音分域管理
  4. 短信系统

    • 发送流程和错误处理
    • 接收处理和应用分发
    • PDU 编码
  5. IMS/VoLTE

    • VoLTE 优势
    • IMS 注册流程
    • VoNR 概念
  6. 权限模型

    • 危险权限列表
    • 系统权限范围

这个完整的分析涵盖了 Android Telephony 系统的所有主要功能和核心类,可以作为深入学习或面试准备的参考。