הטמעת IMS

ב-Android 9 נוסף ממשק SystemApi שנקרא ImsService, שעוזר להטמיע את מערכת המשנה של מולטימדיה ב-IP‏ (IMS). ImsService API הוא ממשק מוגדר היטב בין פלטפורמת Android לבין הטמעת IMS שסופקו על ידי ספק או ספק שירותי הסלולר.

סקירה כללית על ImsService

איור 1. סקירה כללית על ImsService

באמצעות ממשק ImsService, מי שמטמיע את IMS יכול לספק לפלטפורמה מידע חשוב על איתותים, כמו פרטי הרישום ב-IMS, שילוב של SMS ב-IMS ושילוב של התכונה MmTel כדי לספק שיחות קוליות ושיחות וידאו. ImsService API הוא גם Android System API, כלומר אפשר לבנות אותו ישירות מול Android SDK במקום מול המקור. אפשר גם להגדיר אפליקציית IMS שהותקנה מראש במכשיר כך שתהיה ניתנת לעדכון בחנות Play.

דוגמאות ומקור

מערכת Android מספקת אפליקציה ב-AOSP שמטמיעה חלקים מ-ImsService API למטרות בדיקה ופיתוח. האפליקציה נמצאת בכתובת /testapps/ImsTestService.

המסמכים של ImsService API מופיעים ב-ImsService ובכיתות האחרות ב-API.

הטמעה

ImsService API הוא ממשק API ברמה גבוהה שמאפשר להטמיע את IMS בדרכים רבות, בהתאם לחומרה הזמינה. לדוגמה, ההטמעה משתנה בהתאם לאופן שבו הטמעת ה-IMS מתבצעת: אם היא מתבצעת במלואה במעבד האפליקציות, או אם היא מועברת למכשיר המודם באופן חלקי או מלא. מערכת Android לא מספקת HAL ציבורי להעברת עומסים למעבד הבסיס, ולכן כל העברת עומסים חייבת להתבצע באמצעות התוסף של HAL למכשיר המודם.

תאימות להטמעות IMS ישנות יותר

מערכת Android 9 כוללת את ImsService API, אבל מכשירים שמשתמשים בהטמעה ישנה יותר של IMS לא יכולים לתמוך ב-API. במכשירים האלה, ממשקי ה-AIDL הישנים ורשימות הכיתות של המעטפות הועברו למרחב השמות android.telephony.ims.compat. במכשירים ישנים יותר, צריך לבצע את הפעולות הבאות כדי להמשיך לקבל תמיכה ב-API הקודם כשמשדרגים ל-Android 9.

  • משנים את מרחב השמות של הטמעת ImsService כך שיתפרס מ-API של מרחב השמות android.telephony.ims.compat.
  • משנים את הגדרת השירות ImsService בקובץ AndroidManifest.xml כך שישתמש בפעולה android.telephony.ims.compat.ImsService של מסנן הכוונה, במקום בפעולה android.telephony.ims.ImsService.

לאחר מכן, המסגרת תקשר ל-ImsService באמצעות שכבת התאימות שסופקה ב-Android 9 כדי לפעול עם ההטמעה הקודמת של ImsService.

רישום ImsService במסגרת

ממשק ה-API של ImsService מיושם כשירות, שאליו מסגרת Android מקשרת כדי לתקשר עם הטמעת IMS. כדי לרשום אפליקציה שמטמיעה ImsService באמצעות המסגרת, צריך לבצע שלושה שלבים. קודם כול, הטמעת ImsService צריכה להירשם בפלטפורמה באמצעות AndroidManifest.xml של האפליקציה. שנית, היא צריכה להגדיר אילו תכונות IMS נתמכות בהטמעה (MmTel או RCS). שלישית, היא צריכה להיות מאומתת כטמעת IMS מהימנה, בהגדרות הספק או בשכבת-העל של המכשיר.

הגדרת השירות

אפליקציית ה-IMS רושמת ImsService במסגרת על ידי הוספת רשומה service למניפסט בפורמט הבא:

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

