برای دستگاههایی که اندروید ۱۳ یا بالاتر را اجرا میکنند، اندروید از چندین پروفایل فعال (MEP) برای eUICC پشتیبانی میکند. این ویژگی به دستگاهها اجازه میدهد تا با استفاده از یک تراشه eSIM، از دو سیمکارت پشتیبانی کنند که میتواند چندین پروفایل سیمکارت داشته باشد و همزمان به دو اپراتور مختلف متصل شود. تولیدکنندگان دستگاه باید با فروشندگان SoC و فروشندگان چیپست eSIM همکاری کنند تا این ویژگی را در دستگاههای خود ادغام کنند.
پیشینه
در دستگاههایی که اندروید ۱۲ و پایینتر را اجرا میکنند، AOSP پشتیبانی محدودی در پشتیبانی همزمان از چندین پروفایل توسط یک eSIM ارائه میدهد. با وجود صرفهجویی قابل توجه در فضا و هزینه که eSIM ارائه میدهد، این عدم پشتیبانی از دو سیمکارت مانع از آن میشود که تولیدکنندگان دستگاه، دستگاههایی را که فقط از eSIM پشتیبانی میکنند، به بازار عرضه کنند. برای ارائه پشتیبانی از دو سیمکارت در یک دستگاه فقط از eSIM، تولیدکنندگان دستگاه باید دو عنصر eSIM را در دستگاه قرار دهند که این امر هزینههای صورتحساب مواد (BOM) را افزایش میدهد و منجر به تجربه کاربری ضعیف برای مدیریت اشتراک میشود. ویژگی MEP موجود در AOSP از اندروید ۱۳ این مشکل را برطرف میکند.
معماری eUICC
این بخش معماری تراشه eSIM را برای دستگاههای دارای MEP برای نسخههای مختلف اندروید و معماری تراشه eSIM را برای دستگاههای بدون MEP شرح میدهد.
اندروید ۱۴
برای دستگاههایی که اندروید ۱۴ یا بالاتر را اجرا میکنند، اندروید از گزینههای MEP-A1 و MEP-B برای انتخاب ریشه دامنه امنیتی صادرکننده (ISD-R) و انتخاب پورتهای eSIM مطابق با GSMA SGP V22 3.0 پشتیبانی میکند. در ادامه مدلهای انتخاب ISD-R مربوط به MEP-A1 و MEP-B شرح داده شده است:
- MEP-A1: ISD-R روی پورت 0 انتخاب میشود (پورت فرمان 0 است) و پروفایلها روی پورتهای 1 و بالاتر eSIM انتخاب میشوند. دستورات ES10 همیشه به پورت 0 ارسال میشوند و پورت فرمان و پورت هدف همیشه متفاوت هستند. LPA پورت را انتخاب میکند.  - شکل 1. مدل انتخاب ISD-R در MEP-A1 
- MEP-B: ISD-R روی هر پورتی انتخاب میشود و میتوان به هر پورتی یک پروفایل اختصاص داد. دستورات فعال و غیرفعال به پورتی که پروفایل باید در آن فعال یا غیرفعال شود (جایی که بهروزرسانی در انتظار است) ارسال میشوند. پورت فرمان و پورت هدف همیشه یکسان هستند.  - شکل ۲. مدل انتخاب ISD-R مربوط به MEP-B 
اندروید ۱۳
در اندروید ۱۳ یا بالاتر، در دستگاههایی که از MEP پشتیبانی میکنند، اسلات eSIM شامل چندین پورت eUICC است که هر پورت میتواند یک پروفایل فعال داشته باشد. همانطور که در شکل ۳ نشان داده شده است، با این معماری، یک eUICC واحد (یک اسلات فیزیکی واحد) با اتصال هر پورت eUICC به یک باند پایه مودم، از حالت آماده به کار دوگانه دو سیم کارت (DSDS) پشتیبانی میکند. HAL و APIهای اندروید ۱۳ مستقل از نوع MEP هستند.

