| <html devsite><head> |
| <title>相机 HAL 测试核对清单</title> |
| <meta name="project_path" value="/_project.yaml"/> |
| <meta name="book_path" value="/_book.yaml"/> |
| </head> |
| <body> |
| <!-- |
| Copyright 2017 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <p>本文档列出了可用于评估 Android 相机硬件抽象层 (HAL) 的所有测试。该文档专供原始设备制造商 (OEM) 和应用处理器 (AP) 供应商参考,旨在帮助他们确保正确实现相机 HAL,并最大限度减少缺陷。尽管这是 Android 兼容性测试套件 (CTS) 的自愿性补充测试,但它显著扩大了相机测试覆盖范围,并且确实能够发现一些潜在错误。</p> |
| |
| <p>原始设备制造商 (OEM) 可以通过执行这些测试,验证是否已正确集成 Android 相机硬件抽象层 (HAL) 3 接口。当符合核对清单中的所有规范时,设备实现可被视为完全符合 Android 相机 HAL 接口规范。<em></em>这反过来又使得设备能够正确支持构建相机应用所依据的 <a href="https://developer.android.com/reference/android/hardware/camera2/package-summary" class="external"><code>android.hardware.camera2</code></a> 文件包。</p> |
| |
| <h2 id="camera_hal_3_2_specification">相机 HAL3 规范</h2> |
| |
| <p><a href="/devices/camera/camera3">Android 相机 HAL 3.2</a> 规范具体说明了设备必须满足的各项要求,可视为权威信息来源进行参考。本页面提供了所有测试的摘要,可作为核对清单使用。相机 HAL 实现者(例如接入点供应商)应仔细阅读相机 HAL3 规范,确保自己的设备符合规范要求。</p> |
| |
| <p>要了解最新的 HAL 规范的相关定义,请参阅 Android 5.0 及更高版本的常规 Android 平台开发套件 (PDK) 中的以下文件:</p> |
| |
| <ul> |
| <li><em></em>相机 HAL 3.x 接口和规范:<code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/camera3.h" class="external">hardware/libhardware/include/hardware/camera3.h</a></code>、<code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/camera_common.h" class="external">hardware/libhardware/include/hardware/camera_common.h</a></code> |
| </li><li><em></em>相机 HAL 3.x 元数据规范:<code><a href="https://android.googlesource.com/platform/system/media/+/master/camera/docs/docs.html" class="external">system/media/camera/docs/docs.html</a></code> |
| </li><li><em></em>HAL 像素格式接口和规范:<code><a href="https://android.googlesource.com/platform/system/core/+/master/libsystem/include/system/graphics.h" class="external">system/core/libsystem/include/system/graphics.h</a></code> |
| </li></ul> |
| |
| <h2 id="camera_test_types">相机测试类型</h2> |
| |
| <p>以下是适用于最新 Android 相机的主要测试类型以及相关说明:</p> |
| |
| <ul> |
| <li><a href="#vendor_test_suite">供应商测试套件 (VTS)</a>:直接测试相机 HAL 接口的测试<em></em></li><li><em><a href="#cts_tests">兼容性测试套件 (CTS)</a></em>:自动运行的标准 Android 测试,可确保设备兼容性;有关详情,请参阅 <a href="/compatibility/cts/index.html">CTS 简介</a>和 <a href="/devices/tech/test_infra/tradefed/index.html">Trade Federation 概览</a> |
| </li><li><a href="#its_tests">图像测试套件 (ITS)</a>:手动运行的测试,可确保图像的正确性;有关设置说明,请参阅通用以及测试专用的 <code>README</code> 文件和 <code>tutorial.py</code>。<em></em></li><li><a href="#manual_testingcam_tests">手动 TestingCam 测试</a>:从 <code>pdk/apps/TestingCamera/</code> 中的源代码运行<em></em> |
| </li><li><em></em><a href="#manual_testingcam2_tests">手动 TestingCam2.1 测试</a>:从 <code>pdk/apps/TestingCamera2/</code> 中的源代码运行 |
| </li></ul> |
| |
| <p>下面详细介绍了所有这些测试类型。我们按照 OEM 应执行这些测试的时间先后顺序对它们进行了介绍。</p> |
| |
| <p>例如,如果设备未通过原生测试,那么肯定无法通过随后的兼容性测试套件 (CTS) 测试。如果设备未能通过 CTS,则没必要继续进行图像测试套件 (ITS) 测试。我们建议先解决每种测试类型中发现的问题,然后再进行下一组测试。</p> |
| |
| <h2 id="vendor_test_suite">供应商测试套件 (VTS) 测试</h2> |
| |
| <p>Android 供应商测试套件 (VTS) 是在 HIDL 接口一级运行的测试套件。要详细了解如何使用 VTS,请参阅<a href="/compatibility/vts/">供应商测试套件</a>。</p> |
| |
| <h2 id="cts_tests">兼容性测试套件 (CTS) 测试</h2> |
| |
| <p>相机 Android 兼容性测试套件 (CTS) 测试重点测试设备兼容性。要详细了解相机 CTS 的推荐测试环境,请参阅<a href="/compatibility/cts/setup#camera">设置 CTS</a>。</p> |
| |
| <p>相机 CTS 测试的起始路径为:<code>platform/cts</code>。</p> |
| |
| <p>在针对支持外部相机(如 USB 摄像头)的设备运行相机 CTS 时,您必须在运行 CTS 时将设备连接到充电器,否则测试将自动失败。外部相机示例:<a href="https://www.logitech.com/en-us/product/hd-pro-webcam-c920" class="external">Logitech HD Pro Webcam C920</a> 和 <a href="https://www.microsoft.com/accessories/en-us/products/webcams/lifecam-hd-3000/t3h-00011" class="external">Microsoft LifeCam HD-3000</a>。</p> |
| |
| <p>有关运行 CTS 的常规说明,请参阅 <a href="/compatibility/cts/index.html">CTS 简介</a>及其子页面。</p> |
| |
| <h3 id="cts_tests_for_the_android_hardware_camera_api">针对 <code>android.hardware.Camera</code> API 的 CTS 测试</h3> |
| |
| <p>这类相机测试位于 <code>cts/tests/tests/</code> 路径下的下列位置:</p> |
| |
| <ul> |
| <li><code>hardware/src/android/hardware/cts/CameraTest.java</code> |
| </li><li><code>hardware/src/android/hardware/cts/CameraGLTest.java</code> |
| </li><li><code>hardware/src/android/hardware/cts/Camera_SizeTest.java</code> |
| </li><li><code>permission/src/android/permission/cts/CameraPermissionTest.java</code> |
| </li></ul> |
| |
| <h3 id="cts_tests_for_the_android_hardware_camera2_api">针对 <code>android.hardware.camera2</code> API 的 CTS 测试</h3> |
| |
| <p>这类相机测试位于 <code>cts/tests/tests/</code> 路径下的下列位置:</p> |
| |
| <ul> |
| <li><code>hardware/src/android/hardware/camera2/cts/*</code> |
| </li><li><code>permission/src/android/permission/cts/Camera2PermissionTest.java</code> |
| </li></ul> |
| |
| <h3 id="cts_verifier_camera_tests">CTS 验证程序相机测试</h3> |
| |
| <p>这类相机测试位于以下路径:<code>cts/apps/CtsVerifier/src/com/android/cts/verifier/camera/*</code></p> |
| |
| <h2 id="its_tests">图像测试套件 (ITS) 测试</h2> |
| |
| <aside class="Note"><strong>注意</strong>:搭载 Android 9 或更高版本系统的所有设备(Android Go 设备除外)都必须符合<a href="/devices/camera/camera3">相机 HAL3</a> 规范。</aside> |
| |
| <p>相机图像测试套件 (ITS) 测试重点测试图像的正确性。要执行这类测试,请在工作站上对通过 USB 连接的 Android 设备运行 Python 脚本。</p> |
| |
| <p>可以在 <a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS" class="external"><code>cts/apps/CameraITS</code></a> 目录中找到相机 ITS 基础架构和测试的相关内容。每个测试都位于一个单独的 <code>tests/scene<var>#</var></code> 子目录中。</p>要设置测试环境,请运行:<pre class="devsite-click-to-copy"> |
| <code class="devsite-terminal">extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip</code> |
| <code class="devsite-terminal">cd android-cts-verifier</code> |
| <code class="devsite-terminal">adb install -r CtsVerifier.apk</code> |
| <code class="devsite-terminal">cd CameraITS</code> |
| <code class="devsite-terminal">source build/envsetup.sh</code> |
| </pre> |
| |
| <aside class="note"><strong>注意</strong>:因为 ITS 是 CTS 验证程序的子测试,所以应该先启动 CTS 验证程序和 ITS 子测试,然后再运行 Python 脚本,这样可为脚本提供可以通信的进程。</aside> |
| |
| <p>要详细了解如何设置和运行测试,请参阅 <code>cts/apps/CameraITS</code> 中的 <code>CameraITS</code> PDF 文件。要查看有关如何使用脚本的指南,请参阅 <code>tests</code> 子目录中的 <a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/tutorial.py" class="external"><code>tutorial.py</code></a>。</p> |
| |
| <p>可以在任何满足相关 Python 2.7 环境要求的操作系统上运行 ITS 静态测试(场景 0-5),但必须在 Linux 操作系统上运行采用<a href="/compatibility/cts/sensor-fusion-quick-start">传感器融合盒</a>的 <code>sensor_fusion</code> 测试。 |
| </p> |
| |
| <p><a href="/compatibility/cts/camera-its-box">相机盒装 ITS</a> 中介绍了场景 0-4 的推荐设置。<a href="/compatibility/cts/sensor-fusion-quick-start">传感器融合盒快速入门指南</a>中介绍了 sensor_fusion 场景的推荐设置。</p> |
| |
| <p>要手动运行 ITS,请搭建具有可重复使用的特定目标(如白色墙面、灰色卡片和台灯)的简单物理环境。将 Android 设备安装在三脚架上,然后运行脚本来测试相机功能。大多数测试只会提示通过或失败,不过有些测试会提供结果数据。</p> |
| |
| <p>这些未在 CTS 中测试的脚本测试场景是 HAL 3.2 测试计划的重要组成部分。</p> |
| |
| <p>ITS 测试结果可能为通过或失败。设备必须通过每个场景文件夹中的所有强制性测试。对于非强制性测试,即使结果为失败,在 <code>CtsVerifier</code> 中仍会计为通过。</p> |
| |
| <h3 id="scene0_to_scene4_tests">场景 0-4 测试</h3> |
| |
| <p>这些场景代表了大部分 ITS 测试,它们以 PDF 文件的形式包含在 <code>scene</code> 文件夹中。要自动执行这些测试,请使用<a href="/compatibility/cts/camera-its-box">相机盒装 ITS</a> 系统。</p> |
| |
| <ul> |
| <li>场景 0:不需要设置。</li> |
| <li>场景 1:需要灰色卡片。</li> |
| <li>场景 2:需要面部场景。</li> |
| <li>场景 3:ISO12233 图表。</li> |
| <li>场景 4:自定义场景,将圆形置于方形内。</li> |
| </ul> |
| |
| <h3 id="scene5_tests">场景 5 测试</h3> |
| <p>在场景 5 测试中,需要在相机上方放置灯光漫射器。</p> |
| |
| <h3 id="sensor_fusion_tests">传感器融合测试</h3> |
| |
| <p>在传感器融合测试中,将分别针对 AR 和 VR 应用,测试相机和陀螺仪之间的时间戳差异,因此需按照特定轨迹移动摄像机。如果不包含陀螺仪或未启用 <code>REALTIME</code> 参数,则会跳过此测试。可以利用<a href="/compatibility/cts/sensor-fusion-quick-start">传感器融合盒</a>自动执行 <code>sensor_fusion</code> 测试。</p> |
| |
| <h2 id="media_framework_tests">媒体框架测试</h2> |
| |
| <p>通过 MediaFrameworkTest 中与相机相关的所有媒体测试。请注意,运行这些测试需要在 Android 设备上安装 mediaframeworktest.apk。您将需要 <code>make mediaframeworktest</code>,然后使用 adb 来安装生成的 .apk。下面提供了命令示例。</p> |
| |
| <p>相机相关的媒体框架测试的起始路径为:<code>platform/frameworks/base</code></p> |
| |
| <p>这类测试的源代码位于以下路径:<code>frameworks/base/media/tests/MediaFrameworkTest</code></p> |
| |
| <p>设置这类测试的命令如下:</p> |
| |
| <pre class="devsite-click-to-copy"> |
| <code class="devsite-terminal">make mediaframeworktest</code> |
| <code class="devsite-terminal">adb install out/target/product/<var>name</var>/data/app/mediaframeworktest.apk</code> |
| </pre> |
| |
| <p><var></var>其中,name 变量表示包含供应商产品的目录。</p> |
| |
| <p>查找以下目录或其子目录中的所有测试:</p> |
| |
| <pre class="devsite-click-to-copy"> |
| frameworks/base/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest |
| </pre> |
| |
| <p>每个子目录都代表一个测试类:</p> |
| |
| <ul> |
| <li><code>functional/</code> |
| </li><li><code>integration/</code> |
| </li><li><code>performance/</code> |
| </li><li><code>power/</code> |
| </li><li><code>stress/</code> |
| </li><li><code>unit/</code> |
| </li></ul> |
| |
| <h3 id="running_media_framework_tests">运行媒体框架测试</h3> |
| |
| <p>查看所有可用测试的命令如下:</p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell pm list instrumentation |
| </pre> |
| |
| <p>这将会产生类似以下信息的结果:</p> |
| |
| <pre class="devsite-click-to-copy"> |
| 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) |
| </pre> |
| |
| <p>从每个测试行中识别并提取组件(位于 <code>instrumentation:</code> 和 <code>(target=com.android.mediaframeworktest) </code>之间)。该组件的名称由目标软件包名称 (<code>com.android.mediaframeworktest</code>) 和测试运行器名称 (<code>MediaFramework<type>TestRunner</type></code>) 组成。</p> |
| |
| <p>例如:</p> |
| |
| <pre class="devsite-click-to-copy"> |
| com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner |
| com.android.mediaframeworktest/.MediaRecorderStressTestRunner |
| com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner |
| com.android.mediaframeworktest/.MediaFrameworkPowerTestRunner |
| </pre> |
| |
| <p>然后,您可以将每个组件传递到 <code>adb shell am instrument</code>,如下所示:</p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -w <var>component.name</var> |
| </pre> |
| |
| <p>其中,<code><var>component.name</var></code> 等同于上面提取的值。例如:</p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner |
| </pre> |
| |
| <p>请注意,虽然类路径是 Java 文件包 + 类名称,但工具包不一定与 Java 文件包相同。连接组件名称时,请确保您使用的是 AndroidManifest.xml 文件包,而不是测试运行器类所在的 Java 文件包。</p> |
| |
| <p>要运行某一类测试,请传递 -e 类 <test-class> 参数,命令如下:</test-class></p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -e class com.android.mediaframeworktest.integration.CameraBinderTest -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner |
| </pre> |
| |
| <p>如果只运行某个测试类中的单个方法,请将井号 (#) 和方法名称(在本例中为 <code>testConnectPro</code>)附加到类名称,如下所示:</p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -e class 'com.android.mediaframeworktest.integration.CameraBinderTest#testConnectPro' -w com.android.mediaframeworktest/.MediaFrameworkIntegrationTestRunner |
| </pre> |
| |
| <h3 id="media_settings_functional_tests">媒体设置功能测试</h3> |
| |
| <p>下面是一个运行功能测试的示例。该测试用于验证不同相机设置(即闪光灯、曝光、白平衡、场景、照片大小和地理标记)组合的基本功能。</p> |
| |
| <p>运行以下测试命令:</p> |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| 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 |
| </pre> |
| |
| <h3 id="media_integration_tests">媒体集成测试</h3> |
| |
| <p>下面是一个运行集成测试的示例,此例中包括 mediaframeworktest/integration/CameraBinderTest.java 和 mediaframeworktest/CameraStressTestRunner.java:</p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -e class \ 'com.android.mediaframeworktest.<strong>integration</strong>.<strong>CameraBinderTest'</strong> -w \ 'com.android.mediaframeworktest/.<strong>CameraStressTestRunner'</strong> |
| </pre> |
| |
| <p>如果成功通过测试,则会产生类似如下输出信息的结果:</p> |
| |
| <pre class="devsite-click-to-copy"> |
| ----- |
| |
| com.android.mediaframeworktest.integration.CameraBinderTest:........... |
| Test results for CameraStressTestRunner=........... |
| Time: 3.328 |
| |
| OK (11 tests) |
| |
| ----- |
| </pre> |
| |
| <h3 id="media_performance_tests">媒体性能测试</h3> |
| |
| <p>此预览存储空间测试将打开并释放 200 次相机预览。系统每隔 20 次迭代会记录一次 ps mediaserver 的快照,并且在 200 次迭代后比较存储空间使用量的差异。如果差异大于 150kM,则表明未通过测试。</p> |
| |
| <p>运行以下测试命令:</p> |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -w -r -e class com.android.mediaframeworktest.performance.MediaPlayerPerformance#testCameraPreviewMemoryUsage com.android.mediaframeworktest/.MediaFrameworkPerfTestRunner |
| </pre> |
| |
| <p>更详细的输出信息位于以下路径:<code>/sdcard/mediaMemOutput.txt</code></p> |
| |
| <h3 id="media_unit_tests">媒体单元测试</h3> |
| |
| <p>用于执行单元测试的命令很相似。例如,对于 CameraMetadataTest.java,测试命令如下:</p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -e class 'com.android.mediaframeworktest.unit.CameraMetadataTest' -w 'com.android.mediaframeworktest/.CameraStressTestRunner' |
| </pre> |
| |
| <h3 id="media_stress_tests">媒体压力测试</h3> |
| |
| <p>该测试用于对相机进行拍照压力测试和视频录制压力测试。</p> |
| |
| <p>运行以下测试命令:</p> |
| |
| <pre class="devsite-terminal devsite-click-to-copy"> |
| adb shell am instrument -w com.google.android.camera.tests/com.android.camera.stress.CameraStressTestRunner |
| </pre> |
| |
| <p>您必须确保通过所有测试。</p> |
| |
| <h2 id="manual_testingcam_tests">手动 TestingCam 测试</h2> |
| |
| <p>您必须手动运行 TestingCam 应用并执行以下检查。TestingCam 的来源位于以下位置:<code>pdk/apps/TestingCamera/</code></p> |
| |
| <h3 id="infinity_focus_with_camera_tilt">利用相机倾斜度进行无限远聚焦</h3> |
| |
| <p>启动 TestingCam,打开预览,并确保将自动对焦模式设置为无限远。使用<strong>拍照</strong>按钮,给距离较远(至少 10 米距离)的对象拍摄照片,且相机方向为水平、向上(接近垂直)和向下(接近垂直);例如,向上拍摄可以是从下面拍摄大树高处的树叶/分枝,而向下拍摄则可以是从建筑物的顶部俯拍下面的街道。在所有情况下,距离较远的拍摄对象都必须成像清晰且对焦准确。保存并查看图库视图中的照片,以便您可以放大并且更轻松地检查锐度。</p> |
| |
| <p>请注意,对于具有 VCM 执行器的相机,要通过此测试,则需要使用闭环自动对焦控制系统,或者需要使用加速度计数据来确定相机方向,并据此进行一些 SW 校正。此外,还需要对镜头无限远位置进行可靠的工厂校准。</p> |
| |
| <h2 id="manual_testingcam2_tests">手动 TestingCam2 测试</h2> |
| |
| <p>您必须手动运行 TestingCam2 应用并执行以下检查。TestingCam2 的来源位于以下位置:<code>pdk/apps/TestingCamera2/</code></p> |
| |
| <h3 id="9_1_jpeg_capture">JPEG 拍照</h3> |
| |
| <p>启动 TestingCam2,然后按 <strong>JPEG</strong> 按钮。显示在取景器图像右侧的图像应与取景器相同,包括具有一致的方向。</p> |
| |
| </body></html> |