הטמעת IMS

ב-Android 9 נוסף ממשק SystemApi חדש בשם ImsService שעוזר להטמיע את מערכת המשנה של IP Multimedia (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. כשמשדרגים למכשירי Android מגרסה 9 ואילך, צריך לבצע את הפעולות הבאות במכשירים ישנים יותר כדי להמשיך לתמוך ב-API הישן.

  • שינוי מרחב השמות של הטמעת 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 מיושם כשירות, שאליו ה-framework של 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 לגלות את השירות ולהפעיל אותו לפני שהמשתמש מבטל את נעילת המכשיר. השירות לא יכול לגשת לאחסון המוצפן במכשיר לפני שהמשתמש מבטל את הנעילה של המכשיר. מידע נוסף זמין במאמרים תמיכה במצב אתחול ישיר והצפנה מבוססת-קבצים.
  • 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

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

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

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

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

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

זיהוי ואימות של Framework של הטמעת ImsService

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

  1. IMsService של הספק מבטל את ההסכמה: ה-IMsServices האלה נטענים מראש למכשיר, אבל מחוברים לספק סלולרי אחד או יותר, ויהיו מקושרים רק לאחר הכנסת כרטיס SIM תואם. ההגדרה הזו מתבצעת באמצעות
  2. ImsService 'ברירת המחדל' של המכשיר: זהו ImsService ברירת המחדל שנטען למכשיר על ידי יצרן ציוד מקורי (OEM), והוא אמור לספק שירותי 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 תעדכן את ה-framework ללא תכונות נתמכות, ה-IMSService לא יפעל מחדש עד שהטלפון יופעל מחדש או יוכנס כרטיס SIM חדש שתואם לאפליקציית IMS.

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

ה-framework לא יכול לתמוך בקישור לכל השירותים האפשריים של 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, תתבצע קריאה ל-framework ImsStateCallback#onUnavailable עם הסיבה REASON_NO_IMS_SERVICE_CONFIGURED. המשמעות היא ש-ImsService וממשקי ה-API שקשורים ל-IMS לא זמינים במינוי.

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