На устройствах под управлением Android 13 и более поздних версий Android поддерживает несколько включённых профилей (MEP) для eUICC. Эта функция позволяет устройствам поддерживать две SIM-карты, используя один чип eSIM, который может иметь несколько профилей SIM-карт и одновременно подключаться к двум разным операторам. Производители устройств должны сотрудничать с поставщиками SoC и чипсетов eSIM для интеграции этой функции в свои устройства.
Фон
На устройствах под управлением Android 12 и более ранних версий AOSP предоставляет ограниченную поддержку, позволяя одной eSIM поддерживать несколько профилей одновременно. Несмотря на значительную экономию места и средств, обеспечиваемую eSIM, отсутствие поддержки двух SIM-карт не позволяет производителям устройств выпускать устройства, поддерживающие только eSIM. Чтобы обеспечить поддержку двух SIM-карт на устройстве, поддерживающем только eSIM, производителям устройств приходится устанавливать два модуля eSIM, что увеличивает стоимость материалов и усложняет управление подписками. Функция MEP, доступная в AOSP, начиная с Android 13, решает эту проблему.
архитектура eUICC
В этом разделе описывается архитектура чипа eSIM для устройств с MEP для различных версий Android и архитектура чипа eSIM для устройств без MEP.
Андроид 14
Для устройств под управлением Android 14 и выше Android поддерживает параметры MEP-A1 и MEP-B для выбора корневого домена безопасности эмитента (ISD-R) и выбора портов eSIM, как указано в GSMA SGP V22 3.0 . Ниже описаны модели выбора MEP-A1 и MEP-B ISD-R.
MEP-A1: ISD-R выбран на порту 0 (командный порт — 0), а профили выбираются на портах eSIM 1 и выше. Команды ES10 всегда отправляются на порт 0, а командный порт и целевой порт всегда различаются. Порт выбирается LPA.

Рисунок 1. Модель выбора ISD-R MEP-A1
MEP-B: ISD-R выбран на любом порту, и любому порту можно назначить профиль. Команды включения и выключения отправляются на порт, где требуется включить или отключить профиль (где ожидается обновление). Порт команды и целевой порт всегда совпадают.

Рисунок 2. Модель выбора MEP-B ISD-R
Андроид 13
В Android 13 и более поздних версиях на устройствах с поддержкой MEP слот eSIM содержит несколько портов eUICC, каждый из которых может иметь активный профиль. Как показано на рисунке 3, в этой архитектуре один слот eUICC (один физический слот) поддерживает режим ожидания двух SIM-карт (DSDS) благодаря подключению каждого порта eUICC к модему. HAL и API Android 13 не зависят от варианта MEP.

Рисунок 3. Архитектура чипа eSIM с поддержкой MEP (Android 13 или выше)
Android 12 и ниже
Для устройств под управлением Android 12 или ниже без MEP, как показано на рисунке 4, слот eSIM поддерживает только один включенный профиль одновременно, и устройство не может поддерживать DSDS.

Рисунок 4. Архитектура чипа eSIM без поддержки MEP (Android 12 или ниже)
Поток информации API для нескольких включенных профилей
На рисунке 5 показан информационный поток для MEP для eUICC в Android 13. Фреймворк телефонии включает класс UiccPort , представляющий физическую структуру eUICC. Класс UiccPort используется для всех типов SIM-карт: физической SIM-карты (pSIM), интегрированной SIM-карты (iSIM) и встроенной SIM-карты (eSIM). Для eUICC с несколькими портами один объект UiccSlot и объект UiccCard сопоставляются с несколькими экземплярами UiccPort . Каждый экземпляр UiccPort может быть связан максимум с одним экземпляром UiccProfile . Этот поток позволяет UiccPort сопоставляться с логическим слотом, а UiccSlot (физический слот) — с несколькими логическими слотами.

