חבילות

למעט יוצאים מן הכלל, חבילות ממשק 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 בחבילת הדוגמאות :

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 . קובץ כותרת המכיל הצהרות עבור פונקציות המסדרות סוגי נתונים המשמשים בממשק. מפתחים לעולם לא צריכים לכלול את הכותרת שלו ישירות (היא אינה מכילה מחלקות).
  • BpHwFoo.h . מחלקה שיורשת מ- IFoo ומתארת ​​את יישום ה-Proxy של HwBinder (צד הלקוח) של הממשק. למפתחים אסור להתייחס ישירות למחלקה הזו.
  • BnHwFoo.h . מחלקה שמחזיקה הפניה למימוש IFoo ומתארת ​​את המימוש HwBinder stub (צד השרת) של הממשק. למפתחים אסור להתייחס ישירות למחלקה הזו.
  • FooAll.cpp . מחלקה המכילה את ההטמעות הן עבור ה-proxy HwBinder והן עבור ה- HwBinder stub. כאשר לקוח קורא לשיטת ממשק, ה-Proxy מסדר אוטומטית את הארגומנטים מהלקוח ושולח את הטרנזקציה למנהל ההתקן של ליבת ה-Binder, אשר מספק את הטרנזקציה ל-stub בצד השני (שאחר כך קורא למימוש השרת בפועל).

הקבצים בנויים באופן דומה לקבצים שנוצרו על ידי aidl-cpp (לפרטים, ראה "מצב מעבר" בסקירה כללית של HIDL ). הקובץ היחיד שנוצר אוטומטית שאינו תלוי במנגנון ה-RPC המשמש את HIDL הוא IFoo.h ; כל שאר הקבצים קשורים למנגנון HwBinder RPC המשמש את 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 סטנדרטיים. החל באנדרואיד 10, זה מכיל גם את כל הסמלים שהיו בעבר ב- libhidltransport וב- libhwbinder .
libhidltransport מטפל בהעברת שיחות HIDL על פני מנגנוני RPC/IPC שונים. אנדרואיד 10 מוציא משימוש את הספרייה הזו.
libhwbinder סמלים ספציפיים לקלסר. אנדרואיד 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