เลเยอร์ Abstractionion ของฮาร์ดแวร์กล้อง (HAL) ของ Android ช่วยเชื่อมต่อ API เฟรมเวิร์กกล้องใน กล้อง 2 ไปยังไดรเวอร์และฮาร์ดแวร์กล้องที่ใช้งานอยู่ ระบบย่อยของกล้อง รวมไปถึงการใช้งานคอมโพเนนต์ไปป์ไลน์ของกล้องและ HAL ของกล้อง จะมีอินเทอร์เฟซสำหรับนำไปใช้ในการใช้งาน คอมโพเนนต์
สถาปัตยกรรม
รูปและรายการต่อไปนี้อธิบายถึงส่วนประกอบ HAL
- เฟรมเวิร์กแอป
- ในระดับเฟรมเวิร์กแอปคือโค้ดของแอป ซึ่งใช้ 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.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
ไฟล์:
- สร้าง
device/<company_name>/<device_name>/camera
สำหรับใส่ไฟล์ต้นฉบับของไลบรารี - สร้างไฟล์
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
- ระบุว่าอุปกรณ์ของคุณมีฟีเจอร์กล้องโดยคัดลอก 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
- ประกาศความสามารถของตัวแปลงรหัสสื่อ รูปแบบ และความละเอียดของกล้องใน
device/<company_name>/<device_name>/media_profiles.xml
และdevice/<company_name>/<device_name>/media_codecs.xml
ไฟล์ XML โปรดดูรายละเอียดที่หัวข้อ กำลังเปิดเผยตัวแปลงรหัสต่อ เฟรมเวิร์ก - เพิ่มบรรทัดต่อไปนี้ในส่วน
ไฟล์แต่งหน้า
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
รายการในอุปกรณ์ของคุณ วันที่device/<company>/<device>/device.mk
ไฟล์ตัวอย่าง:PRODUCT_PACKAGES := \ Gallery2 \ ...