Multiple enabled profiles

For devices running Android 13 or higher, Android supports multiple enabled profiles (MEPs) for eUICC. This feature allows devices to have dual SIM support using a single eSIM chip, which can have multiple SIM profiles and can connect to two different carriers at the same time. Device manufacturers must work with SoC vendors and eSIM chipset vendors to integrate this feature on their devices.

Background

On devices running Android 12 and lower, AOSP provides limited support in allowing a single eSIM to support multiple profiles at the same time. Despite the significant space and cost savings that eSIM offers, this lack of dual SIM support prevents device manufacturers from adopting eSIM-only devices. To provide dual SIM support on an eSIM-only device, device manufacturers have to pack two eSIM elements into the device, which increases bill of material (BOM) costs and leads to poor user experiences for subscription management. The MEP feature available in AOSP from Android 13 addresses this issue.

eUICC architecture

This section describes the eSIM chip architecture for devices with MEP for different Android versions and the eSIM chip architecture for devices without MEP.

Android 14

For devices running Android 14 or higher, Android supports the MEP-A1 and MEP-B options for the selection of the issuer security domain root (ISD-R) and the selection of eSIM ports as specified in GSMA SGP V22 3.0. The following describes the MEP-A1 and MEP-B ISD-R selection models.

  • MEP-A1: ISD-R is selected on port 0 (command port is 0) and profiles are selected on eSIM ports 1 and higher. ES10 commands are always sent to port 0, and the command port and target port are always different. The LPA selects the port.

    MEP-A1 ISD-R selection model

    Figure 1. MEP-A1 ISD-R selection model

  • MEP-B: ISD-R is selected on any port and any port can be assigned a profile. The enable and disable commands are sent to the port where the profile needs to be enabled or disabled (where a refresh is pending). The command port and target port is always the same.

    MEP-B ISD-R selection model

    Figure 2. MEP-B ISD-R selection model

Android 13

In Android 13 or higher, on devices that support MEP, the eSIM slot contains multiple eUICC ports where can port can have an enabled profile. As shown in Figure 3, with this architecture, a single eUICC (a single physical slot) supports dual SIM dual standby (DSDS) by having each eUICC port link to a modem baseband. Android 13 HAL and APIs are MEP variant independent.

eSIM chip architecture with MEP support

Figure 3. eSIM chip architecture with MEP support (Android 13 or higher)

Android 12 and lower

For devices running Android 12 or lower without MEP as shown in Figure 4, the eSIM slot only supports a single enabled profile at one time and the device can't support DSDS.

eSIM chip architecture without MEP support

Figure 4. eSIM chip architecture without MEP support (Android 12 or lower)

API information flow for multiple enabled profiles

Figure 5 describes the information flow for MEP for eUICC in Android 13. The telephony framework includes the UiccPort class, which represents the physical structure on eUICC. The UiccPort class is used for all types of SIM cards: physical SIM (pSIM), integrated SIM (iSIM), and embedded SIM (eSIM). For an eUICC with multiple ports, a single UiccSlot object and UiccCard object map to multiple UiccPort instances. Each UiccPort instance can link to at most one UiccProfile instance. This flow allows UiccPort to map to a logical slot and UiccSlot (physical slot) to map to multiple logical slots.

MEP information flow

Figure 5. Information flow for eUICC with MEP support

Implementation

This section describes how to implement the MEP feature including details about HAL requirements, APIs, and user interface. Device manufacturers should work with SoC vendors and eSIM chipset vendors to support MEP.

HAL requirements

To support MEP for eUICC, implement the following IRadio AIDL HAL APIs, located in /platform/hardware/interfaces/radio/aidl/aidl_api.

Devices running Android 14 or higher must use the IRadio 2.1 version of the HAL interfaces, which use MultipleEnabledProfileMode (ISD-R selection model supported by the modem or eUICC) and pass ES10 APDU command information during ICC logical channel operations.

CardStatus

The modem must support the CardStatus API as a response to the getIccCardStatusResponse method. The response must include the port index and the physical slot index specified by SimPortSlotMapping.

