กล้อง

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

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

สถาปัตยกรรม

รูปและรายการต่อไปนี้อธิบายถึงส่วนประกอบ HAL

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

รูปที่ 1 สถาปัตยกรรมของกล้อง

เฟรมเวิร์กแอป
ในระดับเฟรมเวิร์กแอปคือโค้ดของแอป ซึ่งใช้ API กล้อง 2 เพื่อโต้ตอบกับฮาร์ดแวร์กล้อง โค้ดนี้จากภายใน การโทรที่เกี่ยวข้อง อินเทอร์เฟซสำหรับเข้าถึงโค้ดแบบเนทีฟที่โต้ตอบกับ กล้อง
AIDL
อินเทอร์เฟซ Binder ที่เชื่อมโยงกับ CameraService สามารถ พบที่ Frameworks/av/camera/aidl/android/hardware โค้ดที่สร้างขึ้นจะเรียกโค้ดแบบเนทีฟระดับล่างเพื่อขอรับสิทธิ์เข้าถึง และส่งคืนข้อมูลที่ใช้ในการสร้าง CameraDevice และสุดท้าย CameraCaptureSession ที่ระดับเฟรมเวิร์ก
เฟรมเวิร์กแบบเนทีฟ
เฟรมเวิร์กนี้ที่อยู่ใน frameworks/av/ จะให้ ที่เทียบเท่ากับ CameraDevice และ CameraCaptureSession ใหม่ ดูเพิ่มเติม ข้อมูลอ้างอิงกล้อง NDK2
อินเทอร์เฟซ Binder IPC
อินเทอร์เฟซ IPC Binder ช่วยอำนวยความสะดวกในการสื่อสารข้ามขอบเขตของกระบวนการ มีคลาส Binder กล้องหลายคลาสอยู่ใน frameworks/av/camera/camera/aidl/android/hardware ไดเรกทอรีที่ เรียกใช้บริการกล้อง ICameraService คืออินเทอร์เฟซสำหรับบริการกล้อง ICameraDeviceUser เป็นอินเทอร์เฟซสำหรับ อุปกรณ์กล้อง และ ICameraServiceListener และ ICameraDeviceCallbacks คือ CameraService และ CameraDevice Callback ไปยัง เฟรมเวิร์กของแอป
บริการกล้อง
บริการกล้องที่อยู่ใน frameworks/av/services/camera/libcameraservice/CameraService.cpp, คือโค้ดจริงที่โต้ตอบกับ HAL
HAL
เลเยอร์แอบสแตรกต์ของฮาร์ดแวร์จะกำหนดอินเทอร์เฟซมาตรฐานที่ บริการกล้องที่โทรเข้ามา และคุณต้องติดตั้งใช้งานกล้อง ฮาร์ดแวร์ทำงานได้อย่างถูกต้อง

ติดตั้งใช้งาน HAL

HAL อยู่ระหว่างไดรเวอร์กล้องกับเฟรมเวิร์ก Android ระดับสูง และกำหนดอินเทอร์เฟซที่คุณต้องใช้เพื่อให้แอปทำงานได้อย่างถูกต้อง ฮาร์ดแวร์กล้อง HIDL อินเทอร์เฟซสำหรับ HAL ของกล้องจะกำหนดไว้ใน ฮาร์ดแวร์/อินเทอร์เฟซ/กล้อง

HAL ทั่วไปที่ใช้อินเทอร์เฟซ HIDL ดังต่อไปนี้

  • ICameraProvider สำหรับแจกแจงอุปกรณ์แต่ละเครื่องและจัดการสถานะ
  • ICameraDevice อินเทอร์เฟซของอุปกรณ์กล้อง
  • ICameraDeviceSession อินเทอร์เฟซเซสชันของอุปกรณ์กล้องที่ใช้งานอยู่

การติดตั้งใช้งาน HIDL อ้างอิงใช้งานได้สำหรับ CameraProvider.cpp CameraDevice.cpp และ CameraDeviceSession.cpp การนำไปใช้งานจะครอบคลุม HAL เก่าที่ยังคงใช้ฟิลด์ API เดิม ตั้งแต่ Android 8.0 เป็นต้นไป การใช้งาน HAL ของกล้องต้องใช้ HIDL API ใช้ ของอินเทอร์เฟซเดิมไม่ได้รับการสนับสนุน

การตรวจสอบข้อมูลที่ป้อน

