Вы можете реализовать свой собственный LPA, который должен быть подключен к API Android Euicc. В следующих разделах дается краткий обзор создания приложения LPA и его интеграции с системой Android.
Требования к оборудованию / модему
LPA и операционная система eSIM на микросхеме eUICC должны поддерживать как минимум GSMA RSP (Remote SIM Provisioning) v2.0 или v2.2. Также следует запланировать использование серверов SM-DP + и SM-DS, которые имеют соответствующую версию RSP. Для получения подробной архитектуры RSP см. Спецификацию архитектуры RSP GSMA.21 SGP.21 .
Кроме того, для интеграции с API eUICC в Android 9 модем устройства должен отправлять возможности терминала с кодированной поддержкой eUICC (локальное управление профилем и загрузка профиля). Также необходимо реализовать следующие API:
- IRadio HAL v1.1: setSimPower
- IRadio HAL v1.2: getIccCardStatus
- IRadioConfig HAL v1.0: getSimSlotsStatus
Модем должен распознавать eSIM с включенным профилем загрузки по умолчанию в качестве действующей SIM-карты и поддерживать питание SIM-карты включенным.
Полный список требований к модему см. В разделе Требования к модему для поддержки eSIM .
EuiccService
Создание приложения LPA состоит из двух отдельных компонентов (оба могут быть реализованы в одном и том же APK): внутренний интерфейс LPA и интерфейс LPA или LUI.
Для реализации бэкэнда LPA вы должны расширить EuiccService
и объявить эту службу в файле манифеста. Служба должна требовать android.permission.BIND_EUICC_SERVICE
разрешения системы, чтобы гарантировать, что только система может связываться с ней. Служба также должна включать фильтр намерений с android.service.euicc.EuiccService
действием. Приоритет фильтра намерений должен быть установлен на ненулевое значение в случае, если на устройстве присутствует несколько реализаций. Например:
<service
android:name=".EuiccServiceImpl"
android:permission="android.permission.BIND_EUICC_SERVICE">
<intent-filter android:priority="100">
<action android:name="android.service.euicc.EuiccService" />
</intent-filter>
</service>
Внутренне платформа Android определяет активный LPA и взаимодействует с ним по мере необходимости для поддержки API-интерфейсов Android eUICC. PackageManager
запрашивается для всех приложений с android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS
разрешением, которое указывает сервис для android.service.euicc.EuiccService
действия. Сервис с наивысшим приоритетом выбран. Если служба не найдена, поддержка LPA отключена.
Для реализации LUI необходимо предоставить действие для следующих действий:
android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS
android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION
Как и в случае службы, каждое действие должно требоватьandroid.permission.BIND_EUICC_SERVICE
разрешения системы. У каждого должен быть фильтр намерений с соответствующим действием, android.service.euicc.category.EUICC_UI
категорией и ненулевым приоритетом. Подобная логика используется для выбора реализаций этих действий, как и при выборе реализации EuiccService
. Например:
<activity android:name=".MyLuiActivity"
android:exported="true"
android:permission="android.permission.BIND_EUICC_SERVICE">
<intent-filter android:priority="100">
<action android:name="android.service.euicc.action.MANAGE_EMBEDDED_SUBSCRIPTIONS" />
<action android:name="android.service.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.service.euicc.category.EUICC_UI" />
</intent-filter>
</activity>
Это подразумевает, что пользовательский интерфейс, реализующий эти экраны, может отличаться от того, который реализует APK EuiccService
. Независимо от того, иметь ли один APK или несколько APK (например, тот, который реализует, EuiccService
и тот, который обеспечивает действия LUI), это выбор дизайна.
EuiccCardManager
EuiccCardManager
интерфейс для связи с чипом eSIM Он обеспечивает функции ES10 (как описано в спецификации GSMA RSP) и обрабатывает команды запроса / ответа APDU низкого уровня, а также синтаксический анализ ASN.1. EuiccCardManager
является системным API и может вызываться только системными приложениями.
Рисунок 2. И приложение-носитель, и LPA используют Euicc API
API для работы с профилем EuiccCardManager
требуют, чтобы вызывающая сторона была LPA. Это обеспечивается платформой Android. Это означает, что вызывающая сторона должна расширить EuiccService
и быть объявлена в вашем файле манифеста, как описано в предыдущих разделах.
Подобно тому EuiccManager
, чтобы использовать EuiccCardManager
API, ваш LPA должен сначала получить экземпляр с EuiccCardManager
помощью Context#getSystemService
:
EuiccCardManager cardMgr = (EuiccCardManager) context.getSystemService(Context.EUICC_CARD_SERVICE);
Затем, чтобы получить все профили на eUICC:
ResultCallback<EuiccProfileInfo[]> callback =
new ResultCallback<EuiccProfileInfo[]>() {
@Override
public void onComplete(int resultCode,
EuiccProfileInfo[] result) {
if (resultCode == EuiccCardManagerReflector.RESULT_OK) {
// handle result
} else {
// handle error
}
}
};
cardMgr.requestAllProfiles(eid, AsyncTask.THREAD_POOL_EXECUTOR, callback);
Внутренне EuiccCardManager
связывается с EuiccCardController
(который выполняется в процессе телефона) через интерфейс AIDL, и каждый EuiccCardManager
метод получает свой обратный вызов от процесса телефона через свой отдельный выделенный интерфейс AIDL. При использовании EuiccCardManager
API вызывающая сторона (LPA) должна предоставить Executor
сквозную функцию, через которую вызывается обратный вызов. Это Executor
может выполняться в одном потоке или в пуле потоков по вашему выбору.
Большинство EuiccCardManager
API имеют одинаковый шаблон использования. Например, чтобы загрузить пакет привязанного профиля в eUICC:
...
cardMgr.loadBoundProfilePackage(eid, boundProfilePackage,
AsyncTask.THREAD_POOL_EXECUTOR, callback);
Переключиться на другой профиль с заданным ICCID:
...
cardMgr.switchToProfile(eid, iccid, true /* refresh */,
AsyncTask.THREAD_POOL_EXECUTOR, callback);
Получить адрес SM-DP + по умолчанию от чипа eUICC:
...
cardMgr.requestDefaultSmdpAddress(eid, AsyncTask.THREAD_POOL_EXECUTOR,
callback);
Получить список уведомлений о данных событиях уведомления:
...
cardMgr.listNotifications(eid,
EuiccNotification.Event.INSTALL
| EuiccNotification.Event.DELETE /* events */,
AsyncTask.THREAD_POOL_EXECUTOR, callback);