شکل ۳. معماری تراشه eSIM با پشتیبانی از MEP (اندروید ۱۳ یا بالاتر)
اندروید ۱۲ و پایینتر
برای دستگاههایی که اندروید ۱۲ یا پایینتر بدون MEP دارند، همانطور که در شکل ۴ نشان داده شده است، اسلات eSIM فقط از یک پروفایل فعال در یک زمان پشتیبانی میکند. این بدان معناست که دستگاه نمیتواند از DSDS پشتیبانی کند.

شکل ۴. معماری تراشه eSIM بدون پشتیبانی از MEP (اندروید ۱۲ یا پایینتر)
جریان اطلاعات API برای چندین پروفایل فعال
 شکل 5 جریان اطلاعات برای MEP برای eUICC در اندروید 13 را شرح میدهد. چارچوب تلفنی شامل کلاس UiccPort است که ساختار فیزیکی روی eUICC را نشان میدهد. کلاس UiccPort برای انواع سیمکارتها استفاده میشود: سیمکارت فیزیکی (pSIM)، سیمکارت یکپارچه (iSIM) و سیمکارت تعبیهشده (eSIM). برای یک eUICC با چندین پورت، یک شیء UiccSlot و شیء UiccCard به چندین نمونه UiccPort نگاشت میشوند. هر نمونه UiccPort میتواند حداکثر به یک نمونه UiccProfile لینک شود. این جریان به UiccPort اجازه میدهد تا به یک اسلات منطقی نگاشت شود و UiccSlot (اسلات فیزیکی) به چندین اسلات منطقی نگاشت شود. 

شکل ۵. جریان اطلاعات برای eUICC با پشتیبانی MEP
پیادهسازی
این بخش نحوه پیادهسازی ویژگی MEP، شامل جزئیات مربوط به الزامات HAL، APIها و رابط کاربری را شرح میدهد. تولیدکنندگان دستگاه باید برای پشتیبانی از MEP با فروشندگان SoC و فروشندگان چیپست eSIM همکاری کنند.
الزامات HAL
 برای پشتیبانی از MEP برای eUICC، APIهای IRadio AIDL HAL زیر را که در /platform/hardware/interfaces/radio/aidl/aidl_api قرار دارند، پیادهسازی کنید.
 دستگاههایی که اندروید ۱۴ یا بالاتر دارند باید از نسخه IRadio 2.1 رابطهای HAL استفاده کنند که از MultipleEnabledProfileMode (مدل انتخاب ISD-R که توسط مودم یا eUICC پشتیبانی میشود) استفاده میکنند و اطلاعات دستور ES10 APDU را در طول عملیات کانال منطقی ICC منتقل میکنند.
وضعیت کارت
 مودم باید از API CardStatus به عنوان پاسخ به متد getIccCardStatusResponse پشتیبانی کند. پاسخ باید شامل شاخص پورت و شاخص اسلات فیزیکی مشخص شده توسط SimPortSlotMapping باشد.
برای دستگاههایی که اندروید ۱۴ یا بالاتر دارند، مودم باید حالت MEP پشتیبانیشده را با تمام رویدادهای CardStatus پشت سر بگذارد.
وضعیت اسلات سیمز
 مودم باید از API SimSlotStatus به عنوان پاسخی به متد getSimSlotsStatus پشتیبانی کند. وضعیت اسلات سیمکارت شامل آرایهای از رابط SimPortInfo است که شامل اندیس پورت، ICCID برای پروفایل فعالشده و وضعیت پورت میشود. مودم باید حداقل دو شیء SimPortInfo را برگرداند.
