相机 HAL 测试核对清单

本文档列出了可用于评估 Android 相机硬件抽象层 (HAL) 的所有测试。该文档专供原始设备制造商 (OEM) 和应用处理器 (AP) 供应商参考,旨在帮助他们确保正确实现相机 HAL,并最大限度减少缺陷。尽管这是 Android 兼容性测试套件 (CTS) 的自愿性补充测试,但它显著扩大了相机测试覆盖范围,并且确实能够发现一些潜在 bug。

原始设备制造商 (OEM) 可以通过执行这些测试,验证是否已正确集成 Android 相机硬件抽象层 (HAL) 3 接口。当满足核对清单中的所有要求时,即认为设备实现完全符合 Android 相机 HAL 接口规范。这反过来又会使设备能够正确支持构建相机应用所依赖的 android.hardware.camera2 软件包。

相机 HAL3 规范

Android 相机 HAL3 规范说明了设备必须满足的各项要求,可视为权威信息来源。本页面提供了所有测试的摘要,可作为核对清单使用。相机 HAL 实现者(例如接入点供应商)应仔细阅读相机 HAL3 规范,确保自己的设备符合规范要求。

如需了解最新的 HAL 规范,请参阅 Android 5.0 及更高版本的通用 Android 平台开发套件 (PDK) 中的以下文件:

相机测试类型

以下是适用于最新 Android 相机的主要测试类型以及相关说明:

下面详细介绍所有这些测试类型。我们按照 OEM 应执行这些测试的先后顺序,对它们进行了介绍。

例如,如果设备未通过原生测试,那么肯定无法通过随后的兼容性测试套件 (CTS) 测试。如果设备未能通过 CTS,则没必要继续进行图像测试套件 (ITS) 测试。我们建议先解决每种测试类型中发现的问题,然后再进行下一组测试。

供应商测试套件 (VTS) 测试

Android 供应商测试套件 (VTS) 是在 HIDL 接口一级运行的测试套件。若要详细了解如何使用 VTS,请参阅供应商测试套件

兼容性测试套件 (CTS) 测试

相机 Android 兼容性测试套件 (CTS) 测试重点测试设备兼容性。如需了解如何设置测试环境,请参阅设置 CTS

相机 CTS 测试的起始路径为:platform/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# 子目录中。

如需设置测试环境,请运行:
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)。

相机盒装 ITS 中介绍了静态场景的推荐设置。传感器融合盒快速入门指南中介绍了 sensor_fusion 场景的推荐设置。

若要手动运行 ITS,请准备好具有可重复使用的特定目标(如白色墙面、灰色卡片和台灯)的简单物理环境。将 Android 设备安装在三脚架上,然后运行脚本来测试相机功能。大多数测试只会提示通过或失败,不过有些测试会提供结果数据。

这些未在 CTS 中测试的脚本测试场景是 HAL 3.2 测试计划的重要组成部分。

ITS 测试结果可能为通过或失败。设备必须通过每个场景文件夹中的所有强制性测试。对于非强制性测试,即使结果为失败,在 CtsVerifier 中仍算作通过。

如需了解场景和测试说明,请参阅相机 ITS 测试

媒体框架测试

应通过 MediaFrameworkTest 中的所有与相机相关的媒体测试。请注意,Android 设备上必须安装 mediaframeworktest.apk,才能运行这些测试。您将需要 make mediaframeworktest,然后使用 adb 安装生成的.apk。下面提供了一些命令示例。

与相机相关的媒体框架测试的起始路径为: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 文件包相同。串联组件名称时,请确保您使用的是 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 应用并执行以下检查。 TestingCam 的源代码位于以下位置:pdk/apps/TestingCamera/

通过倾斜相机进行无限远对焦

启动 TestingCam,打开预览,并确保将自动对焦模式设置为无限远。使用拍照按钮,给距离较远(至少 10 米距离)的对象拍摄照片,且相机方向为水平、向上(接近垂直)和向下(接近垂直);例如,向上拍摄可以是从下面拍摄大树高处的树叶/分枝,而向下拍摄则可以是从建筑物的顶部俯拍下面的街道。在所有情况下,距离较远的拍摄对象都应成像清晰且对焦准确。在图库视图中保存并查看照片,以便您可以放大照片,从而更轻松地检查清晰度。

请注意,对于采用 VCM 致动器的相机,要通过此测试,将需要使用闭环自动对焦控制系统,或者需要使用加速度计数据确定相机方向,并据此进行一些软件校正。 此外,还需要对镜头的无限远位置进行可靠的出厂校准。

手动 TestingCam2 测试

您必须手动运行 TestingCam2 应用并执行以下检查。TestingCam2 的源代码位于以下位置:pdk/apps/TestingCamera2/

JPEG 拍照

启动 TestingCam2,然后按 JPEG 按钮。显示在取景器图像右侧的图像应该与取景器图像相同,包括具有一致的方向。