本文檔列出了可用於評估 Android 相機硬件抽象層 (HAL) 的所有測試。它適用於原始設備製造商 (OEM) 和應用處理器 (AP) 供應商,因此他們可以確保正確實施相機 HAL,並將缺陷降至最低。儘管這是對 Android 兼容性測試套件 (CTS) 的自願添加,但它大大增加了相機測試覆蓋率,並且肯定會發現潛在的錯誤。
通過這些測試,OEM 可以驗證他們是否正確集成了 Android 相機硬件抽象層 (HAL) 3 接口。當符合清單中的所有項目時,設備實現可能被認為是完整的 Android 相機 HAL 接口。這反過來將使設備能夠正確支持相機應用程序構建的android.hardware.camera2
包。
相機 HAL3 規範
Android Camera HAL3規範是有關設備必須滿足哪些信息的權威信息源;此頁面提供了可用作檢查表的所有測試的摘要。相機 HAL 實施者(例如 AP 供應商)應逐行檢查相機 HAL3 規範,並確保其設備符合該規範。
當前的 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 攝像頭的主要測試類型以及對以下相關說明的參考:
- Vendor Test Suite (VTS) :直接測試相機 HAL 接口的測試
- 兼容性測試套件 (CTS) :標準的自動化 Android 測試以確保設備兼容性 - 請參閱CTS 介紹和貿易聯盟概述
- 圖像測試套件 (ITS) :手動運行測試以確保圖像正確性 - 請參閱頂級和特定於測試的
README
文件和tutorial.py
以獲取設置說明 - 手動 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
。
為支持外接攝像頭的設備(如 USB 網絡攝像頭)運行攝像頭 CTS 時,必須在運行 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 Verifier 相機測試
在以下位置找到這些相機測試: cts/apps/CtsVerifier/src/com/android/cts/verifier/camera/*
圖像測試套件 (ITS) 測試
相機圖像測試套件 (ITS) 測試側重於圖像正確性。要執行測試,請在通過 USB 連接 Android 設備的工作站上運行 Python 腳本。
Camera ITS 基礎設施和測試位於cts/apps/CameraITS
目錄中。每個測試駐留在tests/scene #
子目錄中。
extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
cd android-cts-verifier
adb install -r -g CtsVerifier.apk
cd CameraITS
source build/envsetup.sh
有關如何設置和運行測試的更多信息,請參閱cts/apps/CameraITS
中的CameraITS
PDF 文件。有關如何使用腳本的指南,請參閱tests
子目錄中的tutorial.py
。
ITS 測試需要 Linux 環境。有關運行 ITS 測試所需的特定 Python 版本的詳細信息,請參閱該版本的CameraITS
PDF 文件或 Android 12 的Android 12 發行說明。
Camera ITS-in-a-box 中描述了靜態場景的推薦設置。 Sensor_fusion 場景的推薦設置在Sensor Fusion Box 快速入門指南中進行了描述。
要手動運行 ITS,請準備一個簡單的物理環境,其中包含特定的、可重複使用的目標,例如白牆、灰卡和檯燈。將 Android 設備安裝在三腳架上並運行腳本以測試相機功能。大多數測試通過或失敗,但有些提供指標。
這些腳本測試未在 CTS 中測試的場景,是 HAL 3.2 測試計劃的重要組成部分。
ITS 測試要么通過,要么失敗。每個場景文件夾中的所有強制測試都必須通過。未強制執行的測試可能會失敗,但仍算作CtsVerifier
中的通過。
有關場景和測試說明,請參閱相機 ITS 測試。
媒體框架測試
在 MediaFrameworkTest 中通過所有與相機相關的媒體測試。請注意,這些測試需要在 Android 設備上安裝 mediaframeworktest.apk。您需要make mediaframeworktest
,然後使用 adb 安裝生成的 .apk。下麵包括示例命令。
Camera相關媒體框架測試的起始路徑是: 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 TestRunner
)組成MediaFramework TestRunner
)。
例如:
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 包相同。確保在連接組件名稱時使用 AndroidManifest.xml 包,而不是測試運行器類所在的 Java 包。
要運行單類測試,請通過 -e 類
adb shell am instrument -e class com.android.mediaframeworktest.integration.CameraBinderTest -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner
要在測試類中只運行一個方法,請將井號 (#) 符號和方法名稱(在本例中為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 次迭代後不同的內存使用情況。如果差異大於 150kM,測試將失敗。
運行測試命令:
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 的來源在這裡: pdk/apps/TestingCamera/
相機傾斜無限遠對焦
啟動 TestingCam,打開預覽,並確保自動對焦模式設置為無限遠。使用拍照按鈕,以水平、向上(接近垂直)和向下(接近垂直)的相機指向遠處拍攝對象(至少 10m 外);向上拍攝的一個例子可以是從下面看一棵樹的高葉子/樹枝,而向下拍攝的一個例子可以是從建築物屋頂看到的街道。在所有情況下,遠處的主體都應該清晰且清晰。在圖庫視圖中保存和查看照片,以便您可以更輕鬆地放大和檢查清晰度。
請注意,對於帶有 VCM 執行器的相機要通過此測試,它需要一個閉環 AF 控制系統,或者需要基於使用加速度計數據來確定相機方向的某種 SW 校正。還需要對鏡頭無限遠位置進行可靠的工廠校準。
手動測試Cam2 測試
TestingCam2 應用程序應手動運行,並執行以下檢查。 TestingCam2 的來源在這裡: pdk/apps/TestingCamera2/
JPEG 捕捉
啟動 TestingCam2,然後按下JPEG按鈕。出現在取景器圖像右側的圖像應與取景器顯示相同,包括具有相同的方向。