תקן HAL מגדיר ממשק סטנדרטי שלפיו ספקי חומרה יכולים להטמיע, שמאפשר ל-Android לעקוב אחרי הטמעות של מנהלי התקנים ברמה נמוכה יותר. טכנולוגיית HAL מאפשרת להטמיע פונקציונליות בלי להשפיע או לשנות ברמה הגבוהה יותר. בדף הזה מתוארת הארכיטקטורה הישנה יותר, שלא תמיכה ארוכה יותר החל מ-Android 8.0. עבור Android 8.0 ומעלה, יש לעיין ב HAL Overview
עליך להטמיע את הנחיות ה-HAL (והנהג) התואמות
חומרה שהמוצר מספק. הטמעות HAL בדרך כלל מובְנות
מודולים של ספרייה משותפת (.so
קבצים), אבל בגלל ש-Android לא מאפשר ייפוי כוח
אינטראקציה רגילה בין הטמעת HAL לבין מנהלי התקנים של מכשירים,
לעשות מה שהכי מתאים למצב שלכם. עם זאת, כדי לאפשר למערכת Android
אינטראקציה נכונה עם החומרה, חייבים לפעול
מוגדר בכל ממשק HAL ספציפי לחומרה.
כדי להבטיח של-HAL יש מבנה צפוי,
לממשק HAL יש מאפיינים שמוגדרים
hardware/libhardware/include/hardware/hardware.h
בממשק הזה
שמאפשרות למערכת Android לטעון גרסאות נכונות של מודולי ה-HAL
באופן עקבי. ממשק HAL מורכב משני רכיבים: מודולים ומכשירים.
מודולים של HAL
מודול מייצג את הטמעת ה-HAL הארוזה שלכם, שנשמרת
ספרייה משותפת (.so file
).
קובץ כותרת hardware/libhardware/include/hardware/hardware.h
מגדיר מבנה (hw_module_t
) שמייצג מודול
שמכיל מטא-נתונים כמו הגרסה, השם והמחבר של המודול. במכשירי Android
משתמשת במטא-נתונים כדי למצוא ולטעון את מודול ה-HAL בצורה נכונה.
בנוסף, המבנה hw_module_t
מכיל מצביע אל
מבנה אחר, hw_module_methods_t
, שמכיל מצביע אל
פונקציה פתוחה של המודול. הפונקציה הפתוחה הזו משמשת להפעלת
תקשורת עם החומרה שעבורה HAL משמש כהפשטה.
כל ממשק HAL ספציפי לחומרה בדרך כלל מרחיב את הערך הכללי של hw_module_t
לבנות עם מידע נוסף על אותו חלק חומרה ספציפי. עבור
לדוגמה, ב-HAL של המצלמה, המבנה camera_module_t
מכיל
המבנה hw_module_t
ופונקציות אחרות שספציפיות למצלמה
מצביעים:
typedef struct camera_module { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); } camera_module_t;
כשמטמיעים HAL ויוצרים את מבנה המודול, צריך לתת לו שם
HAL_MODULE_INFO_SYM
דוגמה מ-Nexus 9 Audio HAL:
struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = AUDIO_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = AUDIO_HARDWARE_MODULE_ID, .name = "NVIDIA Tegra Audio HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, };
מכשירי HAL
מכשיר מופשט את החומרה של המוצר. לדוגמה, אודיו המודול יכול להכיל התקן אודיו ראשי, התקן אודיו USB או Bluetooth התקן אודיו A2DP.
מכשיר מיוצג על ידי המבנה hw_device_t
. דומה ל-
כל סוג של מכשיר מגדיר גרסה מפורטת של
hw_device_t
שמכיל מצביעים של פונקציות לתכונות ספציפיות
של החומרה. לדוגמה, סוג המבנה audio_hw_device_t
מכילה מצביעי פונקציות לפעולות במכשיר האודיו:
struct audio_hw_device { struct hw_device_t common; /** * used by audio flinger to enumerate what devices are supported by * each audio_hw_device implementation. * * Return value is a bitmask of 1 or more values of audio_devices_t */ uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); ... }; typedef struct audio_hw_device audio_hw_device_t;
בנוסף למאפיינים הרגילים האלה, כל ממשק HAL ספציפי לחומרה שיכול להגדיר עוד תכונות ודרישות משלו. לפרטים, אפשר לעיין במאמרי העזרה בנושא HAL את ההוראות הנפרדות לכל HAL.
פיתוח מודולים של HAL
הטמעות HAL מובנות בקובצי מודולים (.so
),
מקושר באופן דינמי על ידי Android, במקרים הרלוונטיים. כדי לפתח מודולים
יצירת קובצי Android.mk
לכל אחת מהטמעות ה-HAL
ומצביעה אל קובצי המקור. באופן כללי, הספריות המשותפות
שנקראים בפורמט מסוים, כדי שניתן יהיה למצוא אותם ולטעון אותם כמו שצריך. השמות
סכמה משתנה מעט ממודול למודול, אבל פועלת לפי הדפוס הכללי
מתוך: <module_type>.<device_name>
.