For devices running Android 14 or higher, the modem must pass the supported MEP mode with all CardStatus events.

SimSlotStatus

The modem must support the SimSlotStatus API as a response to the getSimSlotsStatus method. The SIM slot status includes an array of the SimPortInfo interface, which includes the port index, the ICCID for the enabled profile, and the port state. The modem must return at least two SimPortInfo objects.

For devices running Android 14 or higher, the modem must pass the supported MEP mode with all CardStatus events.

setSimSlotMapping

The setSimSlotMapping method must pass an array of SimPortSlotMapping. The index of the array is the logical slot and SimPortSlotMapping specifies the corresponding mapped port and physical slot index. The setSimSlotMapping method sets the mapping from ports to logical slots. The LPA app uses this method to select the active port.

APIs supporting MEP for eUICC

Android devices that support multiple enabled profiles as part of the AOSP telephony stack are required to support the following APIs.

UiccCardInfo

  • (Android 13 and higher) isMultipleEnabledProfilesSupported : Returns whether this UICC supports MEP.
  • (Android 13 and higher) getPorts: Returns the list of all possible ports for a particular UICC. If the UICC is a pSIM or eSIM that doesn't support MEP, returns a list of one element.
  • (Deprecated) getIccId: Returns an ICCID. Because a UICC can have more than one ICCID for devices with MEP, use UiccPortInfo.getIccId() instead.

(Android 13 and higher) UiccPortInfo

SubscriptionInfo

  • (Android 13 and higher) getPortIndex: Returns the port index on which the subscription is enabled. If the subscription is disabled, returns INVALID_PORT_ID -1.

EuiccManager

  • switchToSubscription: Switches to a given subscription. Used by apps that don't have carrier privilege on active subscriptions. When called, the platform internally resolves the port index through a three-choice selection dialog to disable the selected active subscription if there are no available ports. Apps targeting Android 13 and higher must not use this API to disable a subscription by passing an invalid subscription ID; instead they must use the switchToSubscription method (added in Android 13) with the port index specified.
  • (Android 13 and higher) switchToSubscription(int subscriptionId, int portIndex, PendingIntent callback): Switches to a given subscription. Calling apps with carrier privilege over the active subscriptions can specify which port to enable the subscription on.
  • (Android 13 and higher) isSimPortAvailable: Returns whether the passing port index is available. A port is available if it has no subscription enabled or the calling app has carrier privilege over the subscription installed on the selected port.

EuiccService

  • (Android 13 and higher) onSwitchToSubscriptionWithPort: Switches to a given subscription on a specified port. LPA implementation must support this on Android 13 and higher.

TelephonyManager

User interface

To resolve the ambiguity of eSIM port selection, on devices supporting MEP, users must be able to disable one of the active subscriptions to enable a new subscription. In Android 13, AOSP includes a user flow with a three-choice dialog that can be applied to subscription enabling user flows from the Settings app. Figure 6 shows an example of this UX flow.

User flow for MEP SIM subscription

Figure 6. User flow for enabling SIM subscription

Feature flags

To support MEP, devices must declare the following feature flags:

LPA implementation

To support MEP, ensure that your LPA implementation meets the following requirements:

  • Implements the APIs from EuiccService to support multiple ports.
  • Uses the APIs for port selection and profile enabling.
  • Provides UX allowing carriers apps to enable profiles on selected ports.

Validation

To test your implementation of the MEP feature, make sure the builds pass the following CTS test cases (for public APIs): /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts.

Device manufacturers should also work with their modem, eUICC chip, and eSIM OS vendors to ensure that the device can do the following:

  • Two eSIM profiles can be enabled and attached to two different networks.
  • eSIM profiles can be activated and deactivated on any eSIM port.
  • There's a UX flow triggered by the carrier app allowing users to switch profiles.

Recommendation for carriers

To ensure that users don't lose service when they move eSIM profiles from one port to another, we recommend that carriers provide support for the following:

  • Fluid mapping of IMEI and SIM
  • Multiple ICCIDs or SIMs for each eUICC identifier (EID)