 架构文档)
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 映射框架层逻辑层物理层插入 SIM 卡eSIM + 1 pSIMeSIM + 1 pSIMSlot 0(硬件卡槽)Slot 1(硬件卡槽)SubId 1(电话号 +138****)SubId 2(电话号 +139****)SubId 3(eSIM Profile)Phone[0](GsmCdmaPhone)Phone[1](GsmCdmaPhone)PhoneId = SlotIdSubId 由 SubscriptionManagerService 动态分配PhoneId 固定与 Slot 绑定2. 核心类与源码锚点类路径职责PhoneSwitcher.javaframeworks/opt/telephony/.../data/PhoneSwitcher.java(2100+ 行)数据路线仲裁器:Preferred Data PhoneId 维护、PS Attach 管理、紧急呼叫 DDS 覆盖ProxyController.javaframeworks/opt/telephony/.../ProxyController.java(500+ 行)Radio 能力协调器:setRadioCapability() 事务管理、双 CDMA 冲突检测、跨 Phone 同步MultiSimSettingController.javaframeworks/opt/telephony/.../MultiSimSettingController.java(600+ 行)设置同步器:分组订阅的移动数据/漫游设置同步SubscriptionManagerService.javaframeworks/opt/telephony/.../subscription/SubscriptionManagerService.java订阅管理器:管理 SubId 到 PhoneId/SlotId 的映射CellularNetworkValidator.javaframeworks/opt/telephony/.../data/CellularNetworkValidator.java网络验证器:数据卡切换前验证目标网络可用性AutoDataSwitchController.javaframeworks/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