Android 13 以降を搭載したデバイスでは、eUICC 用の複数の有効なプロファイル(MEP)がサポートされます。この機能により、デバイスは単一の eSIM チップを使用したデュアル SIM をサポートできます。その場合、eSIM チップは複数の SIM プロファイルを持つことができ、2 つの異なる携帯通信会社に同時に接続することが可能です。デバイス メーカーがこの機能をデバイスに組み込むには、SoC ベンダーおよび eSIM チップセット ベンダーと協力する必要があります。
背景
Android 12 以前を搭載したデバイスの場合、AOSP は、単一の eSIM で複数のプロファイルを同時にサポートできる制限付きサポートを提供します。eSIM はスペースとコストを大幅に削減しますが、デュアル SIM のサポートの欠如は、デバイス メーカーが eSIM 専用デバイスを採用することを妨げる要因になります。デバイス メーカーが eSIM 専用デバイスでデュアル SIM をサポートするには、2 つの eSIM 要素をデバイスに組み込む必要があります。これは、部品表(BOM)のコストを増大させ、サブスクリプション管理のユーザー エクスペリエンスの低下を招きます。Android 13 以降では、AOSP で利用可能な MEP 機能によってこの問題が解決されています。
eUICC アーキテクチャの変更
このセクションでは、Android 13 を搭載したデバイス(MEP あり)と Android 12 以前を搭載したデバイス(MEP なし)における eSIM チップ アーキテクチャの比較を示します。図 1 に示すように、MEP をサポートするデバイスでは、eSIM スロットに複数の eUICC ポートがあり、各ポートに有効なプロファイルを設定できます。このアーキテクチャでは、各 eUICC ポートをモデム ベースバンドにリンクすることにより、単一の eUICC(単一の物理スロット)がデュアル SIM デュアル スタンバイ(DSDS)をサポートします。図 2 は、MEP がないデバイスの eSIM チップ アーキテクチャを示しています。
図 1. MEP をサポートする eSIM チップ アーキテクチャ(Android 13 以降)
図 2. MEP をサポートしない eSIM チップ アーキテクチャ(Android 12 以前)
複数の有効なプロファイルの API 情報フロー
図 3 は、Android 13 における eUICC 用 MEP の情報フローを示しています。電話通信フレームワークには、eUICC 上の物理構造を表す UiccPort
クラスがあります。UiccPort
クラスは、物理 SIM(pSIM)、統合 SIM(iSIM)、埋め込み SIM(eSIM)というすべてのタイプの SIM カードで使用されます。複数のポートがある eUICC では、単一の UiccSlot
オブジェクトと UiccCard
オブジェクトが複数の UiccPort
インスタンスにマッピングされます。各 UiccPort
インスタンスがリンクできる UiccProfile
インスタンスは最大で 1 つです。このフローでは、UiccPort
を 1 つの論理スロットにマッピングし、UiccSlot
(物理スロット)を複数の論理スロットにマッピングできます。
図 3. MEP をサポートする eUICC の情報フロー
実装
このセクションでは、MEP 機能を実装する方法を示し、HAL の要件、API、ユーザー インターフェースについて詳しく説明します。デバイス メーカーが MEP をサポートするには、SoC ベンダーおよび eSIM チップセット ベンダーと協力する必要があります。
HAL の要件
eUICC 用の MEP をサポートするには、以下の IRadio 2.0 AIDL HAL API を実装します。
CardStatus
モデムは、getIccCardStatusResponse
メソッドへのレスポンスとして、CardStatus
API をサポートする必要があります。レスポンスは、SimPortSlotMapping
で指定されるポート インデックスと物理スロット インデックスを含む必要があります。
SimSlotStatus
モデムは、getSimSlotsStatus
メソッドへのレスポンスとして、SimSlotStatus
API をサポートする必要があります。SIM スロット ステータスには、SimPortInfo
インターフェースの配列が含まれます。この配列には、ポート インデックス、有効なプロファイルの ICCID、ポートの状態が格納されています。モデムは、少なくとも 2 つの SimPortInfo
オブジェクトを返す必要があります。
setSimSlotMapping
setSimSlotMapping
メソッドは、SimPortSlotMapping
の配列を渡す必要があります。配列のインデックスは論理スロットであり、SimPortSlotMapping
は対応するマッピング済みポートと物理スロット インデックスを指定します。setSimSlotMapping
メソッドは、ポートから論理スロットへのマッピングを設定します。LPA アプリは、このメソッドを使用してアクティブなポートを選択します。
eUICC 用の MEP をサポートする API
AOSP テレフォニー スタックの一部として複数の有効なプロファイルをサポートする Android デバイスは、以下の API をサポートする必要があります。
UiccCardInfo
- (Android 13 以降)
isMultipleEnabledProfilesSupported
: この UICC が MEP をサポートするかどうかを返します。 - (Android 13 以降)
getPorts
: 特定の UICC で使用可能なすべてのポートのリストを返します。UICC が MEP をサポートしない pSIM または eSIM である場合は、1 つの要素のみを含むリストを返します。 - (非推奨)
getIccId
: ICCID を返します。UICC は MEP をサポートするデバイスで複数の ICCID を持つことができるので、代わりにUiccPortInfo.getIccId()
を使用してください。
(Android 13 以降)UiccPortInfo
getIccId
: このポートに有効なサブスクリプションがある場合は、ICCID を返します。getPortIndex
: ポート インデックスを返します。getLogicalSlotIndex
: アクティブな論理モデムスタック インデックスを返します。
SubscriptionInfo
- (Android 13 以降)
getPortIndex
: サブスクリプションが有効になっているポート インデックスを返します。サブスクリプションが無効になっている場合は、INVALID_PORT_ID -1
を返します。
EuiccManager
switchToSubscription
: 指定されたサブスクリプションに切り替えます。アクティブなサブスクリプションに対する携帯通信会社権限がないアプリで使用されます。このメソッドが呼び出されると、プラットフォームは、三択式の選択ダイアログを通じてポート インデックスを内部的に解決し、使用可能なポートがない場合は、選択されたアクティブなサブスクリプションを無効にします。Android 13 以降をターゲットとするアプリでは、無効なサブスクリプション ID を渡してサブスクリプションを無効にするためにこの API を使用してはなりません。代わりに、ポート インデックスを指定して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 により三択式のダイアログを含むユーザーフローが用意されています。このダイアログは、設定アプリからユーザーフローを有効にするサブスクリプションに適用できます。図 4 は、この UX フローの例を示しています。
図 4. 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 OS のベンダーと協力して、デバイスで以下を実現する必要があります。
- 2 つの eSIM プロファイルを有効にして 2 つの異なるネットワークに接続できる。
- 任意の eSIM ポートで eSIM プロファイルを有効または無効にできる。
- 携帯通信会社アプリによってトリガーされ、ユーザーがプロファイルを切り替えることができる UX フローが存在する。