![ไอคอน HAL ของกล้อง Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=1&hl=th)
เลเยอร์การแยกแยะฮาร์ดแวร์ของกล้อง (HAL) ของ Android จะเชื่อมต่อ API ของเฟรมเวิร์กกล้องระดับสูงขึ้นใน Camera 2 กับไดรเวอร์และฮาร์ดแวร์ของกล้องที่อยู่เบื้องล่าง ระบบย่อยของกล้องจะรวมการใช้งานสำหรับคอมโพเนนต์ไปป์ไลน์ของกล้อง ส่วน HAL ของกล้องจะมีอินเทอร์เฟซสำหรับใช้กับการใช้งานคอมโพเนนต์เหล่านี้ในเวอร์ชันของคุณ
สถาปัตยกรรม
รูปภาพและรายการต่อไปนี้อธิบายองค์ประกอบ HAL
![สถาปัตยกรรมกล้อง Android](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=1&hl=th)
รูปที่ 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](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera.png?authuser=1&hl=th)
รูปที่ 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
- สร้าง
device/<company_name>/<device_name>/camera
ไดเรกทอรีเพื่อเก็บไฟล์ต้นทางของไลบรารี - สร้างไฟล์
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
- ระบุว่าอุปกรณ์มีฟีเจอร์กล้องโดยคัดลอกไฟล์ 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
- ประกาศความสามารถของโค้ดคิวสื่อ รูปแบบ และความละเอียดของกล้องในไฟล์
device/<company_name>/<device_name>/media_profiles.xml
และdevice/<company_name>/<device_name>/media_codecs.xml
XML โปรดดูรายละเอียดที่หัวข้อการเปิดเผยตัวแปลงรหัสให้กับเฟรมเวิร์ก - เพิ่มบรรทัดต่อไปนี้ในไฟล์
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
- หากต้องการรวมแอปกล้องไว้ในภาพระบบของอุปกรณ์ ให้ระบุแอปนั้นในตัวแปร
PRODUCT_PACKAGES
ในไฟล์ makefile ของdevice/<company>/<device>/device.mk
อุปกรณ์PRODUCT_PACKAGES := \ Gallery2 \ ...