对于搭载 Android 13 或更高版本的设备,Android 支持为 eUICC 启用多个配置文件 (MEP)。借助此功能,设备可以使用一个 eSIM 卡芯片实现双 SIM 卡支持,该芯片可以具有多个 SIM 卡配置文件,并且可以同时连接到两个不同的运营商。设备制造商必须与 SoC 供应商和 eSIM 卡芯片组供应商合作,以在其设备上集成此功能。
背景
在搭载 Android 12 及更低版本的设备上,AOSP 可提供有限的支持,以允许单个 eSIM 卡同时支持多个配置文件。尽管 eSIM 卡可以节省大量空间和成本,但缺乏对双 SIM 卡的支持,因此设备制造商无法采用仅支持 eSIM 卡的设备。若要在仅支持 eSIM 卡的设备上提供双 SIM 卡支持,设备制造商必须将两个 eSIM 卡元素打包到设备中,进而增加物料 (BOM) 成本并导致糟糕的订阅管理用户体验。Android 13 的 AOSP 中提供的 MEP 功能可以解决此问题。
eUICC 架构
本部分介绍了适用于不同 Android 版本的 MEP 设备的 eSIM 卡芯片架构和未采用 MEP 的设备的 eSIM 卡芯片架构。
Android 14
对于搭载 Android 14 或更高版本的设备,Android 支持 MEP-A1 和 MEP-B 选项来选择发卡机构安全域根 (ISD-R) 并选择 GSMA SGP V22 3.0 中指定的 eSIM 卡端口。下面介绍了 MEP-A1 和 MEP-B ISD-R 选择模型。
MEP-A1:在端口 0(命令端口 0)中选择 ISD-R,在 eSIM 卡端口 1 及更高版本上选择配置文件。ES10 命令始终发送到端口 0,并且命令端口和目标端口始终不同。LPA 选择端口。
图 1. MEP-A1 ISD-R 选择模型
MEP-B:在任意端口上选择 ISD-R,并且可以为任何端口指定配置文件。启用和停用命令会发送到需要启用或停用配置文件(该端口尚未刷新)的端口。命令端口和目标端口始终相同。
图 2. MEP-B ISD-R 选择模型
Android 13
在 Android 13 或更高版本中,在支持 MEP 的设备上,eSIM 卡插槽包含多个 eUICC 端口,这些端口可以具有已启用的配置文件。如图 3 所示,借助此架构,单个 eUICC(单个物理插槽)可以通过将每个 eUICC 端口链接至调制解调器基带来支持双 SIM 卡双待机 (DSDS)。Android 13 HAL 和 API 与 MEP 变体无关。
图 3. 支持 MEP 的 eSIM 卡芯片架构(Android 13 或更高版本)
Android 12 及更低版本
对于搭载 Android 12 或更低版本且没有 MEP 的设备(如图 4 所示),eSIM 卡插槽一次只能支持一个已启用的配置文件,并且设备不支持 DSDS。
图 4. 不支持 MEP 的 eSIM 卡芯片架构(Android 12 或更低版本)
多个已启用配置文件的 API 信息流
图 5 展示了 Android 13 中适用于 eUICC 的 MEP 的信息流。电话框架包含 UiccPort
类,该类代表 eUICC 上的物理结构。UiccPort
类适用于所有类型的 SIM 卡:实体 SIM 卡 (pSIM)、集成 SIM 卡 (iSIM) 和嵌入式 SIM 卡 (eSIM)。对于具有多个端口的 eUICC,单个 UiccSlot
对象和 UiccCard
对象会映射到多个 UiccPort
实例。每个 UiccPort
实例最多只能关联到一个 UiccProfile
实例。此流程允许 UiccPort
映射到逻辑插槽,并允许 UiccSlot
(实体插槽)映射到多个逻辑插槽。
图 5. 支持 MEP 的 eUICC 的信息流
实现
本部分介绍了如何实现 MEP 功能,包括有关 HAL 要求、API 和界面的详细信息。设备制造商应与 SoC 供应商和 eSIM 卡芯片组供应商合作以支持 MEP。
HAL 要求
如需为 eUICC 支持 MEP,请实现以下位于 /platform/hardware/interfaces/radio/aidl/aidl_api
的 IRadio AIDL HAL API。
搭载 Android 14 或更高版本的设备必须使用 IRadio 2.1 版 HAL 接口,这类接口使用 MultipleEnabledProfileMode
(由调制解调器或 eUICC 支持的 ISD-R 选择模型),并在 ICC 逻辑通道操作期间传递 ES10 APDU 命令信息。
CardStatus
调制解调器必须支持 CardStatus
API,作为对 getIccCardStatusResponse
方法的响应。响应必须包含端口索引和由 SimPortSlotMapping
指定的实体插槽索引。
对于搭载 Android 14 或更高版本的设备,调制解调器必须将支持的 MEP 模式与所有 CardStatus 事件一并传递。
SimSlotStatus
调制解调器必须支持 SimSlotStatus
API,作为对 getSimSlotsStatus
方法的响应。SIM 卡插槽状态包含一个 SimPortInfo
接口数组,其中包括端口索引、已启用配置文件的 ICCID 以及端口状态。调制解调器必须返回至少两个 SimPortInfo
对象。
对于搭载 Android 14 或更高版本的设备,调制解调器必须将支持的 MEP 模式与所有 CardStatus 事件一并传递。
setSimSlotMapping
setSimSlotMapping
方法必须传递一个 SimPortSlotMapping
数组。数组的索引是逻辑插槽,SimPortSlotMapping
指定对应的映射端口和实体插槽索引。setSimSlotMapping
方法可设置从端口到逻辑插槽的映射。LPA 应用使用此方法来选择活跃端口。
为 eUICC 提供 MEP 支持的 API
作为 AOSP 电话堆栈的一部分,支持启用多个配置文件的 Android 设备需要支持以下 API。
UiccCardInfo
- (Android 13 及更高版本)
isMultipleEnabledProfilesSupported
:返回结果,以表示此 UICC 是否支持 MEP。 - (Android 13 及更高版本)
getPorts
:返回特定 UICC 的所有可能端口的列表。如果 UICC 是不支持 MEP 的 pSIM 卡或 eSIM 卡,则会返回一个包含一个元素的列表。 - (已废弃)
getIccId
:返回 ICCID。由于 UICC 可以为支持 MEP 的设备使用多个 ICCID,因此请改用UiccPortInfo.getIccId()
。
(Android 13 及更高版本)UiccPortInfo
getIccId
:如果此端口上启用了订阅,则返回 ICCID。getPortIndex
:返回端口索引。getLogicalSlotIndex
:返回有效的逻辑调制解调器堆栈索引。
SubscriptionInfo
- (Android 13 及更高版本)
getPortIndex
:返回已启用订阅的端口索引。如果订阅已停用,则返回INVALID_PORT_ID -1
。
EuiccManager
switchToSubscription
:切换到指定订阅,由对有效订阅不具备运营商特权的应用使用。被调用时,平台会通过包含三个选项的对话框在内部解析端口索引,以便在没有可用的端口时停用所选的有效订阅。以 Android 13 及更高版本为目标平台的应用不得通过传递无效订阅 ID 来使用此 API 停用订阅,而是必须使用指定了端口索引的switchToSubscription
方法(该方法已添加至 Android 13)。- (Android 13 及更高版本)
switchToSubscription(int subscriptionId, int portIndex, PendingIntent callback)
:切换到指定订阅。如果发起调用的应用对于有效订阅具备运营商特权,则这些应用可以指定用于启用订阅的端口。 - (Android 13 及更高版本)
isSimPortAvailable
:返回结果,以表示传递的端口索引是否可用。如果某个端口未启用订阅或发起调用的应用对于选定端口上安装的订阅具备运营商特权,则该端口可用。
EuiccService
- (Android 13 及更高版本)
onSwitchToSubscriptionWithPort
:切换到指定端口上的指定订阅。在 Android 13 及更高版本中,LPA 实现必须提供此项支持。
TelephonyManager
- (Android 13 及更高版本)
getSimApplicationState
:返回一个指示卡片应用状态的常量。此 API 会同时传递实体插槽索引和端口索引。getSimApplicationState(int physicalSlotIndex)
方法(已废弃)仅传递实体插槽索引以获取simApplicationState
对象。 - (Android 13 及更高版本)
setSimSlotMapping(Collection<UiccSlotMapping> slots)
:将逻辑插槽映射到实体插槽和端口。 - (Android 13 及更高版本)
Collection<UiccSlotMapping> getSimSlotMapping
:获取从逻辑插槽到实体 SIM 卡插槽和端口索引的映射。
界面
如需解决 eSIM 卡端口选择不明确的问题,在支持 MEP 的设备上,用户必须能够停用其中一个有效订阅,然后才能启用新订阅。在 Android 13 中,AOSP 包含一个提供由 3 个选项构成的对话框的用户体验流程,该对话框可应用于“设置”应用中的订阅启用用户体验流程。图 6 显示了此用户体验流程的一个示例。
图 6. 启用 SIM 卡订阅的用户流程
功能标志
为了支持 MEP,设备必须声明以下功能标志:
LPA 实现
如需支持 MEP,请确保您的 LPA 实现满足以下要求:
- 实现 EuiccService 中的多个 API 以支持多个端口。
- 使用支持端口选择和配置文件启用的 API。
- 提供允许运营商应用在所选端口上启用配置文件的用户体验。
验证
如需测试 MEP 功能的实现,请确保 build 通过以下 CTS 测试用例(针对公共 API):/platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts
。
设备制造商还应与其调制解调器、eUICC 芯片和 eSIM 卡操作系统供应商合作以确保设备可以执行以下操作:
- 可以启用两个 eSIM 卡配置文件并将其连接到两个不同的网络。
- 可以在任何 eSIM 卡端口上激活和停用 eSIM 卡配置文件。
- 可通过运营商应用触发的用户体验流程允许用户切换配置文件。
面向运营商的建议
为了确保用户在将 eSIM 卡配置文件从一个端口移至另一个端口时不会丢失服务,我们建议运营商提供以下支持:
- IMEI 和 SIM 卡的浮动映射
- 每个 eUICC 标识符 (EID) 有多个 ICCID 或 SIM 卡