本文档列出了可用于评估 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按钮。出现在取景器图像右侧的图像应与取景器显示相同,包括具有相同的方向。