הנחיות HAL מדור קודם

תקן HAL מגדיר ממשק סטנדרטי שלפיו ספקי חומרה יכולים להטמיע, שמאפשר ל-Android לעקוב אחרי הטמעות של מנהלי התקנים ברמה נמוכה יותר. טכנולוגיית HAL מאפשרת להטמיע פונקציונליות בלי להשפיע או לשנות ברמה הגבוהה יותר. בדף הזה מתוארת הארכיטקטורה הישנה יותר, שלא תמיכה ארוכה יותר החל מ-Android 8.0. עבור Android 8.0 ומעלה, יש לעיין ב HAL Overview

רכיבי HAL

איור 1. רכיבי HAL

עליך להטמיע את הנחיות ה-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>.

ממשק HAL מדור קודם

המונח Legacy HAL מתייחס באופן כללי לכל ה-HALs בגרסאות טרום-Android 8.0 (הוצא משימוש ב-Android 8). חלק גדול מממשקי המערכת של Android (מצלמה, אודיו, חיישנים וכו') מוגדרים מתחת ממשקי 'hardware/libhardware/include/hardware' שיש להם ניהול גרסאות גסות ו-ABI יציב יחסית. א' בכמה מערכות משנה (כולל Wi-Fi, שכבת ממשק רדיו ו-Bluetooth) יש מערכות אחרות שאינן סטנדרטיות והממשקים ב-'libhardware_Legacy' או יהיו משובבים בין ה-codebase. תוכן עם HAL מדור קודם אף פעם מספקות אחריות ליציבות קשיחה.