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 核心状态变量
publicclassPhoneSwitcherextendsHandler{// 用户设置的主数据订阅protectedintmPrimaryDataSubId=SubscriptionManager.INVALID_SUBSCRIPTION_ID;// 系统自动建议的数据订阅(CBRS/自动切换功能)privateintmAutoSelectedDataSubId=SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;// 正在进行语音通话的 Phone IDprotectedintmPhoneIdInVoiceCall=SubscriptionManager.INVALID_PHONE_INDEX;// 最终决定的数据 Phone ID(综合考虑以上因素)protectedintmPreferredDataPhoneId=SubscriptionManager.INVALID_PHONE_INDEX;// 对应的 SubIdprotectedWatchedIntmPreferredDataSubId=newWatchedInt(INVALID_SUBSCRIPTION_ID);// 紧急呼叫 DDS 覆盖请求privateEmergencyOverrideRequestmEmergencyOverride;}3.2 数据 Phone ID 的决策逻辑
updatePreferredDataPhoneId()体现了多因素综合仲裁的设计思想:
protectedvoidupdatePreferredDataPhoneId(){// 优先级 1:紧急呼叫 DDS 覆盖(最高优先级)if(mEmergencyOverride!=null){mPreferredDataPhoneId=mEmergencyOverride.mPhoneId;return;}// 优先级 2:语音通话中的 Phoneif(isAnyVoiceCallActiveOnDevice()){intimsRegTech=mImsRegTechProvider.get(mContext,mPhoneIdInVoiceCall);if(imsRegTech!=REGISTRATION_TECH_IWLAN){if(imsRegTech!=REGISTRATION_TECH_CROSS_SIM){// 通话 Phone 需要数据同步 → 将数据切到通话 PhonemPreferredDataPhoneId=shouldSwitchDataDueToInCall()?mPhoneIdInVoiceCall:getFallbackDataPhoneIdForInternetRequests();}else{// Cross-SIM IMS 通话 → 数据不切换,保持原 Phone