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