Google is committed to advancing racial equity for Black communities. See how.
דף זה תורגם על ידי Cloud Translation API.
Switch to English

HALs מדור קודם

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

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

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