多 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.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
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值