aboutsummaryrefslogtreecommitdiff
path: root/zh-cn/devices/camera/versioning.html
diff options
context:
space:
mode:
Diffstat (limited to 'zh-cn/devices/camera/versioning.html')
-rw-r--r--zh-cn/devices/camera/versioning.html56
1 files changed, 29 insertions, 27 deletions
diff --git a/zh-cn/devices/camera/versioning.html b/zh-cn/devices/camera/versioning.html
index c853230a..7e2a92c9 100644
--- a/zh-cn/devices/camera/versioning.html
+++ b/zh-cn/devices/camera/versioning.html
@@ -20,7 +20,7 @@
limitations under the License.
-->
-<p>本页详细介绍了 Camera HAL、API 和相关的 Android 兼容性测试套件 (CTS) 测试中的版本差异。还介绍了在 Android 7.0 中为增强和提高相机框架安全性而进行的几项架构更改,以及供应商在其相机实现中为支持这些更改所必须进行的更新。</p>
+<p>本页详细介绍了 Camera HAL、API 和相关的 Android 兼容性测试套件 (CTS) 测试中的版本差异,还介绍了在 Android 7.0 中为增强和提高相机框架安全性而进行的几项架构更改,以及供应商在其相机实现中为支持这些更改所必须进行的更新。</p>
<h2 id="glossary">术语</h2>
@@ -56,30 +56,30 @@
<h3 id="camera_api1">Camera API1</h3>
-<p>Android 5.0 已弃用 Camera API1,而且随着新平台开发的重点放在 Camera API2 上,Camera API1 会逐渐被淘汰。但是,该淘汰期限将会很长,而且 Android 版本将会在一段时间内继续支持 Camera API1 应用。具体来说,将继续为以下内容提供支持:</p>
+<p>Android 5.0 已弃用 Camera API1,而且随着新平台开发的重点放在 Camera API2 上,Camera API1 会逐渐被淘汰。但是,淘汰期限将会很长,而且在一段时间内新 Android 版本会继续支持 Camera API1 应用。具体来说,将继续为以下内容提供支持:</p>
<ul>
-<li><em></em>应用的 Camera API1 接口。在 Camera API1 之上构建的相机应用应该与运行早期 Android 版本的设备一样工作。
+<li>供应用使用的 Camera API1 接口。<em></em>在 Camera API1 之上构建的相机应用应该像在运行早期 Android 版本的设备上一样工作。
</li>
<li>Camera HAL 版本。<em></em>包括对 Camera HAL1.0 的支持。</li>
</ul>
<h3 id="camera_api2">Camera API2</h3>
-<p>Camera API2 框架为应用提供较低级别的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。有关详细信息,请观看 <a href="https://www.youtube.com/watch?v=92fgcUNCHic&feature=youtu.be&t=29m50s">Google I/O 视频概览</a>。</p>
+<p>Camera API2 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。有关详细信息,请观看 <a href="https://www.youtube.com/watch?v=92fgcUNCHic&feature=youtu.be&t=29m50s">Google I/O 视频概览</a>。</p>
-<p>Android 5.0 及更高版本包括 Camera API2;但是,运行 Android 5.0 及更高版本的设备可能并非支持所有 Camera API2 功能。应用可以通过 Camera API2 接口查询的 <code>android.info.supportedHardwareLevel</code> 属性会报告以下支持级别之一:</p>
+<p>Android 5.0 及更高版本提供 Camera API2;但是,运行 Android 5.0 及更高版本的设备可能并不支持所有 Camera API2 功能。应用可通过 Camera API2 接口查询 <code>android.info.supportedHardwareLevel</code> 属性。该属性会报告以下支持级别之一:</p>
<ul>
-<li><code>LEGACY</code>。这些设备通过 Camera API2 接口为应用提供功能,而且这些功能与通过 Camera API1 接口提供给应用的功能大致相同。旧版框架代码在概念上将 Camera API2 调用转换为 Camera API1 调用;旧版设备不支持 Camera API2 功能,例如每帧控件。</li>
-<li><code>FULL</code>。这些设备支持 Camera API2 的所有主要功能,并且必须使用 Camera HAL 3.2 或更高版本以及 Android 5.0 或更高版本。</li>
-<li><code>LIMITED</code>。这些设备支持部分(但不是全部)Camera API2 功能,并且必须使用 Camera HAL 3.2 或更高版本。</li>
+<li><code>LEGACY</code>(旧版)。这些设备通过 Camera API2 接口为应用提供功能,而且这些功能与通过 Camera API1 接口提供给应用的功能大致相同。旧版框架代码在概念上将 Camera API2 调用转换为 Camera API1 调用;旧版设备不支持 Camera API2 功能,例如每帧控件。</li>
+<li><code>FULL</code>(全面)。这些设备支持 Camera API2 的所有主要功能,并且必须使用 Camera HAL 3.2 或更高版本以及 Android 5.0 或更高版本。</li>
+<li><code>LIMITED</code>(有限)。这些设备支持部分(但不是全部)Camera API2 功能,并且必须使用 Camera HAL 3.2 或更高版本。</li>
</ul>
-<p>各项功能通过 Camera API2 接口中的 <code>android.request.availableCapabilities</code> 属性提供。<code>FULL</code> 设备需要 <code>MANUAL_SENSOR</code> 和 <code>MANUAL_POST_PROCESSING</code> 等功能。即使对于 <code>FULL</code> 设备,<code>RAW</code> 功能也是可选的。
-<code>LIMITED</code> 设备可以播发这些功能的任何子集,包括空子集。但是,必须始终定义 <code>BACKWARD_COMPATIBLE</code> 功能。</p>
+<p>各项功能通过 Camera API2 接口中的 <code>android.request.availableCapabilities</code> 属性提供。<code>FULL</code> 设备需要具备 <code>MANUAL_SENSOR</code> 和 <code>MANUAL_POST_PROCESSING</code> 等功能。但即使是 <code>FULL</code> 设备,也并非必须实现 <code>RAW</code> 功能。
+<code>LIMITED</code> 设备可以提供这些功能的任何子集,甚至可以不提供其中任何功能。但是,必须始终定义 <code>BACKWARD_COMPATIBLE</code> 功能。</p>
-<p>设备支持的硬件级别及其支持的特定 Camera API2 功能采用以下功能标记的形式提供,以允许 Google Play 过滤 Camera API2 相机应用。</p>
+<p>设备支持的硬件级别及其支持的特定 Camera API2 功能采用以下功能标记的形式指明,以允许 Google Play 过滤 Camera API2 相机应用。</p>
<ul>
<li><code>android.hardware.camera.hardware_level.full</code>
@@ -92,7 +92,7 @@
<p>运行 Android 5.0 及更高版本的设备必须通过 Camera API1 CTS、Camera API2 CTS 和 CTS 验证程序相机测试。</p>
-<p>不具备 Camera HAL3.2 实现且不能支持完整的 Camera API2 接口的设备仍必须通过 Camera API2 CTS 测试。但是,该设备将在 Camera API2 <code>LEGACY</code> 模式下运行(在该模式下,Camera API2 调用在概念上映射到 Camera API1 调用),因此与 Camera API1 之外的特征或功能相关的任何 Camera API2 CTS 测试都将自动跳过。</p>
+<p>不具备 Camera HAL3.2 实现且不能支持完整的 Camera API2 接口的设备仍必须通过 Camera API2 CTS 测试。但是,该设备将在 Camera API2 <code>LEGACY</code> 模式下运行(在该模式下,Camera API2 调用在概念上映射到 Camera API1 调用),因此与 Camera API1 之上的特征或功能相关的任何 Camera API2 CTS 测试都将自动跳过。</p>
<p>在旧版设备上,未跳过的 Camera API2 CTS 测试使用现有的公共 Camera API1 接口和功能,没有新的要求。显示的错误(并导致 Camera API2 CTS 失败)是设备现有 Camera HAL 中已经存在的错误,因此可由现有 Camera API1 应用找到。我们预计不会出现太多此类错误(但是,任何此类错误均必须修复,才能通过 Camera API2 CTS 测试)。</p>
@@ -108,18 +108,19 @@
<p><img src="images/ape_camera_n_api1_hal3.png" alt="HAL3 上 API1 中的 Android 7.0 相机和媒体堆栈" id="figure1"/></p>
<p class="img-caption"><strong>图 1. </strong>HAL3 上 API1 中的 Android 7.0 相机和媒体堆栈。</p>
</li>
-<li>HAL1,支持在视频缓冲区中传递元数据,<strong>供应商必须更新 HAL 才能使用 kMetadataBufferTypeNativeHandleSource</strong>(Android 7.0 中不再支持 <code>kMetadataBufferTypeCameraSource</code>)。
+<li>HAL1(支持在视频缓冲区中传递元数据),<strong>供应商必须更新 HAL 才能使用 kMetadataBufferTypeNativeHandleSource</strong>(Android 7.0 中不再支持 <code>kMetadataBufferTypeCameraSource</code>)。
<p><img src="images/ape_camera_n_api1_hal1.png" alt="HAL1 上 API1 中的 Android 7.0 相机和媒体堆栈" id="figure1"/></p>
-<p class="img-caption"><strong>图 2. </strong>HAL1 上 API1 中的 Android 7.0 相机和媒体。</p>
+<p class="img-caption"><strong>图 2. </strong>HAL1 上 API1 中的 Android 7.0 相机和媒体堆栈。</p>
</li>
</ul>
<h3 id="hardening_api2">API2 的架构更改</h3>
-<p>对于 HAL1 或 HAL3 上的 API2,BufferQueue 会传递缓冲区,以便这些路径继续工作。以下对象上用于 API2 的 Android 7.0 架构:</p>
+<p>对于 HAL1 或 HAL3 上的 API2,BufferQueue 会传递缓冲区,以便这些路径能继续工作。Android 7.0 的 API2 架构:</p>
<ul>
-<li>HAL1 不受 cameraservice 移动的影响,并且<strong>不需要供应商更新</strong>。</li>
-<li>HAL3 会受到影响,但<strong>不需要供应商更新</strong>:<em></em><p><img src="images/ape_camera_n_api2_hal3.png" alt="HAL2 上 API2 中的 Android 7.0 相机和媒体堆栈" id="figure1"/></p>
+<li>若在 HAL1 上,则不受 cameraservice 移动的影响,并且<strong>不需要供应商更新</strong>。</li>
+<li>若在 HAL3 上,则受到 cameraservice 移动的影响,但<strong>不需要供应商更新</strong>:<em></em>
+<p><img src="images/ape_camera_n_api2_hal3.png" alt="HAL2 上 API2 中的 Android 7.0 相机和媒体堆栈" id="figure1"/></p>
<p class="img-caption"><strong>图 3. </strong>HAL3 上 API2 中的 Android 7.0 相机和媒体堆栈。</p>
</li>
</ul>
@@ -131,22 +132,22 @@
<li><strong>常规</strong>。由于 IPC,设备需要额外带宽,这可能会影响对时间敏感的相机使用情况,例如高速视频录制。供应商可以通过运行 <code>android.hardware.camera2.cts.PerformanceTest</code> 和 Google 相机应用进行 120/240 FPS 高速视频录制,以衡量实际影响。设备还需要少量额外的 RAM 来创建新进程。</li>
<li><strong>在视频缓冲区中传递元数据</strong>(仅限 HAL1)。<em></em>如果 HAL1 在视频缓冲区中存储元数据而非实际的 YUV 帧数据,则 HAL 必须使用 <code>kMetadataBufferTypeNativeHandleSource</code> 作为元数据缓冲区类型,并在视频缓冲区中传递 <code>VideoNativeHandleMetadata</code>(<code>kMetadataBufferTypeCameraSource</code> 在 Android 7.0 中不再受支持)。通过 <code>VideoNativeHandleMetadata</code>,相机和媒体框架能够正确地对原生句柄进行序列化和反序列化,从而在进程之间传递视频缓冲区。</li>
<li><strong>缓冲区句柄地址不一定始终存储相同的缓冲区</strong>(仅限 HAL3)。<em></em>对于每个捕获请求,HAL3 会获取缓冲区句柄的地址。HAL 不能使用地址来识别缓冲区,因为地址可能会在 HAL 返回缓冲区之后存储另一个缓冲区句柄。您必须更新 HAL,以便使用缓冲区句柄来标识缓冲区。例如:HAL 接收缓冲区句柄地址 A,该地址存储缓冲区句柄 A。在 HAL 返回缓冲区句柄 A 之后,缓冲区句柄地址 A 可能在 HAL 下次接收到它时存储缓冲区句柄 B。</li>
-<li><strong>更新用于 cameraserver 的 SELinux 策略</strong>。如果设备特定的 SELinux 策略向 mediaserver 授予运行相机的权限,则您必须更新 SELinux 策略,以授予 cameraserver 正确的权限。我们建议不要为 cameraserver 复制 mediaserver 的 SELinux 策略(因为 mediaserver 和 cameraserver 通常在系统中需要不同的资源)。Cameraserver 应仅具有执行相机功能所需的权限,并且 mediaserver 中任何不必要的相机相关权限均应被删除。<p></p>
+<li><strong>更新用于 cameraserver 的 SELinux 策略</strong>。如果设备特定的 SELinux 策略向 mediaserver 授予运行相机的权限,则您必须更新 SELinux 策略,以授予 cameraserver 正确的权限。我们建议不要为 cameraserver 复制 mediaserver 的 SELinux 策略(因为 mediaserver 和 cameraserver 通常需要系统中的不同资源)。Cameraserver 应仅具有执行相机功能所需的权限,并且 mediaserver 中任何不必要的相机相关权限均应被移除。<p></p>
<h3 id="hardening_validation">验证</h3>
<p>对于包含相机且运行 Android 7.0 的所有设备,请通过运行 Android 7.0 CTS 来验证相关实现。尽管 Android 7.0 不包含验证相机服务更改的新 CTS 测试,但如果您尚未进行上述更新,则现有 CTS 测试将失败。</p>
<h2 id="version-history">Camera HAL 版本历史记录</h2>
-<p>有关可用于评估 Android Camera HAL 的测试列表,请参阅 <a href="/compatibility/cts/camera-hal.html">Camera HAL 测试核对清单</a>。</p>
+<p>要获取可用于评估 Android Camera HAL 的测试列表,请参阅 <a href="/compatibility/cts/camera-hal.html">Camera HAL 测试核对清单</a>。</p>
<h3 id="80">Android 8.0</h3>
<p>
-Android 8.0 版本中包含针对相机服务的以下主要增强功能:
+Android 8.0 版本中包含以下针对相机服务的主要增强功能:
</p>
<ul>
- <li>共享表面 - 可让多个表面共享同一个 <code>OutputConfiguration</code></li>
+ <li>共享 surface - 可让多个 surface 共享同一个 <code>OutputConfiguration</code></li>
<li>适用于自定义相机模式的系统 API</li>
<li><code>onCaptureQueueEmpty</code></li>
</ul>
@@ -155,7 +156,7 @@ Android 8.0 版本中包含针对相机服务的以下主要增强功能:
有关这些功能的详细信息,请参阅以下部分。
</p>
-<h4 id="shared-surfaces">共享表面</h4>
+<h4 id="shared-surfaces">共享 surface</h4>
<p>
借助此功能,只需一组缓冲区就可以驱动两个输出(例如预览和视频编码),从而降低功耗和内存消耗。要支持此功能,设备制造商需要确保其相机 HAL 和 gralloc HAL 实现可以创建将由多个不同消耗方(而不是仅一个消耗方;例如 Hardware Composer/GPU 和视频编码器)使用的 gralloc 缓冲区。相机服务会将消耗方使用情况标记传递到相机 HAL 和 gralloc HAL;它们需要分配正确的缓冲区类型,或者相机 HAL 需要返回一个表明该消耗方组合不受支持的错误。
@@ -175,7 +176,7 @@ Android 8.0 版本中包含针对相机服务的以下主要增强功能:
</p>
<p>
-要支持这一功能,OEM 只需将相应的新模式添加到其 HAL 接口即可,传递至 HAL 的这一整数会在 configure_streams 上触发该模式,然后 OEM 就可以让其自定义相机应用使用系统 API 了。</p>
+要支持这一功能,OEM 只需将新模式添加到其 HAL 即可,传递至 HAL 的这一整数会在 configure_streams 上触发该模式,然后 OEM 就可以让其自定义相机应用使用系统 API。</p>
<p>
此方法的名称是 <code><a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.StateCallback.html#onCaptureQueueEmpty(android.hardware.camera2.CameraCaptureSession)">android.hardware.camera2.CameraDevice#createCustomCaptureSession</a></code>。
@@ -186,7 +187,7 @@ Android 8.0 版本中包含针对相机服务的以下主要增强功能:
<h4 id="oncapturequeueempty">onCaptureQueueEmpty</h4>
<p>
-此 API 的目的是通过尽可能让请求队列为空,来缩短控制更改(如缩放)的延迟时间。<code>onCaptureQueueEmpty</code> 不需要 HAL 发挥作用;它只是一种框架端补充。想要利用此 API 的应用需要向回调添加监听器,并相应地发出响应。通常情况下,响应方式是向相机设备发送另一个捕获请求。
+此 API 的目的是通过尽可能让请求队列为空,来缩短控制更改(如缩放)的延迟时间。<code>onCaptureQueueEmpty</code> 不需要 HAL 发挥作用;它只是一种框架端补充。想要利用此 API 的应用需要向该回调添加监听器,并相应地做出响应。通常,响应方式是向相机设备发送另一个捕获请求。
</p>
<h3 id="34">3.4</h3>
@@ -197,7 +198,8 @@ Android 8.0 版本中包含针对相机服务的以下主要增强功能:
<li>如果支持 <code>RAW_OPAQUE</code> 格式,则必须强制添加 <code>ANDROID_SENSOR_OPAQUE_RAW_SIZE</code> 静态元数据。</li>
<li>如果支持任何 RAW 格式,则必须强制添加 <code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE</code> 静态元数据。</li>
<li>使用数据空间编码的版本 0 定义,将 <code>camera3_stream_t data_space</code> 字段切换为更灵活的定义。</li>
-<li>可用于 HALv3.2 或更高版本的常规元数据添加项:<ul>
+<li>可用于 HALv3.2 或更高版本的常规元数据添加项:
+ <ul>
<li>
<a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_3"><code>ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3</code>
</a>
@@ -279,14 +281,14 @@ Android 8.0 版本中包含针对相机服务的以下主要增强功能:
<h2 id="module_version">相机模块版本历史记录</h2>
-<p>本部分基于 <code>camera_module_t.common.module_api_version</code> 提供了相机硬件模块的模块版本控制信息。两个最重要的十六进制数字表示主要版本,而两个最不重要的数字表示次要版本。</p>
+<p>本部分包含相机硬件模块的模块版本控制信息(基于 <code>camera_module_t.common.module_api_version</code>)。两个最重要的十六进制数字表示 Major 版本,而两个最不重要的数字表示 Minor 版本。</p>
<h3 id="24">2_4</h3>
<p>此相机模块版本添加了以下 API 更改:</p>
<ol>
- <li>手电筒模式支持。<em></em>框架可以为具有闪光灯元件的任何相机设备打开手电筒模式,而无需打开相机设备。相机设备对闪光灯单元的访问优先级高于相机模块;如果已通过模块接口启用手电筒,则打开相机设备会关闭手电筒。当出现任何资源冲突时(例如调用 <code>open()</code> 以打开相机设备),Camera HAL 模块必须通过手电筒模式状态回调通知框架,指明手电筒模式已关闭。</li>
+ <li>手电筒模式支持。<em></em>框架可以为具有闪光灯元件的任何相机设备打开手电筒模式,而无需打开相机设备。相机设备对闪光灯元件的访问优先级高于相机模块;如果已通过模块接口启用手电筒,则打开相机设备会关闭手电筒。当出现任何资源冲突时(例如调用 <code>open()</code> 以打开相机设备),Camera HAL 模块必须通过手电筒模式状态回调告知框架手电筒模式已关闭。</li>
<li>外部相机(如 USB 热插拔相机)支持。<em></em>仅当相机已连接且准备好用于外部热插拔相机时,API 更新才会指明相机静态信息可用。当相机状态不是 <code>CAMERA_DEVICE_STATUS_PRESENT</code> 时,获取静态信息的调用将为无效调用。框架仅依赖设备状态更改回调来管理可用的外部相机列表。
</li>