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