ההגדרה של service בקובץ AndroidManifest.xml מגדירה את המאפיינים הבאים, הנחוצים לפעולה תקינה:

  • directBootAware="true": מאפשרת ל-telephony לגלות ולהפעיל את השירות לפני שהמשתמש פותח את נעילת המכשיר. השירות לא יכול לגשת לאחסון המוצפן במכשיר לפני שהמשתמש מבטל את הנעילה של המכשיר. למידע נוסף, ראו תמיכה במצב Direct Boot והצפנה מבוססת-קובץ.
  • persistent="true": מאפשרת להפעיל את השירות הזה באופן קבוע, והמערכת לא תהרוג אותו כדי לפנות זיכרון. המאפיין הזה פועל רק אם האפליקציה נוצרה כאפליקציית מערכת.
  • permission="android.permission.BIND_IMS_SERVICE": מוודא שרק תהליך שקיבל את ההרשאה BIND_IMS_SERVICE יכול לקשר לאפליקציה. כך אפשר למנוע מאפליקציה זדונית לקשר לשירות, כי רק אפליקציות מערכת יכולות לקבל את ההרשאה מהמסגרת.

השירות צריך לציין גם את האלמנט intent-filter עם הפעולה android.telephony.ims.ImsService. כך המסגרת תוכל למצוא את ImsService.

מפרט התכונות של IMS

אחרי שמגדירים את ImsService כשירות Android בקובץ AndroidManifest.xml, צריך להגדיר ב-ImsService את התכונות של IMS שהוא תומך בהן. כרגע יש ב-Android תמיכה בתכונות MmTel ו-RCS, אבל רק MmTel משולבת במסגרת. למרות שאין ממשקי API של RCS שמשולבים במסגרת, עדיין יש יתרונות להצהרה עליו כתכונה של ImsService.

בהמשך מפורטות התכונות התקינות שמוגדרות ב-android.telephony.ims.ImsFeature ש-ImsService יכול לספק, וכן הסבר ודוגמה לכך שאפליקציית IMS תרצה להטמיע אחת או את כל התכונות האלה. אחרי שמגדירים כל מאפיין, בדף הזה מוסבר איך ה-ImsService מכריז על קבוצת המאפיינים שהוא מגדיר לכל חריץ SIM.

FEATURE_MMTEL

ImsService מטמיע את התכונה IMS MMTEL, שמכילה תמיכה בכל המדיה של IMS (מפרטים IR.92 ו-IR.94), מלבד הצמדה לשעת חירום ל-IMS PDN לשיחות חירום. כל הטמעה של ImsService שרוצים לתמוך בתכונות של MMTEL צריכה להרחיב את המחלקה הבסיסית android.telephony.ims.MmTelFeature ולהחזיר הטמעה מותאמת אישית של MmTelFeature ב-ImsService#createMmTelFeature.

FEATURE_EMERGENCY_MMTEL

ההצהרה על התכונה הזו רק מאותתת לפלטפורמה שאפשר לצרף חירום ל-IMS PDN לשירותי חירום. אם לא תצהירו על התכונה הזו ל-ImsService, ברירת המחדל של הפלטפורמה תמיד תהיה Fallback של Circuit Switch לשירותי חירום. כדי להגדיר את התכונה הזו, צריך להגדיר את המאפיין FEATURE_MMTEL.

FEATURE_RCS

ב-ImsService API לא מוטמעות תכונות של IMS RCS, אבל עדיין אפשר להשתמש בכיתה הבסיסית android.telephony.ims.RcsFeature. המסגרת מתחברת באופן אוטומטי ל-ImsService ומפעילה את ImsService#createRcsFeature כשהיא מזהה שהחבילה צריכה לספק RCS. אם כרטיס ה-SIM שמשויך לשירות ה-RCS יוסר, המסגרת תפנה באופן אוטומטי ל-RcsFeature#onFeatureRemoved ולאחר מכן תנקה את ה-ImsService שמשויך לתכונה RCS. התכונה הזו יכולה להסיר חלק מהלוגיקה בהתאמה אישית של זיהוי או קישור, שהתכונה של RCS הייתה צריכה לספק אחרת.

רישום של תכונות נתמכות

מסגרת הטלפונייה קושרת קודם ל-ImsService כדי לשלוח שאילתה לגבי התכונות שהיא תומכת בהן באמצעות ה-API ImsService#querySupportedImsFeatures. אחרי שהמסגרת מחשבת אילו תכונות ImsService יתמוך בהן, היא קוראת ל-ImsService#create[...]Feature לכל תכונה ש-ImsService אחראי עליה. אם יש שינויים בתכונות שתומכת בהן אפליקציית ה-IMS, אפשר להשתמש ב-ImsService#onUpdateSupportedImsFeatures כדי לאותת למסגרת לבצע חישוב מחדש של התכונות הנתמכות. אפשר לעיין בתרשים הבא כדי לקבל מידע נוסף על האינטראקציה הראשונית והקישור של ImsService.

