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.
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.
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.
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.
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.
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, useUiccPortInfo.getIccId()
instead.
(Android 13 and higher) UiccPortInfo
getIccId
: Returns the ICCID if there is an enabled subscription on this port.getPortIndex
: Returns the port index.getLogicalSlotIndex
: Returns the active logical modem stack index.
SubscriptionInfo
- (Android 13 and higher)
getPortIndex
: Returns the port index on which the subscription is enabled. If the subscription is disabled, returnsINVALID_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 theswitchToSubscription
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
- (Android 13 and higher)
getSimApplicationState
: Returns a constant indicating the state of the card application. This API passes both a physical slot index and a port index. ThegetSimApplicationState(int physicalSlotIndex)
method (deprecated) passes only the physical slot index to get asimApplicationState
object. - (Android 13 and higher)
setSimSlotMapping(Collection<UiccSlotMapping> slots)
: Maps the logical slots to physical slots and ports. - (Android 13 and higher)
Collection<UiccSlotMapping> getSimSlotMapping
: Gets the mapping from logical slots to physical sim slots and port indexes.
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.
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)