HAL กำหนดอินเทอร์เฟซมาตรฐานสำหรับผู้ให้บริการฮาร์ดแวร์ ซึ่งทำให้ Android ไม่จำเป็นต้องสนใจการใช้ไดรเวอร์ระดับล่าง การใช้ HAL ช่วยให้คุณใช้ฟังก์ชันต่างๆ ได้โดยไม่ส่งผลกระทบต่อหรือแก้ไข ระบบระดับสูงขึ้น หน้านี้จะอธิบายถึงสถาปัตยกรรมเก่าๆ ซึ่งไม่ใช่ ได้รับการรองรับมากขึ้นตั้งแต่ Android 8.0 สำหรับ Android 8.0 ขึ้นไป โปรดดูที่ ภาพรวม HAL
![ส่วนประกอบของ HAL](https://source.android.com/static/docs/core/architecture/images/ape_fwk_hal.png?authuser=7&hl=th)
รูปที่ 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>