当前位置: 首页 > news >正文

多 SIM 协作 (DSDS/DSDA) 架构文档


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 pSIM

eSIM + 1 pSIM

Slot 0
(硬件卡槽)

Slot 1
(硬件卡槽)

SubId 1
(电话号 +138****)

SubId 2
(电话号 +139****)

SubId 3
(eSIM Profile)

Phone[0]
(GsmCdmaPhone)

Phone[1]
(GsmCdmaPhone)

PhoneId = SlotId
SubId 由 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
http://www.rkmt.cn/news/1485161.html

相关文章:

  • GPT-4的1.8万亿参数与2%激活真相:MoE路由机制深度解析
  • 不背单词里没有的单词
  • 2025-2026年上海搬家公司推荐:五大口碑产品评测大件搬运防磕碰市场份额价格 - 品牌推荐
  • 功耗管理与唤醒锁 (WakeLock) 架构文档
  • 玩转SSD1306的8种扫描模式:用Arduino实现OLED动画和特殊显示效果
  • 你的AR/机器人‘眼睛’准吗?手把手教你用手机和A4纸完成相机标定与精度验证
  • 别再复制粘贴了!手把手教你理解CMSIS-DAP离线下载器里那串神秘代码(附ARM反汇编实战)
  • 广州母婴除甲醛CMA甲醛检测治理公司深度测评:绿呼吸环保稳居榜首 - 一修哥咨询
  • Qt调用WPS导出Word报告踩坑记:管理员权限竟是罪魁祸首?
  • 鸿蒙Next实战开发(四):个人中心与系统设置页面开发
  • AIGC】story_agent_loop架构初步探讨5
  • 51单片机+ADC0809测电压不准?可能是这些细节没做好(附校准方法与代码优化)
  • 2026 安徽亳州市彩钢瓦修缮 TOP4 权威推荐 + 避坑指南(全区域服务) - 本地便民网
  • 阜阳母婴除甲醛CMA甲醛检测治理公司深度测评:绿呼吸环保稳居榜首 - 一修哥咨询
  • 光学萌新看过来:用Light Tools做第一个简单照明仿真(附B站教程高效学习法)
  • 别只盯着环路!用MPS那个EMI视频里的思路,重新审视你的DCDC开关节点Layout
  • 2026年企业在线培训系统选型避坑:从需求分析到供应商评估的全流程拆解
  • 告别Hello World:用ESP32-IDF 4.3和Blink示例,5分钟点亮你的第一盏灯
  • S5.1注意力捕获——如何在信息过载中抓住用户眼球
  • 高级java每日一道面试题-2026年01月26日-实战篇[Docker]-如何实现容器的外部访问?端口映射的原理是什么?
  • 深入TI C2000内核:TMS320F280049的GPIO输入限定,如何为ePWM故障保护与通信外设保驾护航?
  • 人脸验证训练工具包:含T2T-ViT、BotNet、MobileFaceNet和ResNet四套可切换主干实现
  • 从Wireshark GUI到命令行:在无图形界面的CentOS 7服务器上,用tshark抓取并分析HTTP请求的完整流程
  • 别再死记硬背了!用PyTorch动手画一遍,彻底搞懂CNN和MLP到底啥关系
  • XUnity.AutoTranslator字体管理实战指南:如何解决Unity游戏多语言显示难题
  • 别再只用System.out.printf了!Java保留小数点的3种方法实战对比(含DecimalFormat避坑)
  • Qt 高级开发 028:以代码为笔,以界面为卷
  • 别再只会升级GCC了!遇到‘unrecognized command line option‘的三种排查思路与降级方案
  • NTC温度采集全套开发资源:单片机驱动+查表工具+上位机显示+硬件设计文件
  • 从需求到代码:手把手教你用PlantUML插件,在IDEA里自动生成时序图和类图