שפת ההגדרה לבניית ממשק Android (AIDL) היא כלי שמאפשר למשתמשים להסתיר את ה-IPC. בהינתן ממשק (שצוין בקובץ .aidl
), מערכות בנייה שונות משתמשות בקובץ הבינארי aidl
כדי ליצור קשרי קישור של C++ או Java, כך שאפשר להשתמש בממשק הזה בתהליכים שונים, ללא קשר לזמן הריצה או לרוחב הסיביות.
אפשר להשתמש ב-AIDL בין כל תהליך ב-Android: בין רכיבי פלטפורמה או בין אפליקציות. עם זאת, הוא אף פעם לא משמש כממשק API לאפליקציות. לדוגמה, אפשר להשתמש ב-AIDL כדי להטמיע SDK API בפלטפורמה, אבל ממשק ה-SDK API אף פעם לא מכיל AIDL APIs ישירות. לתיעוד בנושא שימוש ב-AIDL בין אפליקציות באופן ישיר, אפשר לעיין בתיעוד למפתחי Android. כשמשתמשים ב-AIDL בין רכיבי פלטפורמה שמתעדכנים בנפרד, כמו APEX (החל מ-Android 10) או HAL (החל מ-Android 11), צריך להשתמש במערכת ניהול הגרסאות שנקראת Stable AIDL.
דוגמה
זוהי דוגמה לממשק AIDL:
package my.package;
import my.package.Baz; // defined elsewhere
interface IFoo {
void doFoo(Baz baz);
}
תהליך השרת רושם ממשק ומשרת קריאות אליו, ותהליך הלקוח שולח קריאות לממשקים האלה. במקרים רבים, תהליך מסוים פועל גם כלקוח וגם כשרת, כי הוא עשוי להפנות לכמה ממשקי API. לפרטים נוספים על שפת AIDL, אפשר לעיין במאמר שפת AIDL. לפרטים נוספים על סביבות הריצה השונות שאפשר להשתמש בהן בממשקים האלה, אפשר לעיין במאמר בנושא בק-אנד של AIDL. הצהרות מהסוג הזה דומות בדיוק להצהרת מחלקה בשפה נתונה, אבל הן פועלות בין תהליכים.
איך זה עובד
AIDL משתמש במנהל התקן של ליבת ה-binder כדי לבצע קריאות. כשמבצעים שיחה, מזהה השיטה וכל האובייקטים נארזים לתוך מאגר זמני ומועתקים לתהליך מרוחק שבו השרשור של ה-binder מחכה לקריאת הנתונים. אחרי ש-binder thread מקבל נתונים לטרנזקציה, ה-thread מחפש אובייקט stub מקורי בתהליך המקומי, והמחלקה הזו מפרקת את הנתונים ומבצעת קריאה באובייקט של ממשק מקומי. אובייקט הממשק המקומי הזה הוא זה שתהליך השרת יוצר ורושם. כשמתבצעות קריאות באותו תהליך ובאותו קצה עורפי, לא קיימים אובייקטים של proxy, ולכן הקריאות הן ישירות ללא אריזה או פריקה. מידע נוסף מפורט בסקירה הכללית בנושא Binder.
אינטראקציה עם שירותים במכשיר
מערכת Android כוללת כמה פקודות שמאפשרות אינטראקציה עם שירותים במכשיר. כדאי לבצע את הפעולות הבאות:
adb shell dumpsys --help # listing and dumping services
adb shell service --help # sending commands to services for testing