איפוס וקישור של ImsService

איור 2. איפוס וקישור של ImsService

זיהוי מסגרת ואימות של הטמעת ImsService

אחרי שמגדירים את ImsService בצורה נכונה ב-AndroidManifest.xml, צריך להגדיר את הפלטפורמה כך שתקשר (באופן מאובטח) ל-ImsService במקרים הרלוונטיים. יש שני סוגים של ImsServices שהמסגרת מקשרת אליהם:

  1. 'שינוי' של הספק ל-ImsService: שירותי ImsService האלה נטענים מראש במכשיר, אבל הם מצורפים לספק סלולר אחד או יותר, והם יקושר רק כשמכניסים כרטיס SIM תואם. ההגדרה הזו מתבצעת באמצעות
  2. ImsService 'ברירת המחדל' של המכשיר: זהו ImsService ברירת המחדל שנטען למכשיר על ידי יצרן ציוד מקורי, והוא אמור לספק שירותי IMS בכל המצבים שבהם ImsService של ספק לא זמין. הוא שימושי במצבים שבהם לא הוכנס כרטיס SIM למכשיר או שכרטיס ה-SIM שהוכנס לא כולל ImsService של ספק. ההגדרה הזו מוגדרת בשכבת-העל של המכשיר באמצעות ההגדרות הבאות:

מערכת Android לא תומכת באפליקציות עם הטמעות של ImsService שניתן להוריד מצד שלישי, לכן כל הטמעות ImsService שמוגדרות כאן צריכות להיות אפליקציות מערכת, והן חייבות להיות בתיקייה ‎ /system/priv-app/ או ‎/product/priv-app/ כדי להעניק את ההרשאות המתאימות (כלומר הרשאות לשיחות, למיקרופון, למיקום, למצלמה ולאנשי קשר). על ידי אימות ששם החבילה של הטמעת ה-IMS תואם לערכים של CarrierConfig או של שכבת-העל של המכשיר שהוגדרו למעלה, רק אפליקציות מהימנות שמותקנות מראש מקושרות.

התאמה אישית

אפליקציות שמטמיעות את ImsService מקושרות רק במכשירים שבהם הן מוגדרות כ'שינוי מברירת המחדל' של ImsService של הספק או כ'ברירת המחדל' של ImsService במכשיר, לצורך פונקציונליות של MMTEL או RCS. באמצעות ImsService אפשר גם להפעיל או להשבית באופן דינמי את תכונות ה-IMS הנתמכות (MMTEL ו-RCS) באמצעות עדכונים באמצעות השיטה ImsService#onUpdateSupportedImsFeatures. הפעולה הזו מפעילה את המסגרת כדי לחשב מחדש אילו ImsServices מקושרים ואילו תכונות הם תומכים בהן. אם אפליקציית IMS מעדכנת את המסגרת ללא תכונות נתמכות, הקישור של ImsService יבוטל עד שהטלפון יופעל מחדש או שתוחדר כרטיס SIM חדש שתואמת לאפליקציית IMS.

תעדוף קישור של כמה ImsService

המסגרת לא יכולה לתמוך בקישור לכל ה-ImsServices האפשריים שמוטענים מראש במכשיר, והיא תקשר עד שני ImsServices לכל חריץ SIM (ImsService אחד לכל תכונה) לפי הסדר הבא, לפי תכונה:

  1. שם החבילה של ImsService שמוגדר לפי הערך config_ims_[mmtel/rcs]_package_override_string של CarrierConfig כשכרטיס SIM מוכנס.
  2. שם החבילה של ImsService שמוגדר בערך שכבת-העל של המכשיר עבור config_ims_[mmtel/rcs]_package, כולל במקרה שבו לא הוכנס כרטיס SIM. שירות ImsService חייב לתמוך בתכונה MmTel למקרי חירום.

שם החבילה של ImsService צריך להיות מוגדר ב-CarrierConfig לכל אחד מהספקים שישתמשו בחבילה הזו, או בשכבת-העל של המכשיר אם ImsService יהיה ברירת המחדל, כפי שמוגדר למעלה.

