description: “Android 16 多SIM协作(DSDS/DSDA) 完整架构,涵盖 Slot/Phone/SubId 三层映射、PhoneSwitcher 数据卡切换策略、ProxyController Radio能力协调、MultiSimSettingController 群组设置同步、CBRS 自动数据切换、紧急呼叫 DDS 覆盖等核心机制。”
1. 概述
多 SIM 卡协作是 Android 16 Multi-SIM 子系统(DSDS — Dual SIM Dual Standby,DSDA — Dual SIM Dual Active)的核心。它解决了多个 SIM 卡共存时的数据路线仲裁、Radio 资源分配、订阅设置同步等关键问题。
在 Android 16 中,多 SIM 协作由以下核心组件组成:
| 组件 | 职责 | 模式 |
|---|---|---|
| PhoneSwitcher | 决定哪个 Phone 承载默认数据连接,管理 PS Attach 状态 | 数据路线仲裁者 |
| ProxyController | 协调多 Phone 间的 Radio Access Family 变更,确保资源分配一致性 | Radio 资源协调者 |
| MultiSimSettingController | 同步分组订阅的移动数据和漫游设置,管理主订阅规则 | 设置同步器 |
| SubscriptionManagerService | 管理 SlotId → SubId → PhoneId 三层映射,用户可配置的默认语音/短信/数据卡 | 订阅管理器 |
1.1 三层 ID 映射
2. 核心类与源码锚点
| 类 | 路径 | 职责 |
|---|---|---|
PhoneSwitcher.java |
frameworks/opt/telephony/.../data/PhoneSwitcher.java (2100+ 行) |
数据路线仲裁器:Preferred Data PhoneId 维护、PS Attach 管理、紧急呼叫 DDS 覆盖 |
ProxyController.java |
frameworks/opt/telephony/.../ProxyController.java (500+ 行) |
Radio 能力协调器:setRadioCapability() 事务管理、双 CDMA 冲突检测、跨 Phone 同步 |
MultiSimSettingController.java |
frameworks/opt/telephony/.../MultiSimSettingController.java (600+ 行) |
设置同步器:分组订阅的移动数据/漫游设置同步 |
SubscriptionManagerService.java |
frameworks/opt/telephony/.../subscription/SubscriptionManagerService.java |
订阅管理器:管理 SubId 到 PhoneId/SlotId 的映射 |
CellularNetworkValidator.java |
frameworks/opt/telephony/.../data/CellularNetworkValidator.java |
网络验证器:数据卡切换前验证目标网络可用性 |
AutoDataSwitchController.java |
frameworks/opt/telephony/.../data/AutoDataSwitchController.java |
自动数据切换控制器:基于信号强度/网络状态自动切换数据卡 |
3. PhoneSwitcher — 数据路线仲裁器
PhoneSwitcher 是 Multi-SIM 的核心枢纽,回答一个问题:当前应该由哪个 Phone 承载 Internet 数据连接?
3.1 核心状态变量
public class PhoneSwitcher extends Handler {
// 用户设置的主数据订阅
protected int mPrimaryDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
// 系统自动建议的数据订阅(CBRS/自动切换功能)
private int mAutoSelectedDataSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
// 正在进行语音通话的 Phone ID
protected int mPhoneIdInVoiceCall = SubscriptionManager.INVALID_PHONE_INDEX;
// 最终决定的数据 Phone ID(综合考虑以上因素)
protected int mPreferredDataPhoneId = SubscriptionManager.INVALID_PHONE_INDEX;
// 对应的 SubId
protected WatchedInt mPreferredDataSubId = new WatchedInt(INVALID_SUBSCRIPTION_ID);
// 紧急呼叫 DDS 覆盖请求
private EmergencyOverrideRequest mEmergencyOverride;
}
3.2 数据 Phone ID 的决策逻辑
updatePreferredDataPhoneId() 体现了多因素综合仲裁的设计思想:
protected void updatePreferredDataPhoneId() {
// 优先级 1:紧急呼叫 DDS 覆盖(最高优先级)
if (mEmergencyOverride != null) {
mPreferredDataPhoneId = mEmergencyOverride.mPhoneId;
return;
}
// 优先级 2:语音通话中的 Phone
if (isAnyVoiceCallActiveOnDevice()) {
int imsRegTech = mImsRegTechProvider.get(mContext, mPhoneIdInVoiceCall);
if (imsRegTech != REGISTRATION_TECH_IWLAN) {
if (imsRegTech != REGISTRATION_TECH_CROSS_SIM) {
// 通话 Phone 需要数据同步 → 将数据切到通话 Phone
mPreferredDataPhoneId = shouldSwitchDataDueToInCall()
? mPhoneIdInVoiceCall : getFallbackDataPhoneIdForInternetRequests();
} else {
// Cross-SIM IMS 通话 → 数据不切换,保持原 Phone

2368

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



