חבילות

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

המהדר (compiler) 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 של חבילה דוגמאות:

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, שאותה לקוחות יכולים לכלול שרתים. שימוש במהדר (compiler) hidl-gen עם IFoo.hal כקובץ ממשק כקלט, במצב קישור, שנוצר באופן אוטומטי קבצים:

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

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

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

המבנה של הקבצים דומה לקבצים שנוצרו על ידי aidl-cpp (לקבלת פרטים, אפשר לעיין בקטע 'מצב מעבר' סקירה כללית של 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 סמלים ספציפיים ל-Binnder. Android 10 מוציא משימוש את הספרייה הזו.
libfmq 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