相机 HAL 测试核对清单

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

通过执行这些测试,原始设备制造商 (OEM) 可验证其是否正确集成了最新的 Android 相机硬件抽象层 (HAL) 3.2 接口。当符合核对清单中的所有规范时,设备实施可被视为完全符合新的 Android 相机 HAL 接口规范。这反过来又使得设备能够正确支持构建相机应用所依据的全新 android.hardware.camera2 文件包。

[ ] 1. 相机 HAL 3.2 规范

Android 相机 HAL 3.2 规范是有关设备必须满足哪些要求的权威信息来源;本文档提供了所有测试的摘要,可将其用作核对清单。相机 HAL 实现方(例如 AP 供应商)应逐条检查 HAL 3.2 规范,并确保其设备符合该规范。

要了解最新的 HAL 3.2 规范的相关定义,请参阅 L 常规 Android 平台开发套件 (PDK) 中的以下文件:

[ ] 2. 相机测试类型

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

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

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

[ ] 3. 原生测试

这类测试会直接测试相机 HAL 接口。

相机原生测试的起始路径为:platform/hardware/libhardware

设置这类测试的命令如下:

cd hardware/libhardware/tests/camera*/
mm
adb remount; adb sync

[ ] 3.1. HAL 3.x 测试

这类相机测试位于以下路径:hardware/libhardware/tests/camera3/*

运行所有测试的命令如下:

adb shell /data/nativetest/camera3_test/camera3_test

对于每项通过的测试,您会收到 OK。在输出信息末尾处会提供错误日志,以及有关所有已通过测试的摘要。

[ ] 3.2. HAL 2/3 测试

这类相机测试位于以下路径:hardware/libhardware/tests/camera2/*

运行所有测试的命令如下:

adb shell /data/nativetest/camera3_test/camera3_test

要运行单个测试,请传递 --gtest_filter 参数和相应测试名称,命令如下:

adb shell /data/nativetest/camera2_test/camera2_test --gtest_filter=Camera2Test.OpenClose

要运行一小组测试,请使用带有 --gtest_filter 参数的通配符,命令如下:

adb shell /data/nativetest/camera2_test/camera2_test --gtest_filter=Camera2Test.*

[ ] 3.3. 与相机服务交互的测试

这类相机测试位于以下路径:frameworks/av/camera/tests/*

[ ] 3.4. 相机元数据测试

这类相机测试位于以下路径:system/media/camera/tests/*

[ ] 4. 兼容性测试套件 (CTS) 测试

相机 Android 兼容性测试套件 (CTS) 测试重点测试设备兼容性。这类测试不需要特定的测试环境(唯一的例外是视野范围/FOV CTS 验证程序测试)。

相机 CTS 测试的起始路径为:platform/cts

有关运行 CTS 的常规说明,请参阅 CTS 简介及其子页面。

[ ] 4.1. 针对 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

[ ] 4.2. 针对 android.hardware.camera2 API 的 CTS 测试

这类相机测试位于 cts/tests/tests/ 路径下的下列位置:

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

[ ] 4.3. CTS 验证程序相机测试

这类相机测试位于以下路径:cts/apps/CtsVerifier/src/com/android/cts/verifier/camera/*

[ ] 5. 图像测试套件 (ITS) 测试

CameraITS 测试重点测试图像的正确性。这些 Python 脚本在通过 USB 连接 Android 设备的工作站上手动运行。该工作站可以运行具备必需的 Python 2.7 环境的任何操作系统。

由于 ITS 是 CTS 验证程序的子测试,因此请在运行 Python 脚本之前启动 CTS 验证程序和 ITS 子测试,以便这些脚本具有可与之通信的进程。

CameraITS 基础设施和测试位于以下路径:cts/apps/CameraITS

有关如何设置和运行测试的说明,请参阅此顶级文件夹中的最新 README 文件。设置方法如下:make cts

extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
cd android-cts-verifier
adb install -r CtsVerifier.apk
cd CameraITS

有关脚本使用方法的演示,请参阅 tests 子目录中的 tutorial.py。每项测试都归属于相应的 tests/scene<#> 子目录。有关具体的测试说明,请参阅每个子目录中的 README 文件。

您将需要使用由可重复使用的特定目标(如白色墙面、灰色卡片和台灯)构建的简单物理环境。Android 设备安装在三脚架上,而设备的相机功能通过脚本运行。大多数测试的结果要么是通过,要么是失败,不过有些测试还会提供一些指标。

这些测试仍在不断开发改进,还不够全面,无法对相机 HAL 进行完全自动化的通过/失败验证。但是,这些脚本确实可以测试未在 CTS 中测试的情景,而且还是整个 HAL 3.2 测试计划的重要组成部分。

[ ] 5.1. 对场景 0(纯色)的 ITS 测试

此测试不需要特定设置。所有相机(背面 + 正面 + 任何其他相机)都必须通过 tests/scene0 文件夹中的所有测试。

[ ] 5.2. 对场景 1(灰色卡片)的 ITS 测试

所有相机(背面 + 正面 + 任何其他相机)都必须通过 tests/scene1 文件夹中的所有测试。tests/scene1/README 文件对场景设置进行了说明。

[ ] 5.3. 对场景 2(相机实验室)的 ITS 测试

所有相机(背面 + 正面 + 任何其他相机)都必须通过 tests/scene2 文件夹中的所有测试。tests/scene2/README 文件对场景设置进行了说明。

[ ] 6. 针对 AOSP 应用的手动测试

[ ] 6.1. 相机模式

对于设备上的所有相机(正面、背面和任何其他相机),您需要验证以下内容:

  1. 可以在设备上拍照和查看图像,并且图像效果良好,没有明显的问题。
  2. 点按对焦、连续自动对焦、微距对焦、无限远对焦、自动白平衡和自动曝光控制均可正常使用。
  3. 使用数码变焦时(拍摄期间),点按对焦、连续自动对焦、自动白平衡和自动曝光控制均可正常使用。
  4. 闪光灯设置(开启/关闭/自动)可正常使用,并且能与 3A 有效同步。

[ ] 6.2. 视频模式

对于设备上的所有相机(正面、背面和任何其他相机),您需要验证以下内容:

  1. 可以在设备上拍摄和查看视频,并且视频效果良好,没有明显的问题。
  2. 在录制视频的过程中能够正常拍摄快照。
  3. 点按对焦、连续自动对焦、微距对焦、无限远对焦、自动白平衡和自动曝光控制均可正常使用。
  4. 使用数码变焦时(拍摄期间),点按对焦、连续自动对焦、自动白平衡和自动曝光控制均可正常使用。
  5. 手电筒设置(开启/关闭)可正常使用,并且能与 3A 有效同步。

[ ] 6.3. 相机设置:分辨率

对于设备上的所有相机(正面、背面和任何其他相机)以及菜单中可用的所有分辨率,您需要验证是否返回并应用了正确的分辨率设置:

  • 相机模式
  • 视频模式
  • 镜头模糊
  • PhotoSphere
  • 全景

[ ] 6.4. 相机设置:曝光补偿

验证是否应用了曝光补偿(+2 和 -2)。

[ ] 6.5. PhotoSphere

分别通过前置和后置摄像头拍摄 360 度全景 PhotoSphere 图像。确认每一帧都对焦在无限远处,并且各个拍摄画面之间的曝光和白平衡是一致的。

[ ] 6.6. 全景

拍摄纵向、横向和广角全景(分别使用前置和后置摄像头),然后确认每一帧都对焦在无限远处,并且各个拍摄画面之间的曝光和白平衡是一致的。

[ ] 6.7. 镜头模糊

分别使用前置和后置摄像头拍摄一张镜头模糊图像,然后确认(在查看拍摄的照片时)重新对焦于不同景深的功能能够正常运行。

此外,在此模式下验证点按对焦、连续自动对焦、自动白平衡和自动曝光控制是否能正常使用。

[ ] 7. 媒体框架测试

通过 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

其中 变量表示包含供应商产品的目录。

查找以下目录或其子目录中的所有测试:

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

每个子目录都代表一个测试类:

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

[ ] 7.1. 运行媒体框架测试

查看所有可用测试的命令如下:

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

[ ] 7.2. 媒体设置功能测试

下面是一个运行功能测试的示例。该测试用于验证不同相机设置(即闪光灯、曝光、白平衡、场景、照片大小和地理标记)组合的基本功能。

运行以下测试命令:

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

[ ] 7.3. 媒体集成测试

下面是一个运行集成测试的示例,此例中包括 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)

-----

[ ] 7.4. 媒体性能测试

此预览存储空间测试将打开并释放 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

[ ] 7.5. 媒体单元测试

用于执行单元测试的命令很相似。例如,对于 CameraMetadataTest.java,测试命令如下:

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

[ ] 7.6. 媒体压力测试

该测试用于对相机进行拍照压力测试和视频录制压力测试。

运行以下测试命令:

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

您必须确保通过所有测试。

[ ] 8. 手动 TestingCam 测试

您必须手动运行 TestingCam 应用并执行以下检查。TestingCam 的来源位于以下位置:pdk/apps/TestingCamera/

[ ] 8.1. 利用相机倾斜度进行无限远聚焦

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

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

[ ] 9. 手动 TestingCam2 测试

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

[ ] 9.1. JPEG 拍照

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