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

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

เลเยอร์การแยกแยะฮาร์ดแวร์ของกล้อง (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 โปรดดูข้อมูลอ้างอิงเกี่ยวกับ Camera2 ของ NDK
อินเทอร์เฟซ IPC ของ Binder
อินเทอร์เฟซ Binder ของ IPC ช่วยให้การสื่อสารข้ามขอบเขตโปรเซสได้ง่ายขึ้น คลาส Binder ของกล้องมีอยู่หลายคลาสในไดเรกทอรี frameworks/av/camera/camera/aidl/android/hardware ที่เรียกใช้บริการกล้อง ICameraService คืออินเทอร์เฟซกับบริการกล้อง ICameraDeviceUser คืออินเทอร์เฟซกับอุปกรณ์กล้องที่เปิดอยู่โดยเฉพาะ และ ICameraServiceListener และ ICameraDeviceCallbacks คือ Callback ของ CameraService และ CameraDevice ตามลำดับสำหรับเฟรมเวิร์กแอป
บริการกล้อง
บริการกล้องที่อยู่ในไฟล์ frameworks/av/services/camera/libcameraservice/CameraService.cpp คือโค้ดจริงที่โต้ตอบกับ HAL
HAL
เลเยอร์การแยกแยะฮาร์ดแวร์จะกำหนดอินเทอร์เฟซมาตรฐานที่บริการกล้องเรียกใช้และคุณต้องนำมาใช้งานเพื่อให้ฮาร์ดแวร์ของกล้องทำงานได้อย่างถูกต้อง

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

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

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

  • ICameraProvider: สำหรับการระบุอุปกรณ์แต่ละเครื่องและจัดการสถานะ
  • ICameraDevice: อินเทอร์เฟซของอุปกรณ์กล้อง
  • 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 Glue ที่เกี่ยวข้องภายในเพื่อเข้าถึงโค้ดเนทีฟที่โต้ตอบกับกล้อง
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 เพื่อรับสิทธิ์เข้าถึงบริการกล้อง
พร็อกซี IPC ของ Binder
พร็อกซี Binder ของ IPC ช่วยให้การสื่อสารข้ามขอบเขตโปรเซสง่ายขึ้น คลาส Binder ของกล้องมี 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 ที่มีโครงสร้าง 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 เพื่อสร้างไลบรารีที่ใช้ร่วมกัน ตรวจสอบว่าไฟล์ make มีบรรทัดต่อไปนี้
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    ห้องสมุดต้องชื่อ camera.<device_name> (ระบบจะใส่ .so ต่อท้ายโดยอัตโนมัติ) เพื่อให้ Android โหลดห้องสมุดได้อย่างถูกต้อง โปรดดูตัวอย่างที่ไฟล์ make สำหรับกล้อง Galaxy Nexus ซึ่งอยู่ใน hardware/ti/omap4xxx/Android.mk

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

    ดูตัวอย่างไฟล์ Make ของอุปกรณ์ได้ที่ 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 makefile ของอุปกรณ์เพื่อคัดลอกไฟล์ 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 \
    ...