blob: 21147b93a2cffa53ff41fee8bd4d6fbcbf483c6a [file] [log] [blame]
<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.2 接口。当符合核对清单中的所有规范时,设备实现可被视为<em></em>完全符合新的 Android 相机 HAL 接口规范。这反过来又使得设备能够正确支持构建相机应用所依据的全新 <code>android.hardware.camera2</code> 文件包。</p>
<h2 id="camera_hal_3_2_specification">相机 HAL 3.2 规范</h2>
<p>Android 相机 HAL 3.2 规范是有关设备必须满足哪些要求的权威信息来源;本文档提供了所有测试的摘要,可将其用作核对清单。相机 HAL 实现方(例如 AP 供应商)应逐条检查 HAL 3.2 规范,并确保其设备符合该规范。</p>
<p>要了解最新的 HAL 3.2 规范的相关定义,请参阅 L 常规 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">hardware/libhardware/include/hardware/camera3.h</a></code><code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/camera_common.h">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">system/media/camera/docs/docs.html</a></code>
</li><li><em></em>HAL 像素格式接口和规范:<code><a href="https://android.googlesource.com/platform/system/core/+/master/include/system/graphics.h">system/core/include/system/graphics.h</a></code>
</li></ul>
<h2 id="camera_test_types">相机测试类型</h2>
<p>以下是适用于最新 Android 相机的主要测试类型以及相关说明:</p>
<ul>
<li><em></em><a href="#vendor_test_suite">供应商测试套件 (VTS)</a>:直接测试相机 HAL 接口的测试
</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">贸易联盟概述</a>
</li><li><em></em><a href="#its_tests">图像测试套件 (ITS)</a>:手动运行的测试,可确保图像正确性;有关设置说明,请参阅顶级和测试专用的 <code>README</code> 文件以及 <code>tutorial.py</code>
</li><li><em></em><a href="#manual_testingcam_tests">手动 TestingCam 测试</a>:从 <code>pdk/apps/TestingCamera/</code> 中的源代码运行
</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) 测试重点测试设备兼容性。这类测试不需要特定的测试环境(唯一的例外是视野范围/FOV CTS 验证程序测试)。</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>
<p>CameraITS 测试重点测试图像的正确性。这些 Python 脚本在通过 USB 连接 Android 设备的工作站上手动运行。该工作站可以运行具备必需的 Python 2.7 环境的任何操作系统。</p>
<p class="note">由于 ITS 是 CTS 验证程序的子测试,因此请在运行 Python 脚本之前启动 CTS 验证程序和 ITS 子测试,以便这些脚本具有可与之通信的进程。</p>
<p>CameraITS 基础设施和测试位于以下路径:<code>cts/apps/CameraITS</code></p>
<p>有关如何设置和运行测试的说明,请参阅此顶级文件夹中的最新 <code>README</code> 文件。设置方法如下:<code>make
cts</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>
</pre>
<p>有关脚本使用方法的演示,请参阅 <code>tests</code> 子目录中的 <code>tutorial.py</code>。每项测试都位于相应的 <code>tests/scene<#></code> 子目录。有关具体的测试说明,请参阅每个子目录中的 <code>README</code> 文件。</p>
<p>要按照推荐的方法设置和运行相机图像测试套件,请参阅<a href="/compatibility/cts/camera-its-box">相机盒装 ITS</a></p>
<p>要手动运行 ITS,您将需要使用由可重复使用的特定目标(如白色墙面、灰色卡片和台灯)构建的简单物理环境。Android 设备安装在三脚架上,而设备的相机功能通过脚本运行。大多数测试的结果要么是通过,要么是失败,不过有些测试还会提供一些指标。</p>
<p>这些测试仍在不断开发改进,还不够全面,无法对相机 HAL 进行完全自动化的通过/失败验证。但是,这些脚本确实可以测试未在 CTS 中测试的情景,而且还是整个 HAL 3.2 测试计划的重要组成部分。</p>
<h3 id="its_tests_on_scene_0_plain">对场景 0(纯色)的 ITS 测试</h3>
<p>此测试不需要特定设置。所有相机(背面 + 正面 + 任何其他相机)都必须通过 <code>tests/scene0</code> 文件夹中的所有测试。</p>
<h3 id="its_tests_on_scene_1_grey_card">对场景 1(灰色卡片)的 ITS 测试</h3>
<p>所有相机(背面 + 正面 + 任何其他相机)都必须通过 <code>tests/scene1</code> 文件夹中的所有测试。<code>tests/scene1/README</code> 文件对场景设置进行了说明。</p>
<h3 id="its_tests_on_scene_2_camera_lab">对场景 2(相机实验室)的 ITS 测试</h3>
<p>所有相机(背面 + 正面 + 任何其他相机)都必须通过 <code>tests/scene2</code> 文件夹中的所有测试。<code>tests/scene2/README</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/<em>&lt;name&gt;</em>/data/app/mediaframeworktest.apk</code>
</pre>
<p>其中 <em><code><name></name></code></em> 变量表示包含供应商产品的目录。</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>