המרת מודולים של HAL

אפשר לעדכן מודולי HAL קיימים למודולי HIDL HAL על ידי המרת הכותרת ב-hardware/libhardware/include/hardware.

שימוש ב-c2hal

c2hal הכלי מבצע את רוב עבודת ההמרה, וכך מצמצם את מספר השינויים הידניים שנדרשים. לדוגמה, כדי ליצור קובץ HIDL .hal עבור NFC HAL:

make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h

הפקודות האלה מוסיפות קבצים ב-hardware/interfaces/nfc/1.0/. הפעלת hardware/interfaces/update-makefiles.sh מהספרייה $ANDROID_BUILD_TOP מוסיפה גם את קובץ ה-Makefile הנדרש ל-HAL. מכאן אפשר לבצע שינויים ידניים כדי להמיר את ה-HAL באופן מלא.

פעילויות c2hal

כשמריצים את c2hal, כל מה שנמצא בקובץ הכותרת מועבר לקבצים .hal.

c2hal מזהה מבנים שמכילים מצביעים לפונקציות בקובץ הכותרת שסופק וממיר כל מבנה לקובץ ממשק נפרד. לדוגמה, alloc_device_t מומר למודול HAL‏ IAllocDevice (בקובץ IAllocDevice.hal).

כל שאר סוגי הנתונים מועתקים לקובץ types.hal. הגדרות עם סימן פאונד מועברות ל-enums, ופריטים שלא שייכים ל-HIDL או שלא ניתן להמיר אותם (כמו הצהרות של פונקציות סטטיות) מועתקים להערות שמסומנות בטקסט NOTE.

פעילויות ידניות

הכלי c2hal לא יודע מה לעשות כשהוא נתקל במבנים מסוימים. לדוגמה, ב-HIDL אין מושג של מצביעים גולמיים. לכן, כש-c2hal נתקל במצביע בקובצי כותרת, הוא לא יודע אם המצביע צריך להתפרש כמערך או כהפניה לאובייקט אחר. גם מצביעים מסוג void הם אטומים באופן דומה.

שדה כמו int reserved[7] צריך להסיר באופן ידני במהלך המעבר ל-HIDL. פריטים כמו השם של ערך ההחזרה צריכים להיות מעודכנים למשהו משמעותי יותר. לדוגמה, המרה של פרמטר ההחזרה של שיטות כמו write ב-NFC מהערך שנוצר אוטומטית int32_t write_ret לערך Status status (כאשר Status הוא סוג חדש של enum שמכיל סטטוסים אפשריים של NFC).

הטמעה של HAL

אחרי שיוצרים קובצי .hal שמייצגים את HAL, צריך ליצור את קובצי ה-Makefile (Make או Soong) שיוצרים את התמיכה בשפות ב-C++‎ וב-Java (אלא אם HAL משתמש בתכונה שלא נתמכת ב-Java). הסקריפט ./hardware/interfaces/update-makefiles.sh יכול ליצור באופן אוטומטי קובצי makefile עבור HAL שנמצאים בספרייה hardware/interfaces (כדי ליצור קובצי makefile עבור HAL במיקומים אחרים, פשוט מעדכנים את הסקריפט).

אחרי שמעדכנים את קובצי ה-Makefile, אפשר ליצור קובצי כותרת ולהטמיע שיטות. פרטים על הטמעת הממשק שנוצר זמינים במאמרים HIDL C++‎ (להטמעות ב-C++‎) או HIDL Java (להטמעות ב-Java).