对于运行 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 架构
本部分介绍了针对采用 MEP 和未采用 MEP 的设备的不同 Android 版本的 eSIM 芯片架构,以及针对未采用 MEP 的设备的 eSIM 芯片架构。
Android 14
对于运行 Android 14 或更高版本的设备,Android 支持 MEP-A1 和 MEP-B 选项,用于选择颁发者安全域根 (ISD-R) 和选择 eSIM 端口,如 GSMA SGP V22 3.0 中所述。以下介绍了 MEP-A1 和 MEP-B ISD-R 选择模型。
MEP-A1: 在端口 0 上选择 ISD-R(命令端口为 0),在 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 端口链接到调制解调器基带,来支持双卡双待 (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,请实现以下 IRadio AIDL HAL API,这些 API 位于 /platform/hardware/interfaces/radio/aidl/aidl_api
中。
运行 Android 14 或更高版本的设备必须使用 HAL 接口的 IRadio 2.1 版本,该版本使用 MultipleEnabledProfileMode
(调制解调器或 eUICC 支持的 ISD-R 选择模型),并在 ICC 逻辑通道操作期间传递 ES10 APDU 命令信息。
CardStatus
调制解调器必须支持 CardStatus
API,作为对 getIccCardStatusResponse
方法的响应。响应必须包括端口索引和 SimPortSlotMapping
指定的物理卡槽索引。
对于运行 Android 14 或更高版本的设备,调制解调器必须通过所有 CardStatus
事件传递支持的 MEP 模式。
SimSlotStatus
调制解调器必须支持 SimSlotStatus
API,作为对 getSimSlotsStatus
方法的响应。SIM 卡槽状态包括 SimPortInfo
接口的数组,该接口包含端口索引、已启用配置文件的 ICCID 和端口状态。调制解调器必须返回至少两个 SimPortInfo
对象。
对于运行 Android 14 或更高版本的设备,调制解调器必须通过所有 CardStatus
事件传递支持的 MEP 模式。
setSimSlotMapping
setSimSlotMapping
方法必须传递 SimPortSlotMapping
数组。数组的索引是逻辑卡槽,SimPortSlotMapping
指定相应的映射端口和物理卡槽索引。setSimSlotMapping
方法设置从端口到逻辑卡槽的映射。LPA 应用使用此方法来选择活动端口。
支持 eUICC 的 MEP 的 API
作为 AOSP 电话堆栈的一部分,支持多个已启用配置文件的 Android 设备需要支持以下 API。
UiccCardInfo
- (Android 13 及更高版本)
isMultipleEnabledProfilesSupported
: 返回此 UICC 是否支持 MEP。 - (Android 13 及更高版本)
getPorts
: 返回特定 UICC 的所有可能端口的列表。如果 UICC 是 pSIM 或不支持 MEP 的 eSIM,则返回包含一个元素的列表。 - (已弃用)
getIccId
: 返回 ICCID。由于具有 MEP 的设备的 UICC 可以有多个 ICCID,因此请改用UiccPortInfo.getIccId()
。
(Android 13 及更高版本)UiccPortInfo
getIccId
: 如果此端口上启用了订阅,则返回 ICCID。getPortIndex
: 返回端口索引。getLogicalSlotIndex
: 返回活动的逻辑调制解调器堆栈索引。
SubscriptionInfo
- (Android 13 及更高版本)
getPortIndex
: 返回启用订阅的端口索引。如果订阅已禁用,则返回INVALID_PORT_ID -1
。
EuiccManager
switchToSubscription
: 切换到给定的订阅。由对活动订阅没有运营商权限的应用使用。调用时,平台会在内部通过三选一选择对话框来解析端口索引,以便在没有可用端口时禁用选定的活动订阅。以 Android 13 及更高版本为目标平台的应用不得使用此 API 通过传递无效的订阅 ID 来禁用订阅;相反,它们必须使用switchToSubscription
方法(在 Android 13 中添加),并指定端口索引。- (Android 13 及更高版本)
switchToSubscription(int subscriptionId, int portIndex, PendingIntent callback)
: 切换到给定的订阅。对活动订阅具有运营商权限的调用应用可以指定在哪个端口上启用订阅。 - (Android 13 及更高版本)
isSimPortAvailable
: 返回传递的端口索引是否可用。如果端口未启用任何订阅,或者调用应用对安装在所选端口上的订阅具有运营商权限,则该端口可用。
EuiccService
- (Android 13 及更高版本)
onSwitchToSubscriptionWithPort
: 在指定端口上切换到给定的订阅。LPA 实现必须在 Android 13 及更高版本上支持此功能。
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 包含一个用户流程,其中包含一个三选一对话框,该对话框可以应用于来自“设置”应用的订阅启用用户流程。图 6 显示了此 UX 流程的示例。
图 6. 启用 SIM 卡订阅的用户流程
功能标记
要支持 MEP,设备必须声明以下功能标记
LPA 实现
要支持 MEP,请确保您的 LPA 实现满足以下要求
- 实现来自
EuiccService
的 API 以支持多个端口。 - 使用 API 进行端口选择和配置文件启用。
- 提供 UX,允许运营商应用在选定的端口上启用配置文件。
验证
要测试 MEP 功能的实现,请确保构建通过以下 CTS 测试用例(对于公共 API):/platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts
。
设备制造商还应与他们的调制解调器、eUICC 芯片和 eSIM 操作系统供应商合作,以确保设备可以执行以下操作
- 可以启用两个 eSIM 配置文件并将其连接到两个不同的网络。
- 可以在任何 eSIM 端口上激活和停用 eSIM 配置文件。
- 存在由运营商应用触发的 UX 流程,允许用户切换配置文件。
给运营商的建议
为了确保用户在将 eSIM 配置文件从一个端口移动到另一个端口时不会丢失服务,我们建议运营商提供对以下内容的支持
- IMEI 和 SIM 的灵活映射
- 每个 eUICC 标识符 (EID) 的多个 ICCID 或 SIM 卡