חבילות

מלבד כמה יוצאים מן הכלל, חבילות ממשק HIDL נמצאות בתיקייה hardware/interfaces או בתיקייה vendor/. ברמת העליונה hardware/interfaces ממופה ישירות למרחב השמות של החבילה android.hardware. הגרסה היא ספריית משנה במרחב השמות של החבילה (לא של הממשק).

המהדר של hidl-gen מקמפל את קובצי ה-.hal לקבוצה של קובצי .h ו-.cpp. מהקבצים האלה שנוצרים באופן אוטומטי נוצרת ספרייה משותפת שמקשרות אליה הטמעות של לקוח/שרת. הקובץ Android.bp שמכיל את הספרייה המשותפת נוצר באופן אוטומטי על ידי הסקריפט hardware/interfaces/update-makefiles.sh. בכל פעם שמוסיפים חבילת קוד חדשה ל-hardware/interfaces, או מוסיפים או מסירים קובצי .hal לחבילה קיימת, צריך להריץ מחדש את הסקריפט כדי לוודא שהספרייה המשותפת שנוצרה עדכנית.

לדוגמה, קובץ הדוגמה IFoo.hal צריך להיות ב-hardware/interfaces/samples/1.0. בקובץ לדוגמה IFoo.hal נוצר ממשק IFoo בחבילה samples:

package android.hardware.samples@1.0;
interface IFoo {
    struct Foo {
       int64_t someValue;
       handle  myHandle;
    };

    someMethod() generates (vec<uint32_t>);
    anotherMethod(Foo foo) generates (int32_t ret);
};

קבצים שנוצרו

קבצים שנוצרו באופן אוטומטי בחבילת HIDL מקושרים לספרייה משותפת אחת עם אותו שם כמו החבילה (לדוגמה, android.hardware.samples@1.0). הספרייה המשותפת מייצאת גם כותרת אחת, IFoo.h, שאפשר לכלול אותה בלקוחות ובשרתים. כשמשתמשים במהדר hidl-gen עם קובץ הממשק IFoo.hal כקלט, במצב המקושר נוצרים הקבצים הבאים באופן אוטומטי:

קבצים שנוצרו על ידי המהדר

איור 1. קבצים שנוצרו על ידי המהדר.

  • IFoo.h. מתאר את הממשק הטהור של IFoo בכיתה של C++. הוא מכיל את השיטות והסוגים שמוגדרים בממשק IFoo בקובץ IFoo.hal, ומתורגם לסוגים של C++ במקרה הצורך. לא מכיל פרטים שקשורים למנגנון ה-RPC (למשל, HwBinder) שמשמש להטמעת הממשק הזה. הכיתה נמצאת במרחב השמות של החבילה והגרסה, לדוגמה, ::android::hardware::samples::IFoo::V1_0. גם לקוחות וגם שרתים כוללים את הכותרת הזו: לקוחות כדי לקרוא לשיטות בה, ושרתים כדי להטמיע את השיטות האלה.
  • IHwFoo.h. קובץ כותרת שמכיל הצהרות על פונקציות שממירות לסדרת נתונים (serialize) את סוגי הנתונים שמשמשים בממשק. מפתחים לעולם לא צריכים לכלול את הכותרת הזו ישירות (היא לא מכילה שום שיעורים).
  • BpHwFoo.h. מחלקה שעוברת בירושה מ-IFoo ומתארת את הטמעת שרת ה-proxy (מצד הלקוח) של הממשק HwBinder. מפתחים לא צריכים להפנות לכיתה הזו ישירות.
  • BnHwFoo.h. מחלקה שמכילה הפניה להטמעה של IFoo ומתארת את ההטמעה של HwBinder (בצד השרת) של הממשק. מפתחים לעולם לא צריכים להפנות לכיתה הזו ישירות.
  • FooAll.cpp. מחלקה שמכילה את ההטמעות של שרת ה-proxy HwBinder ושל ה-stub HwBinder. כשלקוח קורא לשיטת ממשק, שרת ה-proxy מארגן באופן אוטומטי את הארגומנטים מהלקוח ושולח את העסקה למנהל הליבה של ה-binder, שמעביר את העסקה ל-stub בצד השני (שאחר כך קורא להטמעת השרת בפועל).

המבנה של הקבצים דומה למבנה של הקבצים שנוצרים על ידי aidl-cpp (פרטים נוספים זמינים בקטע 'מצב העברה (passthrough)' במאמר סקירה כללית על HIDL). הקובץ היחיד שנוצר באופן אוטומטי ולא תלוי במנגנון ה-RPC שבו HIDL משתמש הוא IFoo.h. כל שאר הקבצים קשורים למנגנון ה-RPC של HwBinder שבו HIDL משתמש. לכן, אף פעם לא צריך להפנות ישירות להטמעות של לקוח ושל שרת, אלא רק ל-IFoo. כדי לעשות זאת, צריך לכלול רק את IFoo.h ולקשר לספרייה המשותפת שנוצרה.

לקוח או שרת שמשתמשים בממשק כלשהו בחבילה חייבים לכלול את הספרייה המשותפת של החבילה באחד (1) מהמיקומים הבאים:

  • בקובץ Android.mk:
    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
  • בקובץ Android.bp:
    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],

ספריות נוספות שיכול להיות שתצטרכו לכלול:

libhidlbase כולל סוגי נתונים סטנדרטיים של HIDL. החל מגרסה Android 10, הוא מכיל גם את כל הסמלים שהיו בעבר ב-libhidltransport וב-libhwbinder.
libhidltransport הספרייה מטפלת בהעברת קריאות HIDL באמצעות מנגנוני RPC/IPC שונים. ב-Android 10 הספרייה הזו הוצאה משימוש.
libhwbinder סמלים ספציפיים לחיבור. ב-Android 10 הספרייה הזו הוצאה משימוש.
libfmq Fast Message Queue IPC.

מרחבי שמות

פונקציות וסוגים של HIDL, כמו Return<T> ו-Void(), מפורטים במרחב השמות ::android::hardware. מרחב השמות של C++ בחבילה נקבע לפי שם החבילה והגרסה שלה. לדוגמה, לחבילה mypackage בגרסה 1.2 ב-hardware/interfaces יש את המאפיינים הבאים:

  • מרחב השמות של C++‎ הוא ::android::hardware::mypackage::V1_2
  • השם המלא של IMyInterface בחבילה הזו הוא ::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterface הוא מזהה, ולא חלק ממרחב השמות).
  • סוגי נתונים שמוגדרים בקובץ types.hal של החבילה מזוהים בתור: ::android::hardware::mypackage::V1_2::MyPackageType