Google 致力于为黑人社区推动种族平等。查看具体举措

相机 HAL 测试核对清单

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

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

相机 HAL3 规范

Android 相机 HAL3 规范具体说明了设备必须满足的各项要求,可视为权威信息来源进行参考。本页提供了所有测试的摘要,可用作核对清单。相机 HAL 实现方(例如 AP 供应商)应仔细阅读相机 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 CtsVerifier.apk
    cd CameraITS
    source build/envsetup.sh
    

要详细了解如何设置和运行测试,请参阅 cts/apps/CameraITS 中的 CameraITS PDF 文件。要查看有关如何使用这些脚本的指南,请参阅 tests 子目录中的 tutorial.py

ITS 静态测试(场景 0-5)可以在任何满足相关 Python 2.7 环境要求的操作系统中运行。但是,采用传感器融合盒sensor_fusion 测试必须在 Linux 操作系统中运行。

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

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

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

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

场景 0-4 测试

这些场景代表了 ITS 测试的主要部分,它们以 PDF 文件的形式包含在 scene 文件夹中。要自动执行这些测试,请使用相机盒装 ITS 系统。

  • 场景 0:不需要设置。
  • 场景 1:需要灰色卡片。
  • 场景 2:需要面部场景。
  • 场景 3:ISO12233 图表。
  • 场景 4:自定义场景,将圆形置于方形内。

场景 5 测试

在场景 5 测试中,需要在相机上方放置灯光漫射器。

传感器融合测试

在传感器融合测试中,将分别针对 AR 和 VR 应用,测试相机和陀螺仪之间的时间戳差异,因此需要按特定轨迹移动相机。如果没有陀螺仪或未启用 REALTIME 参数,则会跳过此测试。sensor_fusion 测试可以通过传感器融合盒来自动执行。

媒体框架测试

应通过 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 按钮。显示在取景器图像右侧的图像应该与取景器图像相同,包括具有一致的方向。