برای دستگاههایی که اندروید ۱۴ یا بالاتر دارند، مودم باید حالت MEP پشتیبانیشده را با تمام رویدادهای CardStatus پشت سر بگذارد.
نگاشت اسلات setSim
 متد setSimSlotMapping باید آرایهای از SimPortSlotMapping را ارسال کند. اندیس آرایه، اسلات منطقی است و SimPortSlotMapping پورت نگاشت شده و اندیس اسلات فیزیکی مربوطه را مشخص میکند. متد setSimSlotMapping نگاشت از پورتها به اسلاتهای منطقی را تنظیم میکند. برنامه LPA از این متد برای انتخاب پورت فعال استفاده میکند.
رابطهای برنامهنویسی کاربردی (API) که از MEP برای eUICC پشتیبانی میکنند
دستگاههای اندرویدی که از چندین پروفایل فعال به عنوان بخشی از پشته تلفنی AOSP پشتیبانی میکنند، ملزم به پشتیبانی از APIهای زیر هستند.
اطلاعات کارت Uicc
-  (اندروید ۱۳ و بالاتر) isMultipleEnabledProfilesSupported: برمیگرداند که آیا این UICC از MEP پشتیبانی میکند یا خیر.
-  (اندروید ۱۳ و بالاتر) getPorts: فهرست تمام پورتهای ممکن برای یک UICC خاص را برمیگرداند. اگر UICC یک pSIM یا eSIM باشد که از MEP پشتیبانی نمیکند، فهرستی از یک عنصر را برمیگرداند.
-  (منسوخ شده) getIccId: یک ICCID را برمیگرداند. از آنجا که یک UICC میتواند بیش از یک ICCID برای دستگاههای دارای MEP داشته باشد، به جای آن ازUiccPortInfo.getIccId()استفاده کنید.
(اندروید ۱۳ و بالاتر) UiccPortInfo
-  getIccId: در صورت وجود اشتراک فعال روی این پورت، ICCID را برمیگرداند.
-  getPortIndex: اندیس پورت را برمیگرداند.
-  getLogicalSlotIndex: اندیس پشته مودم منطقی فعال را برمیگرداند.
اطلاعات اشتراک
-  (اندروید ۱۳ و بالاتر) getPortIndex: اندیس پورتی را که اشتراک روی آن فعال است برمیگرداند. اگر اشتراک غیرفعال باشد،INVALID_PORT_ID -1برمیگرداند.
مدیر اجرایی
-  switchToSubscription: به یک اشتراک مشخص سوئیچ میکند. توسط برنامههایی استفاده میشود که امتیاز اپراتوری روی اشتراکهای فعال ندارند. وقتی فراخوانی میشود، پلتفرم به صورت داخلی شاخص پورت را از طریق یک کادر محاورهای سه گزینهای حل میکند تا در صورت عدم وجود پورتهای موجود، اشتراک فعال انتخاب شده را غیرفعال کند. برنامههایی که اندروید ۱۳ و بالاتر را هدف قرار میدهند، نباید از این API برای غیرفعال کردن اشتراک با ارسال یک شناسه اشتراک نامعتبر استفاده کنند؛ در عوض، آنها باید از متدswitchToSubscription(که در اندروید ۱۳ اضافه شده است) با شاخص پورت مشخص شده استفاده کنند.
-  (اندروید ۱۳ و بالاتر) switchToSubscription(int subscriptionId, int portIndex, PendingIntent callback): به یک اشتراک معین سوئیچ میکند. برنامههایی که دارای امتیاز اپراتور روی اشتراکهای فعال هستند، میتوانند پورتی را که اشتراک روی آن فعال میشود، مشخص کنند.
-  (اندروید ۱۳ و بالاتر) isSimPortAvailable: مشخص میکند که آیا شاخص پورت عبوری در دسترس است یا خیر. یک پورت در صورتی در دسترس است که هیچ اشتراکی روی آن فعال نباشد یا برنامهی فراخوانی، امتیاز اپراتور را روی اشتراک نصبشده روی پورت انتخابشده داشته باشد.
خدمات Euicc
-  (اندروید ۱۳ و بالاتر) onSwitchToSubscriptionWithPort: به یک اشتراک معین روی یک پورت مشخص سوئیچ میکند. پیادهسازی LPA باید از این قابلیت در اندروید ۱۳ و بالاتر پشتیبانی کند.
مدیر تلفن
-  (اندروید ۱۳ و بالاتر) getSimApplicationState: یک ثابت را برمیگرداند که وضعیت برنامه کارت را نشان میدهد. این API هم یک شاخص اسلات فیزیکی و هم یک شاخص پورت را ارسال میکند. متدgetSimApplicationState(int physicalSlotIndex)(منسوخ شده) فقط شاخص اسلات فیزیکی را برای دریافت یک شیءsimApplicationStateارسال میکند.
-  (اندروید ۱۳ و بالاتر) setSimSlotMapping(Collection<UiccSlotMapping> slots): اسلاتهای منطقی را به اسلاتها و پورتهای فیزیکی نگاشت میکند.
-  (اندروید ۱۳ و بالاتر) Collection<UiccSlotMapping> getSimSlotMapping: نگاشت از اسلاتهای منطقی به اسلاتهای سیمکارت فیزیکی و شاخصهای پورت را دریافت میکند.
رابط کاربری
برای رفع ابهام در انتخاب پورت eSIM، در دستگاههایی که از MEP پشتیبانی میکنند، کاربران باید بتوانند یکی از اشتراکهای فعال را غیرفعال کنند تا اشتراک جدیدی فعال شود. در اندروید ۱۳، AOSP شامل یک جریان کاربری با یک کادر محاورهای سه گزینهای است که میتواند برای جریانهای کاربری فعالکننده اشتراک از برنامه تنظیمات اعمال شود. شکل ۶ نمونهای از این جریان UX را نشان میدهد.

