このページでは、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)内の以下のファイルで定義されています。
- カメラ HAL 3.x のインターフェースと仕様:
hardware/libhardware/include/hardware/camera3.h
、hardware/libhardware/include/hardware/camera_common.h
- カメラ HAL 3.x のメタデータ仕様:
system/media/camera/docs/docs.html
- HAL ピクセル形式のインターフェースと仕様:
system/core/libsystem/include/system/graphics.h
カメラのテストの種類
以下に、最新の Android カメラで使用できる主なテストの種類と、関連する手順への参照を示します。
- ベンダー テストスイート(VTS): カメラ HAL インターフェースを直接検証するテストです。
- 互換性テストスイート(CTS): デバイスの適合性を確認する標準の自動 Android テストです。詳細は、互換性テストスイートと Trade Federation の概要をご覧ください。
- 画像テストスイート(ITS): テストを手動で実行して、画像の正確性を確認します。詳細は、カメラ ITS をご覧ください。
- 手動 TestingCam テスト:
pdk/apps/TestingCamera/
内のソースから実行します。 - 手動 TestingCam2.1 テスト:
pdk/apps/TestingCamera2/
内のソースから実行します。
これらのテストの全種類について、以下で詳しく説明します。テストを説明する順序は、OEM がこの順序で実行するのが望ましい順序となっています。
たとえば、デバイスがネイティブ テストでエラーになると、次の互換性テストスイート(CTS)でもエラーになります。CTS でエラーになった場合、画像テストスイート(ITS)に進んでもほとんどが無駄になります。次のテストに進む前に、それぞれの種類のテストでエラーを解決することをおすすめします。
ベンダー テストスイート(VTS)のテスト
Android ベンダー テストスイート(VTS)は、HIDL インターフェースのレベルで動作するテストスイートです。VTS の使用方法については、ベンダー テストスイートのページをご覧ください。
互換性テストスイート(CTS)によるテスト
カメラ Android 互換性テストスイート(CTS)テストは、デバイスの適合性に絞ったテストです。テスト環境の設定については、CTS のセットアップのページをご覧ください。
カメラ CTS テストは、platform/cts
以下にあります。
カメラ CTS を USB ウェブカメラなどの外部カメラをサポートするデバイスで使用する場合は、CTS を実行するときにデバイスが接続されている必要があり、未接続の場合は自動的にエラーとなります。外部カメラには、Logitech HD Pro Webcam C920 や Microsoft 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
)とテストランナー名(MediaFramework
)から構成されます。
たとえば、次のようになります。
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] ボタンを押します。ビューファインダー画像の右側に表示される画像は、向きを含めてビューファインダーと同じになる必要があります。