カメラ HAL テストのチェックリスト

このページでは、Android カメラの Hardware Abstraction Layer(HAL)の評価に使用できるすべてのテストを示します。これは、不具合を極力排除してカメラ HAL を適切に実装できるように、相手先ブランド製品製造企業(OEM)およびアプリ プロセッサ(AP)ベンダーを対象としています。このテストは、Android 互換性テストスイート(CTS)に自発的に追加されたものですが、カメラのテスト範囲を大幅に拡大し、潜在的なバグの発見に役立ちます。

これらのテストに合格することにより、OEM は Android カメラ Hardware Abstraction Layer(HAL)3 インターフェースを適切に実装していることを確認できます。チェックリストのすべての項目に適合している場合、デバイスの実装は Android カメラ HAL インターフェースに関して「完全」だとみなされます。これにより、デバイスがカメラアプリのベースとなる android.hardware.camera2 パッケージを適切にサポートできるようになります。

カメラ HAL3 仕様

Android カメラ HAL3 仕様は、デバイスの要件に関する信頼できる情報源です。このページでは、チェックリストとして使用できるすべてのテストの概要を説明しています。カメラ HAL を実装する AP ベンダーなどは、カメラ HAL3 仕様を 1 行ずつ追いながら、それにデバイスが適合していることを確認する必要があります。

現在の HAL 仕様は、Android 5.0 以降の汎用 Android プラットフォーム開発キット(PDK)内の以下のファイルで定義されています。

カメラのテストの種類

以下に、最新の Android カメラで使用できる主なテストの種類と、関連する手順への参照を示します。

これらのテストの全種類について、以下で詳しく説明します。テストを説明する順序は、OEM がこの順序で実行するのが望ましい順序となっています。

たとえば、デバイスがネイティブ テストでエラーになると、次の互換性テストスイート(CTS)でもエラーになります。CTS でエラーになった場合、画像テストスイート(ITS)に進んでもほとんどが無駄になります。次のテストに進む前に、それぞれの種類のテストでエラーを解決することをおすすめします。

ベンダー テストスイート(VTS)のテスト

Android ベンダー テストスイート(VTS)は、HIDL インターフェースのレベルで動作するテストスイートです。VTS の使用方法については、ベンダー テストスイートのページをご覧ください。

互換性テストスイート(CTS)によるテスト

カメラ Android 互換性テストスイート(CTS)テストは、デバイスの適合性に絞ったテストです。テスト環境の設定については、CTS のセットアップのページをご覧ください。

カメラ CTS テストは、platform/cts 以下にあります。

カメラ CTS を USB ウェブカメラなどの外部カメラをサポートするデバイスで使用する場合は、CTS を実行するときにデバイスが接続されている必要があり、未接続の場合は自動的にエラーとなります。外部カメラには、Logitech HD Pro Webcam C920Microsoft LifeCam HD-3000 などがあります。

CTS の実行に関する一般的な手順については、CTS の概要のページとそのサブページをご覧ください。

android.hardware.Camera API に対する CTS テスト

cts/tests/tests/ 以下にある次のカメラテストをご覧ください。

  • hardware/src/android/hardware/cts/CameraTest.java
  • hardware/src/android/hardware/cts/CameraGLTest.java
  • hardware/src/android/hardware/cts/Camera_SizeTest.java
  • permission/src/android/permission/cts/CameraPermissionTest.java

android.hardware.camera2 API に対する CTS テスト

