導入:
主に Android カメラシステムの CameraAPI v2 + HAL3 のアーキテクチャを整理することです。
カメラのアーキテクチャ
アプリとフレームワーク
カメラ API v2 は次の場所にあります。
パッケージ/アプリ/Camer2
フレームワーク/ex/camera2
アプリケーション フレームワーク レベルでは、Camera2 API を使用してカメラのハードウェアと対話します。Binder インターフェイスを呼び出してネイティブ レイヤー コードにアクセスし、カメラを設定します。
AIDL
CameraService に関連付けられたバインダー インターフェイスは次の場所にあります。
フレームワーク/av/カメラ/aidl/android/ハードウェア
AIDL によって生成された Java コードは、natvie 層にアクセスし、物理デバイスのカメラのアクセス許可を取得し、アプリケーション フレームワーク層に戻って CameraDevice を作成し、最後に CameraCaptureSession を作成します。
ネイティブフレームワーク
CameraDevice クラスと CameraCaptureSession クラスのネイティブ クラスは、次の場所にあります。
フレームワーク/AV/カメラ
カメラデバイス:
カメラキャプチャセッション:
バインダー IPC インターフェース
クロスプロセス通信を実装します。カメラ サービスを呼び出すバインダー クラスは、次のパスにあります。
フレームワーク/av/カメラ/aidl/android/ハードウェア
ICameraService: カメラ サービスのインターフェイス
ICameraDeviceUser: 開いている特定のカメラ デバイス
ICameraServiceListener: アプリケーション フレームワーク層の CameraService のコールバック
ICameraDeviceCallbacks:フレームワーク層を適用するために使用されるCameraDevice のコールバック
カメラサービス
CameraService の実装クラスは次の場所にあります。
フレームワーク/av/サービス/カメラ/libcameraservice/CameraService.cpp
実際に HAL と対話するコード
ハル
CameraService によって呼び出されるカメラ ハードウェア操作の標準インターフェイスの実装を提供します
フィルター
カメラ HAL の HIDL インターフェイス定義は次の場所にあります。
ハードウェア/インターフェース/カメラ
実装が必要なカメラサービスのHAL(ハードウェアアブストラクトレイヤー)層標準インターフェース
HALの実装
HAL レイヤーは、カメラ ドライバーと Android フレームワークの間に位置します。
HAL は、アプリケーションがカメラ ハードウェアを適切に操作できるように実装する必要があるインターフェイスを定義します。
一般的な HAL バインダーは、次の HIDL インターフェイスを実装する必要があります。
ICameraProvider: 個々のカメラ デバイスを列挙し、その状態を管理するために使用されます。
ICameraDevice: カメラデバイスのインターフェース
ICameraDeviceSession: アクティブなカメラ デバイス セッション インターフェイス
入力検証
HAL はカメラ サービスとは異なるリソースにアクセスできるため、この 2 つの境界はセキュリティ境界とみなされます。
したがって、カメラ HAL は、カメラ サービスから HAL レイヤーに渡されるパラメーターを検証する必要があります。これには、バッファ長の値が許容範囲内であることのチェック、パラメータが使用されてハードウェアまたはカーネル ドライバに渡される前にパラメータをサニタイズすることが含まれます。