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