cts/tests/tests/ 以下にある次のカメラテストをご覧ください。

  • hardware/src/android/hardware/camera2/cts/*
  • permission/src/android/permission/cts/Camera2PermissionTest.java

CTS 検証ツール カメラテスト

cts/apps/CtsVerifier/src/com/android/cts/verifier/camera/* 以下にある次のカメラテストをご覧ください。

画像テストスイート(ITS)のテスト

カメラ画像テストスイート(ITS)のテストは、画像の正確性に絞ったテストです。テストを実行するには、USB 経由で Android デバイスに接続したワークステーション上で Python スクリプトを実行します。

カメラ ITS のインフラストラクチャとテストは、cts/apps/CameraITS ディレクトリにあります。各テストは tests/scene# サブディレクトリにあります。

テストのセットアップと実行方法の詳細については、カメラ ITS をご覧ください。

シーンとテストの詳細については、カメラ ITS テストをご覧ください。

ITS テストは、合格か不合格かのいずれかです。各シーンのフォルダにある必須のテストには、すべて合格しなければなりません。必須でないテストは不合格でもよく、CtsVerifier で合格としてカウントされます。

ITS は CTS でテストされていないシナリオをテストする、HAL 3.2 テストプランの重要なコンポーネントです。

メディア フレームワークのテスト

MediaFrameworkTest にあるカメラ関連のすべてのメディアテストに合格してください。これらのテストでは、mediaframeworktest.apk を Android デバイスにインストールする必要があります。make mediaframeworktest を実行し、作成された .apk を adb を使用してインストールする必要があります。コマンドの例を以下に示します。

カメラ関連のメディア フレームワーク テストは、platform/frameworks/base 以下にあります。

テストのソースコードは、frameworks/base/media/tests/MediaFrameworkTest にあります。

次のコマンドでテストをセットアップします。

make mediaframeworktest
adb install out/target/product/name/data/app/mediaframeworktest.apk

ここで、name 変数は、ベンダーの製品があるディレクトリを表します。

次のディレクトリまたはそのサブディレクトリに、すべてのテストがあります。

frameworks/base/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest

各サブディレクトリは、テストのクラスを表します。

  • functional/
  • integration/
  • performance/
  • power/
  • stress/
  • unit/

メディア フレームワークのテストの実行

すべてのテストを表示するには、次のコマンドを実行します。

adb shell pm list instrumentation

次のような結果が表示されます。

instrumentation:com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner
(target=com.android.mediaframeworktest)
instrumentation:com.android.mediaframeworktest/.MediaRecorderStressTestRunner
(target=com.android.mediaframeworktest)
instrumentation:com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner
(target=com.android.mediaframeworktest)
instrumentation:com.android.mediaframeworktest/.MediaFrameworkPowerTestRunner
(target=com.android.mediaframeworktest)

各行の instrumentation:(target=com.android.mediaframeworktest) の間にあるコンポーネントを確認して抽出します。コンポーネントは、ターゲット パッケージ名(com.android.mediaframeworktest)とテストランナー名(MediaFrameworkTestRunner)から構成されます。

たとえば、次のようになります。

com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner
com.android.mediaframeworktest/.MediaRecorderStressTestRunner
com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner
com.android.mediaframeworktest/.MediaFrameworkPowerTestRunner

次に、各コンポーネントを以下のように adb shell am instrument に渡します。

adb shell am instrument -w component.name

ここで、component.name は上の手順で抽出した値です。次に例を示します。

adb shell am instrument -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner

クラスパスは Java パッケージ + クラス名ですが、インストルメンテーション パッケージは必ずしも Java パッケージと同じである必要はありません。コンポーネント名を連結する場合は、テストランナー クラスが存在する Java パッケージではなく、必ず AndroidManifest.xml パッケージを使用してください。

1 つのクラスのテストを実行するには、次のように -e class 引数を渡します。

adb shell am instrument -e class com.android.mediaframeworktest.integration.CameraBinderTest -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner

テストクラスの 1 つのメソッドのみを実行するには、次のように、シャープ記号(#)とメソッド名(この場合は testConnectPro)をクラス名に追加します。

adb shell am instrument -e class 'com.android.mediaframeworktest.integration.CameraBinderTest#testConnectPro' -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner

メディア設定機能テスト

機能テストの実行例を次に示します。このテストでは、カメラ設定のさまざまな組み合わせ(フラッシュ、露出、ホワイト バランス、シーン、画像サイズ、ジオタグ)からなる基本機能を検証します。

次のテストコマンドを実行します。

adb shell am instrument -w -r  -e delay_msec 15 -e log true -e class com.android.mediaframeworktest.functional.camera.CameraPairwiseTest com.android.mediaframeworktest/com.android.mediaframeworktest.CameraStressTestRunner

メディア統合テスト

統合テストを実行するコマンドの例を次に示します。この例では mediaframeworktest/integration/CameraBinderTest.java と mediaframeworktest/CameraStressTestRunner.java を実行します。

adb  shell am instrument -e class \ 'com.android.mediaframeworktest.integration.CameraBinderTest' -w \ 'com.android.mediaframeworktest/.CameraStressTestRunner'

成功した場合、出力は次のようになります。

-----

com.android.mediaframeworktest.integration.CameraBinderTest:...........
Test results for CameraStressTestRunner=...........
Time: 3.328

OK (11 tests)

-----

メディア性能テスト

このプレビュー メモリテストでは、カメラ プレビューを開いて解放するテストを 200 回繰り返します。20 回の繰り返しごとに、ps mediaserver のスナップショットが記録され、200 回繰り返した後でメモリ使用量の差が比較されます。差が 150 kM より大きい場合、テストは不合格となります。

次のテストコマンドを実行します。

adb shell am instrument -w -r  -e class com.android.mediaframeworktest.performance.MediaPlayerPerformance#testCameraPreviewMemoryUsage com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner

出力の詳細は /sdcard/mediaMemOutput.txt をご覧ください。

メディア単体テスト

単体テストを実行するためのコマンドは、どれもよく似ています。たとえば、CameraMetadataTest.java の場合は、次のようなコマンドになります。

adb shell am instrument -e class 'com.android.mediaframeworktest.unit.CameraMetadataTest' -w 'com.android.mediaframeworktest/.CameraStressTestRunner'

メディア ストレステスト

このテストでは、カメラの静止画撮影と動画撮影にストレスを加えます。

次のテストコマンドを実行します。

adb shell am instrument -w com.google.android.camera.tests/com.android.camera.stress.CameraStressTestRunner

すべてのテストに合格する必要があります。

手動 TestingCam テスト

TestingCam アプリを手動で実行して、次のチェックを行う必要があります。 TestingCam のソースは pdk/apps/TestingCamera/ にあります。

カメラを傾けた状態での無限遠フォーカス

TestingCam を起動し、プレビューをオンにして、オート フォーカス モードが無限遠に設定されていることを確認します。[Take picture] ボタンを使用して、遠くの被写体(10 メートル以上)を、カメラを水平、上向き(ほぼ垂直)、下向き(ほぼ垂直)にして撮影します。上向きの例としては、下から木の高い位置にある枝葉を撮影するなどがあります。下向きの例としては、建物の屋上から路面を撮影するなどがあります。すべての場合で、遠くの被写体が鮮明であり、その被写体に焦点が合っている必要があります。画像をギャラリー ビューに保存して表示すると、ズームインして鮮明度を簡単に確認できます。

VCM アクチュエーターを備えたカメラでこのテストに合格するには、閉ループ AF 制御システム、またはカメラの向きを知るために加速度計のデータを使用するソフトウェア補正が必要となります。工場出荷時に行われるレンズの無限遠位置に関する較正が信頼できることも必要です。

手動 TestingCam2 テスト

TestingCam2 アプリを手動で実行して、次のチェックを行う必要があります。TestingCam2 のソースは pdk/apps/TestingCamera2/ にあります。

JPEG キャプチャ

TestingCam2 を起動し、[JPEG] ボタンを押します。ビューファインダー画像の右側に表示される画像は、向きを含めてビューファインダーと同じになる必要があります。