HAL กำหนดอินเทอร์เฟซมาตรฐานสำหรับผู้จำหน่ายฮาร์ดแวร์เพื่อนำไปใช้ ซึ่งช่วยให้ Android ไม่เชื่อเรื่องการใช้งานไดรเวอร์ระดับล่าง การใช้ HAL ช่วยให้คุณสามารถใช้งานฟังก์ชันต่างๆ ได้โดยไม่ส่งผลกระทบหรือแก้ไขระบบระดับที่สูงกว่า หน้านี้อธิบายสถาปัตยกรรมรุ่นเก่าซึ่งไม่รองรับอีกต่อไปตั้งแต่ Android 8.0 สำหรับ Android 8.0 และสูงกว่า โปรดดู ภาพรวมของ HAL
คุณต้องใช้ HAL (และไดรเวอร์) ที่เกี่ยวข้องสำหรับฮาร์ดแวร์เฉพาะที่ผลิตภัณฑ์ของคุณมอบให้ โดยทั่วไปการใช้งาน HAL จะถูกสร้างไว้ในโมดูลไลบรารีที่ใช้ร่วมกัน (ไฟล์ .so
) แต่เนื่องจาก Android ไม่ได้กำหนดปฏิสัมพันธ์มาตรฐานระหว่างการใช้งาน HAL และไดรเวอร์อุปกรณ์ คุณจึงสามารถทำสิ่งที่ดีที่สุดสำหรับสถานการณ์ของคุณได้ อย่างไรก็ตาม เพื่อให้ระบบ Android สามารถโต้ตอบกับฮาร์ดแวร์ของคุณได้อย่างถูกต้อง คุณ ต้อง ปฏิบัติตามสัญญาที่กำหนดไว้ในอินเทอร์เฟซ HAL เฉพาะฮาร์ดแวร์แต่ละรายการ
เพื่อรับประกันว่า HAL มีโครงสร้างที่คาดเดาได้ แต่ละอินเทอร์เฟซ HAL เฉพาะฮาร์ดแวร์จะมีคุณสมบัติที่กำหนดไว้ใน hardware/libhardware/include/hardware/hardware.h
อินเทอร์เฟซนี้ช่วยให้ระบบ Android โหลดโมดูล 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
ตัวอย่างจาก 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, }, };
อุปกรณ์ฮาล
อุปกรณ์จะสรุปฮาร์ดแวร์ของผลิตภัณฑ์ของคุณ ตัวอย่างเช่น โมดูลเสียงอาจมีอุปกรณ์เสียงหลัก อุปกรณ์เสียง 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>