HAL เดิม

HAL กำหนดอินเทอร์เฟซมาตรฐานสำหรับผู้ให้บริการฮาร์ดแวร์ ซึ่งทำให้ Android ไม่จำเป็นต้องสนใจการใช้ไดรเวอร์ระดับล่าง การใช้ HAL ช่วยให้คุณใช้ฟังก์ชันต่างๆ ได้โดยไม่ส่งผลกระทบต่อหรือแก้ไข ระบบระดับสูงขึ้น หน้านี้จะอธิบายถึงสถาปัตยกรรมเก่าๆ ซึ่งไม่ใช่ ได้รับการรองรับมากขึ้นตั้งแต่ Android 8.0 สำหรับ Android 8.0 ขึ้นไป โปรดดูที่ ภาพรวม HAL

ส่วนประกอบของ HAL

รูปที่ 1 ส่วนประกอบของ HAL

คุณต้องติดตั้งใช้งาน HAL (และไดรเวอร์) ที่เกี่ยวข้องสำหรับ ฮาร์ดแวร์ที่ผลิตภัณฑ์ของคุณให้มา การติดตั้งใช้งาน HAL มักรวมอยู่ใน โมดูลไลบรารีที่ใช้ร่วมกัน (.so ไฟล์) แต่เนื่องจาก Android ไม่ได้กำหนด เป็นการโต้ตอบแบบมาตรฐานระหว่างการติดตั้งใช้งาน HAL และไดรเวอร์อุปกรณ์ ให้พยายามที่สุดสำหรับสถานการณ์ของคุณ แต่หากต้องการเปิดใช้ระบบ Android โต้ตอบกับฮาร์ดแวร์ของคุณอย่างถูกต้อง คุณต้องปฏิบัติตาม ที่กำหนดไว้ในอินเทอร์เฟซ HAL เฉพาะฮาร์ดแวร์แต่ละรายการ

เพื่อรับประกันว่า HAL จะมีโครงสร้างที่คาดการณ์ได้ ฮาร์ดแวร์แต่ละอย่าง อินเทอร์เฟซ HAL มีคุณสมบัติที่กำหนดไว้ใน hardware/libhardware/include/hardware/hardware.h อินเทอร์เฟซนี้ ช่วยให้ระบบ Android โหลดโมดูล HAL เวอร์ชันที่ถูกต้องใน อย่างสม่ำเสมอ อินเทอร์เฟซ HAL ประกอบด้วยองค์ประกอบ 2 ส่วน ได้แก่ โมดูลและอุปกรณ์

โมดูล 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 Audio ของ 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 หรือบลูทูธ อุปกรณ์เสียง 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 เดิม

คำว่า HAL เดิมหมายถึง HAL ก่อน Android 8.0 ทั้งหมด (เลิกใช้งานใน Android 8) อินเทอร์เฟซระบบ Android จำนวนมาก (กล้อง เสียง เซ็นเซอร์ ฯลฯ) มีการกำหนดไว้ภายใต้ "ฮาร์ดแวร์/libhardware/include/hardware" และมีเวอร์ชันคร่าวๆ และมี ABI ที่เสถียรพอสมควร ต ระบบย่อยไม่กี่ระบบ (รวมถึง Wi-Fi, เลเยอร์อินเทอร์เฟซของวิทยุ และบลูทูธ) ที่มีระบบอื่นๆ ที่ไม่ได้มาตรฐาน ใน "libhardware_legacy" หรือแทรกอยู่ทั่ว Codebase HAL เดิมไม่มี ให้การรับประกันความเสถียรที่ยาก