Рисунок 5. Информационный поток для eUICC с поддержкой MEP
Выполнение
В этом разделе описывается, как реализовать функцию MEP, включая требования HAL, API и пользовательский интерфейс. Производителям устройств следует сотрудничать с поставщиками SoC и чипсетов eSIM для поддержки MEP.
Требования HAL
Для поддержки MEP для eUICC реализуйте следующие API IRadio AIDL HAL, расположенные в /platform/hardware/interfaces/radio/aidl/aidl_api .
Устройства под управлением Android 14 или выше должны использовать версию HAL IRadio 2.1, которая использует MultipleEnabledProfileMode (модель выбора ISD-R, поддерживаемая модемом или eUICC) и передает информацию о командах ES10 APDU во время операций логического канала ICC.
Статус карты
Модем должен поддерживать API CardStatus в ответе на метод getIccCardStatusResponse . Ответ должен включать индекс порта и индекс физического слота, указанные в SimPortSlotMapping .
Для устройств под управлением Android 14 и выше модем должен пройти поддерживаемый режим MEP со всеми событиями CardStatus.
SimSlotStatus
Модем должен поддерживать API SimSlotStatus в ответ на метод getSimSlotsStatus . Статус слота SIM-карты включает массив интерфейса SimPortInfo , включающий индекс порта, ICCID для включённого профиля и состояние порта. Модем должен возвращать как минимум два объекта SimPortInfo .
Для устройств под управлением Android 14 и выше модем должен пройти поддерживаемый режим MEP со всеми событиями CardStatus.
setSimSlotMapping
Метод setSimSlotMapping должен передавать массив SimPortSlotMapping . Индекс массива — это логический слот, а SimPortSlotMapping определяет соответствующий сопоставленный порт и индекс физического слота. Метод setSimSlotMapping устанавливает сопоставление портов с логическими слотами. Приложение LPA использует этот метод для выбора активного порта.
API, поддерживающие MEP для eUICC
Устройства Android, поддерживающие несколько включенных профилей в рамках стека телефонии AOSP, должны поддерживать следующие API.
UiccCardInfo
- (Android 13 и выше)
isMultipleEnabledProfilesSupported: Возвращает, поддерживает ли эта UICC MEP. - (Android 13 и выше)
getPorts: возвращает список всех возможных портов для конкретной UICC-карты. Если UICC — это pSIM или eSIM, не поддерживающая MEP, возвращает список из одного элемента. - (Устарело)
getIccId: возвращает ICCID. Поскольку UICC-карта может иметь несколько ICCID для устройств с MEP, используйте вместо неёUiccPortInfo.getIccId().
(Android 13 и выше) UiccPortInfo
-
getIccId: Возвращает ICCID, если на этом порту включена подписка. -
getPortIndex: возвращает индекс порта. -
getLogicalSlotIndex: возвращает индекс активного логического стека модема.
Информация о подписке
- (Android 13 и выше)
getPortIndex: возвращает индекс порта, на котором включена подписка. Если подписка отключена, возвращаетINVALID_PORT_ID -1.
EuiccManager
-
switchToSubscription: переключает на заданную подписку. Используется приложениями, не имеющими привилегий оператора связи для активных подписок. При вызове платформа внутренне определяет индекс порта через диалоговое окно с тремя вариантами выбора, чтобы отключить выбранную активную подписку, если доступных портов нет. Приложения для Android 13 и более поздних версий не должны использовать этот API для отключения подписки путём передачи недопустимого идентификатора подписки ; вместо этого они должны использовать методswitchToSubscription(добавленный в Android 13) с указанным индексом порта. - (Android 13 и выше)
switchToSubscription(int subscriptionId, int portIndex, PendingIntent callback): переключает на заданную подписку. Вызов приложений с привилегиями оператора связи для активных подписок может указать порт, на котором следует включить подписку. - (Android 13 и выше)
isSimPortAvailable: Возвращает доступность индекса порта передачи. Порт доступен, если для него не активирована подписка или вызывающее приложение имеет привилегию оператора связи для подписки, установленной на выбранном порту.
EuiccService
- (Android 13 и выше)
onSwitchToSubscriptionWithPort: переключает на заданную подписку на указанном порту. Реализация LPA должна поддерживать эту функцию на Android 13 и выше.
Менеджер телефонии
- (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 соответствует следующим требованиям:
- Реализует API EuiccService для поддержки нескольких портов.
- Использует API для выбора порта и включения профиля.
- Обеспечивает пользовательский интерфейс, позволяющий приложениям операторов включать профили на выбранных портах.
Проверка
Чтобы протестировать реализацию функции MEP, убедитесь, что сборки проходят следующие тестовые случаи CTS (для публичных API): /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts .
Производители устройств также должны сотрудничать с поставщиками модемов, чипов eUICC и ОС eSIM, чтобы гарантировать, что устройство сможет выполнять следующие функции:
- Можно включить два профиля eSIM и прикрепить их к двум разным сетям.
- Профили eSIM можно активировать и деактивировать на любом порту eSIM.
- Приложение оператора связи запускает UX-поток, позволяющий пользователям переключать профили.
Рекомендация для перевозчиков
Чтобы гарантировать, что пользователи не потеряют обслуживание при перемещении профилей eSIM из одного порта в другой, мы рекомендуем операторам связи предоставлять поддержку по следующим вопросам:
- Жидкое сопоставление IMEI и SIM-карты
- Несколько ICCID или SIM-карт для каждого идентификатора eUICC (EID)