เนื่องจาก HAL มีสิทธิ์เข้าถึงทรัพยากรที่แตกต่างจากบริการกล้อง ขอบเขตระหว่าง ทั้ง 2 ประเภทนี้ถือเป็นขอบเขตความปลอดภัย ซึ่งหมายความว่าพารามิเตอร์ที่ส่งผ่านจากบริการกล้องจะ ไม่น่าเชื่อถือและไม่ผ่านการตรวจสอบ เพื่อป้องกันช่องโหว่ด้านความปลอดภัยที่ทำให้ผู้โจมตี ส่งต่อสิทธิ์หรือเข้าถึงข้อมูลที่ลูกค้าไม่ได้ตั้งใจเข้าถึงได้ โดย HAL ของกล้อง ตรวจสอบพารามิเตอร์ที่ส่งผ่านจากบริการกล้องไปยัง HAL ซึ่งรวมถึงการตรวจสอบบัฟเฟอร์ ค่าความยาวอยู่ภายในช่วงที่อนุญาตและทำความสะอาดพารามิเตอร์ก่อนใช้งานและก่อนการใช้งาน ไปยังไดรเวอร์ฮาร์ดแวร์หรือเคอร์เนล

คอมโพเนนต์ HAL เดิม

ส่วนนี้อธิบายสถาปัตยกรรมของคอมโพเนนต์ HAL เดิมและวิธี ติดตั้งใช้งาน HAL การติดตั้งใช้งาน HAL ของกล้องใน Android 8.0 ขึ้นไปต้องใช้ HIDL API แทน ซึ่งอธิบายไว้ข้างต้น

สถาปัตยกรรม (เดิม)

รูปและรายการต่อไปนี้อธิบายส่วนประกอบ HAL ของกล้องรุ่นเดิม

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

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

เฟรมเวิร์กแอป
ในระดับเฟรมเวิร์กแอปคือโค้ดของแอป ซึ่งใช้ android.hardware.Camera API สำหรับโต้ตอบกับฮาร์ดแวร์กล้อง โค้ดนี้เรียกการทำงานภายใน คลาส Glue 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 คลาสนี้เรียก IPC Binder พร็อกซีสำหรับขอสิทธิ์เข้าถึงบริการกล้อง
พร็อกซี Binder IPC
พร็อกซีไฟล์ยึด IPC ช่วยอำนวยความสะดวกในการสื่อสารข้ามขอบเขตของกระบวนการ คลาสแฟ้มกล้องจะมี 3 คลาสที่อยู่ใน ไดเรกทอรี frameworks/av/camera ที่เรียกใช้บริการกล้อง ICameraService เป็นอินเทอร์เฟซสำหรับบริการกล้อง ICamera เป็นอินเทอร์เฟซสำหรับอุปกรณ์กล้องที่เปิดอยู่ที่เฉพาะเจาะจง และ ICameraClient เป็นอินเทอร์เฟซ ของอุปกรณ์กลับไปที่ เฟรมเวิร์กของแอป
บริการกล้อง
บริการกล้องที่อยู่ใน frameworks/av/services/camera/libcameraservice/CameraService.cpp, คือโค้ดจริงที่โต้ตอบกับ HAL
HAL
เลเยอร์แอบสแตรกต์ของฮาร์ดแวร์จะกำหนดอินเทอร์เฟซมาตรฐานที่ บริการกล้องที่โทรเข้ามา และคุณต้องติดตั้งใช้งานกล้อง ฮาร์ดแวร์ทำงานได้อย่างถูกต้อง
ไดรเวอร์เคอร์เนล
ไดรเวอร์ของกล้องจะทำงานกับฮาร์ดแวร์จริงของกล้องและ การนำ 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 Struct ที่มี โครงสร้าง camera_device_ops ที่มีตัวชี้ไปยังฟังก์ชันที่ใช้งาน อินเทอร์เฟซ HAL สำหรับเอกสารประกอบเกี่ยวกับพารามิเตอร์กล้อง นักพัฒนาซอฟต์แวร์สามารถ ตั้งค่าไว้ที่ frameworks/av/include/camera/CameraParameters.h พารามิเตอร์เหล่านี้ตั้งค่าด้วยฟังก์ชันที่ int (*set_parameters)(struct camera_device *, const char *parms) ชี้ไปใน HAL

สำหรับตัวอย่างของการติดตั้งใช้งาน HAL ให้ดูที่การใช้งานสำหรับ Galaxy Nexus HAL ใน 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 จึงสามารถโหลด ไลบรารี ตัวอย่างเช่น โปรดดูไฟล์ตัวอย่างสำหรับกล้อง Galaxy Nexus ที่อยู่ใน hardware/ti/omap4xxx/Android.mk

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

    ดูตัวอย่างไฟล์ตัวอย่างของอุปกรณ์ได้ที่ device/samsung/tuna/device.mk

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