กล้องถ่ายรูป

ไอคอน HAL กล้องของ Android

Hardware Abstraction Layer (HAL) ของกล้องใน Android จะเชื่อมต่อ API ของเฟรมเวิร์กกล้องระดับสูง ใน Camera 2 กับไดรเวอร์และฮาร์ดแวร์กล้องพื้นฐาน ระบบย่อยของกล้องประกอบด้วยการติดตั้งใช้งานสำหรับคอมโพเนนต์ของไปป์ไลน์กล้อง ขณะที่ HAL ของกล้องมีอินเทอร์เฟซสำหรับใช้ในการติดตั้งใช้งานคอมโพเนนต์เหล่านี้ในเวอร์ชันของคุณ

สถาปัตยกรรม

รูปภาพและรายการต่อไปนี้อธิบายคอมโพเนนต์ HAL

สถาปัตยกรรมกล้องของ Android

รูปที่ 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 ของกล้องเดิม

สถาปัตยกรรมกล้องของ Android

รูปที่ 2 สถาปัตยกรรมกล้องเดิม

เฟรมเวิร์กแอป
โค้ดของแอปจะอยู่ที่ระดับเฟรมเวิร์กแอป ซึ่งใช้ android.hardware.Camera API เพื่อโต้ตอบกับฮาร์ดแวร์กล้อง ภายใน โค้ดนี้จะเรียกใช้คลาสกาว 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 ดังนี้

  1. สร้างdevice/<company_name>/<device_name>/camera ไดเรกทอรีเพื่อเก็บไฟล์ซอร์สของไลบรารี
  2. สร้างไฟล์ 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

  3. ระบุว่าอุปกรณ์ของคุณมีฟีเจอร์กล้องโดยคัดลอกไฟล์ XML ฟีเจอร์ที่จำเป็นในไดเรกทอรี frameworks/native/data/etc ด้วย MakeFile ของอุปกรณ์ ตัวอย่างเช่น หากต้องการระบุว่าอุปกรณ์ของคุณมีแฟลชกล้องและ สามารถโฟกัสอัตโนมัติได้ ให้เพิ่มบรรทัดต่อไปนี้ใน <device>/<company_name>/<device_name>/device.mk MakeFile ของอุปกรณ์
    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

  4. ประกาศความสามารถของตัวแปลงสัญญาณสื่อ รูปแบบ และความละเอียดของกล้องใน device/<company_name>/<device_name>/media_profiles.xml และ device/<company_name>/<device_name>/media_codecs.xml ไฟล์ XML ดูรายละเอียดได้ที่ แสดงตัวแปลงสัญญาณต่อ เฟรมเวิร์ก
  5. เพิ่มบรรทัดต่อไปนี้ใน 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
    
  6. หากต้องการรวมแอปกล้องถ่ายรูปไว้ในอิมเมจระบบของอุปกรณ์ ให้ระบุแอปในตัวแปร PRODUCT_PACKAGES ใน MakeFile device/<company>/<device>/device.mk ของอุปกรณ์
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...