HALs מדור קודם

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

רכיבי HAL

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

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

כדי להבטיח של-HAL יש מבנה צפוי, לכל ממשק HAL ספציפי לחומרה יש מאפיינים המוגדרים ב- hardware/libhardware/include/hardware/hardware.h . ממשק זה מאפשר למערכת אנדרואיד לטעון גרסאות נכונות של מודולי HAL שלך בצורה עקבית. ממשק HAL מורכב משני רכיבים: מודולים והתקנים.

מודולי HAL

מודול מייצג את יישום ה-HAL הארוז שלך, המאוחסן כספרייה משותפת ( .so file ). קובץ הכותרת hardware/libhardware/include/hardware/hardware.h מגדיר מבנה ( hw_module_t ) המייצג מודול ומכיל מטא נתונים כגון הגרסה, השם והמחבר של המודול. אנדרואיד משתמש במטא נתונים אלה כדי למצוא ולטעון את מודול 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 . דוגמה מ-HAL האודיו של Nexus 9:

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.mk עבור כל אחת מיישומי HAL שלך והצבעה על קבצי המקור שלך. באופן כללי, הספריות המשותפות שלך חייבות לקבל שם בפורמט מסוים כדי שניתן יהיה למצוא אותן ולטעון אותן כראוי. ערכת השמות משתנה מעט ממודול למודול, אך עוקבת אחר הדפוס הכללי של: <module_type>.<device_name> .