נבחן את הנושא הזה לגבי כל תכונה. במכשיר (עם כרטיס SIM יחיד או עם כמה כרטיסי SIM) שמוכנס אליו כרטיס SIM אחד, אפשר להשתמש בשתי תכונות IMS: MMTel ו-RCS. המסגרת תנסה לבצע קישור לפי הסדר שמוגדר למעלה לכל תכונה, ואם התכונה לא זמינה ל-ImsService שמוגדר בשינוי ההגדרה של הספק, המסגרת תעבור ל-ImsService שמוגדר כברירת מחדל. לדוגמה, בטבלה הבאה מתואר איזו תכונת IMS המערכת תשתמש בה, בהתאם לשלושה אפליקציות IMS שמטמיעות את ImsServices שמותקנות במערכת עם התכונות הבאות:

  • שירות Ims של ספק A תומך ב-RCS
  • שירות Ims של ספק B תומך ב-RCS וב-MMTel
  • שירות OEM ImsService תומך ב-RCS וב-MMTel
כרטיס SIM הוכנס תכונה של RCS תכונה של MMTel
ספק א' ספק א' OEM
ספק ב' ספק ב' ספק ב'
אין כרטיס SIM OEM OEM

אימות

הכלים לאימות ההטמעה של IMS עצמה לא כלולים, כי המפרטים של IMS גדולים מאוד ומשתמשים בציוד אימות מיוחד. הבדיקות יכולות לאמת רק שהתשתית של טלפוניה מגיבה כראוי ל-ImsService API.

פיתוח אפליקציית IMS

כשמפתחים אפליקציית IMS שמתחברת לממשק של סטאק הטלפוניה של Android, מומלץ לציין שהאפליקציה יכולה להאזין למצב של מופע ImsService שמצורף למינוי ספציפי לספק.

כדי להאזין לסטטוס של ImsService עבור תכונות MMTEL ו-RCS או לשנות אותו, משתמשים בכיתה ImsManager כדי לקבל מופע של הכיתה ImsMmTelManager, ImsRcsManager או הכיתה הספציפית ל-IMS‏ ProvisioningManager. לאחר מכן האפליקציה יכולה להאזין למצבים ספציפיים של שירות ושל הקצאה ב-IMS, כמו:

  • תכונות MMTEL או RCS שפועלות וזמינות
  • עדכונים כשסטטוס ההרשמה ל-IMS משתנה
  • סטטוס ההקצאה של תכונות IMS
  • תכונות IMS שהמשתמש הפעיל

שימוש ב-ImsStateCallback

ImsService הוא שירות שמקושר באופן קבוע, אבל השירות שמקושר עשוי להשתנות כשכרטיס SIM חדש או מינוי מוטמע הופכים לפעילים, או כשהגדרת הספק משתנה. מכיוון ש-ImsService לא נכלל בתהליך הטלפוני, יכול להיות שתופיעו באפליקציה חריגות בלתי צפויות כשהיא תנסה לגשת לממשקי ה-API של IMS, אם ImsService יתרסק באופן בלתי נראה או לא יהיה מקושר בגלל שינוי במינוי או בהגדרה.

במכשירים עם Android מגרסה 13 ואילך, כדי לעקוב אחרי זמינות המכונה של ImsService עבור מינוי משויך, אפליקציה יכולה להשתמש בכיתה ImsStateCallback. כשמקבלים מופע של ImsMmTelManager או ImsRcsManager, מומלץ שהאפליקציה תירשם קודם לקריאה חוזרת למצב IMS באמצעות ImsMmTelManager#registerImsStateCallback או ImsRcsManager#registerImsStateCallback. כדי להמשיך לקבל עדכונים על שיחות חזרה למינוי ספציפי כש-ImsService יהיה זמין שוב, האפליקציה צריכה לבטל את ההרשמה של שיחות חזרה קיימות שרשומות דרך ImsMmTelManager, ‏ ImsRcsManager או ProvisioningManager, ולרשום שיחות חזרה חדשות.

אם יש מינוי שלא תומך ב-IMS, המסגרת קוראת ל-ImsStateCallback#onUnavailable עם הסיבה REASON_NO_IMS_SERVICE_CONFIGURED. המשמעות היא ש-ImsService וממשקי ה-API שקשורים ל-IMS לא זמינים במינוי.

במקרה הלא סביר שבו תהליך הטלפון יתרסק, האפליקציה תקבל את הערך ImsStateCallback#onError ולא תקבל יותר עדכונים במכונה הרשומה של ImsStateCallback. כדי לצאת מהמצב הזה, צריך לרשום מחדש את המכונה ImsStateCallback למינוי המשויך באמצעות קריאה ל-ImsMmTelManager#registerImsStateCallback או ל-ImsRcsManager#registerImsStateCallback.