החל מ-Android 11, שירותי AIDL מקוריים פועלים ב- ניתן להפעיל ולהפסיק באופן דינמי את מחיצת המערכת לפי הצורך. שירותים דינמיים מופעלים בבקשה הראשונה שלהם ומפסיקים אוטומטית לאחר קבלת הבקשה שהם כבר לא בשימוש.
שירותים שיכולים לפעול באופן דינמי
התכונה הזו זמינה רק לשירותים מקומיים שאפשר לשלוט במחזור החיים שלהם באמצעות init
ו-servicemanager
. השירותים בתוך חבילות האפליקציה לא
נתמכים וצריך להשתמש בשירותים קשורים
במקום זאת.
השבתה דינמית פועלת על ידי השבתת התהליך שבו השירות פועל. אם באותו תהליך קיימים כמה שירותים, כולם צריכים להיות רשומים דינמיות בהתאם לתכונה הזו. התהליך הזה יושבת ואז כאשר כל השירותים לא בשימוש.
הגדרת קובץ rc ראשוני של שירות
כדי להפעיל שירות באופן דינמי, צריך להוסיף את האפשרויות הבאות ל-init של השירות
קובץ .rc
אחרי השורה הראשית service <name> <cmd>
.
interface aidl serviceName
disabled
oneshot
האפשרויות האלה מבצעות את הפעולות הבאות:
interface aidl serviceName
: מאפשרת ל-servicemanager
למצוא את השירות. אם השירות משתמש בכמה ממשקים, צריך להצהיר על כל ממשק בשורה משלו. השמות האלה חייבים להיות בדיוק מה ש-servicemanager
מצפה להם, ויכול להיות שהם שונים משם התהליך.disabled
: מונעת את הפעלת השירות באופן אוטומטי בזמן האתחול.oneshot
: מונע מהשירות להפעיל מחדש באופן אוטומטי בכל פעם הופסק.
אפשר לקרוא מידע נוסף במאמר בנושא Android Init Language (השפה של Android Init) Readme ב-AOSP.
לדוגמה:
רישום שירות
כל שירות נוצר ורשום ב-servicemanager
. הרישום מתבצע בדרך כלל בקובץ בשם main.cpp
, אבל ההטמעה עשויה להשתנות. הרשמה בדרך כלל נראית כך:
using android::defaultServiceManager;
defaultServiceManager()->addService(serviceName, service);
לפעמים הרישום מופשט על ידי BinderService::publish
או
BinderService::instantiate
, שקוראים לקוד שלמעלה.
כדי לרשום שירות כדינמי, מחליפים את קוד הרישום שלו בקוד הבא:
#include <binder/LazyServiceRegistrar.h>
using android::binder::LazyServiceRegistrar;
auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);
servicemanager
מתקשר עם LazyServiceRegistrar
כדי להפסיק את השירותים
על סמך ספירת ההפניות שלהם.
לדוגמה:
הגדרת לקוחות שירות AIDL
אחזור השירות
כדי לאחזר שירות עצלני, צריך להפעיל את השירות ולאחר מכן לאחזר אותו.
קריאה ל-getService
ב-Service Manager תפעיל את השירות, אבל בדרך כלל רוצים לקבל את השירות ברגע שהוא זמין, ולכן צריך להשתמש באפשרויות של waitForService
. פרטים נוספים זמינים בנקודות קצה עורפי
תיעוד
שיעזרו לך להשתמש בהם.
השקת השירות
כיבוי דינמי מבוסס על ספירת הפניות, ולכן לקוחות לא יכולים להחזיק את השירות כשאין בו שימוש.
לדוגמה:
השבתה זמנית של כיבוי
אם רוצים ששירות יפעל באופן עצמאי עד שמשימות מסוימות הושלמו
ואז לעבור להתנהגות דינמית, אפשר להשתמש
LazyServiceRegistrar::forcePersist
כדי להפעיל או להשבית את הכיבוי הדינמי. אם המיקום
היא נקראת בצד השרת, היא צריכה לפעול לפני
registerService
.
דוגמה: apexservice