Hardware Abstraction Layer (HAL) ของกล้องใน Android จะเชื่อมต่อ API ของเฟรมเวิร์กกล้องระดับสูง ใน Camera 2 กับไดรเวอร์และฮาร์ดแวร์กล้องพื้นฐาน ระบบย่อยของกล้องประกอบด้วยการติดตั้งใช้งานสำหรับคอมโพเนนต์ของไปป์ไลน์กล้อง ขณะที่ HAL ของกล้องมีอินเทอร์เฟซสำหรับใช้ในการติดตั้งใช้งานคอมโพเนนต์เหล่านี้ในเวอร์ชันของคุณ
สถาปัตยกรรม
รูปภาพและรายการต่อไปนี้อธิบายคอมโพเนนต์ HAL
รูปที่ 1 สถาปัตยกรรมกล้อง
- เฟรมเวิร์กแอป
- โค้ดของแอปจะอยู่ที่ระดับเฟรมเวิร์กแอป ซึ่งใช้ Camera 2 API เพื่อโต้ตอบกับฮาร์ดแวร์กล้อง ภายใน โค้ดนี้จะเรียกใช้ อินเทอร์เฟซ Binder ที่เกี่ยวข้องเพื่อเข้าถึงโค้ดแบบเนทีฟที่โต้ตอบกับ กล้อง
- AIDL
- อินเทอร์เฟซ Binder ที่เชื่อมโยงกับ
CameraServiceจะอยู่ที่ frameworks/av/camera/aidl/android/hardware โค้ดที่สร้างขึ้นจะเรียกใช้โค้ดแบบเนทีฟระดับล่างเพื่อเข้าถึงกล้องจริงและแสดงผลข้อมูลที่ใช้สร้างออบเจ็กต์CameraDeviceและในที่สุดCameraCaptureSessionที่ระดับเฟรมเวิร์ก - เฟรมเวิร์กแบบเนทีฟ
- เฟรมเวิร์กนี้ซึ่งอยู่ใน
frameworks/av/มีคลาสCameraDeviceและCameraCaptureSessionที่เทียบเท่ากับแบบเนทีฟ ดูข้อมูลอ้างอิง NDK Camera2 ด้วย - อินเทอร์เฟซ Binder IPC
- อินเทอร์เฟซ Binder IPC ช่วยให้การสื่อสารข้ามขอบเขตของกระบวนการเป็นไปได้ง่ายขึ้น
มีคลาส Binder ของกล้องหลายคลาสอยู่ใน
frameworks/av/camera/camera/aidl/android/hardwareไดเรกทอรีซึ่ง เรียกใช้บริการกล้องICameraServiceเป็นอินเทอร์เฟซสำหรับบริการกล้องICameraDeviceUserเป็นอินเทอร์เฟซสำหรับอุปกรณ์กล้องที่เปิดอยู่โดยเฉพาะ และICameraServiceListenerกับICameraDeviceCallbacksเป็นการเรียกกลับCameraServiceและCameraDeviceที่เกี่ยวข้องกับ เฟรมเวิร์กแอป - บริการกล้อง
- บริการกล้องซึ่งอยู่ใน
frameworks/av/services/camera/libcameraservice/CameraService.cpp, เป็นโค้ดจริงที่โต้ตอบกับ HAL - HAL
- Hardware Abstraction Layer กำหนดอินเทอร์เฟซมาตรฐานที่ บริการกล้องเรียกใช้ และคุณต้องติดตั้งใช้งานเพื่อให้ฮาร์ดแวร์กล้อง ทำงานได้อย่างถูกต้อง
ติดตั้งใช้งาน HAL
HAL อยู่ระหว่างไดรเวอร์กล้องกับเฟรมเวิร์ก Android ระดับสูงกว่า และกำหนดอินเทอร์เฟซที่คุณต้องติดตั้งใช้งานเพื่อให้แอปทำงานกับฮาร์ดแวร์กล้องได้อย่างถูกต้อง อินเทอร์เฟซ HIDL สำหรับ HAL ของกล้องจะกำหนดไว้ใน hardware/interfaces/camera
HAL ที่ใช้ Binder โดยทั่วไปต้องติดตั้งใช้งานอินเทอร์เฟซ HIDL ต่อไปนี้
-
ICameraProvider: สำหรับการแจกแจงอุปกรณ์แต่ละเครื่องและการจัดการสถานะของอุปกรณ์ -
ICameraDevice: อินเทอร์เฟซอุปกรณ์กล้อง -
ICameraDeviceSession: `ICameraDeviceSession`: อินเทอร์เฟซเซสชันอุปกรณ์กล้องที่ใช้งานอยู่
การติดตั้งใช้งาน HIDL อ้างอิงมีให้ใช้งานสำหรับ
CameraProvider.cpp,
CameraDevice.cpp, และ
CameraDeviceSession.cpp
การติดตั้งใช้งานจะห่อหุ้ม HAL เก่าที่ยังคงใช้
API เดิม
ตั้งแต่ Android 8.0 เป็นต้นไป การติดตั้งใช้งาน HAL ของกล้องต้องใช้ HIDL API และระบบไม่รองรับการใช้อินเทอร์เฟซเดิม
การตรวจสอบข้อมูลที่ป้อน
เนื่องจาก HAL มีสิทธิ์เข้าถึงทรัพยากรต่างๆ มากกว่าบริการกล้อง ระบบจึงถือว่าขอบเขตระหว่าง HAL กับบริการกล้องเป็นขอบเขตด้านความปลอดภัย ซึ่งหมายความว่าพารามิเตอร์ที่ส่งจากบริการกล้องจะถือว่าไม่น่าเชื่อถือและไม่ได้ล้างข้อมูล HAL ของกล้องต้องตรวจสอบพารามิเตอร์ที่ส่งจากบริการกล้องไปยัง HAL เพื่อป้องกันช่องโหว่ด้านความปลอดภัยที่อนุญาตให้ผู้โจมตีเพิ่มสิทธิ์หรือเข้าถึงข้อมูลที่ตนไม่ควรเข้าถึง ซึ่งรวมถึงการตรวจสอบว่าค่าความยาวบัฟเฟอร์อยู่ในช่วงที่อนุญาต และการล้างข้อมูลพารามิเตอร์ก่อนใช้งานและก่อนส่งไปยังฮาร์ดแวร์หรือไดรเวอร์เคอร์เนล
HAL เดิม
ส่วนนี้จะอธิบายสถาปัตยกรรมของคอมโพเนนต์ HAL เดิมและวิธีติดตั้งใช้งาน HAL การติดตั้งใช้งาน HAL ของกล้องใน Android 8.0 ขึ้นไปต้องใช้ HIDL API แทน ซึ่งอธิบายไว้ข้างต้น
สถาปัตยกรรม (เดิม)
รูปภาพและรายการต่อไปนี้อธิบายคอมโพเนนต์ HAL ของกล้องเดิม
รูปที่ 2 สถาปัตยกรรมกล้องเดิม
- เฟรมเวิร์กแอป
- โค้ดของแอปจะอยู่ที่ระดับเฟรมเวิร์กแอป ซึ่งใช้
android.hardware.CameraAPI เพื่อโต้ตอบกับฮาร์ดแวร์กล้อง ภายใน โค้ดนี้จะเรียกใช้คลาสกาว JNI ที่เกี่ยวข้องเพื่อเข้าถึงโค้ดแบบเนทีฟที่โต้ตอบกับกล้อง - JNI
- โค้ด JNI ที่เชื่อมโยงกับ
android.hardware.Cameraอยู่ในframeworks/base/core/jni/android_hardware_Camera.cppโค้ดนี้จะเรียกใช้โค้ดแบบเนทีฟระดับล่างเพื่อเข้าถึงกล้องจริงและแสดงผลข้อมูลที่ใช้สร้างออบเจ็กต์android.hardware.Cameraที่ระดับเฟรมเวิร์ก - เฟรมเวิร์กแบบเนทีฟ
- เฟรมเวิร์กแบบเนทีฟที่กำหนดไว้ใน
frameworks/av/camera/Camera.cppมีคลาสandroid.hardware.Cameraที่เทียบเท่ากับแบบเนทีฟ คลาสนี้จะเรียกใช้พร็อกซี Binder IPC เพื่อเข้าถึงบริการกล้อง - พร็อกซี Binder IPC
- พร็อกซี Binder IPC ช่วยให้การสื่อสารข้ามขอบเขตของกระบวนการเป็นไปได้ง่ายขึ้น
มีคลาส Binder ของกล้อง 3 คลาสอยู่ใน
frameworks/av/cameraไดเรกทอรีซึ่งเรียกใช้บริการกล้องICameraServiceเป็นอินเทอร์เฟซสำหรับบริการกล้องICameraเป็นอินเทอร์เฟซสำหรับอุปกรณ์กล้องที่เปิดอยู่โดยเฉพาะ และICameraClientเป็นอินเทอร์เฟซของอุปกรณ์ที่ส่งกลับไปยัง เฟรมเวิร์กแอป - บริการกล้อง
- บริการกล้องซึ่งอยู่ใน
frameworks/av/services/camera/libcameraservice/CameraService.cpp, เป็นโค้ดจริงที่โต้ตอบกับ HAL - HAL
- Hardware Abstraction Layer กำหนดอินเทอร์เฟซมาตรฐานที่ บริการกล้องเรียกใช้ และคุณต้องติดตั้งใช้งานเพื่อให้ฮาร์ดแวร์กล้อง ทำงานได้อย่างถูกต้อง
- ไดรเวอร์เคอร์เนล
- ไดรเวอร์ของกล้องจะโต้ตอบกับฮาร์ดแวร์กล้องจริงและการติดตั้งใช้งาน HAL ของคุณ กล้องและไดรเวอร์ต้องรองรับรูปแบบรูปภาพ YV12 และ NV21 เพื่อรองรับการแสดงตัวอย่างรูปภาพจากกล้องบน จอแสดงผลและการบันทึกวิดีโอ
ติดตั้งใช้งาน HAL (เดิม)
HAL อยู่ระหว่างไดรเวอร์กล้องกับเฟรมเวิร์ก Android ระดับสูงกว่า และกำหนดอินเทอร์เฟซที่คุณต้องติดตั้งใช้งานเพื่อให้แอปทำงานกับฮาร์ดแวร์กล้องได้อย่างถูกต้อง อินเทอร์เฟซ HAL กำหนดไว้ในไฟล์ส่วนหัว hardware/libhardware/include/hardware/camera.h และ hardware/libhardware/include/hardware/camera_common.h
camera_common.h กำหนด camera_module ซึ่งเป็นโครงสร้างมาตรฐานสำหรับรับข้อมูลทั่วไปเกี่ยวกับกล้อง เช่น รหัสกล้องและพร็อพเพอร์ตี้ที่กล้องทุกตัวมีเหมือนกัน (เช่น กล้องด้านหน้าหรือด้านหลัง)
camera.h มีโค้ดที่สอดคล้องกับ
android.hardware.Camera ไฟล์ส่วนหัวนี้ประกาศโครงสร้าง
camera_device ซึ่งมีโครงสร้าง
camera_device_ops ที่มีตัวชี้ไปยังฟังก์ชันที่ติดตั้งใช้งาน
อินเทอร์เฟซ HAL โปรดดูเอกสารประกอบเกี่ยวกับพารามิเตอร์กล้องที่นักพัฒนาแอปตั้งค่าได้ที่ frameworks/av/include/camera/CameraParameters.h
พารามิเตอร์เหล่านี้ตั้งค่าด้วยฟังก์ชันที่ตัวชี้ int
(*set_parameters)(struct camera_device *, const char *parms) ใน HAL ชี้อยู่
ดูตัวอย่างการติดตั้งใช้งาน HAL ได้ที่การติดตั้งใช้งาน HAL ของ Galaxy Nexus ใน hardware/ti/omap4xxx/camera
กำหนดค่าไลบรารีที่แชร์
ตั้งค่าระบบบิลด์ของ Android เพื่อแพ็กเกจการติดตั้งใช้งาน HAL ลงในไลบรารีที่แชร์และคัดลอกไปยังตำแหน่งที่เหมาะสมอย่างถูกต้องโดยการสร้างไฟล์ Android.mk ดังนี้
- สร้าง
device/<company_name>/<device_name>/cameraไดเรกทอรีเพื่อเก็บไฟล์ซอร์สของไลบรารี - สร้างไฟล์
Android.mkเพื่อสร้างไลบรารีที่แชร์ ตรวจสอบว่า MakeFile มีบรรทัดต่อไปนี้LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
ไลบรารีต้องมีชื่อว่า
camera.<device_name>(ระบบจะเพิ่ม.soโดยอัตโนมัติ) เพื่อให้ Android โหลด ไลบรารีได้อย่างถูกต้อง ดูตัวอย่างได้ที่ MakeFile สำหรับกล้อง Galaxy Nexus ซึ่งอยู่ในhardware/ti/omap4xxx/Android.mk - ระบุว่าอุปกรณ์ของคุณมีฟีเจอร์กล้องโดยคัดลอกไฟล์ XML ฟีเจอร์ที่จำเป็นในไดเรกทอรี
frameworks/native/data/etcด้วย MakeFile ของอุปกรณ์ ตัวอย่างเช่น หากต้องการระบุว่าอุปกรณ์ของคุณมีแฟลชกล้องและ สามารถโฟกัสอัตโนมัติได้ ให้เพิ่มบรรทัดต่อไปนี้ใน<device>/<company_name>/<device_name>/device.mkMakeFile ของอุปกรณ์PRODUCT_COPY_FILES := \ ... PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
ดูตัวอย่าง MakeFile ของอุปกรณ์ได้ที่
device/samsung/tuna/device.mk - ประกาศความสามารถของตัวแปลงสัญญาณสื่อ รูปแบบ และความละเอียดของกล้องใน
device/<company_name>/<device_name>/media_profiles.xmlและdevice/<company_name>/<device_name>/media_codecs.xmlไฟล์ XML ดูรายละเอียดได้ที่ แสดงตัวแปลงสัญญาณต่อ เฟรมเวิร์ก - เพิ่มบรรทัดต่อไปนี้ใน MakeFile
device/<company_name>/<device_name>/device.mkของอุปกรณ์ เพื่อคัดลอกไฟล์media_profiles.xmlและmedia_codecs.xmlไปยังตำแหน่งที่เหมาะสม# media config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml # media codec config xml file PRODUCT_COPY_FILES += \ <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml - หากต้องการรวมแอปกล้องถ่ายรูปไว้ในอิมเมจระบบของอุปกรณ์ ให้ระบุแอปในตัวแปร
PRODUCT_PACKAGESใน MakeFiledevice/<company>/<device>/device.mkของอุปกรณ์PRODUCT_PACKAGES := \ Gallery2 \ ...