הפעלת שירותי AIDL באופן דינמי

החל מאנדרואיד 11, שירותי AIDL מקוריים הפועלים במחיצת המערכת ניתנים להפעלה ולעצור באופן דינמי לפי הצורך. שירותים דינמיים מתחילים כאשר הם מתבקשים לראשונה ונפסקים אוטומטית כאשר הם אינם בשימוש עוד.

שירותים שיכולים לפעול בצורה דינמית

תכונה זו זמינה רק עבור שירותים מקוריים שמחזור החיים שלהם יכול להיות נשלט על ידי init ו- servicemanager . שירותים בתוך חבילות אפליקציות אינם נתמכים ויש להשתמש בשירותים קשורים במקום זאת.

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

הגדרת קובץ rc init של שירות

כדי להפעיל שירות באופן דינמי, הוסף את האפשרויות הבאות לקובץ .rc init של השירות אחרי שורת service <name> <cmd> .

interface aidl serviceName
disabled
oneshot

אפשרויות אלה עושות את הפעולות הבאות:

  • interface aidl serviceName : מאפשר servicemanager למצוא את השירות. אם השירות משתמש במספר ממשקים, הכריז על כל ממשק בשורה משלו. שמות אלו חייבים להיות בדיוק מה servicemanager מצפה ועשויים להיות שונים משם התהליך.
  • disabled : מונע מהשירות להתחיל אוטומטית באתחול.
  • oneshot : מונע מהשירות להפעיל מחדש באופן אוטומטי בכל פעם שהוא מופסק.

למידע נוסף, עיין ב- Android Init Language 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 במנהל השירות תתחיל את השירות, אך בדרך כלל, אתה רוצה לקבל את השירות ברגע שהוא זמין, ויש להשתמש בגרסאות waitForService . ראה תיעוד ספציפי לחלק האחורי על אופן השימוש באלה.

שחרור השירות

כיבוי דינמי מבוסס על ספירת הפניות, כך שללקוחות אסור להחזיק בשירות כאשר הוא אינו בשימוש.

דוגמאות:

השבתה זמנית של כיבוי

אם אתה רוצה ששירות יפעל באופן עצמאי עד להשלמת משימות מסוימות ולאחר מכן לעבור להתנהגות דינמית, אתה יכול להשתמש ב- LazyServiceRegistrar::forcePersist כדי להפעיל ולכבות כיבוי דינמי. אם זה נקרא מצד השרת, יש לקרוא לזה לפני registerService .

דוגמה: apexservice