شکل ۶. جریان کاربر برای فعالسازی اشتراک سیمکارت
پرچمهای ویژه
برای پشتیبانی از MEP، دستگاهها باید feature flag های زیر را اعلان کنند:
پیادهسازی LPA
برای پشتیبانی از MEP، مطمئن شوید که پیادهسازی LPA شما الزامات زیر را برآورده میکند:
- APIهای EuiccService را برای پشتیبانی از چندین پورت پیادهسازی میکند.
- از APIها برای انتخاب پورت و فعالسازی پروفایل استفاده میکند.
- تجربه کاربری (UX) را فراهم میکند که به برنامههای اپراتورها اجازه میدهد پروفایلها را روی پورتهای انتخابشده فعال کنند.
اعتبارسنجی
 برای آزمایش پیادهسازی ویژگی MEP، مطمئن شوید که نسخههای ساختهشده، موارد آزمایش CTS زیر (برای APIهای عمومی) را با موفقیت پشت سر میگذارند: /platform/cts/tests/tests/telephony/current/src/android/telephony/euicc/cts .
تولیدکنندگان دستگاه همچنین باید با فروشندگان مودم، تراشه eUICC و سیستم عامل eSIM خود همکاری کنند تا تأیید کنند که دستگاه میتواند موارد زیر را انجام دهد:
- دو پروفایل eSIM میتوانند فعال شوند و به دو شبکه مختلف متصل شوند.
- پروفایلهای eSIM را میتوان در هر پورت eSIM فعال و غیرفعال کرد.
- یک جریان UX توسط برنامه اپراتور ایجاد میشود که به کاربران امکان میدهد پروفایلهای خود را تغییر دهند.
توصیه برای اپراتورهای تلفن همراه
برای اطمینان از اینکه کاربران هنگام انتقال پروفایلهای eSIM از یک پورت به پورت دیگر، سرویس را از دست نمیدهند، توصیه میکنیم که اپراتورها از موارد زیر پشتیبانی کنند:
- نگاشت سیال IMEI و سیمکارت
- چندین ICCID یا سیمکارت برای هر شناسه eUICC (EID)
