blob: e1ed0e4326d0cfc67c8d6fb7c65979079a131860 [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 接口。当符合核对清单中的所有规范时,设备实现可被视为完全符合 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>