aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClay Murphy <claym@google.com>2018-02-28 02:08:58 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-02-28 02:08:58 +0000
commitae8cc47f7f443fc184778645b37620f61111797d (patch)
tree021e37ca44f1f03fc9b76d2c5f46866be1418139
parentd5e0ee3300d7176fb17595ce3e7c7d18703a9f31 (diff)
parent7a4e60bdebfa9c7ebf0a953770da06c29488d1ef (diff)
downloadsource.android.com-o-mr1-iot-preview-7.tar.gz
Merge "Docs: Changes to source.android.com"android-o-mr1-iot-preview-7o-mr1-iot-preview-7
-rw-r--r--en/devices/architecture/hidl/versioning.html8
-rw-r--r--en/devices/tech/debug/ftrace.html2
-rw-r--r--en/devices/tech/debug/native-crash.html59
-rw-r--r--en/devices/tech/ota/ab/index.html65
-rw-r--r--en/setup/initializing.html8
-rw-r--r--en/setup/requirements.html7
-rw-r--r--zh-cn/compatibility/android-cdd.html9423
-rw-r--r--zh-cn/license.html2
-rw-r--r--zh-cn/security/bulletin/2017-06-01.html9
9 files changed, 9509 insertions, 74 deletions
diff --git a/en/devices/architecture/hidl/versioning.html b/en/devices/architecture/hidl/versioning.html
index fbfd60fa..13bce259 100644
--- a/en/devices/architecture/hidl/versioning.html
+++ b/en/devices/architecture/hidl/versioning.html
@@ -491,8 +491,8 @@ must be true:</p>
<ol>
<li>"Previous minor version is valid": <code>package@major.(minor-1)</code>
must be defined and follow the same rule A (none of
-<code>package@major.0</code> through <code>package@major.(major-2)</code>
-are defined) or rule B (if it is an uprev from <code>@major.(major-2)</code>);
+<code>package@major.0</code> through <code>package@major.(minor-2)</code>
+are defined) or rule B (if it is an uprev from <code>@major.(minor-2)</code>);
<br><br>
AND
<br><br>
@@ -627,10 +627,8 @@ combination of interface-level inheritance and building of UDTs by composition.
backwards-compatible inheritance rules are as follows:</p>
<ol>
-<li>All interfaces of the parent package are inherited from by interfaces in the
+<li>All top-level interfaces of the parent package are inherited from by interfaces in the
child package.</li>
-<li>All data types of the parent package are present in the new package and can
-be handled by the (possibly reimplemented) methods from the old package.</li>
<li>New interfaces may also be added the new package (no restrictions about
relationships to other interfaces in other packages).</li>
<li>New data types may also be added for use by either new methods of uprev'ed
diff --git a/en/devices/tech/debug/ftrace.html b/en/devices/tech/debug/ftrace.html
index 2fbaba4b..c4f8bbcd 100644
--- a/en/devices/tech/debug/ftrace.html
+++ b/en/devices/tech/debug/ftrace.html
@@ -106,7 +106,7 @@ cat /d/tracing/trace &gt; /data/local/tmp/trace_output
<p>The trace_output gives the trace in text form. To visualize it using
Catapult, get the
<a href="https://github.com/catapult-project/catapult/tree/master/">Catapult
-repository</a> from Github and run trace2html:</p>
+repository</a> from GitHub and run trace2html:</p>
<pre class="devsite-terminal devsite-click-to-copy">
catapult/tracing/bin/trace2html ~/path/to/trace_file
diff --git a/en/devices/tech/debug/native-crash.html b/en/devices/tech/debug/native-crash.html
index 00f72cd0..686af070 100644
--- a/en/devices/tech/debug/native-crash.html
+++ b/en/devices/tech/debug/native-crash.html
@@ -49,15 +49,40 @@ plus SIGABRT are the things to look for in the <code>debuggerd</code> output to
recognize this case.</p>
<p>
-As mentioned above, there may be an explicit "abort message" line. But you
+As mentioned above, there may be an explicit "abort message" line. You
should also look in the <code>logcat</code> output to see what this thread logged before
-deliberately killing itself, because the basic abort primitive doesn't accept a
-message.
+deliberately killing itself, because unlike assert(3) or high level fatal logging
+facilities, abort(3) doesn't accept a message.
</p>
+
+<p>
+Current versions of Android inline the <code><a
+href="http://man7.org/linux/man-pages/man2/tgkill.2.html">tgkill(2)</a></code>
+system call, so their stacks are the easiest to read, with the call to abort(3)
+at the very top:
+</p>
+<pre class="devsite-click-to-copy">
+pid: 4637, tid: 4637, name: crasher >>> crasher <<<
+signal 6 (<i style="color:Orange">SIGABRT</i>), code -6 (SI_TKILL), fault addr --------
+<i style="color:Orange">Abort message</i>: 'some_file.c:123: some_function: assertion "false" failed'
+ r0 00000000 r1 0000121d r2 00000006 r3 00000008
+ r4 0000121d r5 0000121d r6 ffb44a1c r7 0000010c
+ r8 00000000 r9 00000000 r10 00000000 r11 00000000
+ ip ffb44c20 sp ffb44a08 lr eace2b0b pc eace2b16
+backtrace:
+ #00 pc 0001cb16 /system/lib/<i style="color:Orange">libc.so</i> (<i style="color:Orange">abort</i>+57)
+ #01 pc 0001cd8f /system/lib/libc.so (__assert2+22)
+ #02 pc 00001531 /system/bin/crasher (do_action+764)
+ #03 pc 00002301 /system/bin/crasher (main+68)
+ #04 pc 0008a809 /system/lib/libc.so (__libc_init+48)
+ #05 pc 00001097 /system/bin/crasher (_start_main+38)
+</pre>
+
<p>
-Older versions of Android (especially on 32-bit ARM) followed a convoluted path
-between the original abort call (frame 4 here) and the actual sending of the
-signal (frame 0 here):
+Older versions of Android followed a convoluted path between the original abort call (frame 4 here)
+and the actual sending of the signal (frame 0 here). This was especially true on 32-bit ARM,
+which added <code>__libc_android_abort</code> (frame 3 here) to the other platforms' sequence of
+<code>raise</code>/<code>pthread_kill</code>/<code>tgkill</code>:
</p>
<pre class="devsite-click-to-copy">
pid: 1656, tid: 1656, name: crasher >>> crasher <<<
@@ -80,28 +105,6 @@ backtrace:
#09 pc 00000abc /system/xbin/crasher
</pre>
<p>
-More recent versions call <code><a
-href="http://man7.org/linux/man-pages/man2/tgkill.2.html">tgkill(2)</a></code>
-directly from <code>abort</code>, so there are fewer stack frames for you to
-skip over before you get to the interesting frames:</p>
-
-<pre class="devsite-click-to-copy">
-pid: 25301, tid: 25301, name: crasher >>> crasher <<<
-signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
- r0 00000000 r1 000062d5 r2 00000006 r3 00000008
- r4 ffa09dd8 r5 000062d5 r6 000062d5 r7 0000010c
- r8 00000000 r9 00000000 sl 00000000 fp ffa09f0c
- ip 00000000 sp ffa09dc8 lr eac63ce3 pc eac93f0c cpsr 000d0010
-backtrace:
- #00 pc 00049f0c /system/lib/libc.so (tgkill+12)
- #01 pc 00019cdf /system/lib/libc.so (abort+50)
- #02 pc 000012db /system/xbin/crasher (maybe_abort+26)
- #03 pc 000015b7 /system/xbin/crasher (do_action+414)
- #04 pc 000020d5 /system/xbin/crasher (main+100)
- #05 pc 000177a1 /system/lib/libc.so (__libc_init+48)
- #06 pc 000010e4 /system/xbin/crasher (_start+96)
-</pre>
-<p>
You can reproduce an instance of this type of crash using: <code>crasher
abort</code>
</p>
diff --git a/en/devices/tech/ota/ab/index.html b/en/devices/tech/ota/ab/index.html
index c1b70856..48a9fea5 100644
--- a/en/devices/tech/ota/ab/index.html
+++ b/en/devices/tech/ota/ab/index.html
@@ -245,31 +245,31 @@
<h4 id="update_engine_source">Update engine source</h4>
- <p>
- The <code>update_engine</code> source is located in
- <code><a href="https://android.googlesource.com/platform/system/update_engine/" class="external">system/update_engine</a></code>.
- The A/B OTA dexopt files are split between <code>installd</code> and
- a package manager:
- </p>
+ <p>
+ The <code>update_engine</code> source is located in
+ <code><a href="https://android.googlesource.com/platform/system/update_engine/" class="external">system/update_engine</a></code>.
+ The A/B OTA dexopt files are split between <code>installd</code> and
+ a package manager:
+ </p>
- <ul>
- <li>
- <code><a href="https://android.googlesource.com/platform/frameworks/native/+/master/cmds/installd/" class="external-link">frameworks/native/cmds/installd/</a></code>ota*
- includes the postinstall script, the binary for chroot, the
- installd clone that calls dex2oat, the post-OTA move-artifacts
- script, and the rc file for the move script.
- </li>
- <li>
- <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/pm/OtaDexoptService.java" class="external-link">frameworks/base/services/core/java/com/android/server/pm/OtaDexoptService.java</a></code>
- (plus <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/pm/OtaDexoptShellCommand.java" class="external-link">OtaDexoptShellCommand</a></code>)
- is the package manager that prepares dex2oat commands for
- applications.
- </li>
- </ul>
+ <ul>
+ <li>
+ <code><a href="https://android.googlesource.com/platform/frameworks/native/+/master/cmds/installd/" class="external-link">frameworks/native/cmds/installd/</a></code>ota*
+ includes the postinstall script, the binary for chroot, the
+ installd clone that calls dex2oat, the post-OTA move-artifacts
+ script, and the rc file for the move script.
+ </li>
+ <li>
+ <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/pm/OtaDexoptService.java" class="external-link">frameworks/base/services/core/java/com/android/server/pm/OtaDexoptService.java</a></code>
+ (plus <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/pm/OtaDexoptShellCommand.java" class="external-link">OtaDexoptShellCommand</a></code>)
+ is the package manager that prepares dex2oat commands for
+ applications.
+ </li>
+ </ul>
- <p>
- For a working example, refer to <code><a href="https://android.googlesource.com/device/google/marlin/+/nougat-dr1-release/device-common.mk" class="external-link">/device/google/marlin/device-common.mk</a></code>.
- </p>
+ <p>
+ For a working example, refer to <code><a href="https://android.googlesource.com/device/google/marlin/+/nougat-dr1-release/device-common.mk" class="external-link">/device/google/marlin/device-common.mk</a></code>.
+ </p>
<h4 id="update_engine_logs">Update engine logs</h4>
@@ -282,24 +282,29 @@
<ul>
<li><a
- href="https://android-review.googlesource.com/c/platform/system/update_engine/+/486618">
+ href="https://android-review.googlesource.com/c/platform/system/update_engine/+/486618">
Change 486618</a></li>
<li><a
- href="https://android-review.googlesource.com/c/platform/system/core/+/529080">
+ href="https://android-review.googlesource.com/c/platform/system/core/+/529080">
Change 529080</a></li>
<li><a
- href="https://android-review.googlesource.com/c/platform/system/update_engine/+/529081">
+ href="https://android-review.googlesource.com/c/platform/system/update_engine/+/529081">
Change 529081</a></li>
<li><a
- href="https://android-review.googlesource.com/c/platform/system/sepolicy/+/534660">
+ href="https://android-review.googlesource.com/c/platform/system/sepolicy/+/534660">
Change 534660</a></li>
+ <li><a
+ href="https://android-review.googlesource.com/c/platform/system/update_engine/+/594637">
+ Change 594637</a></li>
</ul>
<p>These changes save a copy of the most recent
<code>update_engine</code> log to
- <code>/data/misc/update_engine_log/update_engine.log</code>. Users
- with the <strong>log</strong> group ID will be able to access the file
- system logs.
+ <code>/data/misc/update_engine_log/update_engine.<var>YEAR</var>-<var>TIME</var></code>.
+ In addition to the current log, the five most recent logs are saved
+ under <code>/data/misc/update_engine_log/</code>. Users
+ with the <strong>log</strong> group ID will be able to access the
+ file system logs.</p>
<h3 id="bootloader-interactions">Bootloader interactions</h3>
diff --git a/en/setup/initializing.html b/en/setup/initializing.html
index aa857f4d..518a1d98 100644
--- a/en/setup/initializing.html
+++ b/en/setup/initializing.html
@@ -81,16 +81,16 @@ found not to work on 14.04 using the instructions below.</em></p>
<ol>
<li>
<p>Download the <code>.deb</code> packages for 64-bit architecture from
-<a href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/">archive.ubuntu.com</a>:</p>
+<a href="http://old-releases.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/">old-releases.ubuntu.com</a>:</p>
<ul>
<li><a
-href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre-headless_8u45-b14-1_amd64.deb">openjdk-8-jre-headless_8u45-b14-1_amd64.deb</a>
+href="http://old-releases.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre-headless_8u45-b14-1_amd64.deb">openjdk-8-jre-headless_8u45-b14-1_amd64.deb</a>
with SHA256 <code>0f5aba8db39088283b51e00054813063173a4d8809f70033976f83e214ab56c0</code></li>
<li><a
-href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre_8u45-b14-1_amd64.deb">openjdk-8-jre_8u45-b14-1_amd64.deb</a>
+href="http://old-releases.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jre_8u45-b14-1_amd64.deb">openjdk-8-jre_8u45-b14-1_amd64.deb</a>
with SHA256 <code>9ef76c4562d39432b69baf6c18f199707c5c56a5b4566847df908b7d74e15849</code></li>
<li><a
-href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jdk_8u45-b14-1_amd64.deb">openjdk-8-jdk_8u45-b14-1_amd64.deb</a>
+href="http://old-releases.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/openjdk-8-jdk_8u45-b14-1_amd64.deb">openjdk-8-jdk_8u45-b14-1_amd64.deb</a>
with SHA256 <code>6e47215cf6205aa829e6a0a64985075bd29d1f428a4006a80c9db371c2fc3c4c</code></li>
</ul>
</li>
diff --git a/en/setup/requirements.html b/en/setup/requirements.html
index 69a60a27..e95cbb20 100644
--- a/en/setup/requirements.html
+++ b/en/setup/requirements.html
@@ -145,6 +145,13 @@ older versions of Android.</p>
SDK</li>
</ul>
+ <p><b>Note</b>: consider building on GNU/Linux, not another
+ operating system. The Android build system normally uses ART,
+ running on the build machine, to pre-compile system dex files. Since
+ ART is able to run only on Linux, the build system skips this
+ pre-compilation step on non-Linux operating systems, resulting in an
+ Android build with reduced performance.</p>
+
<h4 id=jdk>JDK</h4>
<p>See <a href="initializing.html#installing-the-jdk">Installing the JDK</a>
diff --git a/zh-cn/compatibility/android-cdd.html b/zh-cn/compatibility/android-cdd.html
new file mode 100644
index 00000000..3d1f034d
--- /dev/null
+++ b/zh-cn/compatibility/android-cdd.html
@@ -0,0 +1,9423 @@
+<html devsite xmlns="http://www.w3.org/1999/xhtml"><head>
+ <title>Android 8.0 兼容性定义</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.
+ -->
+ <h2 id="1_introduction">
+1. 简介
+ </h2>
+ <p>
+本文档列举了设备必须满足哪些要求才能与 Android 8.0 兼容。
+ </p>
+ <p>
+本文档按照 <a href="http://www.ietf.org/rfc/rfc2119.txt">RFC2119</a> 中定义的 IETF 标准使用“必须”、“不得”、“必需”、“会”、“不会”、“应”、“不应”、“建议”、“可以”和“可选”字样。
+ </p>
+ <p>
+在本文档中,“设备实现者”或“实现者”指的是开发运行 Android 8.0 的硬件/软件解决方案的个人或单位。“设备实现”或“实现”指的是所开发的硬件/软件解决方案。
+ </p>
+ <p>
+设备实现必须满足本兼容性定义文档(包括以参考资料的形式纳入的任何文档)中列出的要求,才会被视为与 Android 8.0 兼容。
+ </p>
+ <p>
+如果本定义或<a href="#10_software_compatibility_testing">第 10 节</a>中所述的软件测试未提及、含糊不清或不完整,设备实现者需负责确保与现有实现兼容。
+ </p>
+ <p>
+因此,<a href="http://source.android.com/">Android 开源项目</a>既是参考 Android 实现,也是首选 Android 实现。强烈建议设备实现者尽可能使其实现基于 Android 开源项目提供的“上游”源代码。虽然某些组件可以假设替换为备用实现,但强烈建议不要这样做,否则通过软件测试的难度会大大增加。实现者需负责确保行为与标准 Android 实现(包括兼容性测试套件及其他内容)完全兼容。最后请注意,本文档明确禁止替换和修改某些组件。
+ </p>
+ <p>
+本文档中链接到的许多资源都直接或间接来自 Android SDK,并且与该 SDK 的文档中包含的信息发挥相同的作用。如果出现任何本兼容性定义或兼容性测试套件与 SDK 文档不一致的情况,都要以 SDK 文档为准。本文档中链接到的资源内提供的任何技术详细信息都被视为是本兼容性定义的一部分。
+ </p>
+ <h3 id="1_1_document_structure">
+1.1 文档结构
+ </h3>
+ <h4 id="1_1_1_requirements_by_device_type">
+1.1.1. 针对各种设备类型的要求
+ </h4>
+ <p>
+ <a href="#2_device_types">第 2 节</a>中包含适用于特定设备类型的所有“必须”满足和“强烈建议”满足的要求。<a href="#2_device_types">第 2 节</a>中的每个小节均分别针对一种特定设备类型。
+ </p>
+ <p>
+<a href="#2_device_types">第 2 节</a>之后的各节中列出了普遍适用于所有 Android 设备实现的所有其他要求。本文档中将这些要求称为“核心要求”。
+ </p>
+ <h4 id="1_1_2_requirement_id">
+1.1.2. 要求 ID
+ </h4>
+ <p>
+“必须”满足的要求都被分配了要求 ID。
+ </p>
+ <ul>
+ <li>只有“必须”满足的要求被分配了 ID。
+ </li>
+ <li>“强烈建议”满足的要求带有 [SR] 标记,但未被分配 ID。
+ </li>
+ <li>ID 由以下部分构成:设备类型 ID - 条件 ID - 要求 ID(例如 C-0-1)。
+ </li>
+ </ul>
+ <p>
+每个 ID 的定义如下:
+ </p>
+ <ul>
+ <li>设备类型 ID(有关详情,请参阅 <a href="#2_device_types">2. 设备类型</a>)
+ <ul>
+ <li>C:核心(适用于所有 Android 设备实现的要求)
+ </li>
+ <li>H:Android 手持设备
+ </li>
+ <li>T:Android TV 设备
+ </li>
+ <li>A:Android Automotive 实现
+ </li>
+ <li>W:Android Watch 实现
+ </li>
+ </ul>
+ </li>
+ <li>条件 ID
+ <ul>
+ <li>如果要求是无条件的,则此 ID 会被设为 0。
+ </li>
+ <li>如果要求是有条件的,则在同一节的同一设备类型下,为第 1 个条件分配的 ID 为 1,为后续条件分配的 ID 按 1 递增。
+ </li>
+ </ul>
+ </li>
+ <li>要求 ID
+ <ul>
+ <li>在同一节的同一条件下,第 1 项要求的 ID 为 1,后续要求的 ID 则按 1 递增。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h2 id="2_device_types">
+2. 设备类型
+ </h2>
+ <p>
+虽然 Android 开源项目提供了一个可用于各种设备类型和外形规格的软件堆栈,但还有些设备类型具有相对来说更为完善的应用分发生态系统。
+ </p>
+ <p>
+本节介绍了这些设备类型,以及适用于每种设备类型的额外要求和建议。
+ </p>
+ <p>
+不属于任何所述设备类型的所有 Android 设备实现仍必须满足本兼容性定义其他各节中的所有要求。
+ </p>
+ <h3 id="2_1_device_configurations">
+2.1 设备配置
+ </h3>
+ <p>
+要了解各种设备类型在硬件配置方面的主要区别,请参阅本节中随后介绍的设备专属要求。
+ </p>
+ <h3 id="2_2_handheld_requirements">
+2.2. 针对手持设备的要求
+ </h3>
+ <p>
+<strong>Android 手持设备</strong>:一种 Android 设备实现,通常是拿在手中使用,例如 mp3 播放器、手机或平板电脑。
+ </p>
+ <p>
+满足以下所有条件的 Android 设备实现可归类为手持设备:
+ </p>
+ <ul>
+ <li>具有能够使设备实现移动性的电源,例如电池。
+ </li>
+ <li>屏幕的物理对角线尺寸介于 2.5 到 8 英寸之间。
+ </li>
+ </ul>
+ <p>
+本节其余部分中的附加要求针对的是 Android 手持设备实现。
+ </p>
+ <div class="note">
+ <b>注意</b>:不适用于 Android 平板电脑设备的要求带有 * 标记。
+ </div>
+ <h4 id="2_2_1_hardware">
+2.2.1. 硬件
+ </h4>
+ <p>
+ <strong>屏幕尺寸(第 7.1.1.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须具有物理对角线尺寸至少为 2.5 英寸的屏幕。<sup>*</sup>
+ </li>
+ </ul>
+ <p>
+ <strong>屏幕密度(第 7.1.1.3 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-SR] 强烈建议为用户提供一种用于更改显示区域大小的方式。
+ </li>
+ </ul>
+ <p>
+ <strong>旧版应用兼容模式(第 7.1.5 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须支持上游 Android 开放源代码所实现的旧版应用兼容模式。也就是说,设备实现不得更改启用兼容模式的触发条件或阈值,也不得更改兼容模式本身的行为。
+ </li>
+ </ul>
+ <p>
+ <strong>键盘(第 7.2.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须支持第三方输入法编辑器 (IME) 应用。
+ </li>
+ </ul>
+ <p>
+ <strong>导航键(第 7.2.3 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[H-0-1] 必须提供“主屏幕”、“最近用过”和“返回”功能。
+ </p>
+ </li>
+ <li>
+ <p>
+[H-0-2] 必须将“返回”功能 (<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK"><code>KEYCODE_BACK</code></a>) 的常规按下事件和长按事件都发送到前台应用。
+ </p>
+ </li>
+ </ul>
+ <p>
+ <strong>触摸屏输入(第 7.2.4 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须支持触摸屏输入。
+ </li>
+ </ul>
+ <p>
+ <strong>加速度计(第 7.3.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-SR] 强烈建议包含 3 轴加速度计。
+ </li>
+ </ul>
+ <p>
+如果手持设备实现包含 3 轴加速度计,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须能够以至少 100 Hz 的频率报告事件。
+ </li>
+ </ul>
+ <p>
+ <strong>陀螺仪(第 7.3.4 节)</strong>
+ </p>
+ <p>
+如果手持设备实现包含陀螺仪,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须能够以至少 100 Hz 的频率报告事件。
+ </li>
+ </ul>
+ <p>
+ <strong>近程传感器(第 7.3.8 节)</strong>
+ </p>
+ <p>
+如果手持设备实现可以进行语音通话,并且在 <code>getPhoneType</code> 中指出了 <code>PHONE_TYPE_NONE</code> 以外的任何其他值,则:
+ </p>
+ <ul>
+ <li>应包含近程传感器。
+ </li>
+ </ul>
+ <p>
+ <strong>姿势传感器(第 7.3.12 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>建议支持具有 6 个自由度的姿势传感器。
+ </li>
+ </ul>
+ <p>
+ <strong>蓝牙(第 7.4.3 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>应支持蓝牙和蓝牙 LE。
+ </li>
+ </ul>
+ <p>
+ <strong>流量节省程序(第 7.4.7 节)</strong>
+ </p>
+ <p>
+如果手持设备实现包含按流量计费的网络连接,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须提供流量节省程序模式。
+ </li>
+ </ul>
+ <p>
+ <strong>最小内存和存储空间(第 7.6.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须有至少 4GB 的非易失性存储空间可用于存储应用隐私数据(该空间也称为“/data”分区)。
+ </li>
+ <li>[H-0-2] 当可供内核和用户空间使用的内存少于 1GB 时,必须针对 <code>ActivityManager.isLowRamDevice()</code> 返回“true”。
+ </li>
+ </ul>
+ <p>
+如果手持设备实现是 32 位:
+ </p>
+ <ul>
+ <li>
+ <p>
+[H-1-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 512MB:
+ </p>
+ <ul>
+ <li>280dpi 或更低(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>ldpi 或更低(超大屏幕)
+ </li>
+ <li>mdpi 或更低(大屏幕)
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[H-2-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 608MB:
+ </p>
+ <ul>
+ <li>xhdpi 或更高(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>hdpi 或更高(大屏幕)
+ </li>
+ <li>mdpi 或更高(超大屏幕)
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[H-3-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 896MB:
+ </p>
+ <ul>
+ <li>400dpi 或更高(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>xhdpi 或更高(大屏幕)
+ </li>
+ <li>tvdpi 或更高(超大屏幕)
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[H-4-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 1344MB:
+ </p>
+ <ul>
+ <li>560dpi 或更高(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>400dpi 或更高(大屏幕)
+ </li>
+ <li>xhdpi 或更高(超大屏幕)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+如果手持设备实现是 64 位:
+ </p>
+ <ul>
+ <li>
+ <p>
+[H-5-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 816MB:
+ </p>
+ <ul>
+ <li>280dpi 或更低(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>ldpi 或更低(超大屏幕)
+ </li>
+ <li>mdpi 或更低(大屏幕)
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[H-6-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 944MB:
+ </p>
+ <ul>
+ <li>xhdpi 或更高(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>hdpi 或更高(大屏幕)
+ </li>
+ <li>mdpi 或更高(超大屏幕)
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[H-7-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 1280MB:
+ </p>
+ <ul>
+ <li>400dpi 或更高(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>xhdpi 或更高(大屏幕)
+ </li>
+ <li>tvdpi 或更高(超大屏幕)
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[H-8-1] 如果使用了以下任何密度,则可供内核和用户空间使用的内存必须至少为 1824MB:
+ </p>
+ <ul>
+ <li>560dpi 或更高(小屏幕/普通屏幕)<sup>*</sup>
+ </li>
+ <li>400dpi 或更高(大屏幕)
+ </li>
+ <li>xhdpi 或更高(超大屏幕)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+请注意,上文提到的“可供内核和用户空间使用的内存”是指除了已专门用于硬件组件(例如设备实现上的无线装置、视频组件,以及其他不受内核控制的组件)的所有内存之外另行提供的内存空间。
+ </p>
+ <p>
+ <strong>应用共享存储空间(第 7.6.2 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须提供不小于 1GiB 的应用共享存储空间。
+ </li>
+ </ul>
+ <p>
+ <strong>USB 外围设备模式(第 7.7.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>应包含支持外围设备模式的 USB 端口。
+ </li>
+ </ul>
+ <p>
+如果手持设备实现包含支持外围设备模式的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须实现 Android Open Accessory (AOA) API。<sup>*</sup>
+ </li>
+ </ul>
+ <p>
+ <strong>麦克风(第 7.8.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须包含麦克风。
+ </li>
+ </ul>
+ <p>
+ <strong>音频输出(第 7.8.2 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须具有音频输出机制,并声明 <code>android.hardware.audio.output</code>。
+ </li>
+ </ul>
+ <p>
+ <strong>虚拟实境模式(第 7.9.1 节)</strong>
+ </p>
+ <p>
+如果手持设备实现支持 VR 模式,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须声明 <code>android.software.vr.mode</code> 功能。<sup>*</sup>
+ </li>
+ </ul>
+ <p>
+如果设备实现声明了 <code>android.software.vr.mode</code> 功能,则:
+ </p>
+ <ul>
+ <li>[H-2-1] 必须包含用于实现 <code>android.service.vr.VrListenerService</code>(可以由 VR 应用通过 <code>android.app. Activity#setVrModeEnabled</code> 启用)的应用。<sup>*</sup>
+ </li>
+ </ul>
+ <p>
+ <strong>虚拟实境高性能(第 7.9.2 节)</strong>
+ </p>
+ <p>
+如果手持设备实现能够满足关于声明 <code>android.hardware.vr.high_performance</code> 功能标记的所有要求,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须声明 <code>android.hardware.vr.high_performance</code> 功能标记。<sup>*</sup>
+ </li>
+ </ul>
+ <h4 id="2_2_2_multimedia">
+2.2.2. 多媒体
+ </h4>
+ <p>
+ <strong>音频编码(第 5.1.1 节)</strong>
+ </p>
+ <p>
+手持设备实现必须支持以下音频编码:
+ </p>
+ <ul>
+ <li>[H-0-1] AMR-NB
+ </li>
+ <li>[H-0-2] AMR-WB
+ </li>
+ <li>[H-0-3] MPEG-4 AAC Profile (AAC LC)
+ </li>
+ <li>[H-0-4] MPEG-4 HE AAC Profile (AAC+)
+ </li>
+ <li>[H-0-5] AAC ELD(增强型低延迟 AAC)
+ </li>
+ </ul>
+ <p>
+ <strong>音频解码(第 5.1.2 节)</strong>
+ </p>
+ <p>
+手持设备实现必须支持以下音频解码:
+ </p>
+ <ul>
+ <li>[H-0-1] AMR-NB
+ </li>
+ <li>[H-0-2] AMR-WB
+ </li>
+ </ul>
+ <p>
+ <strong>视频编码(第 5.2 节)</strong>
+ </p>
+ <p>
+手持设备实现必须支持以下视频编码,并使其可供第三方应用使用:
+ </p>
+ <ul>
+ <li>[H-0-1] H.264 AVC
+ </li>
+ <li>[H-0-2] VP8
+ </li>
+ </ul>
+ <p>
+ <strong>视频解码(第 5.3 节)</strong>
+ </p>
+ <p>
+手持设备实现必须支持以下视频解码:
+ </p>
+ <ul>
+ <li>[H-0-1] H.264 AVC。
+ </li>
+ <li>[H-0-2] H.265 HEVC。
+ </li>
+ <li>[H-0-3] MPEG-4 SP。
+ </li>
+ <li>[H-0-4] VP8。
+ </li>
+ <li>[H-0-5] VP9。
+ </li>
+ </ul>
+ <h4 id="2_2_3_software">
+2.2.3. 软件
+ </h4>
+ <p>
+ <strong>WebView 兼容性(第 3.4.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须提供 <code>android.webkit.Webview</code> API 的完整实现。
+ </li>
+ </ul>
+ <p>
+ <strong>浏览器兼容性(第 3.4.2 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须包含独立的浏览器应用,以供用户进行一般的网页浏览。
+ </li>
+ </ul>
+ <p>
+ <strong>启动器(第 3.8.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[H-SR] 强烈建议实现一个支持应用内固定快捷方式和微件的默认启动器。
+ </p>
+ </li>
+ <li>
+ <p>
+[H-SR] 强烈建议实现一个可让用户快速访问第三方应用通过 <a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html">ShortcutManager</a> API 提供的其他快捷方式的默认启动器。
+ </p>
+ </li>
+ <li>
+ <p>
+[H-SR] 强烈建议包含一个会为应用图标显示标记的默认启动器应用。
+ </p>
+ </li>
+ </ul>
+ <p>
+ <strong>微件(第 3.8.2 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-SR] 强烈建议支持第三方应用微件。
+ </li>
+ </ul>
+ <p>
+ <strong>通知(第 3.8.3 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须允许第三方应用通过 <a href="https://developer.android.com/reference/android/app/Notification.html"><code>Notification</code></a> 和 <a href="https://developer.android.com/reference/android/app/NotificationManager.html"><code>NotificationManager</code></a> API 类向用户发出关于重要事件的通知。
+ </li>
+ <li>[H-0-2] 必须支持内容丰富的通知。
+ </li>
+ <li>[H-0-3] 必须支持提醒式通知。
+ </li>
+ <li>[H-0-4] 必须包含通知栏,以便用户能够通过相应方式(例如 AOSP 中实现的操作按钮或控制面板)直接控制通知(例如回复、暂停、关闭、屏蔽通知)。
+ </li>
+ </ul>
+ <p>
+ <strong>搜索(第 3.8.4 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-SR] 强烈建议在设备上实现用于处理<a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_ASSIST">辅助操作</a>的辅助程序。
+ </li>
+ </ul>
+ <p>
+ <strong>锁定屏幕媒体控件(第 3.8.10 节)</strong>
+ </p>
+ <p>
+如果 Android 手持设备实现支持锁定屏幕,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须显示包含媒体通知模板的锁定屏幕通知。
+ </li>
+ </ul>
+ <p>
+ <strong>设备管理(第 3.9 节)</strong>
+ </p>
+ <p>如果手持设备实现支持安全锁定屏幕,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须实现 Android SDK 文档中定义的所有<a href="http://developer.android.com/guide/topics/admin/device-admin.html">设备管理</a>政策。
+ </li>
+ </ul>
+ <p>
+ <strong>无障碍服务(第 3.10 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[H-SR] 必须支持第三方无障碍服务。
+ </p>
+ </li>
+ <li>
+ <p>
+[H-SR] 强烈建议在设备上预加载无障碍服务,并且这些服务的功能要与 <a href="https://github.com/google/talkback">TalkBack 开源项目</a>中提供的开关控制和 TalkBack(适用于预加载的文字转语音引擎支持的语言)无障碍服务的功能相当或更胜一筹。
+ </p>
+ </li>
+ </ul>
+ <p>
+ <strong>文字转语音(第 3.11 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[H-0-1] 必须支持安装第三方 TTS 引擎。
+ </p>
+ </li>
+ <li>
+ <p>
+[H-SR] 强烈建议包含支持设备上可用语言的 TTS 引擎。
+ </p>
+ </li>
+ </ul>
+ <p>
+ <strong>快捷设置(第 3.13 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-SR] 强烈建议包含快捷设置界面组件。
+ </li>
+ </ul>
+ <p>
+ <strong>配套设备配对(第 3.15 节)</strong>
+ </p>
+ <p>
+如果 Android 手持设备实现声明支持 <code>FEATURE_BLUETOOTH</code> 或 <code>FEATURE_WIFI</code>,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须支持配套设备配对功能。
+ </li>
+ </ul>
+ <h4 id="2_2_4_performance_and_power">
+2.2.4. 性能和功耗
+ </h4>
+ <p>
+ <strong>用户体验一致性(第 8.1 节)</strong>
+ </p>
+ <p>
+对于手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] <strong>一致的帧延迟</strong>:帧延迟不一致或呈现帧时出现延迟的发生频率不得超过每秒 5 帧,并且应低于每秒 1 帧。
+ </li>
+ <li>[H-0-2] <strong>界面延迟</strong>:设备实现必须确保滚动完包含 10K 个列表条目的列表(如 Android 兼容性测试套件 (CTS) 中定义)所用的时间不超过 36 秒,从而确保实现低延迟用户体验。
+ </li>
+ <li>[H-0-3] <strong>任务切换</strong>:在启动了多个应用的情况下,如果重新启动已启动且已在运行的应用,所用时间不得超过 1 秒。
+ </li>
+ </ul>
+ <p>
+ <strong>文件 I/O 访问性能(第 8.2 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须确保顺序写入性能至少为 5 MB/s。
+ </li>
+ <li>[H-0-2] 必须确保随机写入性能至少为 0.5 MB/s。
+ </li>
+ <li>[H-0-3] 必须确保顺序读取性能至少为 15 MB/s。
+ </li>
+ <li>[H-0-4] 必须确保随机读取性能至少为 3.5 MB/s。
+ </li>
+ </ul>
+ <p>
+ <strong>节电模式(第 8.3 节)</strong>
+ </p>
+ <p>
+对于手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须让最终用户能够看到所有无需进入应用待机和低电耗节电模式的应用。
+ </li>
+ <li>[H-0-2] 应用待机和低电耗节电模式的触发、维护、唤醒算法以及对全局系统设置的使用都不得违背 Android 开源项目。
+ </li>
+ </ul>
+ <p>
+ <strong>功耗计算(第 8.4 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须提供一个关于各组件功耗的配置文件,其中要定义每种硬件组件的<a href="http://source.android.com/devices/tech/power/values.html">耗电值</a>,以及组件在一段时间内大概消耗的电量(如 Android 开源项目网站上所述)。
+ </li>
+ <li>[H-0-2] 必须以毫安小时 (mAh) 为单位报告所有功耗值。
+ </li>
+ <li>[H-0-3] 必须按每个进程的 UID 报告 CPU 功耗。Android 开源项目通过 <code>uid_cputime</code> 内核模块实现来满足该要求。
+ </li>
+ <li>[H-0-4] 必须能让应用开发者通过 <a href="http://source.android.com/devices/tech/power/batterystats.html"><code>adb shell dumpsys batterystats</code></a> shell 命令查看此功耗。
+ </li>
+ <li>如果无法将硬件组件的功耗归于某个应用,则应将其归于硬件组件本身。
+ </li>
+ </ul>
+ <p>
+如果手持设备实现包含屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>[H-1-1] 必须能够遵从 <a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_POWER_USAGE_SUMMARY"><code>android.intent.action.POWER_USAGE_SUMMARY</code></a> Intent 提供一个会显示此功耗的设置菜单。
+ </li>
+ </ul>
+ <h4 id="2_2_5_security_model">
+2.2.5. 安全模型
+ </h4>
+ <p>
+ <strong>权限(第 9.1 节)</strong>
+ </p>
+ <p>
+手持设备实现:
+ </p>
+ <ul>
+ <li>[H-0-1] 必须允许第三方应用通过 <code>android.permission.PACKAGE_USAGE_STATS</code> 权限访问使用情况统计信息,并能够因应 <a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION&amp;lowbar;USAGE&amp;lowbar;ACCESS&amp;lowbar;SETTINGS"><code>android.settings.ACTION_USAGE_ACCESS_SETTINGS</code></a> Intent 提供一种可供用户使用的机制,让用户能够为此类应用授予或撤消该访问权限。
+ </li>
+ </ul>
+ <h3 id="2_3_television_requirements">
+2.3. 针对 TV 的要求
+ </h3>
+ <p>
+<strong>Android TV 设备</strong>:一种 Android 设备实现,是适合用户坐在约 10 英尺远的距离观看的娱乐界面(“提供大屏幕娱乐体验的界面”或“距离 10 英尺观看的界面”),用于观看数字媒体、影片、电视直播,玩游戏和/或使用应用。
+ </p>
+ <p>
+满足以下所有条件的 Android 设备实现可归类为 TV 设备:
+ </p>
+ <ul>
+ <li>提供了可远程控制显示屏(可能距用户 10 英尺远)上呈现的界面的机制。
+ </li>
+ <li>具有对角线长度超过 24 英寸的嵌入式显示屏,或包含视频输出端口,例如用于连接显示设备的 VGA、HDMI、DisplayPort 或无线端口。
+ </li>
+ </ul>
+ <p>
+本节其余部分中的附加要求针对的是 Android TV 设备实现。
+ </p>
+ <h4 id="2_3_1_hardware">
+2.3.1. 硬件
+ </h4>
+ <p>
+ <strong>非触摸导航(第 7.2.2 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须支持<a href="https://developer.android.com/reference/android/content/res/Configuration.html#NAVIGATION_DPAD">方向键</a>。
+ </li>
+ </ul>
+ <p>
+ <strong>导航键(第 7.2.3 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须提供“主屏幕”和“返回”功能。
+ </li>
+ <li>[T-0-2] 必须将“返回”功能 (<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK"><code>KEYCODE_BACK</code></a>) 的常规按下事件和长按事件都发送到前台应用。
+ </li>
+ </ul>
+ <p>
+ <strong>按钮映射(第 7.2.6.1 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须支持游戏控制器,并声明 <code>android.hardware.gamepad</code> 功能标记。
+ </li>
+ </ul>
+ <p>
+ <strong>遥控器(第 7.2.7 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>应提供可让用户访问<a href="#7_2_2_non-touch_navigation">非触摸导航</a>和<a href="#7_2_3_navigation_keys">核心导航键</a>输入的遥控器。
+ </li>
+ </ul>
+ <p>
+ <strong>陀螺仪(第 7.3.4 节)</strong>
+ </p>
+ <p>
+如果 TV 设备实现包含陀螺仪,则:
+ </p>
+ <ul>
+ <li>[T-1-1] 必须能够以至少 100 Hz 的频率报告事件。
+ </li>
+ </ul>
+ <p>
+ <strong>蓝牙(第 7.4.3 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须支持蓝牙和蓝牙 LE。
+ </li>
+ </ul>
+ <p>
+ <strong>最小内存和存储空间(第 7.6.1 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须有至少 4GB 的非易失性存储空间可用于存储应用隐私数据(该空间也称为“/data”分区)。
+ </li>
+ </ul>
+ <p>
+ <strong>麦克风(第 7.8.1 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>应包含麦克风。
+ </li>
+ </ul>
+ <p>
+ <strong>音频输出(第 7.8.2 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须具有音频输出机制,并声明 <code>android.hardware.audio.output</code>。
+ </li>
+ </ul>
+ <h4 id="2_3_2_multimedia">
+2.3.2. 多媒体
+ </h4>
+ <p>
+ <strong>音频编码(第 5.1 节)</strong>
+ </p>
+ <p>
+TV 设备实现必须支持以下音频编码:
+ </p>
+ <ul>
+ <li>[T-0-1] MPEG-4 AAC Profile (AAC LC)
+ </li>
+ <li>[T-0-2] MPEG-4 HE AAC Profile (AAC+)
+ </li>
+ <li>[T-0-3] AAC ELD(增强型低延迟 AAC)
+ </li>
+ </ul>
+ <p>
+ <strong>视频编码(第 5.2 节)</strong>
+ </p>
+ <p>
+TV 设备实现必须支持以下视频编码:
+ </p>
+ <ul>
+ <li>[T-0-1] H.264 AVC
+ </li>
+ <li>[T-0-2] VP8
+ </li>
+ </ul>
+ <p>
+ <strong>H-264(第 5.2.2 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-SR] 强烈建议支持对分辨率为 720p 和 1080p 的视频进行 H.264 编码。
+ </li>
+ <li>[T-SR] 强烈建议支持以 30 帧/秒 (fps) 的帧速率对分辨率为 1080p 的视频进行 H.264 编码。
+ </li>
+ </ul>
+ <p>
+ <strong>视频解码(第 5.3 节)</strong>
+ </p>
+ <p>
+TV 设备实现必须支持以下视频解码:
+ </p>
+ <ul>
+ <li>[T-0-1] H.264 AVC
+ </li>
+ <li>[T-0-2] H.265 HEVC
+ </li>
+ <li>[T-0-3] MPEG-4 SP
+ </li>
+ <li>[T-0-4] VP8
+ </li>
+ <li>[T-0-5] VP9
+ </li>
+ </ul>
+ <p>
+强烈建议 TV 设备实现支持以下视频解码:
+ </p>
+ <ul>
+ <li>[T-SR] MPEG-2
+ </li>
+ </ul>
+ <p>
+ <strong>H.264(第 5.3.4 节)</strong>
+ </p>
+ <p>
+如果 TV 设备实现支持 H.264 解码器,则:
+ </p>
+ <ul>
+ <li>[T-1-1] 必须支持 High Profile Level 4.2 和高清 1080p (60 fps) 解码配置。
+ </li>
+ <li>[T-1-2] 必须能够对以下视频进行解码:采用下表中所列的两种高清配置,且使用 Baseline Profile、Main Profile 或 High Profile Level 4.2 编码的视频。
+ </li>
+ </ul>
+ <p>
+ <strong>H.265 (HEVC)(第 5.3.5 节)</strong>
+ </p>
+ <p>
+如果 TV 设备实现支持 H.265 编解码器和高清 1080p 解码配置,则:
+ </p>
+ <ul>
+ <li>[T-1-1] 必须支持 Main Profile Level 4.1 Main Tier。
+ </li>
+ <li>[T-SR] 强烈建议支持以 60 fps 的帧速率对高清 1080p 视频进行解码。
+ </li>
+ </ul>
+ <p>
+如果 TV 设备实现支持 H.265 编解码器和超高清解码配置,则:
+ </p>
+ <ul>
+ <li>[T-2-1] 该编解码器必须支持 Main10 Level 5 Main Tier 配置。
+ </li>
+ </ul>
+ <p>
+ <strong>VP8(第 5.3.6 节)</strong>
+ </p>
+ <p>
+如果 TV 设备实现支持 VP8 编解码器,则:
+ </p>
+ <ul>
+ <li>[T-1-1] 必须支持高清 1080p60 解码配置。
+ </li>
+ </ul>
+ <p>
+如果 TV 设备实现支持 VP8 编解码器和 720p,则:
+ </p>
+ <ul>
+ <li>[T-2-1] 必须支持高清 720p60 解码配置。
+ </li>
+ </ul>
+ <p>
+ <strong>VP9(第 5.3.7 节)</strong>
+ </p>
+ <p>
+如果 TV 设备实现支持 VP9 编解码器和超高清视频解码,则:
+ </p>
+ <ul>
+ <li>[T-1-1] 必须支持 8 位色深,并且应支持 VP9 Profile 2(10 位)。
+ </li>
+ </ul>
+ <p>
+如果 TV 设备实现支持 VP9 编解码器、1080p 配置和 VP9 硬件解码,则:
+ </p>
+ <ul>
+ <li>[T-2-1] 必须支持以 60 fps 的帧速率对 1080p 视频进行解码。
+ </li>
+ </ul>
+ <p>
+ <strong>安全媒体(第 5.8 节)</strong>
+ </p>
+ <p>
+如果设备实现是 Android TV 设备,并且支持 4K 分辨率,则:
+ </p>
+ <ul>
+ <li>[T-1-1] 对于所有采用有线方式连接的外部显示设备,都必须支持 HDCP 2.2。
+ </li>
+ </ul>
+ <p>
+如果 TV 设备实现不支持 4K 分辨率,则:
+ </p>
+ <ul>
+ <li>[T-2-1] 对于所有采用有线方式连接的外部显示设备,都必须支持 HDCP 1.4。
+ </li>
+ </ul>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-SR] 强烈建议支持同时对多个安全视频流进行解码。强烈建议至少支持同时对两个视频流进行解码。
+ </li>
+ </ul>
+ <p>
+ <strong>音频输出音量(第 5.5.3 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须支持在支持的输出装置上进行系统主音量和数字音频输出音量衰减,使用压缩音频直通输出装置时(在这种情况下,设备上不会进行任何音频解码)除外。
+ </li>
+ </ul>
+ <h4 id="2_3_3_software">
+2.3.3. 软件
+ </h4>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须声明 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_LEANBACK"><code>android.software.leanback</code></a> 和 <code>android.hardware.type.television</code> 功能。
+ </li>
+ </ul>
+ <p>
+ <strong>WebView 兼容性(第 3.4.1 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须提供 <code>android.webkit.Webview</code> API 的完整实现。
+ </li>
+ </ul>
+ <p>
+ <strong>锁定屏幕媒体控件(第 3.8.10 节)</strong>
+ </p>
+ <p>
+如果 Android TV 设备实现支持锁定屏幕,则:
+ </p>
+ <ul>
+ <li>[T-1-1] 必须显示包含媒体通知模板的锁定屏幕通知。
+ </li>
+ </ul>
+ <p>
+ <strong>多窗口模式(第 3.8.14 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-SR] 强烈建议支持画中画 (PIP) 多窗口模式。
+ </li>
+ </ul>
+ <p>
+ <strong>无障碍服务(第 3.10 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[T-SR] 必须支持第三方无障碍服务。
+ </p>
+ </li>
+ <li>
+ <p>
+[T-SR] 强烈建议 Android TV 设备实现在设备上预加载无障碍服务,并且这些服务的功能要与 <a href="https://github.com/google/talkback">TalkBack 开源项目</a>中提供的开关控制和 TalkBack(适用于预加载的文字转语音引擎支持的语言)无障碍服务的功能相当或更胜一筹。
+ </p>
+ </li>
+ </ul>
+ <p>
+ <strong>文字转语音(第 3.11 节)</strong>
+ </p>
+ <p>
+如果设备实现报告 android.hardware.audio.output 功能,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[T-SR] 强烈建议包含支持设备上可用语言的 TTS 引擎。
+ </p>
+ </li>
+ <li>
+ <p>
+[T-0-1] 必须支持安装第三方 TTS 引擎。
+ </p>
+ </li>
+ </ul>
+ <p>
+ <strong>TV 输入框架(第 3.12 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须支持 TV 输入框架。
+ </li>
+ </ul>
+ <h4 id="2_3_4_performance_and_power">
+2.3.4. 性能和功耗
+ </h4>
+ <p>
+ <strong>用户体验一致性(第 8.1 节)</strong>
+ </p>
+ <p>
+对于 TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] <strong>一致的帧延迟</strong>:帧延迟不一致或呈现帧时出现延迟的发生频率不得超过每秒 5 帧,并且应低于每秒 1 帧。
+ </li>
+ </ul>
+ <p>
+ <strong>文件 I/O 访问性能(第 8.2 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须确保顺序写入性能至少为 5MB/s。
+ </li>
+ <li>[T-0-2] 必须确保随机写入性能至少为 0.5MB/s。
+ </li>
+ <li>[T-0-3] 必须确保顺序读取性能至少为 15MB/s。
+ </li>
+ <li>[T-0-4] 必须确保随机读取性能至少为 3.5MB/s。
+ </li>
+ </ul>
+ <p>
+ <strong>节电模式(第 8.3 节)</strong>
+ </p>
+ <p>
+对于 TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须让最终用户能够看到所有无需进入应用待机和低电耗节电模式的应用。
+ </li>
+ <li>[T-0-2] 应用待机和低电耗节电模式的触发、维护、唤醒算法以及对全局系统设置的使用都不得违背 Android 开源项目。
+ </li>
+ </ul>
+ <p>
+ <strong>功耗计算(第 8.4 节)</strong>
+ </p>
+ <p>
+TV 设备实现:
+ </p>
+ <ul>
+ <li>[T-0-1] 必须提供一个关于各组件功耗的配置文件,其中要定义每种硬件组件的<a href="http://source.android.com/devices/tech/power/values.html">耗电值</a>,以及组件在一段时间内大概消耗的电量(如 Android 开源项目网站上所述)。
+ </li>
+ <li>[T-0-2] 必须以毫安小时 (mAh) 为单位报告所有功耗值。
+ </li>
+ <li>[T-0-3] 必须按每个进程的 UID 报告 CPU 功耗。Android 开源项目通过 <code>uid_cputime</code> 内核模块实现来满足该要求。
+ </li>
+ <li>如果无法将硬件组件的功耗归于某个应用,则应将其归于硬件组件本身。
+ </li>
+ <li>[T-0-4] 必须能让应用开发者通过 <a href="http://source.android.com/devices/tech/power/batterystats.html"><code>adb shell dumpsys batterystats</code></a> shell 命令查看此功耗。
+ </li>
+ </ul>
+ <h3 id="2_4_watch_requirements">
+2.4. 针对 Watch 的要求
+ </h3>
+ <p>
+<strong>Android Watch 设备</strong>:一种应穿戴在身上(也许是戴在手腕上)的 Android 设备实现。
+ </p>
+ <p>
+满足以下所有条件的 Android 设备实现可归类为 Watch 设备:
+ </p>
+ <ul>
+ <li>具有物理对角线长度介于 1.1 到 2.5 英寸之间的屏幕。
+ </li>
+ <li>具有旨在方便穿戴在身上的机制。
+ </li>
+ </ul>
+ <p>
+本节其余部分中的附加要求针对的是 Android Watch 设备实现。
+ </p>
+ <h4 id="2_4_1_hardware">
+2.4.1. 硬件
+ </h4>
+ <p>
+ <strong>屏幕尺寸(第 7.1.1.1 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-0-1] 必须具有物理对角线尺寸介于 1.1 到 2.5 英寸之间的屏幕。
+ </li>
+ </ul>
+ <p>
+ <strong>导航键(第 7.2.3 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-0-1] 必须为用户提供“主屏幕”功能,还必须提供“返回”功能(处于 <code>UI_MODE_TYPE_WATCH</code> 模式时除外)。
+ </li>
+ </ul>
+ <p>
+ <strong>触摸屏输入(第 7.2.4 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-0-2] 必须支持触摸屏输入。
+ </li>
+ </ul>
+ <p>
+ <strong>加速度计(第 7.3.1 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-SR] 强烈建议包含 3 轴加速度计。
+ </li>
+ </ul>
+ <p>
+ <strong>蓝牙(第 7.4.3 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-0-1] 必须支持蓝牙。
+ </li>
+ </ul>
+ <p>
+ <strong>最小内存和存储空间(第 7.6.1 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-0-1] 必须有至少 1GB 的非易失性存储空间可用于存储应用隐私数据(该空间也称为“/data”分区)。
+ </li>
+ <li>[W-0-2] 必须有至少 416MB 的内存可供内核和用户空间使用。
+ </li>
+ </ul>
+ <p>
+ <strong>麦克风(第 7.8.1 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-0-1] 必须包含麦克风。
+ </li>
+ </ul>
+ <p>
+ <strong>音频输出(第 7.8.1 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>可以(但不应)包含音频输出机制。
+ </li>
+ </ul>
+ <h4 id="2_4_2_multimedia">
+2.4.2. 多媒体
+ </h4>
+ <p>
+没有额外要求。
+ </p>
+ <h4 id="2_4_3_software">
+2.4.3. 软件
+ </h4>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-0-1] 必须声明 android.hardware.type.watch 功能。
+ </li>
+ <li>[W-0-2] 必须支持 uiMode = <a href="http://developer.android.com/reference/android/content/res/Configuration.html#UI_MODE_TYPE_WATCH">UI_MODE_TYPE_WATCH</a>。
+ </li>
+ </ul>
+ <p>
+ <strong>搜索(第 3.8.4 节)</strong>
+ </p>
+ <p>
+Watch 设备实现:
+ </p>
+ <ul>
+ <li>[W-SR] 强烈建议在设备上实现用于处理<a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_ASSIST">辅助操作</a>的辅助程序。
+ </li>
+ </ul>
+ <p>
+ <strong>无障碍服务(第 3.10 节)</strong>
+ </p>
+ <p>
+声明 <code>android.hardware.audio.output</code> 功能标记的 Watch 设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[W-1-1] 必须支持第三方无障碍服务。
+ </p>
+ </li>
+ <li>
+ <p>
+[W-SR] 强烈建议在设备上预加载无障碍服务,并且这些服务的功能要与 <a href="https://github.com/google/talkback">TalkBack 开源项目</a>中提供的开关控制和 TalkBack(适用于预加载的文字转语音引擎支持的语言)无障碍服务的功能相当或更胜一筹。
+ </p>
+ </li>
+ </ul>
+ <p>
+ <strong>文字转语音(第 3.11 节)</strong>
+ </p>
+ <p>
+如果 Watch 设备实现报告 android.hardware.audio.output 功能,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[W-SR] 强烈建议包含支持设备上可用语言的 TTS 引擎。
+ </p>
+ </li>
+ <li>
+ <p>
+[W-0-1] 必须支持安装第三方 TTS 引擎。
+ </p>
+ </li>
+ </ul>
+ <h3 id="2_5_automotive_requirements">
+2.5. 针对 Automotive 的要求
+ </h3>
+ <p>
+ <strong>Android Automotive 实现</strong>:一种汽车音响主机,运行 Android 作为操作系统来实现部分或全部的系统功能和/或信息娱乐功能。
+ </p>
+ <p>
+声明了 <code>android.hardware.type.automotive</code> 功能或满足以下所有条件的 Android 设备实现可归类为 Automotive 设备。
+ </p>
+ <ul>
+ <li>作为部件嵌入到车辆上或可插入到车辆上。
+ </li>
+ <li>使用驾驶侧的屏幕作为主要显示屏。
+ </li>
+ </ul>
+ <p>
+本节其余部分中的附加要求针对的是 Android Automotive 设备实现。
+ </p>
+ <h4 id="2_5_1_hardware">
+2.5.1. 硬件
+ </h4>
+ <p>
+ <strong>屏幕尺寸(第 7.1.1.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须具有物理对角线尺寸至少为 6 英寸的屏幕。
+ </li>
+ <li>[A-0-2] 屏幕尺寸布局必须至少为 750 dp x 480 dp。
+ </li>
+ </ul>
+ <p>
+ <strong>导航键(第 7.2.3 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须提供“主屏幕”功能,并且可以提供“返回”和“最近用过”功能。
+ </li>
+ <li>[A-0-2] 必须将“返回”功能 (<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK"><code>KEYCODE_BACK</code></a>) 的常规按下事件和长按事件都发送到前台应用。
+ </li>
+ </ul>
+ <p>
+ <strong>加速度计(第 7.3.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-SR] 强烈建议包含 3 轴加速度计。
+ </li>
+ </ul>
+ <p>
+如果 Automotive 设备实现包含 3 轴加速度计,则:
+ </p>
+ <ul>
+ <li>[A-1-1] 必须能够以至少 100 Hz 的频率报告事件。
+ </li>
+ <li>[A-1-2] 必须遵从 Android <a href="http://source.android.com/devices/sensors/sensor-types.html#auto_axes">汽车传感器坐标系</a>。
+ </li>
+ </ul>
+ <p>
+ <strong>GPS(第 7.3.3 节)</strong>
+ </p>
+ <p>
+如果 Automotive 设备实现包含 GPS/GNSS 接收器,并且通过 <code>android.hardware.location.gps</code> 功能标记向应用报告该功能,则:
+ </p>
+ <ul>
+ <li>[A-1-1] GNSS 技术的出产年份必须为“2017 年”或更晚。
+ </li>
+ </ul>
+ <p>
+ <strong>陀螺仪(第 7.3.4 节)</strong>
+ </p>
+ <p>
+如果 Automotive 设备实现包含陀螺仪,则:
+ </p>
+ <ul>
+ <li>[A-1-1] 必须能够以至少 100 Hz 的频率报告事件。
+ </li>
+ </ul>
+ <p>
+ <strong>Android Automotive 专用传感器(第 7.3.11 节)</strong><strong>用电装置(第 7.3.11.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>应将用电装置作为 <code>SENSOR_TYPE_GEAR</code> 来提供。
+ </li>
+ </ul>
+ <p>
+ <strong>日间/夜间模式(第 7.3.11.2 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须支持定义为 <code>SENSOR_TYPE_NIGHT</code> 的日间/夜间模式。
+ </li>
+ <li>[A-0-2] <code>SENSOR_TYPE_NIGHT</code> 标记的值必须与信息中心的日间/夜间模式一致,并且应基于环境光传感器输入。
+ </li>
+ <li>底层环境光传感器可以与<a href="#7_3_7_photometer">光度计</a>使用同一个传感器。
+ </li>
+ </ul>
+ <p>
+ <strong>驾驶状态(第 7.3.11.3 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须支持定义为 <code>SENSOR_TYPE_DRIVING_STATUS</code> 的驾驶状态(当车辆完全处于停止和停泊状态时,默认值为 <code>DRIVE_STATUS_UNRESTRICTED</code>)。设备制造商需负责根据产品要运往的市场的所有适用法律法规配置 <code>SENSOR_TYPE_DRIVING_STATUS</code>。
+ </li>
+ </ul>
+ <p>
+ <strong>车轮转速(第 7.3.11.4 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须提供定义为 <code>SENSOR_TYPE_CAR_SPEED</code> 的车速。
+ </li>
+ </ul>
+ <p>
+ <strong>蓝牙(第 7.4.3 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[A-0-1] 必须支持蓝牙,并且应支持蓝牙 LE。
+ </p>
+ </li>
+ <li>
+ <p>
+[A-0-2] Android Automotive 实现必须支持以下蓝牙配置:
+ </p>
+ <ul>
+ <li>通过免提模式配置 (HFP) 拨打电话。
+ </li>
+ <li>通过音频分发配置 (A2DP) 播放媒体。
+ </li>
+ <li>通过远程控制配置 (AVRCP) 控制媒体播放。
+ </li>
+ <li>使用电话簿访问配置 (PBAP) 分享联系人信息。
+ </li>
+ </ul>
+ </li>
+ <li>应支持消息访问配置 (MAP)。
+ </li>
+ </ul>
+ <p>
+ <strong>最低网络功能(第 7.4.5 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>应支持基于移动网络的数据网络连接。
+ </li>
+ </ul>
+ <p>
+ <strong>最小内存和存储空间(第 7.6.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须有至少 4GB 的非易失性存储空间可用于存储应用隐私数据(该空间也称为“/data”分区)。
+ </li>
+ </ul>
+ <p>
+ <strong>USB 外围设备模式(第 7.7.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>应包含支持外围设备模式的 USB 端口。
+ </li>
+ </ul>
+ <p>
+ <strong>麦克风(第 7.8.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须包含麦克风。
+ </li>
+ </ul>
+ <p>
+ <strong>音频输出(第 7.8.2 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须具有音频输出机制,并声明 <code>android.hardware.audio.output</code>。
+ </li>
+ </ul>
+ <h4 id="2_5_2_multimedia">
+2.5.2. 多媒体
+ </h4>
+ <p>
+ <strong>音频编码(第 5.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现必须支持以下音频编码:
+ </p>
+ <ul>
+ <li>[A-1-1] MPEG-4 AAC Profile (AAC LC)
+ </li>
+ <li>[A-1-2] MPEG-4 HE AAC Profile (AAC+)
+ </li>
+ <li>[A-1-3] AAC ELD(增强型低延迟 AAC)
+ </li>
+ </ul>
+ <p>
+ <strong>视频编码(第 5.2 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现必须支持以下视频编码:
+ </p>
+ <ul>
+ <li>[A-0-1] H.264 AVC
+ </li>
+ <li>[A-0-2] VP8
+ </li>
+ </ul>
+ <p>
+ <strong>视频解码(第 5.3 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现必须支持以下视频解码:
+ </p>
+ <ul>
+ <li>[A-0-1] H.264 AVC
+ </li>
+ <li>[A-0-2] MPEG-4 SP
+ </li>
+ <li>[A-0-3] VP8
+ </li>
+ <li>[A-0-4] VP9
+ </li>
+ </ul>
+ <p>
+强烈建议 Automotive 设备实现支持以下视频解码:
+ </p>
+ <ul>
+ <li>[A-SR] H.265 HEVC
+ </li>
+ </ul>
+ <h4 id="2_5_3_software">
+2.5.3. 软件
+ </h4>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须声明 android.hardware.type.automotive 功能。
+ </li>
+ <li>[A-0-2] 必须支持 uiMode = <a href="http://developer.android.com/reference/android/content/res/Configuration.html#UI_MODE_TYPE_CAR">UI_MODE_TYPE_CAR</a>。
+ </li>
+ <li>[A-0-3] Android Automotive 实现必须支持 <code>android.car.*</code> 命名空间中的所有公共 API。
+ </li>
+ </ul>
+ <p>
+ <strong>WebView 兼容性(第 3.4.1 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须提供 <code>android.webkit.Webview API</code> 的完整实现。
+ </li>
+ </ul>
+ <p>
+ <strong>通知(第 3.8.3 节)</strong>
+ </p>
+ <p>
+Android Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须能够应第三方应用的请求显示使用 <a href="https://developer.android.com/reference/android/app/Notification.CarExtender.html"><code>Notification.CarExtender</code></a> API 的通知。
+ </li>
+ </ul>
+ <p>
+ <strong>搜索(第 3.8.4 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须在设备上实现用于处理<a href="http://developer.android.com/reference/android/content/Intent.html#ACTION_ASSIST">辅助操作</a>的辅助程序。
+ </li>
+ </ul>
+ <p>
+ <strong>媒体界面(第 3.14 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须包含一个界面框架,以支持使用媒体 API(如第 3.14 节中所述)的第三方应用。
+ </li>
+ </ul>
+ <h4 id="2_5_4_performance_and_power">
+2.5.4. 性能和功耗
+ </h4>
+ <p>
+ <strong>节电模式(第 8.3 节)</strong>
+ </p>
+ <p>
+对于 Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须让最终用户能够看到所有无需进入应用待机和低电耗节电模式的应用。
+ </li>
+ <li>[A-0-2] 应用待机和低电耗节电模式的触发、维护、唤醒算法以及对全局系统设置的使用都不得违背 Android 开源项目。
+ </li>
+ </ul>
+ <p>
+ <strong>功耗计算(第 8.4 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须提供一个关于各组件功耗的配置文件,其中要定义每种硬件组件的<a href="http://source.android.com/devices/tech/power/values.html">耗电值</a>,以及组件在一段时间内大概消耗的电量(如 Android 开源项目网站上所述)。
+ </li>
+ <li>[A-0-2] 必须以毫安小时 (mAh) 为单位报告所有功耗值。
+ </li>
+ <li>[A-0-3] 必须按每个进程的 UID 报告 CPU 功耗。Android 开源项目通过 <code>uid_cputime</code> 内核模块实现来满足该要求。
+ </li>
+ <li>如果无法将硬件组件的功耗归于某个应用,则应将其归于硬件组件本身。
+ </li>
+ <li>[A-0-4] 必须能让应用开发者通过 <a href="http://source.android.com/devices/tech/power/batterystats.html"><code>adb shell dumpsys batterystats</code></a> shell 命令查看此功耗。
+ </li>
+ </ul>
+ <h4 id="2_5_5_security_model">
+2.5.5. 安全模型
+ </h4>
+ <p>
+ <strong>多用户支持(第 9.5 节)</strong>
+ </p>
+ <p>
+如果 Automotive 设备实现包含多个用户,则:
+ </p>
+ <ul>
+ <li>[A-1-1] 必须包含一个让用户无需登录即可使用车载系统所有功能的访客帐号。
+ </li>
+ </ul>
+ <p>
+ <strong>Automotive 车载系统隔离(第 9.14 节)</strong>
+ </p>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>[A-0-1] 必须对来自 Android 框架车载子系统的消息进行把关,例如将允许的消息类型和消息来源列入白名单。
+ </li>
+ <li>[A-0-2] 必须监控来自 Android 框架或第三方应用的拒绝服务攻击。这是为了防范恶意软件利用流量对车载网络进行泛洪攻击,此类攻击可能会导致车载子系统无法正常运行。
+ </li>
+ </ul>
+ <h3 id="2_6_tablet_requirements">
+2.6. 针对平板电脑的要求
+ </h3>
+ <p>
+<strong>Android 平板电脑设备</strong>:一种 Android 设备实现,通常是拿在双手中使用,并且外形不是翻盖式。
+ </p>
+ <p>
+满足以下所有条件的 Android 设备实现可归类为平板电脑:
+ </p>
+ <ul>
+ <li>具有能够使设备实现移动性的电源,例如电池。
+ </li>
+ <li>屏幕的物理对角线尺寸介于 7 到 18 英寸之间。
+ </li>
+ </ul>
+ <p>
+平板电脑设备实现需要满足的要求与手持设备实现需要满足的要求类似。对于两者的不同之处,手持设备实现要求的相应章节中已使用 * 指明,本节中也提供了相应备注以供参考。
+ </p>
+ <h4 id="2_6_1_hardware">
+2.6.1. 硬件
+ </h4>
+ <p>
+ <strong>屏幕尺寸(第 7.1.1.1 节)</strong>
+ </p>
+ <p>
+平板电脑设备实现:
+ </p>
+ <ul>
+ <li>[Ta-0-1] 必须具有尺寸介于 7 到 18 英寸之间的屏幕。
+ </li>
+ </ul>
+ <p>
+ <strong>最小内存和存储空间(第 7.6.1 节)</strong>
+ </p>
+ <p>
+针对手持设备的要求中为小屏幕/普通屏幕列出的屏幕密度不适用于平板电脑。
+ </p>
+ <p>
+ <strong>USB 外围设备模式(第 7.7.1 节)</strong>
+ </p>
+ <p>
+如果手持设备实现包含支持外围设备模式的 USB 端口,则:
+ </p>
+ <ul>
+ <li>可以实现 Android Open Accessory (AOA) API。
+ </li>
+ </ul>
+ <p>
+ <strong>虚拟实境模式(第 7.9.1 节)</strong>
+ </p>
+ <p>
+ <strong>虚拟实境高性能(第 7.9.2 节)</strong>
+ </p>
+ <p>
+针对虚拟实境的要求不适用于平板电脑。
+ </p>
+ <h2 id="3_software">
+3. 软件
+ </h2>
+ <h3 id="3_1_managed_api_compatibility">
+3.1. 受管理 API 兼容性
+ </h3>
+ <p>
+受管理 Dalvik 字节码执行环境是 Android 应用所需的主要容器。Android 应用编程接口 (API) 是一组 Android 平台接口,可供在受管理运行时环境中运行的应用使用。
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 设备实现必须提供以下 API 的完整实现(包括所有载述的行为):<a href="http://developer.android.com/reference/packages.html">Android SDK</a> 中载述的所有 API,或上游 Android 源代码中所有带“@SystemApi”标记的 API。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-2] 设备实现必须支持/保留所有标有 TestApi 注记 (@TestApi) 的类、方法和关联的元素。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-3] 除非本兼容性定义中明确许可,否则设备实现不得省略任何受管理 API,不得更改 API 接口或签名,不得违背载述的行为,也不得包含空操作。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-4] 设备实现必须仍保留 API 并使其采取合理的行为方式,即使 Android 包含的 API 所对应的某些硬件功能被省略也是如此。如需了解针对这种情况的具体要求,请参阅<a href="#7_hardware_compatibility">第 7 节</a>。
+ </p>
+ </li>
+ </ul>
+ <h3 id="3_1_1_android_extensions">
+3.1.1. Android 扩展
+ </h3>
+ <p>
+Android 支持在使 API 级别版本保持不变的情况下扩展受管理 API。
+ </p>
+ <ul>
+ <li>[C-0-1] Android 设备实现必须预加载 <code>ExtShared</code> 共享库和 <code>ExtServices</code> 服务(版本不低于每个 API 级别所允许的最低版本)的 AOSP 实现。例如,运行 API 24 级的 Android 7.0 设备实现包含的版本必须至少为 1。
+ </li>
+ </ul>
+ <h3 id="3_2_soft_api_compatibility">
+3.2. 软 API 兼容性
+ </h3>
+ <p>
+除了<a href="#3_1_managed_api_compatibility">第 3.1 节</a>中的受管理 API 之外,Android 还包含一个非常重要的运行时专用“软”API,该 API 采用 Intent、权限,以及 Android 应用的类似方面(它们在应用编译期间无法被强制执行)等形式。
+ </p>
+ <h4 id="3_2_1_permissions">
+3.2.1. 权限
+ </h4>
+ <ul>
+ <li>[C-0-1] 设备实现必须支持并强制执行所有权限常量(如<a href="http://developer.android.com/reference/android/Manifest.permission.html">“权限”参考页面</a>中所述)。请注意,<a href="#9_security_model_compatibility">第 9 节</a>中列出了与 Android 安全模型相关的附加要求。
+ </li>
+ </ul>
+ <h4 id="3_2_2_build_parameters">
+3.2.2. 版本号参数
+ </h4>
+ <p>
+Android API 在 <a href="http://developer.android.com/reference/android/os/Build.html">android.os.Build 类</a>中包含一些旨在描述当前设备的常量。
+ </p>
+ <ul>
+ <li>[C-0-1] 为了在各种设备实现之间提供一致且有意义的值,下表中列出了针对这些值的格式的一些其他限制,设备实现必须遵从这些限制。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th>
+参数
+ </th>
+ <th>
+详细说明
+ </th>
+ </tr>
+ <tr>
+ <td>
+VERSION.RELEASE
+ </td>
+ <td>
+当前正在执行的 Android 系统的版本,采用人类可读懂的格式。该字段的值必须是 <a href="http://source.android.com/compatibility/8.0/versions.html">8.0</a> 中定义的字符串值之一。
+ </td>
+ </tr>
+ <tr>
+ <td>
+VERSION.SDK
+ </td>
+ <td>
+当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 8.0,该字段必须为整数值 8.0_INT。
+ </td>
+ </tr>
+ <tr>
+ <td>
+VERSION.SDK_INT
+ </td>
+ <td>
+当前正在执行的 Android 系统的版本,采用第三方应用代码可访问的格式。对于 Android 8.0,该字段必须为整数值 8.0_INT。
+ </td>
+ </tr>
+ <tr>
+ <td>
+VERSION.INCREMENTAL
+ </td>
+ <td>
+由设备实现者选择的值,用于指定当前正在执行的 Android 系统的具体细分版本,采用人类可读懂的格式。该值不得重复用于提供给最终用户的不同细分版本。该字段的一个典型用途是,指示用于生成版本的版本号或源代码控制更改标识符。该字段不得为 null,也不得为空字符串 (""),除此之外,对该字段的具体格式没有任何其他要求。
+ </td>
+ </tr>
+ <tr>
+ <td>
+BOARD
+ </td>
+ <td>
+由设备实现者选择的值,用于标识设备所使用的具体内部硬件,采用人类可读懂的格式。该字段的一个可能用途是指明设备主板的具体修订版本。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9_-]+$”匹配。
+ </td>
+ </tr>
+ <tr>
+ <td>
+BRAND
+ </td>
+ <td>
+该值用于指明与设备关联的品牌名称,即最终用户所熟知的设备品牌名称。必须采用人类可读懂的格式,并且应表示设备的制造商或设备在营销时所冠的公司品牌。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9_-]+$”匹配。
+ </td>
+ </tr>
+ <tr>
+ <td>
+SUPPORTED_ABIS
+ </td>
+ <td>
+本机代码指令集的名称(CPU 类型 + ABI 惯例)。请参阅<a href="#3_3_native_api_compatibility">第 3.3 节:本机 API 兼容性</a>。
+ </td>
+ </tr>
+ <tr>
+ <td>
+SUPPORTED_32_BIT_ABIS
+ </td>
+ <td>
+本机代码指令集的名称(CPU 类型 + ABI 惯例)。请参阅<a href="#3_3_native_api_compatibility">第 3.3 节:本机 API 兼容性</a>。
+ </td>
+ </tr>
+ <tr>
+ <td>
+SUPPORTED_64_BIT_ABIS
+ </td>
+ <td>
+本机代码第二个指令集的名称(CPU 类型 + ABI 惯例)。请参阅<a href="#3_3_native_api_compatibility">第 3.3 节:本机 API 兼容性</a>。
+ </td>
+ </tr>
+ <tr>
+ <td>
+CPU_ABI
+ </td>
+ <td>
+本机代码指令集的名称(CPU 类型 + ABI 惯例)。请参阅<a href="#3_3_native_api_compatibility">第 3.3. 节:本机 API 兼容性</a>。
+ </td>
+ </tr>
+ <tr>
+ <td>
+CPU_ABI2
+ </td>
+ <td>
+本机代码第二个指令集的名称(CPU 类型 + ABI 惯例)。请参阅<a href="#3_3_native_api_compatibility">第 3.3 节:本机 API 兼容性</a>。
+ </td>
+ </tr>
+ <tr>
+ <td>
+DEVICE
+ </td>
+ <td>
+由设备实现者选择的值,其中包含开发者名称或代码名称,用于标识设备的硬件功能和工业设计配置。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9_-]+$”匹配。该设备名称在产品的生命周期内不得更改。
+ </td>
+ </tr>
+ <tr>
+ <td>
+FINGERPRINT
+ </td>
+ <td>
+该字符串用于唯一标识相应细分版本,应采用人类可读懂的格式,且必须遵从以下模板:
+ <p class="small">
+ $(BRAND)/$(PRODUCT)/<br />
+     $(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS)
+ </p>
+ <p>
+例如:
+ </p>
+ <p class="small">
+ acme/myproduct/<br />
+     mydevice:8.0/LMYXX/3359:userdebug/test-keys
+ </p>
+ <p>
+该指纹不得包含空格。如果上述模板中包含的其他字段内有空格,则在细分版本指纹中必须将其替换为其他字符(例如下划线 ("_") 字符)。该字段的值必须可编码为 7 位的 ASCII 值。
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td>
+HARDWARE
+ </td>
+ <td>
+硬件的名称(来自内核命令行或 /proc),应采用人类可读懂的格式。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9_-]+$”匹配。
+ </td>
+ </tr>
+ <tr>
+ <td>
+HOST
+ </td>
+ <td>
+该字符串用于唯一标识编译相应细分版本时所用的主机,采用人类可读懂的格式。该字段不得为 null,也不得为空字符串 (""),除此之外,对该字段的具体格式没有任何其他要求。
+ </td>
+ </tr>
+ <tr>
+ <td>
+ID
+ </td>
+ <td>
+由设备实现者选择的标识符,用于指特定版本,采用人类可读懂的格式。该字段可与 android.os.Build.VERSION.INCREMENTAL 相同,但应是对最终用户来说有充分意义的值,以便他们区分各软件细分版本。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9._-]+$”匹配。
+ </td>
+ </tr>
+ <tr>
+ <td>
+MANUFACTURER
+ </td>
+ <td>
+产品的原始设备制造商 (OEM) 的商号。该字段不得为 null,也不得为空字符串 (""),除此之外,对该字段的具体格式没有任何其他要求。该字段在产品的生命周期内不得更改。
+ </td>
+ </tr>
+ <tr>
+ <td>
+MODEL
+ </td>
+ <td>
+由设备实现者选择的值,其中包含最终用户所熟知的设备名称。该值应与设备在营销时以及出售给最终用户时所使用的名称相同。该字段不得为 null,也不得为空字符串 (""),除此之外,对该字段的具体格式没有任何其他要求。该字段在产品的生命周期内不得更改。
+ </td>
+ </tr>
+ <tr>
+ <td>
+PRODUCT
+ </td>
+ <td>
+由设备实现者选择的值,其中包含具体产品 (SKU) 的开发名称或代码名称,在同一品牌中必须是独一无二的。必须采用人类可读懂的格式,但不一定可供最终用户查看。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9_-]+$”匹配。该产品名称在产品的生命周期内不得更改。
+ </td>
+ </tr>
+ <tr>
+ <td>
+SERIAL
+ </td>
+ <td>
+硬件序列号;如果有多款 MODEL 和 MANUFACTURER 相同的设备,则必须为其提供硬件序列号,并且提供的硬件序列号在这些设备中必须是独一无二的。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^([a-zA-Z0-9]{6,20})$”匹配。
+ </td>
+ </tr>
+ <tr>
+ <td>
+TAGS
+ </td>
+ <td>
+由设备实现者选择的一系列标记(用于进一步区分细分版本),各个标记之间以英文逗号分隔。该字段的值必须是与以下三种典型 Android 平台签名配置对应的值之一:release-keys、dev-keys、test-keys。
+ </td>
+ </tr>
+ <tr>
+ <td>
+TIME
+ </td>
+ <td>
+该值用于表示进行编译时的时间戳。
+ </td>
+ </tr>
+ <tr>
+ <td>
+TYPE
+ </td>
+ <td>
+由设备实现者选择的值,用于指定相应细分版本的运行时配置。该字段的值必须是与以下三种典型 Android 运行时配置对应的值之一:user、userdebug 或 eng。
+ </td>
+ </tr>
+ <tr>
+ <td>
+USER
+ </td>
+ <td>
+生成相应细分版本的用户(或自动用户)的名称或 ID。该字段不得为 null,也不得为空字符串 (""),除此之外,对该字段的具体格式没有任何其他要求。
+ </td>
+ </tr>
+ <tr>
+ <td>
+SECURITY_PATCH
+ </td>
+ <td>
+该值用于指明相应细分版本的安全补丁程序级别。它必须表明相应细分版本在任何方面都不容易受到指定的 Android 公共安全公告中所述的任何问题的影响。它必须采用 [YYYY-MM-DD] 格式,并且与 <a href="source.android.com/security/bulletin">Android 公共安全公告</a>或 <a href="http://source.android.com/security/advisory">Android 安全建议</a>中载述的已定义字符串匹配,例如“2015-11-01”。
+ </td>
+ </tr>
+ <tr>
+ <td>
+BASE_OS
+ </td>
+ <td>
+该值表示以下细分版本的 FINGERPRINT 参数:除了 Android 公共安全公告中提供的补丁程序以外,与相应细分版本完全相同的细分版本。它必须报告正确的值,如果这样的细分版本不存在,则报告一个空字符串 ("")。
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="https://developer.android.com/reference/android/os/Build.html#BOOTLOADER">BOOTLOADER</a>
+ </td>
+ <td>
+由设备实现者选择的值,用于标识设备所使用的具体内部引导加载程序,采用人类可读懂的格式。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9._-]+$”匹配。
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="https://developer.android.com/reference/android/os/Build.html#getRadioVersion()">getRadioVersion()</a>
+ </td>
+ <td>
+必须是或必须返回由设备实现者选择的值,该值用于标识设备所使用的具体内部无线装置/调制解调器版本,采用人类可读懂的格式。如果设备没有任何内部无线装置/调制解调器,则该方法必须返回 NULL。该字段的值必须可编码为 7 位的 ASCII 值,并且与正则表达式“^[a-zA-Z0-9._-,]+$”匹配。
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="3_2_3_intent_compatibility">
+3.2.3. Intent 兼容性
+ </h4>
+ <h5 id="3_2_3_1_core_application_intents">
+3.2.3.1. 核心应用 Intent
+ </h5>
+ <p>
+通过 Android Intent,应用组件可以请求其他 Android 组件的功能。Android 上游项目包含一系列被视为核心 Android 应用的应用,这些应用可实现多种 Intent 模式来执行常见操作。
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 对于 AOSP 中的以下核心 Android 应用定义的所有公共 Intent 过滤器模式,设备实现都必须包含这些应用、服务组件或至少一个处理程序:
+ </p>
+ <ul>
+ <li>桌面时钟
+ </li>
+ <li>浏览器
+ </li>
+ <li>日历
+ </li>
+ <li>通讯录
+ </li>
+ <li>图库
+ </li>
+ <li>GlobalSearch
+ </li>
+ <li>启动器
+ </li>
+ <li>音乐
+ </li>
+ <li>设置
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h5 id="3_2_3_2_intent_resolution">
+3.2.3.2. Intent 解决方案
+ </h5>
+ <ul>
+ <li>[C-0-1] 由于 Android 是一个可扩展的平台,因此设备实现必须允许使用第三方应用替换<a href="#3_2_3_1_core_application_intents">第 3.2.3.1 节</a>中提到的每种 Intent 模式。上游 Android 开放源代码实现默认允许这么做。
+ </li>
+ <li>
+ <p>
+[C-0-2] 设备实现者不得为系统应用使用这些 Intent 模式的情况附加特殊权限,也不得阻止第三方应用绑定到这些模式以及取得对这些模式的控制权。具体来说,此项规定包括但不限于停用“选择器”界面(用户可通过该界面在多个均可处理相同 Intent 模式的应用之间进行选择)。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-3] 设备实现必须提供一个界面来供用户修改 Intent 的默认 Activity。
+ </p>
+ </li>
+ <li>
+ <p>
+不过,当默认 Activity 为数据 URI 提供更具体的属性时,设备实现可以为特定 URI 模式(例如 http://play.google.com)提供默认 Activity。例如,与针对“http://”的浏览器核心 Intent 模式相比,指定数据 URI“http://www.android.com”的 Intent 过滤器模式更为具体。
+ </p>
+ </li>
+ </ul>
+ <p>
+Android 还包含可让第三方应用为某些类型的网页 URI Intent 声明权威性默认<a href="https://developer.android.com/training/app-links">应用链接行为</a>的机制。如果此类权威声明是在某个应用的 Intent 过滤器模式中定义的,则设备实现:
+ </p>
+ <ul>
+ <li>[C-0-4] 必须尝试执行<a href="https://developers.google.com/digital-asset-links">数字资产链接规范</a>(由上游 Android 开源项目中的软件包管理器实现)中定义的验证步骤,来验证所有 Intent 过滤器。
+ </li>
+ <li>[C-0-5] 必须在应用安装期间尝试验证 Intent 过滤器,并将所有成功通过验证的 URI Intent 过滤器设为其 URI 的默认应用处理程序。
+ </li>
+ <li>可以将特定 URI Intent 过滤器设为其 URI 的默认应用处理程序,但前提是这些过滤器成功通过验证,而其他候选 URI 过滤器则未通过验证。如果设备实现进行了此项设置,则必须在设置菜单中按 URI 向用户提供适当的替代模式。
+ </li>
+ <li>必须在“设置”中按应用向用户提供应用链接控制,如下所述:
+ <ul>
+ <li>[C-0-6] 用户必须能够整体替换默认应用链接行为,以便应用始终开启、始终询问或永不开启,这必须同样适用于所有候选 URI Intent 过滤器。
+ </li>
+ <li>[C-0-7] 用户必须能够查看候选 URI Intent 过滤器列表。
+ </li>
+ <li>设备实现可以按 Intent 过滤器提供相应的功能,使用户能够替换成功通过验证的特定候选 URI Intent 过滤器。
+ </li>
+ <li>[C-0-8] 如果设备实现允许只有部分(而非全部)候选 URI Intent 过滤器成功通过验证,则设备实现必须使用户能够查看和替换特定候选 URI Intent 过滤器。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h5 id="3_2_3_3_intent_namespaces">
+3.2.3.3. Intent 命名空间
+ </h5>
+ <ul>
+ <li>[C-0-1] 设备实现不得包含任何符合以下条件的 Android 组件:遵从任何使用 ACTION、CATEGORY 或使用 android. 或 com.android. 命名空间中其他键字符串的新 Intent 模式或广播 Intent 模式。<em></em>
+ </li>
+ <li>[C-0-2] 设备实现者不得添加任何符合以下条件的 Android 组件:遵从任何使用 ACTION、CATEGORY 或使用属于其他组织的软件包空间中其他键字符串的新 Intent 模式或广播 Intent 模式。
+ </li>
+ <li>[C-0-3] 设备实现者不得更改或扩展<a href="#3_2_3_1_core_application_intents">第 3.2.3.1 节</a>中列出的核心应用使用的任何 Intent 模式。
+ </li>
+ <li>设备实现可以包含所用命名空间明显与其所属组织关联的 Intent 模式。此项规定类似于<a href="#3_6_api_namespaces">第 3.6 节</a>中针对 Java 语言类的规定。
+ </li>
+ </ul>
+ <h5 id="3_2_3_4_broadcast_intents">
+3.2.3.4. 广播 Intent
+ </h5>
+ <p>
+第三方应用依赖平台广播某些 Intent 来获悉硬件或软件环境中发生的变化。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须能够因应适当的系统事件广播公共广播 Intent,如 SDK 文档中所述。请注意,该要求与第 3.5 节并不冲突,因为针对后台应用的限制在 SDK 文档中也有相应说明。
+ </li>
+ </ul>
+ <h5 id="3_2_3_5_default_app_settings">
+3.2.3.5. 默认应用设置
+ </h5>
+ <p>
+Android 包含可让用户轻松选择默认应用(例如选择默认的主屏幕应用或短信应用)的设置。
+ </p>
+ <p>
+在适当的情况下,设备实现必须提供类似的设置菜单,并与 SDK 文档中所述的 Intent 过滤器模式和 API 方法兼容(详见下文)。
+ </p>
+ <p>
+如果设备实现报告 <code>android.software.home_screen</code>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须能够遵从 <a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_HOME_SETTINGS">android.settings.HOME_SETTINGS</a> Intent 显示主屏幕的默认应用设置菜单。
+ </li>
+ </ul>
+ <p>
+如果设备实现报告 <code>android.hardware.telephony</code>,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须提供一个设置菜单,并且该菜单将调用 <a href="http://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html">android.provider.Telephony.ACTION_CHANGE_DEFAULT</a> Intent,以显示用于更改默认短信应用的对话框。
+ </li>
+ </ul>
+ <p>
+如果设备实现报告 <code>android.hardware.nfc.hce</code>,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须能够遵从 <a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_NFC_PAYMENT_SETTINGS">android.settings.NFC_PAYMENT_SETTINGS</a> Intent 显示触碰付款的默认应用设置菜单。
+ </li>
+ </ul>
+ <p>
+如果设备实现报告 <code>android.hardware.telephony</code>,则:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须能够遵从 <a href="https://developer.android.com/reference/android/telecom/TelecomManager.html#ACTION_CHANGE_DEFAULT_DIALER">android.telecom.action.CHANGE_DEFAULT_DIALER</a> Intent 显示可让用户更改默认电话应用的对话框。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 VoiceInteractionService,则:
+ </p>
+ <ul>
+ <li>[C-5-1] 必须能够遵从 <a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_VOICE_INPUT_SETTINGS">android.settings.ACTION_VOICE_INPUT_SETTINGS</a> Intent 显示语音输入和语音助理的默认应用设置菜单。
+ </li>
+ </ul>
+ <h4 id="3_2_4_activities_on_secondary_displays">
+3.2.4. 辅助显示设备上的 Activity
+ </h4>
+ <p>
+如果设备实现允许在辅助显示设备上启动常规 <a href="https://developer.android.com/reference/android/app/Activity.html">Android Activity</a>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须设置 <code>android.software.activities_on_secondary_displays</code> 功能标记。
+ </li>
+ <li>[C-1-2] 必须保证 API 兼容性与在主要显示设备上运行的 Activity 的 API 兼容性类似。
+ </li>
+ <li>[C-1-3] 如果某个 Activity 在启动新的 Activity 时没有通过 <a href="https://developer.android.com/reference/android/app/ActivityOptions.html#setLaunchDisplayId%28int%29"><code>ActivityOptions.setLaunchDisplayId()</code></a> API 指定目标显示设备,则必须在前者所在的显示设备上启动后者。
+ </li>
+ <li>[C-1-4] 当带有 <a href="http://developer.android.com/reference/android/view/Display.html#FLAG_PRIVATE"><code>Display.FLAG_PRIVATE</code></a> 标记的显示设备被取除后,必须销毁所有 Activity。
+ </li>
+ <li>[C-1-5] 如果显示区域的大小发生变化,则必须相应地调整 <a href="https://developer.android.com/reference/android/hardware/display/VirtualDisplay.html"><code>VirtualDisplay</code></a> 上所有 Activity 的大小。
+ </li>
+ <li>当文字输入字段成为辅助显示设备上的焦点时,可以在主要显示设备上显示 IME(输入法编辑器,可让用户输入文字的一种用户控件)。
+ </li>
+ <li>如果支持触摸输入或按键输入,则应在独立于主要显示设备的辅助显示设备上实现输入焦点。
+ </li>
+ <li>如果 Activity 是在辅助显示设备上启动的,则应具有与该显示设备对应的 <a href="https://developer.android.com/reference/android/content/res/Configuration.html"><code>android.content.res.Configuration</code></a>,以便能够显示内容、正确操作以及保持兼容性。
+ </li>
+ </ul>
+ <p>
+如果设备实现允许在辅助显示设备上启动常规 <a href="https://developer.android.com/reference/android/app/Activity.html">Android Activity</a>,并且主要显示设备和辅助显示设备具有不同的 <a href="https://developer.android.com/reference/android/util/DisplayMetrics.html">android.util.DisplayMetrics</a>,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 不得允许在辅助显示设备上启动大小不可调整的 Activity(<code>AndroidManifest.xml</code> 中有 <code>resizeableActivity=false</code>)以及采用 API 23 级或更低级别的应用。
+ </li>
+ </ul>
+ <p>
+如果设备实现允许在辅助显示设备上启动常规 <a href="https://developer.android.com/reference/android/app/Activity.html">Android Activity</a>,并且辅助显示设备具有 <a href="https://developer.android.com/reference/android/view/Display.html#FLAG_PRIVATE">android.view.Display.FLAG_PRIVATE</a> 标记,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 只有该显示设备的所有者、系统以及已经存在于该显示设备上的 Activity 能够在该显示设备上启动 Activity。每个人都可以在具有 <a href="https://developer.android.com/reference/android/view/Display.html#FLAG_PUBLIC">android.view.Display.FLAG_PUBLIC</a> 标记的显示设备上启动 Activity。
+ </li>
+ </ul>
+ <h3 id="3_3_native_api_compatibility">
+3.3. 本机 API 兼容性
+ </h3>
+ <p>
+设备实现者:
+ </p>
+ <p>
+实现本机代码兼容性是一件高难度的事情。因此,对于设备实现者:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议使用上游 Android 开源项目中的下列库的实现。
+ </li>
+ </ul>
+ <h4 id="3_3_1_application_binary_interfaces">
+3.3.1. 应用二进制接口
+ </h4>
+ <p>
+受管理 Dalvik 字节码可以调用应用 <code>.apk</code> 文件中提供的本机代码,以便作为针对相应设备硬件架构编译的 ELF <code>.so</code> 文件。由于本机代码高度依赖底层处理器技术,因此 Android 在 Android NDK 中定义了一些应用二进制接口 (ABI)。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须与一个或多个已定义的 ABI 兼容,并与 Android NDK 兼容。
+ </li>
+ <li>[C-0-2] 必须支持在受管理环境中运行的代码使用标准 Java 本机接口 (JNI) 语义调用本机代码。
+ </li>
+ <li>[C-0-3] 必须与下方列表中每个必需的库保持源代码兼容(即标头兼容)和二进制兼容(适用于 ABI)。
+ </li>
+ <li>[C-0-4] 如果支持任何 64 位 ABI,则必须支持对应的 32 位 ABI。
+ </li>
+ <li>[C-0-5] 必须通过 <code>android.os.Build.SUPPORTED_ABIS</code>、<code>android.os.Build.SUPPORTED_32_BIT_ABIS</code> 和 <code>android.os.Build.SUPPORTED_64_BIT_ABIS</code> 参数准确报告设备支持的本机应用二进制接口 (ABI),其中每个参数报告的都是一个以英文逗号分隔的 ABI 列表,列表中的条目按偏好程度从高到低排序。
+ </li>
+ <li>[C-0-6] 必须(通过上述参数)仅报告最新版 <a href="https://developer.android.com/ndk/guides/abis.html">Android NDK ABI 管理文档</a>中载述的那些 ABI,并支持<a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388f/Beijfcja.html">高级 SIMD</a>(也称为 NEON)扩展。
+ </li>
+ <li>
+ <p>
+[C-0-7] 必须使以下所有提供本机 API 的库可供包含本机代码的应用使用:
+ </p>
+ <ul>
+ <li>libaaudio.so(AAudio 本机音频支持)
+ </li>
+ <li>libandroid.so(本机 Android Activity 支持)
+ </li>
+ <li>libc(C 库)
+ </li>
+ <li>libcamera2ndk.so
+ </li>
+ <li>libdl(动态链接器)
+ </li>
+ <li>libEGL.so(本机 OpenGL 表面管理)
+ </li>
+ <li>libGLESv1_CM.so (OpenGL ES 1.x)
+ </li>
+ <li>libGLESv2.so (OpenGL ES 2.0)
+ </li>
+ <li>libGLESv3.so (OpenGL ES 3.x)
+ </li>
+ <li>libicui18n.so
+ </li>
+ <li>libicuuc.so
+ </li>
+ <li>libjnigraphics.so
+ </li>
+ <li>liblog(Android 日志记录)
+ </li>
+ <li>libmediandk.so(本机媒体 API 支持)
+ </li>
+ <li>libm(数学库)
+ </li>
+ <li>libOpenMAXAL.s(OpenMAX AL 1.0.1 支持)
+ </li>
+ <li>libOpenSLES.so(OpenSL ES 1.0.1 音频支持)
+ </li>
+ <li>libRS.so
+ </li>
+ <li>libstdc++(至少必须支持 C++ 中的这个库)
+ </li>
+ <li>libvulkan.so (Vulkan)
+ </li>
+ <li>libz(Zlib 压缩)
+ </li>
+ <li>JNI 接口
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[C-0-8] 不得添加或移除上述本机库的公共函数。
+ </p>
+ </li>
+ <li>[C-0-9] 必须在 <code>/vendor/etc/public.libraries.txt</code> 中列出直接提供给第三方应用使用的其他非 AOSP 库。
+ </li>
+ <li>[C-0-10] 在 AOSP 中作为系统库实现和提供的任何其他本机库均为保留库,不得将其提供给采用 API 24 级或更高级别的第三方应用使用。
+ </li>
+ <li>[C-0-11] 必须通过 <code>libGLESv3.so</code> 库导出所有 OpenGL ES 3.1 和 <a href="http://developer.android.com/guide/topics/graphics/opengl.html#aep">Android Extension Pack</a> 函数符号(如 NDK 中定义)。请注意,所有这些符号都必须存在。第 7.1.4.1 节中更详细地介绍了关于何时需要完整实现每个对应函数方面的要求。
+ </li>
+ <li>[C-0-12] 必须通过 <code>libvulkan.so</code> 库导出核心 Vulkan 1.0 函数的函数符号以及 <code>VK_KHR_surface</code>、<code>VK_KHR_android_surface</code>、<code>VK_KHR_swapchain</code>、<code>VK_KHR_maintenance1</code> 和 <code>VK_KHR_get_physical_device_properties2</code> 扩展。请注意,所有这些符号都必须存在。第 7.1.4.2 节中更详细地介绍了关于何时需要完整实现每个对应函数方面的要求。
+ </li>
+ <li>应使用上游 Android 开源项目中的源代码和标头文件进行编译。
+ </li>
+ </ul>
+ <p>
+请注意,未来版本的 Android NDK 可能会支持更多 ABI。
+ </p>
+ <h4 id="3_3_2_32-bit_arm_native_code_compatibility">
+3.3.2. 32 位 ARM 本机代码兼容性
+ </h4>
+ <p>
+如果设备实现是 64 位 ARM 设备,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 尽管 ARMv8 架构弃用了多项 CPU 操作(包括现有本机代码中使用的一些操作),但以下已弃用的操作必须仍可供 32 位本机 ARM 代码使用(通过本机 CPU 支持或软件模拟):
+ </p>
+ <ul>
+ <li>SWP 和 SWPB 指令
+ </li>
+ <li>SETEND 指令
+ </li>
+ <li>CP15ISB、CP15DSB 和 CP15DMB 屏障操作
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 32 位 ARM ABI,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-2-1] 当 32 位 ARM 应用读取 <code>/proc/cpuinfo</code> 时,设备实现必须在其中添加以下行,以确保与使用旧版 Android NDK 编译的应用兼容。
+ </p>
+ <ul>
+ <li>
+ <code>Features:</code>,后跟设备支持的所有可选 ARMv7 CPU 功能的列表。
+ </li>
+ <li>
+ <code>CPU architecture:</code>,后跟一个整数,该整数用于说明设备支持的最高 ARM 架构(例如对于 ARMv8 设备,该整数为“8”)。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+当 64 位 ARM 应用或非 ARM 应用读取 <code>/proc/cpuinfo</code> 时,设备实现不应对其进行更改。
+ </p>
+ </li>
+ </ul>
+ <h3 id="3_4_web_compatibility">
+3.4. 网页兼容性
+ </h3>
+ <h4 id="3_4_1_webview_compatibility">
+3.4.1. WebView 兼容性
+ </h4>
+ <p>
+如果设备实现提供 <code>android.webkit.Webview</code> API 的完整实现,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告 <code>android.software.webview</code>。
+ </li>
+ <li>[C-1-2] 必须使用 Android 8.0 分支上的上游 Android 开源项目中的 <a href="http://www.chromium.org/">Chromium</a> 项目细分版本来实现 <a href="http://developer.android.com/reference/android/webkit/WebView.html"><code>android.webkit.WebView</code></a> API。
+ </li>
+ <li>
+ <p>
+[C-1-3] WebView 报告的用户代理字符串必须采用以下格式:
+ </p>
+ <p>
+Mozilla/5.0 (Linux; Android $(VERSION); $(MODEL) Build/$(BUILD); wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 $(CHROMIUM_VER) Mobile Safari/537.36
+ </p>
+ <ul>
+ <li>$(VERSION) 字符串的值必须与 android.os.Build.VERSION.RELEASE 的值相同。
+ </li>
+ <li>$(MODEL) 字符串的值必须与 android.os.Build.MODEL 的值相同。
+ </li>
+ <li>$(BUILD) 字符串的值必须与 android.os.Build.ID 的值相同。
+ </li>
+ <li>$(CHROMIUM_VER) 字符串的值必须是上游 Android 开源项目中的 Chromium 的版本。
+ </li>
+ <li>设备实现可以在用户代理字符串中省略 Mobile。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+WebView 组件应支持尽可能多的 HTML5 功能;如果它支持此类功能,则应符合 <a href="http://html.spec.whatwg.org/multipage/">HTML5 规范</a>。
+ </p>
+ </li>
+ </ul>
+ <h4 id="3_4_2_browser_compatibility">
+3.4.2. 浏览器兼容性
+ </h4>
+ <p>
+如果设备实现包含独立的浏览器应用,以供用户进行一般的网页浏览,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持以下与 HTML5 相关联的每个 API:
+ <ul>
+ <li>
+ <a href="http://www.w3.org/html/wg/drafts/html/master/browsers.html#offline">应用缓存/离线操作</a>
+ </li>
+ <li>
+ <a href="http://www.w3.org/html/wg/drafts/html/master/semantics.html#video">&lt;video&gt; 标记</a>
+ </li>
+ <li>
+ <a href="http://www.w3.org/TR/geolocation-API/">geolocation</a>
+ </li>
+ </ul>
+ </li>
+ <li>[C-1-2] 必须支持 HTML5/W3C <a href="http://www.w3.org/TR/webstorage/">webstorage API</a>,并且应支持 HTML5/W3C <a href="http://www.w3.org/TR/IndexedDB/">IndexedDB API</a>。请注意,随着网页开发标准制定机构逐渐转变为青睐 IndexedDB 胜过 webstorage,IndexedDB 预计在未来版本的 Android 中会成为必需的组件。
+ </li>
+ <li>可以在独立的浏览器应用中附带自定义用户代理字符串。
+ </li>
+ <li>应在独立的浏览器应用(无论是基于上游 WebKit 浏览器应用,还是基于第三方替代应用)中支持尽可能多的 <a href="http://html.spec.whatwg.org/multipage/">HTML5</a> 功能。
+ </li>
+ </ul>
+ <p>
+不过,如果设备实现不包含独立的浏览器应用,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须仍支持<a href="#3_2_3_1_core_application_intents">第 3.2.3.1 节</a>中所述的公共 Intent 模式。
+ </li>
+ </ul>
+ <h3 id="3_5_api_behavioral_compatibility">
+3.5. API 行为兼容性
+ </h3>
+ <p>
+每种 API 类型(受管理 API、软 API、本机 API 和网页 API)的行为都必须与上游 <a href="http://source.android.com/">Android 开源项目</a>的首选实现一致。兼容性的一些具体方面如下:
+ </p>
+ <ul>
+ <li>[C-0-1] 设备不得更改标准 Intent 的行为或语义。
+ </li>
+ <li>[C-0-2] 设备不得更改特定类型的系统组件(例如 Service、Activity、ContentProvider 等)的生命周期或生命周期语义。
+ </li>
+ <li>[C-0-3] 设备不得更改标准权限的语义。
+ </li>
+ <li>设备不得更改对后台应用实施的限制。更具体地说就是,对于后台应用:
+ <ul>
+ <li>[C-0-4] 设备必须停止执行应用为接收 <a href="https://developer.android.com/reference/android/location/GnssMeasurement.html"><code>GnssMeasurement</code></a> 和 <a href="https://developer.android.com/reference/android/location/GnssNavigationMessage.html"><code>GnssNavigationMessage</code></a> 的输出而注册的回调。
+ </li>
+ <li>[C-0-5] 设备必须通过 <a href="https://developer.android.com/reference/android/location/LocationManager.html"><code>LocationManager</code></a> API 类或 <a href="https://developer.android.com/reference/android/net/wifi/WifiManager.html#startScan%28%29"><code>WifiManager.startScan()</code></a> 方法限制为应用提供更新的频率。
+ </li>
+ <li>[C-0-6] 如果应用采用 API 25 级或更高级别,则设备不得允许注册广播接收器来接收应用清单中标准 Android Intent 的隐式广播,除非广播 Intent 要求 <code>"signature"</code> 或 <code>"signatureOrSystem"</code> <a href="https://developer.android.com/guide/topics/manifest/permission-element.html#plevel"><code>protectionLevel</code></a> 权限,或位于<a href="https://developer.android.com/preview/features/background-broadcasts.html">豁免列表</a>中。
+ </li>
+ <li>[C-0-7] 如果应用采用 API 25 级或更高级别,则设备必须停止应用的后台服务,就像应用已调用这些服务的 <a href="https://developer.android.com/reference/android/app/Service.html#stopSelf%28%29"><code>stopSelf()</code></a> 方法一样,除非应用被列入临时白名单中,以便处理某项用户可见的任务。
+ </li>
+ <li>[C-0-8] 如果应用采用 API 25 级或更高级别,则设备必须解除应用的唤醒锁定。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+上述列表并不是详尽无遗的。兼容性测试套件 (CTS) 会对平台的重要部分进行行为兼容性测试,但不会对所有部分进行测试。实现者需负责确保与 Android 开源项目保持行为兼容。为此,设备实现者应尽可能使用通过 Android 开源项目获得的源代码,而不是重新实现系统的重要部分。
+ </p>
+ <h3 id="3_6_api_namespaces">
+3.6. API 命名空间
+ </h3>
+ <p>
+Android 遵循 Java 编程语言定义的软件包和类命名空间惯例。为了确保与第三方应用兼容,设备实现者不得对以下软件包命名空间进行任何禁止的修改(见下文):
+ </p>
+ <ul>
+ <li>
+ <code>java.*</code>
+ </li>
+ <li>
+ <code>javax.*</code>
+ </li>
+ <li>
+ <code>sun.*</code>
+ </li>
+ <li>
+ <code>android.*</code>
+ </li>
+ <li>
+ <code>com.android.*</code>
+ </li>
+ </ul>
+ <p>
+也就是说,他们:
+ </p>
+ <ul>
+ <li>[C-0-1] 不得通过更改任何方法或类签名或者通过移除类或类字段来修改 Android 平台上的已公开 API。
+ </li>
+ <li>[C-0-2] 不得向上述命名空间中的 API 添加任何已公开元素(例如类或接口,或现有类或接口的字段或方法)、测试 API 或系统 API。“已公开元素”是指在上游 Android 源代码中使用时不带“@hide”标记的任何构造。
+ </li>
+ </ul>
+ <p>
+设备实现者可以修改 API 的底层实现,但此类修改:
+ </p>
+ <ul>
+ <li>[C-0-3] 不得影响任何已公开 API 的既定行为和 Java 语言签名。
+ </li>
+ <li>[C-0-4] 不得向开发者通告或以其他方式向开发者公开这些修改。
+ </li>
+ </ul>
+ <p>
+不过,设备实现者可以在标准 Android 命名空间以外添加自定义 API,但这些自定义 API:
+ </p>
+ <ul>
+ <li>[C-0-5] 不得位于归其他组织所有或提及其他组织的命名空间内。例如,设备实现者不得向 <code>com.google.*</code> 或类似命名空间内添加 API:只有 Google 可以在此类命名空间内添加 API。同样,Google 也不得向其他公司的命名空间内添加 API。
+ </li>
+ <li>[C-0-6] 必须打包到 Android 共享库中,以便只有明确使用它们的应用(通过 &lt;uses-library&gt; 机制)会受到此类 API 内存使用量增加的影响。
+ </li>
+ </ul>
+ <p>
+如果设备实现者提议改善上述某个软件包命名空间(例如通过向现有 API 添加实用的新功能,或通过添加新的 API),则实现者应访问 <a href="http://source.android.com/">source.android.com</a>,并按照该网站上的信息开始执行贡献更改和代码需要遵循的流程。
+ </p>
+ <p>
+请注意,上述限制对应于 Java 编程语言中命名 API 的标准惯例;本节只是为了强调这些惯例,并通过将其纳入本兼容性定义来使其具有约束力。
+ </p>
+ <h3 id="3_7_runtime_compatibility">
+3.7. 运行时兼容性
+ </h3>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 必须支持完整的 Dalvik 可执行文件 (DEX) 格式以及 <a href="https://android.googlesource.com/platform/dalvik/">Dalvik 字节码规范和语义</a>。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-2] 必须将 Dalvik 运行时配置为根据上游 Android 平台来分配内存,如下表所示。(有关屏幕尺寸和屏幕密度定义,请参阅<a href="#7_1_1_screen_configuration">第 7.1.1 节</a>。)
+ </p>
+ </li>
+ <li>
+ <p>
+应使用 Android 运行时 (ART)、Dalvik 可执行文件格式的参考上游实现,以及该参考实现的软件包管理系统。
+ </p>
+ </li>
+ <li>
+ <p>
+应在执行和定位架构的多种模式下运行模糊测试,以确保运行时的稳定性。请参阅 Android 开源项目网站上的 <a href="https://android.googlesource.com/platform/art/+/master/tools/dexfuzz/">JFuzz</a> 和 <a href="https://android.googlesource.com/platform/art/+/master/tools/dexfuzz/">DexFuzz</a>。
+ </p>
+ </li>
+ </ul>
+ <p>
+请注意,下面指定的内存值被视为最小值,设备实现可以为每个应用分配更多内存。
+ </p>
+ <table>
+ <tbody><tr>
+ <th>
+屏幕布局
+ </th>
+ <th>
+屏幕密度
+ </th>
+ <th>
+最小应用内存
+ </th>
+ </tr>
+ <tr>
+ <td rowspan="12">
+Android Watch
+ </td>
+ <td>
+120 dpi (ldpi)
+ </td>
+ <td rowspan="3">
+32MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+160 dpi (mdpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+213 dpi (tvdpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+240 dpi (hdpi)
+ </td>
+ <td rowspan="2">
+36MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+280 dpi (280dpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+320 dpi (xhdpi)
+ </td>
+ <td rowspan="2">
+48MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+360 dpi (360dpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+400 dpi (400dpi)
+ </td>
+ <td>
+56MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+420 dpi (420dpi)
+ </td>
+ <td>
+64MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+480 dpi (xxhdpi)
+ </td>
+ <td>
+88MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+560 dpi (560dpi)
+ </td>
+ <td>
+112MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+640 dpi (xxxhdpi)
+ </td>
+ <td>
+154MB
+ </td>
+ </tr>
+ <tr>
+ <td rowspan="12">
+小/普通
+ </td>
+ <td>
+120 dpi (ldpi)
+ </td>
+ <td rowspan="2">
+32MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+160 dpi (mdpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+213 dpi (tvdpi)
+ </td>
+ <td rowspan="3">
+48MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+240 dpi (hdpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+280 dpi (280dpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+320 dpi (xhdpi)
+ </td>
+ <td rowspan="2">
+80MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+360 dpi (360dpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+400 dpi (400dpi)
+ </td>
+ <td>
+ 96MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+420 dpi (420dpi)
+ </td>
+ <td>
+112MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+480 dpi (xxhdpi)
+ </td>
+ <td>
+128MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+560 dpi (560dpi)
+ </td>
+ <td>
+192MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+640 dpi (xxxhdpi)
+ </td>
+ <td>
+256MB
+ </td>
+ </tr>
+ <tr>
+ <td rowspan="12">
+大
+ </td>
+ <td>
+120 dpi (ldpi)
+ </td>
+ <td>
+32MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+160 dpi (mdpi)
+ </td>
+ <td>
+48MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+213 dpi (tvdpi)
+ </td>
+ <td rowspan="2">
+80MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+240 dpi (hdpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+280 dpi (280dpi)
+ </td>
+ <td>
+ 96MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+320 dpi (xhdpi)
+ </td>
+ <td>
+128MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+360 dpi (360dpi)
+ </td>
+ <td>
+160MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+400 dpi (400dpi)
+ </td>
+ <td>
+192MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+420 dpi (420dpi)
+ </td>
+ <td>
+228MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+480 dpi (xxhdpi)
+ </td>
+ <td>
+256MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+560 dpi (560dpi)
+ </td>
+ <td>
+384MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+640 dpi (xxxhdpi)
+ </td>
+ <td>
+512MB
+ </td>
+ </tr>
+ <tr>
+ <td rowspan="12">
+超大
+ </td>
+ <td>
+120 dpi (ldpi)
+ </td>
+ <td>
+48MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+160 dpi (mdpi)
+ </td>
+ <td>
+80MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+213 dpi (tvdpi)
+ </td>
+ <td rowspan="2">
+ 96MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+240 dpi (hdpi)
+ </td>
+ </tr>
+ <tr>
+ <td>
+280 dpi (280dpi)
+ </td>
+ <td>
+144MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+320 dpi (xhdpi)
+ </td>
+ <td>
+192MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+360 dpi (360dpi)
+ </td>
+ <td>
+240MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+400 dpi (400dpi)
+ </td>
+ <td>
+288MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+420 dpi (420dpi)
+ </td>
+ <td>
+336MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+480 dpi (xxhdpi)
+ </td>
+ <td>
+384MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+560 dpi (560dpi)
+ </td>
+ <td>
+576MB
+ </td>
+ </tr>
+ <tr>
+ <td>
+640 dpi (xxxhdpi)
+ </td>
+ <td>
+768MB
+ </td>
+ </tr>
+ </tbody></table>
+ <h3 id="3_8_user_interface_compatibility">
+3.8. 界面兼容性
+ </h3>
+ <h4 id="3_8_1_launcher_(home_screen)">
+3.8.1. 启动器(主屏幕)
+ </h4>
+ <p>
+Android 包含一个启动器应用(主屏幕),并且支持第三方应用更换设备启动器(主屏幕)。
+ </p>
+ <p>
+如果设备实现允许第三方应用更换设备主屏幕,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明平台功能 <code>android.software.home_screen</code>。
+ </li>
+ <li>[C-1-2] 如果第三方应用使用 <code>&lt;adaptive-icon&gt;</code> 标记提供其图标,那么当用于检索图标的 <a href="https://developer.android.com/reference/android/content/pm/PackageManager.html"><code>PackageManager</code></a> 方法被调用时,必须返回 <a href="https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html"><code>AdaptiveIconDrawable</code></a> 对象。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含支持应用内固定快捷方式和微件的默认启动器,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须针对 <a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html#isRequestPinShortcutSupported%28%29"><code>ShortcutManager.isRequestPinShortcutSupported()</code></a> 和 <a href="https://developer.android.com/reference/android/appwidget/AppWidgetManager.html#isRequestPinAppWidgetSupported%28%29"><code>AppWidgetManager.html.isRequestPinAppWidgetSupported()</code></a> 报告 <code>true</code>。
+ </li>
+ <li>[C-2-2] 必须具有一种在添加应用通过 <a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html#requestPinShortcut%28android.content.pm.ShortcutInfo,%20android.content.IntentSender%29"><code>ShortcutManager.requestPinShortcut()</code></a> 和 <a href="https://developer.android.com/reference/android/appwidget/AppWidgetManager.html#requestPinAppWidget%28android.content.ComponentName,android.os.Bundle,%20android.app.PendingIntent%29"><code>AppWidgetManager.requestPinAddWidget()</code></a> API 方法请求的快捷方式之前先询问用户的方式。
+ </li>
+ </ul>
+ <p>
+反之,如果设备实现不支持应用内固定,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须针对 <a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html#isRequestPinShortcutSupported%28%29"><code>ShortcutManager.isRequestPinShortcutSupported()</code></a> 和 <a href="https://developer.android.com/reference/android/appwidget/AppWidgetManager.html#isRequestPinAppWidgetSupported%28%29"><code>AppWidgetManager.html#isRequestPinAppWidgetSupported()</code></a> 报告 <code>false</code>。
+ </li>
+ </ul>
+ <p>
+如果设备实现已实现一个可让用户快速访问第三方应用通过 <a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html">ShortcutManager</a> API 提供的其他快捷方式的默认启动器,则:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须支持载述的所有快捷方式功能(例如静态和动态快捷方式、固定快捷方式),并完整实现 <a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html"><code>ShortcutManager</code></a> API 类的 API。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含会为应用图标显示标记的默认启动器应用,则:
+ </p>
+ <ul>
+ <li>[C-5-1] 必须遵从 <a href="https://developer.android.com/reference/android/app/NotificationChannel.html#setShowBadge%28boolean%29"><code>NotificationChannel.setShowBadge()</code></a> API 方法。也就是说,如果相应值被设为 <code>true</code>,则显示与应用图标关联的可见标记;如果应用的所有通知渠道均将相应值设为 <code>false</code>,则不显示任何应用图标标记方案。
+ </li>
+ <li>如果第三方应用指明通过使用专有 API 支持专有标记方案,则可以使用专有标记方案替换应用图标标记,但应使用通过 <a href="https://developer.android.com/preview/features/notification-badges.html">SDK</a> 中所述的通知标记 API(例如 <a href="http://developer.android.com/reference/android/app/Notification.Builder.html#setNumber%28int%29"><code>Notification.Builder.setNumber()</code></a> 和 <a href="http://developer.android.com/reference/android/app/Notification.Builder.html#setBadgeIconType%28int%29"><code>Notification.Builder.setBadgeIconType()</code></a> API)提供的资源和值。
+ </li>
+ </ul>
+ <h4 id="3_8_2_widgets">
+3.8.2. 微件
+ </h4>
+ <p>
+Android 定义了一种组件类型以及对应的 API 和生命周期来供应用向最终用户提供<a href="http://developer.android.com/guide/practices/ui_guidelines/widget_design.html">应用微件</a>,因此 Android 支持第三方应用微件。
+ </p>
+ <p>
+如果设备实现支持第三方应用微件,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明支持平台功能 android.software.app_widgets。
+ </li>
+ <li>[C-1-2] 必须包含对应用微件的内置支持,并提供用于直接在启动器中添加、配置、查看和移除应用微件的界面方式。
+ </li>
+ <li>[C-1-3] 必须能够呈现标准网格大小为 4 x 4 的微件。有关详细信息,请参阅 Android SDK 文档中的<a href="http://developer.android.com/guide/practices/ui_guidelines/widget_design.html">应用微件设计指南</a>。
+ </li>
+ <li>可以支持位于锁定屏幕上的应用微件。
+ </li>
+ </ul>
+ <h4 id="3_8_3_notifications">
+3.8.3. 通知
+ </h4>
+ <p>
+Android 包含 <a href="https://developer.android.com/reference/android/app/Notification.html"><code>Notification</code></a> 和 <a href="https://developer.android.com/reference/android/app/NotificationManager.html"><code>NotificationManager</code></a> API,以便第三方应用开发者使用设备的硬件组件(例如声音、振动和指示灯)和软件功能(例如通知栏、系统栏)向用户通知重要事件以及吸引用户的注意力。
+ </p>
+ <h5 id="3_8_3_1_presentation_of_notifications">
+3.8.3.1. 通知的呈现方式
+ </h5>
+ <p>
+如果设备实现允许第三方应用<a href="http://developer.android.com/guide/topics/ui/notifiers/notifications.html">向用户通知重要事件</a>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持使用硬件功能的通知(如 SDK 文档中所述),并尽可能提供相关的设备硬件。例如,如果设备实现包含振动器,则必须正确实现振动 API。如果设备实现缺少硬件,则必须将对应 API 实现为空操作。<a href="#7_hardware_compatibility">第 7 节</a>中对此行为进行了进一步的详细说明。
+ </li>
+ <li>[C-1-2] 必须正确呈现 API 或状态栏/系统栏<a href="https://developer.android.com/guide/topics/resources/available-resources.html">图标样式指南</a>中提供的所有<a href="http://developer.android.com/design/style/iconography.html">资源</a>(图标、动画文件等),不过,它们可以针对通知提供替代用户体验,而不使用参考 Android 开放源代码实现所提供的体验。
+ </li>
+ <li>[C-1-3] 必须遵从并正确实现为 <a href="https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Managing">API</a> 描述的行为,以便更新、移除通知以及对通知进行分组。
+ </li>
+ <li>[C-1-4] 必须提供 SDK 中载述的 <a href="https://developer.android.com/reference/android/app/NotificationChannel.html">NotificationChannel</a> API 的完整行为。
+ </li>
+ <li>[C-1-5] 必须提供一种方式,让用户能够按每个渠道和应用包级别屏蔽和修改特定第三方应用的通知。
+ </li>
+ <li>[C-1-6] 还必须提供一种方式,让用户能够查看已删除的通知渠道。
+ </li>
+ <li>应支持内容丰富的通知。
+ </li>
+ <li>应以提醒式通知的形式显示某些优先级较高的通知。
+ </li>
+ <li>应具有可让用户暂停通知的方式。
+ </li>
+ <li>只能管理是否以及何时显示第三方应用针对重要事件向用户发出的通知,以避免安全问题(例如分散驾驶员的注意力)。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持内容丰富的通知,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须使用通过 <a href="https://developer.android.com/reference/android/app/Notification.Style.html"><code>Notification.Style</code></a> API 类及其子类为呈现的资源元素提供的确切资源。
+ </li>
+ <li>应呈现 <a href="https://developer.android.com/reference/android/app/Notification.Style.html"><code>Notification.Style</code></a> API 类及其子类中定义的每个资源元素(例如图标、标题和摘要文本)。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持提醒式通知,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 在呈现提醒式通知时,必须使用提醒式通知视图和资源(如 <a href="https://developer.android.com/reference/android/app/Notification.Builder.html"><code>Notification.Builder</code></a> API 类中所述)。
+ </li>
+ </ul>
+ <h5 id="3_8_3_2_notification_listener_service">
+3.8.3.2. 通知监听器服务
+ </h5>
+ <p>
+Android 包含 <a href="https://developer.android.com/reference/android/service/notification/NotificationListenerService.html"><code>NotificationListenerService</code></a> API,任何通知一经发布或更新,此类 API 便可让应用(用户明确启用后)收到其副本。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须正确、及时地将通知完整地更新到所有已安装且用户已启用的此类监听器服务,包括附加到通知对象的所有元数据。
+ </li>
+ <li>[C-0-2] 必须遵从 <a href="https://developer.android.com/reference/android/service/notification/NotificationListenerService.html#snoozeNotification%28java.lang.String,%20long%29"><code>snoozeNotification()</code></a> API 调用,并在经过 API 调用中设置的暂停时长之后关闭通知并执行回调。
+ </li>
+ </ul>
+ <p>
+如果设备实现具有可让用户暂停通知的方式,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须通过标准 API(例如 <a href="https://developer.android.com/reference/android/service/notification/NotificationListenerService.html#getSnoozedNotifications%28%29"><code>NotificationListenerService.getSnoozedNotifications()</code></a>)正确反映已暂停通知状态。
+ </li>
+ <li>[C-1-2] 必须使该方式可用于暂停每个已安装的第三方应用发出的通知,除非通知来自常驻/前台服务。
+ </li>
+ </ul>
+ <h5 id="3_8_3_3_dnd_(do_not_disturb)">
+3.8.3.3. DND(请勿打扰)
+ </h5>
+ <p>
+如果设备实现支持 DND 功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现会响应 <a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS">ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS</a> Intent 的 Activity;对于设为 UI_MODE_TYPE_NORMAL 的实现,它必须是用户可用于授权或拒绝应用访问 DND 政策配置的 Activity。
+ </li>
+ <li>[C-1-2] 当设备实现为用户提供了用于授权或拒绝第三方应用访问 DND 政策配置的方式时,必须随同用户创建的规则和预定义的规则一起显示应用创建的<a href="https://developer.android.com/reference/android/app/NotificationManager.html#addAutomaticZenRule%28android.app.AutomaticZenRule%29">自动 DND 规则</a>。
+ </li>
+ <li>[C-1-3] 必须遵从随同 <a href="https://developer.android.com/reference/android/app/NotificationManager.Policy.html#NotificationManager.Policy%28int,%20int,%20int,%20int%29"><code>NotificationManager.Policy</code></a> 传递的 <a href="https://developer.android.com/reference/android/app/NotificationManager.Policy.html#suppressedVisualEffects"><code>suppressedVisualEffects</code></a> 值;如果应用已设置 SUPPRESSED_EFFECT_SCREEN_OFF 或 SUPPRESSED_EFFECT_SCREEN_ON 标记,则应向用户指明 DND 设置菜单中不会显现视觉效果。
+ </li>
+ </ul>
+ <h4 id="3_8_4_search">
+3.8.4. 搜索
+ </h4>
+ <p>
+Android 包含一些可让开发者在其应用中<a href="http://developer.android.com/reference/android/app/SearchManager.html">纳入搜索功能</a>以及将其应用中的数据提供给全局系统搜索使用的 API。一般来说,该功能会包括一个系统级界面,以便用户输入查询、在用户输入时显示建议,以及显示搜索结果。这些 Android API 可让开发者重复使用此界面,以在其应用内提供搜索功能,还可让开发者向通用的全局搜索界面提供搜索结果。
+ </p>
+ <ul>
+ <li>Android 设备实现应包含全局搜索界面 - 单个共享的系统级搜索界面,能够在用户输入内容时实时提供建议。
+ </li>
+ </ul>
+ <p>
+如果设备实现已实现全局搜索界面,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现可让第三方应用向搜索框(当它以全局搜索模式运行时)中添加建议的 API。
+ </li>
+ </ul>
+ <p>
+如果未安装任何使用全局搜索界面的第三方应用,则:
+ </p>
+ <ul>
+ <li>默认行为应为显示网页搜索引擎提供的搜索结果和建议。
+ </li>
+ </ul>
+ <p>
+Android 还包含一些<a href="https://developer.android.com/reference/android/app/assist/package-summary.html">辅助 API</a>,以便应用选择与设备上的辅助程序分享多少关于当前上下文的信息。
+ </p>
+ <p>
+如果设备实现支持辅助操作,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 当分享上下文时,必须通过以下方式之一向最终用户清楚地指明这一点:
+ <ul>
+ <li>每当辅助应用访问上下文时,都在屏幕边缘显示白光,并且其持续时间和亮度达到或超过 Android 开源项目实现的持续时间和亮度。
+ </li>
+ <li>对于预安装的辅助应用,提供距<a href="#3_2_3_5_default_app_settings">默认语音输入和辅助应用设置菜单</a>不超过两个导航步骤的用户可见内容,并且仅在用户通过启动指令或辅助导航键输入明确调用辅助应用的情况下才分享上下文。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-2] 用于启动辅助应用的指定交互(如<a href="#7_2_3_navigation_keys">第 7.2.3 节</a>中所述)必须启动用户选择的辅助应用(也就是实现了 <code>VoiceInteractionService</code> 的应用)或负责处理 <code>ACTION_ASSIST</code> Intent 的 Activity。
+ </li>
+ <li>[SR] 强烈建议将长按 <code>HOME</code> 键用作这一指定交互。
+ </li>
+ </ul>
+ <h4 id="3_8_5_alerts_and_toasts">
+3.8.5. 提醒和消息框
+ </h4>
+ <p>
+应用可以使用 <a href="http://developer.android.com/reference/android/widget/Toast.html"><code>Toast</code></a> API 向最终用户显示简短的非模态字符串(这些字符串会在短暂显示后消失),并使用 <a href="http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#TYPE_APPLICATION_OVERLAY"><code>TYPE_APPLICATION_OVERLAY</code></a> 窗口类型 API 使提醒窗口叠加在其他应用之前显示。
+ </p>
+ <p>
+如果设备实现包含屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须提供一种方式,让用户能够阻止应用显示使用 <a href="http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#TYPE_APPLICATION_OVERLAY"><code>TYPE_APPLICATION_OVERLAY</code></a> 的提醒窗口。AOSP 实现通过在通知栏中提供相应控件来满足该要求。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-2] 必须遵从 Toast API,并以某种非常显眼的方式向最终用户显示来自应用的消息框。
+ </p>
+ </li>
+ </ul>
+ <h4 id="3_8_6_themes">
+3.8.6. 主题背景
+ </h4>
+ <p>
+Android 提供“主题背景”这一机制,以供应用在整个 Activity 或应用中应用样式。
+ </p>
+ <p>
+Android 包含“Holo”和“Material”主题背景系列(一组预定义的样式),如果应用开发者想要与 Android SDK 定义的 <a href="http://developer.android.com/guide/topics/ui/themes.html">Holo 主题背景外观和风格</a>保持一致,则可以使用它们。
+ </p>
+ <p>
+如果设备实现包含屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 不得更改任何可供应用使用的 <a href="http://developer.android.com/reference/android/R.style.html">Holo 主题背景属性</a>。
+ </li>
+ <li>[C-1-2] 必须支持“Material”主题背景系列,并且不得更改任何可供应用使用的 <a href="http://developer.android.com/reference/android/R.style.html#Theme_Material">Material 主题背景属性</a>或其素材资源。
+ </li>
+ </ul>
+ <p>
+Android 还包含一个“Device Default”主题背景系列(一组预定义的样式),如果应用开发者想要与设备实现者定义的设备主题背景外观和风格保持一致,则可以使用它们。
+
+ </p>
+ <ul>
+ <li>设备实现可以修改可供应用使用的 <a href="http://developer.android.com/reference/android/R.style.html">Device Default 主题背景属性</a>。
+ </li>
+ </ul>
+ <p>
+Android 支持带有半透明系统栏的变体主题背景,以便应用开发者将其应用内容填充到状态栏和导航栏后面的区域。为了在采用此配置时实现一致的开发者体验,请务必在不同的设备实现之间保持一致的状态栏图标样式。
+ </p>
+ <p>
+如果设备实现包含系统状态栏,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须使用白色来显示系统状态图标(例如信号强度和电池电量)以及系统发出的通知,除非相应图标用于指明有问题状态,或者应用使用 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 标记请求使用浅色状态栏。
+ </li>
+ <li>[C-2-2] 当应用请求使用浅色状态栏时,Android 设备实现必须将系统状态图标的颜色更改为黑色(有关详细信息,请参阅 <a href="http://developer.android.com/reference/android/R.style.html">R.style</a>)。
+ </li>
+ </ul>
+ <h4 id="3_8_7_live_wallpapers">
+3.8.7. 动态壁纸
+ </h4>
+ <p>
+Android 定义了一种组件类型以及对应的 API 和生命周期来供应用向最终用户提供一个或多个<a href="http://developer.android.com/reference/android/service/wallpaper/WallpaperService.html">“动态壁纸”</a>。动态壁纸是具备有限输入功能且作为壁纸显示在其他应用之后的动画、图案或类似图片。
+ </p>
+ <p>
+如果硬件能够在不限制功能且不会对其他应用造成负面影响的情况下,以合理的帧速率运行所有动态壁纸,则会被视为能够可靠地运行动态壁纸。如果硬件中的限制导致壁纸和/或应用崩溃、无法正常运行、占用过多 CPU/消耗过多电池电量,或者运行时的帧速率低得令人无法接受,则相应硬件会被视为无法运行动态壁纸。例如,有些动态壁纸可能会利用 OpenGL 2.0 或 3.x 上下文来呈现其内容。动态壁纸将无法在不支持多个 OpenGL 上下文的硬件上可靠地运行,因为使用 OpenGL 上下文的动态壁纸可能会与其他同样使用 OpenGL 上下文的应用发生冲突。
+ </p>
+ <ul>
+ <li>如果设备实现能够可靠地运行动态壁纸(如上所述),则应实现动态壁纸。
+ </li>
+ </ul>
+ <p>
+如果设备实现已实现动态壁纸,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告 android.software.live_wallpaper 平台功能标记。
+ </li>
+ </ul>
+ <h4 id="3_8_8_activity_switching">
+3.8.8. Activity 切换
+ </h4>
+ <p>
+上游 Android 源代码包含<a href="https://developer.android.com/guide/components/activities/recents.html">概览屏幕</a>,该屏幕是一个系统级界面,可用于切换任务,以及使用缩略图(对应于用户上次离开应用时应用的图形状态)显示用户最近访问的 Activity 和任务。
+ </p>
+ <p>
+如果设备实现包含“最近用过”功能导航键(<a href="#7_2_3_navigation_keys">第 7.2.3 节</a>中对此进行了详细说明),则可以更改该界面。
+ </p>
+ <p>
+如果设备实现包含“最近用过”功能导航键(<a href="#7_2_3_navigation_keys">第 7.2.3 节</a>中对此进行了详细说明),并且要更改该界面,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持显示至少 20 个 Activity。
+ </li>
+ <li>一次应至少显示 4 个 Activity 的名称。
+ </li>
+ <li>[C-1-2] 必须实现<a href="http://developer.android.com/about/versions/android-5.0.html#ScreenPinning">屏幕固定行为</a>,并向用户提供用于开启/关闭该功能的设置菜单。
+ </li>
+ <li>应在“最近用过”中显示亮显颜色、图标、屏幕标题。
+ </li>
+ <li>应显示关闭选项 (x),但可以延迟到用户与屏幕互动之后显示。
+ </li>
+ <li>应实现一个可让用户轻松切换到前一个 Activity 的快捷方式。
+ </li>
+ <li>当用户点按两次“最近用过”功能键时,应触发在最近用过的两个应用之间进行快速切换。
+ </li>
+ <li>当用户长按“最近用过”功能键时,应触发分屏多窗口模式(如果支持的话)。
+ </li>
+ <li>
+ <p>
+可以将最近用过的关联项显示为一组(它们会一起移动)。
+ </p>
+ </li>
+ <li>
+ <p>
+[SR] 强烈建议设备实现为概览屏幕使用上游 Android 界面(或类似的基于缩略图的界面)。
+ </p>
+ </li>
+ </ul>
+ <h4 id="3_8_9_input_management">
+3.8.9. 输入管理
+ </h4>
+ <p>
+Android 支持<a href="http://developer.android.com/guide/topics/text/creating-input-method.html">输入管理</a>,并且支持第三方输入法编辑器。
+ </p>
+ <p>如果设备实现允许用户在设备上使用第三方输入法,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明平台功能 android.software.input_methods,并支持 IME API(如 Android SDK 文档中定义)。
+ </li>
+ <li>[C-1-2] 必须能够因应 INPUT_METHOD_SETTINGS Intent 提供一种可供用户使用的机制,以便他们添加和配置第三方输入法。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明了 <a href="https://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_AUTOFILL"><code>android.software.autofill</code></a> 功能标记,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须完整实现 <a href="https://developer.android.com/reference/android/service/autofill/AutofillService.html"><code>AutofillService</code></a> 和 <a href="https://developer.android.com/reference/android/view/autofill/AutofillManager.html"><code>AutofillManager</code></a> API,并能够遵从 <a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_REQUEST_SET_AUTOFILL_SERVICE"><code>android.settings.REQUEST_SET_AUTOFILL_SERVICE</code></a> Intent 显示一个默认应用设置菜单,以便用户启用和停用自动填充服务以及更改默认自动填充服务。
+ </li>
+ </ul>
+ <h4 id="3_8_10_lock_screen_media_control">
+3.8.10. 锁定屏幕媒体控件
+ </h4>
+ <p>
+Remote Control Client API 从 Android 5.0 开始便被弃用了,取而代之的是可让媒体应用与锁定屏幕上显示的播放控件相集成的<a href="http://developer.android.com/reference/android/app/Notification.MediaStyle.html">媒体通知模板</a>。
+ </p>
+ <h4 id="3_8_11_screen_savers_(previously_dreams)">
+3.8.11. 屏保(之前称为 Dream)
+ </h4>
+ <p>
+Android 支持 <a href="http://developer.android.com/reference/android/service/dreams/DreamService.html">interactivescreensaver</a>(之前称为 Dream)。当接通电源的设备处于闲置状态或放在桌面基座中时,屏保让用户能够与应用互动。Android Watch 设备可以实现屏保,但其他类型的设备实现应支持屏保,并且应能够因应 <code>android.settings.DREAM_SETTINGS</code> Intent 为用户提供用于配置屏保的设置选项。
+ </p>
+ <h4 id="3_8_12_location">
+3.8.12. 位置
+ </h4>
+ <p>
+如果设备实现包含能够提供位置坐标的硬件传感器(例如 GPS),则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须在“设置”部分的“位置信息”菜单中显示<a href="http://developer.android.com/reference/android/provider/Settings.Secure.html#LOCATION_MODE">位置信息模式</a>。
+ </li>
+ </ul>
+ <h4 id="3_8_13_unicode_and_font">
+3.8.13. Unicode 和字体
+ </h4>
+ <p>
+Android 支持 <a href="http://www.unicode.org/versions/Unicode10.0.0/">Unicode 10.0</a> 中定义的表情符号。
+ </p>
+ <p>
+如果设备实现包含屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须能够以彩色符号形式呈现这些表情符号。
+ </li>
+ <li>[C-1-2] 必须支持:
+ </li>
+ <li>对于设备上的可用语言,支持具有以下各种粗细的 Roboto 2 字体:sans-serif-thin、sans-serif-light、sans-serif-medium、sans-serif-black、sans-serif-condensed、sans-serif-condensed-light。
+ </li>
+ <li>Unicode 7.0 中涵盖的所有拉丁语、希腊语和西里尔语字母(包括拉丁语扩展 A、B、C 和 D 系列),以及 Unicode 7.0 的货币符号块中的所有符号。
+ </li>
+ <li>应支持 <a href="http://unicode.org/reports/tr51">Unicode 技术报告 #51</a> 中指定的肤色和各种家庭表情符号。
+ </li>
+ </ul>
+ <p>如果设备实现包含 IME,则:
+ </p>
+ <ul>
+ <li>应为用户提供一种可输入这些表情符号的输入法。
+ </li>
+ </ul>
+ <h4 id="3_8_14_multi-windows">
+3.8.14. 多窗口模式
+ </h4>
+ <p>
+如果设备实现能够同时显示多个 Activity,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须按照 Android SDK <a href="https://developer.android.com/guide/topics/ui/multi-window.html">多窗口模式支持文档</a>中所述的应用行为和 API 实现此类多窗口模式,并满足以下要求:
+ </li>
+ <li>[C-1-2] 应用可以在 <code>AndroidManifest.xml</code> 文件中指明它们是否能够以多窗口模式运行:通过将 <a href="https://developer.android.com/reference/android/R.attr.html#resizeableActivity"><code>android:resizeableActivity</code></a> 属性设为 <code>true</code> 来明确指明,或通过使 targetSdkVersion 高于 24 来隐式指明。在清单中明确将该属性设为 <code>false</code> 的应用不得以多窗口模式启动。targetSdkVersion 低于 24 的旧版应用(没有设置该 <code>android:resizeableActivity</code> 属性)可以采用多窗口模式启动,但系统必须发出警告,让用户知道相应应用在多窗口模式下可能无法正常运行。
+ </li>
+ <li>[C-1-3] 如果屏幕高度和宽度均小于 440 dp,则不得提供分屏或自由窗口模式。
+ </li>
+ <li>屏幕尺寸为 <code>xlarge</code> 的设备实现应支持自由窗口模式。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持多窗口模式和分屏模式,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须预加载一个<a href="https://developer.android.com/guide/topics/ui/multi-window.html#configuring">大小可调整</a>的启动器作为默认启动器。
+ </li>
+ <li>[C-2-2] 如果启动器应用是获得焦点的窗口,则必须剪裁处于分屏多窗口模式的停靠 Activity,但应显示它的部分内容。
+ </li>
+ <li>[C-2-3] 必须遵从第三方启动器应用声明的 <a href="https://developer.android.com/reference/android/R.styleable.html#AndroidManifestLayout_minWidth"><code>AndroidManifestLayout_minWidth</code></a> 和 <a href="https://developer.android.com/reference/android/R.styleable.html#AndroidManifestLayout_minHeight"><code>AndroidManifestLayout_minHeight</code></a> 值,并且在显示停靠 Activity 的部分内容时不得替换这些值。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持多窗口模式和画中画多窗口模式,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 如果应用符合以下任一条件,则必须以画中画多窗口模式启动 Activity:*采用 API 26 级或更高级别,并且声明了 <a href="https://developer.android.com/reference/android/R.attr.html#supportsPictureInPicture"><code>android:supportsPictureInPicture</code></a>;*采用 API 25 级或更低级别,并且声明了 <a href="https://developer.android.com/reference/android/R.attr.html#resizeableActivity"><code>android:resizeableActivity</code></a> 和 <a href="https://developer.android.com/reference/android/R.attr.html#supportsPictureInPicture"><code>android:supportsPictureInPicture</code></a>。
+ </li>
+ <li>[C-3-2] 必须在 SystemUI 中公开当前 PIP Activity 通过 <a href="https://developer.android.com/reference/android/app/PictureInPictureParams.Builder.html#setActions%28java.util.List%3Candroid.app.RemoteAction%3E%29"><code>setActions()</code></a> API 指定的操作。
+ </li>
+ <li>[C-3-3] 必须支持 PIP Activity 通过 <a href="https://developer.android.com/reference/android/app/PictureInPictureParams.Builder.html#setAspectRatio%28android.util.Rational%29"><code>setAspectRatio()</code></a> API 指定的大于等于 1:2.39 且小于等于 2.39:1 的宽高比。
+ </li>
+ <li>[C-3-4] 必须使用 <a href="https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_WINDOW"><code>KeyEvent.KEYCODE_WINDOW</code></a> 控制 PIP 窗口;如果未实现 PIP 模式,则该键必须可供前台 Activity 使用。
+ </li>
+ <li>[C-3-5] 必须提供一种方式,让用户能够阻止应用以 PIP 模式显示;AOSP 实现通过在通知栏中提供相应控件来满足该要求。
+ </li>
+ <li>[C-3-6] 必须为 PIP 窗口分配 108 dp 的最小宽度和高度;当 <code>Configuration.uiMode</code> 配置为 <a href="https://developer.android.com/reference/android/content/res/Configuration.html#UI_MODE_TYPE_TELEVISION"><code>UI_MODE_TYPE_TELEVISION</code></a> 时,必须为 PIP 窗口分配 240 dp 的最小宽度和 135 dp 的最小高度。
+ </li>
+ </ul>
+ <h3 id="3_9_device_administration">
+3.9. 设备管理
+ </h3>
+ <p>
+Android 包含一些可让注重安全性的应用在系统级执行设备管理工作的功能,例如通过 <a href="http://developer.android.com/guide/topics/admin/device-admin.html">Android Device Administration API</a> 强制执行密码政策或执行远程清除。
+ </p>
+ <p>
+如果设备实现已实现 Android SDK 文档中定义的所有<a href="http://developer.android.com/guide/topics/admin/device-admin.html">设备管理</a>政策,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明 <code>android.software.device_admin</code>。
+ </li>
+ <li>[C-1-2] 必须支持设备所有者配置(如<a href="#3_9_1_device_provisioning">第 3.9.1 节</a>和<a href="#3_9_1_1_device_owner_provisioning">第 3.9.1.1 节</a>中所述)。
+ </li>
+ <li>[C-1-3] 必须通过 <code>android.software.managed_users</code> 功能标记声明支持受管理个人资料,除非设备的配置决定了设备会将其自身<a href="http://developer.android.com/reference/android/app/ActivityManager.html#isLowRamDevice%28%29">报告</a>为低 RAM 设备,或会将内部(不可移动)存储空间分配为共享存储空间。
+ </li>
+ </ul>
+ <h4 id="3_9_1_device_provisioning">
+3.9.1 设备配置
+ </h4>
+ <h5 id="3_9_1_1_device_owner_provisioning">
+3.9.1.1 设备所有者配置
+ </h5>
+ <p>
+如果设备实现声明了 <code>android.software.device_admin</code>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持将 Device Policy Client (DPC) 注册为<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isDeviceOwnerApp%28java.lang.String%29">设备所有者应用</a>,如下所述:
+ <ul>
+ <li>如果设备实现尚未配置任何用户数据,则:
+ <ul>
+ <li>[C-1-3] 必须针对 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isProvisioningAllowed(java.lang.String)"><code>DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)</code></a> 报告 <code>true</code>。
+ </li>
+ <li>[C-1-4] 必须能够因应 Intent 操作 <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_DEVICE"><code>android.app.action.PROVISION_MANAGED_DEVICE</code></a> 将 DPC 应用注册为设备所有者应用。
+ </li>
+ <li>[C-1-5] 如果设备通过 <code>android.hardware.nfc</code> 功能标记声明支持近距离无线通信 (NFC),那么如果它收到的 NFC 消息中包含 MIME 类型为 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#MIME_TYPE_PROVISIONING_NFC"><code>MIME_TYPE_PROVISIONING_NFC</code></a> 的记录,则必须将 DPC 应用注册为设备所有者应用。
+ </li>
+ </ul>
+ </li>
+ <li>如果设备实现有用户数据,则:
+ <ul>
+ <li>[C-1-6] 必须针对 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isProvisioningAllowed(java.lang.String)"><code>DevicePolicyManager.isProvisioningAllowed(ACTION_PROVISION_MANAGED_DEVICE)</code></a> 报告 <code>false</code>。
+ </li>
+ <li>[C-1-7] 不得再将任何 DPC 应用注册为设备所有者应用。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li>[C-1-2] 未经设备用户或管理员的明确同意或操作,不得将应用(包含预安装的应用)设为设备所有者应用。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明了 <code>android.software.device_admin</code>,包含专有的设备所有者管理解决方案,并提供了相应机制来向标准 Android <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html">DevicePolicyManager</a> API 识别出的标准“设备所有者”通告在其解决方案中配置为“与设备所有者同等”的应用,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须部署相应的流程来验证所通告的应用属于合法的企业设备管理解决方案,并且已在专有的解决方案中配置为具备与“设备所有者”同等的权利。
+ </li>
+ <li>[C-2-2] 在将 DPC 应用注册为“设备所有者”之前,必须先按照 <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_DEVICE"><code>android.app.action.PROVISION_MANAGED_DEVICE</code></a> 启动的流程显示相同的 AOSP 设备所有者同意披露。
+ </li>
+ <li>在将 DPC 应用注册为“设备所有者”之前,设备上可以有用户数据。
+ </li>
+ </ul>
+ <h5 id="3_9_1_2_managed_profile_provisioning">
+3.9.1.2 受管理个人资料配置
+ </h5>
+ <p>
+如果设备实现声明了 <code>android.software.managed_users</code>,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须实现相应的 <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_PROFILE">API</a>,以便将设备政策控制器 (DPC) 应用注册为<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#isProfileOwnerApp%28java.lang.String%29">新增受管理个人资料的所有者</a>。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-2] 受管理个人资料配置流程(该流程由 <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_PROFILE">android.app.action.PROVISION_MANAGED_PROFILE</a> 启动)用户体验必须与 AOSP 实现保持一致。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-3] 当设备政策控制器 (DPC) 停用了某项系统功能时,必须在“设置”部分提供以下用户可见内容,以便向用户指明这一点:
+ </p>
+ <ul>
+ <li>当设备管理员限制了某项设置时,显示一致的图标或其他用户可见内容(例如上游 AOSP 信息图标)来向用户指明这一点。
+ </li>
+ <li>简短的说明消息,由设备管理员通过 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setShortSupportMessage%28android.content.ComponentName,%20java.lang.CharSequence%29"><code>setShortSupportMessage</code></a> 提供。
+ </li>
+ <li>DPC 应用图标。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h3 id="3_9_2_managed_profile_support">
+3.9.2 受管理个人资料支持
+ </h3>
+ <p>
+如果设备实现声明了 <code>android.software.managed_users</code>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须通过 <code>android.app.admin.DevicePolicyManager</code> API 支持受管理个人资料。
+ </li>
+ <li>[C-1-2] 必须允许且只允许<a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_PROVISION_MANAGED_PROFILE">创建一个受管理个人资料</a>。
+ </li>
+ <li>[C-1-3] 必须使用图标标记(类似于 AOSP 上游工作标记)来表示受管理应用和微件以及其他带有标记的界面元素(例如“最近用过”和“通知”)。
+ </li>
+ <li>[C-1-4] 当用户位于受管理个人资料应用中时,必须显示通知图标(类似于 AOSP 上游工作标记)来指明这一点。
+ </li>
+ <li>[C-1-5] 当设备唤醒 (ACTION_USER_PRESENT) 且前台应用在受管理个人资料中时,必须显示消息框来指明用户在受管理个人资料中。
+ </li>
+ <li>[C-1-6] 如果存在受管理个人资料,并且该个人资料已由设备政策控制器启用,则必须在 Intent“选择器”中显示可见方式,以便用户将 Intent 从受管理个人资料转发给主要用户,反之亦然。
+ </li>
+ <li>[C-1-7] 如果存在受管理个人资料,则必须针对主要用户和受管理个人资料提供以下用户权限:
+ <ul>
+ <li>分别计算主要用户和受管理个人资料的耗电量、位置信息、移动数据流量和存储空间使用情况。
+ </li>
+ <li>单独管理安装在主要用户或受管理个人资料中的 VPN 应用。
+ </li>
+ <li>单独管理安装在主要用户或受管理个人资料中的应用。
+ </li>
+ <li>单独管理主要用户或受管理个人资料中的帐号。
+ </li>
+ </ul>
+ </li>
+ <li>[C-1-8] 如果设备政策控制器允许,必须确保预安装的拨号器、通讯录和消息应用可以搜索和查询受管理个人资料(如果存在)以及主要个人资料中的来电者信息。
+ </li>
+ <li>[C-1-9] 必须确保满足适用于启用了多位用户的设备的所有安全性要求(请参阅<a href="#9_5_multi-user_support">第 9.5 节</a>),虽然除了主要用户之外,受管理个人资料不算作其他用户。
+ </li>
+ <li>[C-1-10] 必须支持指定满足以下要求的单独锁定屏幕,以便向在受管理个人资料中运行的应用授予访问权限。
+ <ul>
+ <li>设备实现必须能够遵从 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#ACTION_SET_NEW_PASSWORD"><code>DevicePolicyManager.ACTION_SET_NEW_PASSWORD</code></a> Intent 显示一个界面,以便用户为受管理个人资料配置单独的锁定屏幕凭据。
+ </li>
+ <li>受管理个人资料的锁定屏幕凭据必须使用与父级个人资料相同的凭据存储和管理机制,如 <a href="http://source.android.com/security/authentication/index.html">Android 开源项目网站</a>上所述。
+ </li>
+ <li>除非在通过 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#getParentProfileInstance%28android.content.ComponentName%29">getParentProfileInstance</a> 返回的 <code>DevicePolicyManager</code> 实例上被调用,否则 DPC <a href="https://developer.android.com/guide/topics/admin/device-admin.html#pwd">密码政策</a>必须仅适用于受管理个人资料的锁定屏幕凭据。
+ </li>
+ </ul>
+ </li>
+ <li>当受管理个人资料中的联系人信息显示在预安装的通话记录、通话界面、进行中和未接来电通知、通讯录和消息应用中时,它们应带有用于表示受管理个人资料应用的相同标记。
+ </li>
+ </ul>
+ <h3 id="3_10_accessibility">
+3.10. 无障碍服务
+ </h3>
+ <p>
+Android 提供了一个无障碍服务层,以便残障用户更轻松地在其设备上进行导航。此外,Android 还提供了一些相应的平台 API,以便无障碍服务实现接收针对用户和系统事件的回调并生成备用反馈机制,例如文字转语音、触感,以及轨迹球/方向键导航。
+ </p>
+ <p>
+如果设备实现支持第三方无障碍服务,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须提供 Android 无障碍服务框架(如<a href="http://developer.android.com/reference/android/view/accessibility/package-summary.html">无障碍服务 API</a> SDK 文档中所述)的实现。
+ </li>
+ <li>[C-1-2] 必须生成无障碍事件,并将相应的 <code>AccessibilityEvent</code> 提交到所有已注册的 <a href="http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html"><code>AccessibilityService</code></a> 实现(如 SDK 中所述)。
+ </li>
+ <li>[C-1-3] 必须能够遵从 <code>android.settings.ACCESSIBILITY_SETTINGS</code> Intent 提供一种可供用户使用的机制,以便他们启用和停用第三方无障碍服务以及预加载的无障碍服务。
+ </li>
+ <li>[C-1-4] 如果已启用的无障碍服务声明了 <a href="https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo.html#FLAG%5FREQUEST%5FACCESSIBILITY%5FBUTTON"><code>AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON</code></a>,则必须在系统的导航栏中添加一个可让用户控制无障碍服务的按钮。请注意,该要求不适用于没有系统导航栏的设备实现,但设备实现应为用户提供一种用于控制这些无障碍服务的方式。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含预加载的无障碍服务,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 如果数据存储采用文件级加密 (FBE) 方式进行加密,则必须将这些预加载的无障碍服务实现为 [直接启动感知型] 服务 (https://developer.android.com/reference/android/content/pm/ComponentInfo.html#directBootAware)。
+ </li>
+ <li>应在开箱设置流程中提供一种可让用户启用相关无障碍服务的机制,以及用于调整字体大小、显示区域大小和放大手势的选项。
+ </li>
+ </ul>
+ <h3 id="3_11_text-to-speech">
+3.11. 文字转语音
+ </h3>
+ <p>
+Android 包含一些可让应用使用文字转语音 (TTS) 服务的 API,并允许服务提供商提供 TTS 服务实现。
+ </p>
+ <p>
+如果设备实现报告 android.hardware.audio.output 功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 <a href="http://developer.android.com/reference/android/speech/tts/package-summary.html">Android TTS 框架</a> API。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持安装第三方 TTS 引擎,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须提供一种方式,让用户能够选择在系统级使用的 TTS 引擎。
+ </li>
+ </ul>
+ <h3 id="3_12_tv_input_framework">
+3.12. TV 输入框架
+ </h3>
+ <p>
+<a href="http://source.android.com/devices/tv/index.html">Android TV 输入框架 (TIF)</a> 能够简化向 Android TV 设备传输实时内容的过程。TIF 提供了一个相应的标准 API,以便创建可控制 Android TV 设备的输入模块。
+ </p>
+ <p>
+如果设备实现支持 TIF,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明平台功能 <code>android.software.live_tv</code>。
+ </li>
+ <li>[C-1-2] 必须预加载 TV 应用,并满足<a href="#3_12_tv-input-framework">第 3.12.1 节</a>中所述的所有要求。
+ </li>
+ </ul>
+ <h4 id="3_12_1_tv_app">
+3.12.1. TV 应用
+ </h4>
+ <p>
+如果设备实现支持 TIF:
+ </p>
+ <ul>
+ <li>[C-1-1] TV 应用必须提供用于安装和使用<a href="http://developer.android.com/reference/android/media/tv/TvContract.Channels.html">电视频道</a>的方式,并满足以下要求:
+ </li>
+ </ul>
+ <p>
+声明 <code>android.software.live_tv</code> 功能标记的 Android 设备实现所需的 TV 应用必须满足以下要求:
+ </p>
+ <ul>
+ <li>设备实现应允许安装和管理基于 TIF 的第三方输入法(<a href="https://source.android.com/devices/tv/index.html#third-party_input_example">第三方输入法</a>)。
+ </li>
+ <li>设备实现可以在外观上区分预安装的<a href="https://source.android.com/devices/tv/index.html#tv_inputs">基于 TIF 的输入法</a>(已安装的输入法)和第三方输入法。
+ </li>
+ <li>设备实现应将第三方输入法显示在距离 TV 应用不超过一个导航操作的位置(例如从 TV 应用展开第三方输入法列表)。
+ </li>
+ </ul>
+ <p>
+Android 开源项目提供了一个满足上述要求的 TV 应用实现。
+ </p>
+ <h5 id="3_12_1_1_electronic_program_guide">
+3.12.1.1. 电子收视指南
+ </h5>
+ <p>
+如果设备实现支持 TIF,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须显示一个提供信息的互动叠加层,其中必须包含根据 <a href="https://developer.android.com/reference/android/media/tv/TvContract.Programs.html">TvContract.Programs</a> 字段中的值生成的电子收视指南 (EPG)。
+ </li>
+ <li>[C-1-2] 更换频道时,设备实现必须显示当前正在播放的节目的 EPG 数据。
+ </li>
+ <li>[SR] 强烈建议 EPG 以同等的突出程度显示已安装的输入法和第三方输入法。EPG 应将第三方输入法显示在距离 EPG 中的已安装输入法不超过一个导航操作的位置。
+
+</li>
+ <li>EPG 应显示来自所有已安装输入法和第三方输入法的信息。
+ </li>
+ <li>EPG 可以在外观上区分已安装的输入法和第三方输入法。
+ </li>
+ </ul>
+ <h5 id="3_12_1_2_navigation">
+3.12.1.2. 导航
+ </h5>
+ <p>
+如果设备实现支持 TIF,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须允许通过 Android TV 设备的输入设备(例如遥控器、遥控器应用或游戏控制器)上提供的方向键、“返回”键和“主屏幕”键进行以下操作:
+ </p>
+ <ul>
+ <li>更换电视频道
+ </li>
+ <li>打开 EPG
+ </li>
+ <li>配置和微调基于 TIF 的第三方输入法
+ </li>
+ <li>打开“设置”菜单
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+应通过 CEC 将按键事件传递到 HDMI 输入。
+ </p>
+ </li>
+ </ul>
+ <h5 id="3_12_1_3_tv_input_app_linking">
+3.12.1.3. TV 输入应用链接
+ </h5>
+ <p>
+如果设备实现支持 TIF,则:
+ </p>
+ <ul>
+ <li>[C-1-1] Android TV 设备实现必须支持 <a href="http://developer.android.com/reference/android/media/tv/TvContract.Channels.html#COLUMN_APP_LINK_INTENT_URI">TV 输入应用链接</a>,以便所有输入法都提供从当前 Activity 到其他 Activity 的 Activity 链接(例如从直播节目到相关内容的链接)。
+ </li>
+ <li>[C-1-2] 如果提供了 TV 输入应用链接,则 TV 应用必须显示该链接。
+ </li>
+ </ul>
+ <h5 id="3_12_1_4_time_shifting">
+3.12.1.4. 时移
+ </h5>
+ <p>
+如果设备实现支持 TIF,则:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议支持时移,以便用户暂停和恢复播放实时内容。
+ </li>
+ <li>应为用户提供一种方式,让他们能够暂停和恢复播放当前正在播放的节目(如果<a href="https://developer.android.com/reference/android/media/tv/TvInputManager.html#TIME_SHIFT_STATUS_AVAILABLE">可以</a>对相应节目使用时移功能的话)。
+ </li>
+ </ul>
+ <h5 id="3_12_1_5_tv_recording">
+3.12.1.5. TV 录制
+ </h5>
+ <p>
+如果设备实现支持 TIF,则:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议支持 TV 录制。
+ </li>
+ <li>
+ <p>
+如果 TV 输入法支持录制功能,并且录制节目没有<a href="https://developer.android.com/reference/android/media/tv/TvContract.Programs.html#COLUMN_RECORDING_PROHIBITED">被禁止</a>,则 EPG 可以提供<a href="https://developer.android.com/reference/android/media/tv/TvInputInfo.html#canRecord%28%29">录制节目</a>的方式。
+ </p>
+ </li>
+ <li>
+ <p>
+应提供一个界面来播放录制的节目。
+ </p>
+ </li>
+ </ul>
+ <h3 id="3_13_quick_settings">
+3.13. 快捷设置
+ </h3>
+ <p>
+Android 提供了一个“快捷设置”界面组件供用户快速进行频繁执行或急需执行的操作。
+ </p>
+ <p>
+如果设备实现包含“快捷设置”界面组件,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须允许用户添加或移除第三方应用通过 <a href="https://developer.android.com/reference/android/service/quicksettings/package-summary.html"><code>quicksettings</code></a> API 提供的设置项。
+ </li>
+ <li>[C-1-2] 不得自动将来自第三方应用的设置项直接添加到快捷设置中。
+ </li>
+ <li>[C-1-3] 必须随同系统提供的快捷设置项一起显示由用户添加的来自第三方应用的所有设置项。
+ </li>
+ </ul>
+ <h3 id="3_14_media_ui">
+3.14. 媒体界面
+ </h3>
+ <p>
+如果设备实现包含界面框架,并且该框架支持依赖于 <a href="http://developer.android.com/reference/android/media/browse/MediaBrowser.html"><code>MediaBrowser</code></a> 和 <a href="http://developer.android.com/reference/android/media/session/MediaSession.html"><code>MediaSession</code></a> 的第三方应用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须照原样显示 <a href="http://developer.android.com/reference/android/media/browse/MediaBrowser.MediaItem.html">MediaItem</a> 图标和通知。
+ </li>
+ <li>[C-1-2] 必须按照 MediaSession 所述显示这些内容,例如元数据、图标、图像。
+ </li>
+ <li>[C-1-3] 必须显示应用标题。
+ </li>
+ <li>[C-1-4] 必须有用于呈现 <a href="http://developer.android.com/reference/android/media/browse/MediaBrowser.html">MediaBrowser</a> 层次结构的抽屉式导航栏。
+ </li>
+ </ul>
+ <h3 id="3_15_instant_apps">
+3.15. 免安装应用
+ </h3>
+ <p>
+设备实现必须满足以下要求:
+ </p>
+ <ul>
+ <li>[C-0-1] 对于免安装应用,只能向其授予将 <a href="https://developer.android.com/guide/topics/manifest/permission-element.html#plevel"><code>android:protectionLevel</code></a> 设为 <code>"ephemeral"</code> 的权限。
+ </li>
+ <li>[C-0-2] 免安装应用不得通过<a href="https://developer.android.com/reference/android/content/Intent.html">隐式 Intent</a> 与已安装的应用交互,除非以下某项为 true:
+ <ul>
+ <li>组件的 Intent 模式过滤器已公开,并且具有 CATEGORY_BROWSABLE
+ </li>
+ <li>操作是 ACTION_SEND、ACTION_SENDTO 或 ACTION_SEND_MULTIPLE
+ </li>
+ <li>目标已通过 <a href="https://developer.android.com/reference/android/R.attr.html#visibleToInstantApps">android:visibleToInstantApps</a> 明确公开
+ </li>
+ </ul>
+ </li>
+ <li>[C-0-3] 免安装应用不得与已安装的应用明确交互,除非相应组件已通过 android:visibleToInstantApps 公开。
+ </li>
+ <li>[C-0-4] 已安装的应用不得查看关于设备上免安装应用的详细信息,除非免安装应用明确关联到已安装的应用。
+ </li>
+ </ul>
+ <h3 id="3_16_companion_device_pairing">
+3.16. 配套设备配对
+ </h3>
+ <p>
+Android 支持配套设备配对,以便更有效地管理与配套设备的关联,并且提供了可让应用使用该功能的 <a href="https://developer.android.com/reference/android/companion/CompanionDeviceManager.html"><code>CompanionDeviceManager</code></a> API。
+ </p>
+ <p>
+如果设备实现支持配套设备配对功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明 <a href="https://developer.android.com/reference/android/content/pm/PackageManager.html?#FEATURE_COMPANION_DEVICE_SETUP"><code>FEATURE_COMPANION_DEVICE_SETUP</code></a> 功能标记。
+ </li>
+ <li>[C-1-2] 必须确保完整实现 <a href="https://developer.android.com/reference/android/companion/package-summary.html"><code>android.companion</code></a> 软件包内的 API。
+ </li>
+ <li>[C-1-3] 必须提供一种方式,让用户能够选择/确认配套设备是否存在以及是否能够正常运作。
+ </li>
+ </ul>
+ <h2 id="4_application_packaging_compatibility">
+4. 应用打包兼容性
+ </h2>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须能够安装和运行由<a href="http://developer.android.com/tools/help/index.html">官方 Android SDK</a> 中包含的“aapt”工具生成的 Android“.apk”文件。
+ </li>
+ <li>由于上述要求可能不太容易达到,因此建议设备实现使用 AOSP 参考实现中的软件包管理 systemDevice 实现。
+ </li>
+ <li>[C-0-2] 必须支持使用 <a href="https://source.android.com/security/apksigning/v2.html">APK 签名方案 v2</a> 和 <a href="https://source.android.com/security/apksigning/v2.html#v1-verification">JAR 签名</a>验证“.apk”文件。
+ </li>
+ <li>[C-0-3] 扩展 <a href="http://developer.android.com/guide/components/fundamentals.html">.apk</a>、<a href="http://developer.android.com/guide/topics/manifest/manifest-intro.html">Android 清单</a>、<a href="https://android.googlesource.com/platform/dalvik/">Dalvik 字节码</a>或 RenderScript 字节码格式时,采用的方式不得导致相应文件无法在其他与 Android 兼容的设备上正确安装和运行。
+ </li>
+ <li>[C-0-4] 不得允许应用(软件包的当前“录制安装程序”除外)在没有任何提示的情况下静默卸载应用,如 SDK 中关于 <a href="https://developer.android.com/reference/android/Manifest.permission.html#DELETE_PACKAGES"><code>DELETE_PACKAGE</code></a> 权限的部分所述。仅有的两个例外应用是:负责处理 <a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_NEEDS_VERIFICATION">PACKAGE_NEEDS_VERIFICATION</a> Intent 的系统软件包验证程序应用,和负责处理 <a href="https://developer.android.com/reference/android/os/storage/StorageManager.html#ACTION_MANAGE_STORAGE">ACTION_MANAGE_STORAGE</a> Intent 的存储管理器应用。
+ </li>
+ </ul>
+ <p>
+除非<a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_INSTALL_PACKAGE">提出安装请求</a>的应用满足以下所有要求,否则设备实现不得安装来自未知来源的应用包:
+ </p>
+ <ul>
+ <li>必须声明 <a href="http://developer.android.com/reference/android/Manifest.permission.html#REQUEST_INSTALL_PACKAGES"><code>REQUEST_INSTALL_PACKAGES</code></a> 权限或将 <code>android:targetSdkVersion</code> 设为 24 或更低。
+ </li>
+ <li>必须已获得用户授权,能够安装来自未知来源的应用。
+ </li>
+ </ul>
+ <p>
+设备实现必须有负责处理 <a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_MANAGE_UNKNOWN_APP_SOURCES"><code>android.settings.MANAGE_UNKNOWN_APP_SOURCES</code></a> Intent 的 Activity。此外,设备实现应提供一种方式,让用户能够按应用授予/撤消安装未知来源的应用的权限;但如果设备实现不希望为用户提供这种选择,则可以选择将该功能实现为空操作,并针对 <a href="http://developer.android.com/reference/android/app/Activity.html#startActivityForResult%28android.content.Intent,%20int%29"><code>startActivityForResult()</code></a> 返回 <code>RESULT_CANCELED</code>。不过,即使在这种情况下,设备实现也应向用户表明为什么没有提供这种选择。
+ </p>
+ <h2 id="5_multimedia_compatibility">
+5. 多媒体兼容性
+ </h2>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须支持<a href="#5_1_media-codecs.md">第 5.1 节</a>中针对通过 <code>MediaCodecList</code> 声明的每种编解码器定义的媒体格式、编码器、解码器、文件类型和容器格式。
+ </li>
+ <li>[C-0-2] 必须通过 <a href="http://developer.android.com/reference/android/media/MediaCodecList.html"><code>MediaCodecList</code></a> 声明并报告支持可供第三方应用使用的编码器和解码器。
+ </li>
+ <li>[C-0-3] 必须能够解码,并向第三方应用通告它可以解码的所有格式。其中包括其编码器生成的所有比特流,以及其 <a href="http://developer.android.com/reference/android/media/CamcorderProfile.html"><code>CamcorderProfile</code></a> 中报告的配置。
+ </li>
+ </ul>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应力争最大限度地缩短编解码器延迟,也就是说,它们
+ <ul>
+ <li>不应使用和存储输入缓存,而应在处理之后将其返回。
+ </li>
+ <li>持有已解码缓存的时间不应超过相应标准(例如 SPS)指定的时间。
+ </li>
+ <li>持有已编码缓存的时间不应超过 GOP 结构所要求的时间。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+在 Android 开源项目提供的首选 Android 实现中,以下部分中列出的所有编解码器均作为软件实现提供。
+ </p>
+ <p>
+请注意,Google 和开放手机联盟 (Open Handset Alliance) 均未做过任何关于这些编解码器中没有第三方专利的声明。打算在硬件或软件产品中使用该源代码的用户请注意,实现该代码(包括在开放源代码软件或共享软件中实现)可能需要获得相关专利持有者的专利许可。
+ </p>
+ <h3 id="5_1_media_codecs">
+5.1. 媒体编解码器
+ </h3>
+ <h4 id="5_1_1_audio_encoding">
+5.1.1. 音频编码
+ </h4>
+ <p>
+有关详情,请参阅 <a href="#5_1_3_audio_codecs_details">5.1.3. 音频编解码器详细信息</a>。
+ </p>
+ <p>
+如果设备实现声明了 <code>android.hardware.microphone</code>,则必须支持以下音频编码:
+ </p>
+ <ul>
+ <li>[C-1-1] PCM/WAVE
+ </li>
+ </ul>
+ <h4 id="5_1_2_audio_decoding">
+5.1.2. 音频解码
+ </h4>
+ <p>
+有关详情,请参阅 <a href="#5_1_3_audio_codecs_details">5.1.3. 音频编解码器详细信息</a>。
+ </p>
+ <p>
+如果设备实现声明支持 <code>android.hardware.audio.output</code> 功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] MPEG-4 AAC Profile (AAC LC)
+ </li>
+ <li>[C-1-2] MPEG-4 HE AAC Profile (AAC+)
+ </li>
+ <li>[C-1-3] MPEG-4 HE AACv2 Profile(增强型 AAC+)
+ </li>
+ <li>[C-1-4] AAC ELD(增强型低延迟 AAC)
+ </li>
+ <li>[C-1-5] FLAC
+ </li>
+ <li>[C-1-6] MP3
+ </li>
+ <li>[C-1-7] MIDI
+ </li>
+ <li>[C-1-8] Vorbis
+ </li>
+ <li>[C-1-9] PCM/WAVE
+ </li>
+ <li>[C-1-10] Opus
+ </li>
+ </ul>
+ <p>
+如果设备实现支持通过 <code>android.media.MediaCodec</code> API 中的默认 AAC 音频解码器将多声道音频流(即超过两个声道)的 AAC 输入缓存解码为 PCM,则必须支持以下各项:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须在不缩混的情况下进行解码(例如必须将 5.0 AAC 音频流解码为五声道 PCM,必须将 5.1 AAC 音频流解码为六声道 PCM)。
+ </li>
+ <li>[C-2-2] 动态范围元数据以及用于为音频解码器配置动态范围相关行为的 <code>android.media.MediaFormat</code> DRC 键必须符合 ISO/IEC 14496-3 中“动态范围控制 (DRC)”部分的定义。这些 AAC DRC 键是在 API 21 中引入的,分别为:KEY_AAC_DRC_ATTENUATION_FACTOR、KEY_AAC_DRC_BOOST_FACTOR、KEY_AAC_DRC_HEAVY_COMPRESSION、KEY_AAC_DRC_TARGET_REFERENCE_LEVEL 和 KEY_AAC_ENCODED_TARGET_LEVEL
+ </li>
+ </ul>
+ <h4 id="5_1_3_audio_codecs_details">
+5.1.3. 音频编解码器详细信息
+ </h4>
+ <table>
+ <tbody><tr>
+ <th>
+格式/编解码器
+ </th>
+ <th>
+详细信息
+ </th>
+ <th>
+支持的文件类型/容器格式
+ </th>
+ </tr>
+ <tr>
+ <td>
+MPEG-4 AAC Profile<br />
+(AAC LC)
+ </td>
+ <td>
+支持单声道/立体声/5.0/5.1 内容,标准采样率为 8-48 kHz。
+ </td>
+ <td>
+ <ul>
+ <li class="table_list">3GPP (.3gp)
+ </li>
+ <li class="table_list">MPEG-4(.mp4、.m4a)
+ </li>
+ <li class="table_list">ADTS 原始 AAC(不支持 .aac、ADIF)
+ </li>
+ <li class="table_list">MPEG-TS(.ts,不可查找)
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+MPEG-4 HE AAC Profile (AAC+)
+ </td>
+ <td>
+支持单声道/立体声/5.0/5.1 内容,标准采样率为 16-48 kHz。
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+MPEG-4 HE AACv2<br />
+Profile(增强型 AAC+)
+ </td>
+ <td>
+支持单声道/立体声/5.0/5.1 内容,标准采样率为 16-48 kHz。
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+AAC ELD(增强型低延迟 AAC)
+ </td>
+ <td>支持单声道/立体声内容,标准采样率为 16-48 kHz。
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+AMR-NB
+ </td>
+ <td>
+4.75-12.2 kbps,采样率为 8 kHz
+ </td>
+ <td>
+3GPP (.3gp)
+ </td>
+ </tr>
+ <tr>
+ <td>
+AMR-WB
+ </td>
+ <td>
+有 9 个比特率(介于 6.60-23.85 kbit/s 之间)可供选择,采样率为 16 kHz
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>
+FLAC
+ </td>
+ <td>
+单声道/立体声(非多声道)。采样率最高可达 48 kHz(但对于输出为 44.1 kHz 的设备,则建议最高不超过 44.1 kHz,因为 48-44.1 kHz 的降采样器不包含低通滤波器)。建议使用 16 位;对于 24 位,不会应用任何抖动。
+ </td>
+ <td>
+仅支持 FLAC (.flac)
+ </td>
+ </tr>
+ <tr>
+ <td>
+MP3
+ </td>
+ <td>
+单声道/立体声 8-320 Kbps 恒定 (CBR) 或可变比特率 (VBR)
+ </td>
+ <td>
+MP3 (.mp3)
+ </td>
+ </tr>
+ <tr>
+ <td>
+MIDI
+ </td>
+ <td>
+MIDI 类型为 0 和 1。DLS 版本为 1 和 2。XMF 和 Mobile XMF。支持铃声格式 RTTTL/RTX、OTA 和 iMelody
+ </td>
+ <td>
+ <ul>
+ <li class="table_list">类型 0 和 1(.mid、.xmf、.mxmf)
+ </li>
+ <li class="table_list">RTTTL/RTX(.rtttl、.rtx)
+ </li>
+ <li class="table_list">OTA (.ota)
+ </li>
+ <li class="table_list">iMelody (.imy)
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+Vorbis
+ </td>
+ <td></td>
+ <td>
+ <ul>
+ <li class="table_list">Ogg (.ogg)
+ </li>
+ <li class="table_list">Matroska(.mkv、Android 4.0+)
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+PCM/WAVE
+ </td>
+ <td>
+16 位线性 PCM(比特率最高可达到硬件上限)。设备必须支持以 8000、11025、16000 和 44100 Hz 频率录制原始 PCM 所需的采样率。
+ </td>
+ <td>
+WAVE (.wav)
+ </td>
+ </tr>
+ <tr>
+ <td>
+Opus
+ </td>
+ <td></td>
+ <td>
+Matroska (.mkv)、Ogg (.ogg)
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="5_1_4_image_encoding">
+5.1.4. 图像编码
+ </h4>
+ <p>
+有关详情,请参阅 <a href="#5_1_6_image_codecs_details">5.1.6. 图像编解码器详细信息</a>。
+ </p>
+ <p>
+设备实现必须支持以下图像编码:
+ </p>
+ <ul>
+ <li>[C-0-1] JPEG
+ </li>
+ <li>[C-0-2] PNG
+ </li>
+ <li>[C-0-3] WebP
+ </li>
+ </ul>
+ <h4 id="5_1_5_image_decoding">
+5.1.5. 图像解码
+ </h4>
+ <p>
+有关详情,请参阅 <a href="#5_1_6_image_codecs_details">5.1.6. 图像编解码器详细信息</a>。
+ </p>
+ <p>
+设备实现必须支持以下图像解码:
+ </p>
+ <ul>
+ <li>[C-0-1] JPEG
+ </li>
+ <li>[C-0-2] GIF
+ </li>
+ <li>[C-0-3] PNG
+ </li>
+ <li>[C-0-4] BMP
+ </li>
+ <li>[C-0-5] WebP
+ </li>
+ <li>[C-0-6] Raw
+ </li>
+ </ul>
+ <h4 id="5_1_6_image_codecs_details">
+5.1.6. 图像编解码器详细信息
+ </h4>
+ <table>
+ <tbody><tr>
+ <th>
+格式/编解码器
+ </th>
+ <th>
+详细信息
+ </th>
+ <th>
+支持的文件类型/容器格式
+ </th>
+ </tr>
+ <tr>
+ <td>
+JPEG
+ </td>
+ <td>
+基本式 + 渐进式
+ </td>
+ <td>
+JPEG (.jpg)
+ </td>
+ </tr>
+ <tr>
+ <td>
+GIF
+ </td>
+ <td></td>
+ <td>
+GIF (.gif)
+ </td>
+ </tr>
+ <tr>
+ <td>
+PNG
+ </td>
+ <td></td>
+ <td>
+PNG (.png)
+ </td>
+ </tr>
+ <tr>
+ <td>
+BMP
+ </td>
+ <td></td>
+ <td>
+BMP (.bmp)
+ </td>
+ </tr>
+ <tr>
+ <td>
+WebP
+ </td>
+ <td></td>
+ <td>
+WebP (.webp)
+ </td>
+ </tr>
+ <tr>
+ <td>
+Raw
+ </td>
+ <td></td>
+ <td>
+ARW (.arw)、CR2 (.cr2)、DNG (.dng)、NEF (.nef)、NRW (.nrw)、ORF (.orf)、PEF (.pef)、RAF (.raf)、RW2 (.rw2)、SRW (.srw)
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="5_1_7_video_codecs">
+5.1.7. 视频编解码器
+ </h4>
+ <ul>
+ <li>为了使网络视频流和视频会议服务的质量达到可接受的水平,设备实现应使用满足<a href="http://www.webmproject.org/hardware/rtc-coding-requirements/">要求</a>的硬件 VP8 编解码器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含视频解码器或编码器,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 视频编解码器必须支持符合以下条件的输出和输入字节缓冲区大小:能够容纳相应标准和配置规定的最大可行压缩帧和未压缩帧,并且不会过度分配。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-2] 视频编码器和解码器必须支持 YUV420 灵活颜色格式 (COLOR_FormatYUV420Flexible)。
+ </p>
+ </li>
+ </ul>
+ <p>
+如果设备实现通过 <a href="https://developer.android.com/reference/android/view/Display.HdrCapabilities.html"><code>Display.HdrCapabilities</code></a> 通告支持 HDR 配置,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持解析和处理 HDR 静态元数据。
+ </li>
+ </ul>
+ <p>
+如果设备实现通过 <a href="https://developer.android.com/reference/android/media/MediaCodecInfo.CodecCapabilities.html#FEATURE_IntraRefresh"><code>MediaCodecInfo.CodecCapabilities</code></a> 类中的 <code>FEATURE_IntraRefresh</code> 通告支持帧内刷新,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须支持介于 10-60 帧的刷新周期,并且必须在配置的刷新周期的 20% 内准确运行。
+ </li>
+ </ul>
+ <h4 id="5_1_8_video_codecs_list">
+5.1.8. 视频编解码器列表
+ </h4>
+ <table>
+ <tbody><tr>
+ <th>
+格式/编解码器
+ </th>
+ <th>
+详细信息
+ </th>
+ <th>
+支持的文件类型/<br />
+容器格式
+ </th>
+ </tr>
+ <tr>
+ <td>
+H.263
+ </td>
+ <td></td>
+ <td>
+ <ul>
+ <li class="table_list">3GPP (.3gp)
+ </li>
+ <li class="table_list">MPEG-4 (.mp4)
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+H.264 AVC
+ </td>
+ <td>
+有关详情,请参阅<a href="#5_2_video_encoding">第 5.2 节</a>和<a href="#5_3_video_decoding">第 5.3 节</a>
+ </td>
+ <td>
+ <ul>
+ <li class="table_list">3GPP (.3gp)
+ </li>
+ <li class="table_list">MPEG-4 (.mp4)
+ </li>
+ <li class="table_list">MPEG-2 TS(.ts,仅限 AAC 音频,不可查找,Android 3.0+)
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+H.265 HEVC
+ </td>
+ <td>
+有关详情,请参阅<a href="#5_3_video_decoding">第 5.3 节</a>
+ </td>
+ <td>
+MPEG-4 (.mp4)
+ </td>
+ </tr>
+ <tr>
+ <td>
+MPEG-2
+ </td>
+ <td>
+Main Profile
+ </td>
+ <td>
+MPEG2-TS
+ </td>
+ </tr>
+ <tr>
+ <td>
+MPEG-4 SP
+ </td>
+ <td></td>
+ <td>
+3GPP (.3gp)
+ </td>
+ </tr>
+ <tr>
+ <td>
+VP8
+ </td>
+ <td>
+有关详情,请参阅<a href="#5_2_video_encoding">第 5.2 节</a>和<a href="#5_3_video_decoding">第 5.3 节</a>
+ </td>
+ <td>
+ <ul>
+ <li class="table_list">
+ <a href="http://www.webmproject.org/">WebM (.webm)</a>
+ </li>
+ <li class="table_list">Matroska (.mkv)
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+VP9
+ </td>
+ <td>
+有关详情,请参阅<a href="#5_3_video_decoding">第 5.3 节</a>
+ </td>
+ <td>
+ <ul>
+ <li class="table_list">
+ <a href="http://www.webmproject.org/">WebM (.webm)</a>
+ </li>
+ <li class="table_list">Matroska (.mkv)
+ </li>
+ </ul>
+ </td>
+ </tr>
+ </tbody></table>
+ <h3 id="5_2_video_encoding">
+5.2. 视频编码
+ </h3>
+ <p>
+如果设备实现支持任何视频编码器,并使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>采用两个滑窗时,比帧内 (I-frame) 间隔之间的比特率高出的幅度不应超过 15% 左右。
+ </li>
+ <li>比采用一个 1 秒的滑窗时的比特率高出的幅度不应超过 100% 左右。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含对角线长度至少为 2.5 英寸的嵌入式显示屏,或包含视频输出端口,或通过 <code>android.hardware.camera.any</code> 功能标记声明支持摄像头,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持至少一个 VP8 或 H.264 视频编码器,并使其可供第三方应用使用。
+ </li>
+ <li>应同时支持 VP8 和 H.264 视频编码器,并使其可供第三方应用使用。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 H.264、VP8、VP9 或 HEVC 视频编码器中的任何一个,并使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持可动态配置的比特率。
+ </li>
+ <li>应支持可变帧速率,在这种情况下,视频编码器应根据输入缓存的时间戳来确定瞬时帧时长,并根据该时长来分配其位存储分区。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 MPEG-4 SP 视频编码器,并使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>应针对支持的编码器支持可动态配置的比特率。
+ </li>
+ </ul>
+ <h4 id="5_2_1_h_263">
+5.2.1. H.263
+ </h4>
+ <p>
+如果设备实现支持 H.263 编码器,并使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 Baseline Profile Level 45。
+ </li>
+ <li>应针对支持的编码器支持可动态配置的比特率。
+ </li>
+ </ul>
+ <h4 id="5_2_2_h-264">
+5.2.2. H-264
+ </h4>
+ <p>
+如果设备实现支持 H.264 编解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 Baseline Profile Level 3。不过,可以选择是否支持 ASO(任意切片顺序)、FMO(灵活宏块顺序)和 RS(冗切片)。此外,为了保持与其他 Android 设备兼容,对于 Baseline Profile,建议编码器不要使用 ASO、FMO 和 RS。
+ </li>
+ <li>[C-1-2] 必须支持下表中的标清视频编码配置。
+ </li>
+ <li>应支持 Main Profile Level 4。
+ </li>
+ <li>应支持下表中所列的高清视频编码配置。
+ </li>
+ </ul>
+ <p>
+如果设备实现通过媒体 API 报告支持对分辨率为 720p 或 1080p 的视频进行 H.264 编码,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持下表中的编码配置。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th></th>
+ <th>
+标清(低画质)
+ </th>
+ <th>
+标清(高画质)
+ </th>
+ <th>
+高清 720p
+ </th>
+ <th>
+高清 1080p
+ </th>
+ </tr>
+ <tr>
+ <th>
+视频分辨率
+ </th>
+ <td>
+320 x 240 像素
+ </td>
+ <td>
+720 x 480 像素
+ </td>
+ <td>
+1280 x 720 像素
+ </td>
+ <td>
+1920 x 1080 像素
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频帧速率
+ </th>
+ <td>
+20 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频比特率
+ </th>
+ <td>
+384 Kbps
+ </td>
+ <td>
+2 Mbps
+ </td>
+ <td>
+4 Mbps
+ </td>
+ <td>
+10 Mbps
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="5_2_3_vp8">
+5.2.3. VP8
+ </h4>
+ <p>
+如果设备实现支持 VP8 编解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持标清视频编码配置。
+ </li>
+ <li>应支持以下高清视频编码配置。
+ </li>
+ <li>应支持写入 Matroska WebM 文件。
+ </li>
+ <li>应使用满足 <a href="http://www.webmproject.org/hardware/rtc-coding-requirements">WebM 项目 RTC 硬件编码要求</a>的硬件 VP8 编解码器,以确保网络视频流和视频会议服务的质量达到可接受的水平。
+ </li>
+ </ul>
+ <p>
+如果设备实现通过媒体 API 报告支持对分辨率为 720p 或 1080p 的视频进行 VP8 编码,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持下表中的编码配置。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th></th>
+ <th>
+标清(低画质)
+ </th>
+ <th>
+标清(高画质)
+ </th>
+ <th>
+高清 720p
+ </th>
+ <th>
+高清 1080p
+ </th>
+ </tr>
+ <tr>
+ <th>
+视频分辨率
+ </th>
+ <td>
+320 x 180 像素
+ </td>
+ <td>
+640 x 360 像素
+ </td>
+ <td>
+1280 x 720 像素
+ </td>
+ <td>
+1920 x 1080 像素
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频帧速率
+ </th>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频比特率
+ </th>
+ <td>
+800 Kbps
+ </td>
+ <td>
+2 Mbps
+ </td>
+ <td>
+4 Mbps
+ </td>
+ <td>
+10 Mbps
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="5_2_4_vp9">
+5.2.4. VP9
+ </h4>
+ <p>
+如果设备实现支持 VP9 编解码器,则:
+ </p>
+ <ul>
+ <li>应支持写入 Matroska WebM 文件。
+ </li>
+ </ul>
+ <h3 id="5_3_video_decoding">
+5.3. 视频解码
+ </h3>
+ <p>
+如果设备实现支持 VP8、VP9、H.264 或 H.265 编解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 对于所有 VP8、VP9、H.264 和 H.265 编解码器,都必须支持通过标准 Android API 在同一视频流内实时进行动态视频分辨率和帧速率切换,并且能够支持设备上每个编解码器所支持的最大分辨率。
+ </li>
+ </ul>
+ <p>
+如果设备实现通过 <a href="https://developer.android.com/reference/android/view/Display.HdrCapabilities.html#HDR_TYPE_DOLBY_VISION"><code>HDR_TYPE_DOLBY_VISION</code></a> 声明支持杜比视界解码器,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须提供具有杜比视界功能的提取器。
+ </li>
+ <li>[C-2-2] 必须在设备屏幕或标准视频输出端口(例如 HDMI)上正确显示杜比视界内容。
+ </li>
+ <li>[C-2-3] 必须将向后兼容的基本层(如果存在)的轨道索引设为与组合式杜比视界层的轨道索引相同。
+ </li>
+ </ul>
+ <h4 id="5_3_1_mpeg-2">
+5.3.1. MPEG-2
+ </h4>
+ <p>
+如果设备实现支持 MPEG-2 解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 Main Profile High Level。
+ </li>
+ </ul>
+ <h4 id="5_3_2_h_263">
+5.3.2. H.263
+ </h4>
+ <p>
+如果设备实现支持 H.263 解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 Baseline Profile Level 30 和 Level 45。
+ </li>
+ </ul>
+ <h4 id="5_3_3_mpeg-4">
+5.3.3. MPEG-4
+ </h4>
+ <p>
+如果设备实现具有 MPEG-4 解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 Simple Profile Level 3。
+ </li>
+ </ul>
+ <h4 id="5_3_4_h_264">
+5.3.4. H.264
+ </h4>
+ <p>
+如果设备实现支持 H.264 解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 Main Profile Level 3.1 和 Baseline Profile。可以选择是否支持 ASO(任意切片顺序)、FMO(灵活宏块顺序)和 RS(冗切片)。
+ </li>
+ <li>[C-1-2] 必须能够对以下视频进行解码:采用下表中所列的标清配置,且使用 Baseline Profile 和 Main Profile Level 3.1(包括 720p30)编码的视频。
+ </li>
+ <li>应能够对采用下表中所列高清配置的视频进行解码。
+ </li>
+ </ul>
+ <p>
+如果 <code>Display.getSupportedModes()</code> 方法报告的高度等于或大于视频分辨率,则设备实现:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持下表中的高清 720p 视频编码配置。
+ </li>
+ <li>[C-2-2] 必须支持下表中的高清 1080p 视频编码配置。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th></th>
+ <th>
+标清(低画质)
+ </th>
+ <th>
+标清(高画质)
+ </th>
+ <th>
+高清 720p
+ </th>
+ <th>
+高清 1080p
+ </th>
+ </tr>
+ <tr>
+ <th>
+视频分辨率
+ </th>
+ <td>
+320 x 240 像素
+ </td>
+ <td>
+720 x 480 像素
+ </td>
+ <td>
+1280 x 720 像素
+ </td>
+ <td>
+1920 x 1080 像素
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频帧速率
+ </th>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+60 fps
+ </td>
+ <td>
+30 fps (60 fps<sup>TV</sup>)
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频比特率
+ </th>
+ <td>
+800 Kbps
+ </td>
+ <td>
+2 Mbps
+ </td>
+ <td>
+8 Mbps
+ </td>
+ <td>
+20 Mbps
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="5_3_5_h_265_(hevc)">
+5.3.5. H.265 (HEVC)
+ </h4>
+ <p>
+如果设备实现支持 H.265 编解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 Main Profile Level 3 Main Tier 和下表中所列的标清视频解码配置。
+ </li>
+ <li>应支持下表中所列的高清解码配置。
+ </li>
+ <li>[C-1-2] 必须支持下表中所列的高清解码配置(如果有硬件解码器的话)。
+ </li>
+ </ul>
+ <p>
+如果 <code>Display.getSupportedModes()</code> 方法报告的高度等于或大于视频分辨率,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 设备实现必须至少支持 720、1080 和超高清配置的 H.265 或 VP9 解码之一。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th></th>
+ <th>
+标清(低画质)
+ </th>
+ <th>
+标清(高画质)
+ </th>
+ <th>
+高清 720p
+ </th>
+ <th>
+高清 1080p
+ </th>
+ <th>
+超高清
+ </th>
+ </tr>
+ <tr>
+ <th>
+视频分辨率
+ </th>
+ <td>
+352 x 288 像素
+ </td>
+ <td>
+720 x 480 像素
+ </td>
+ <td>
+1280 x 720 像素
+ </td>
+ <td>
+1920 x 1080 像素
+ </td>
+ <td>
+3840 x 2160 像素
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频帧速率
+ </th>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30/60 fps(60 fps<sup>采用 H.265 硬件解码的 TV</sup>)
+ </td>
+ <td>
+60 fps
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频比特率
+ </th>
+ <td>
+600 Kbps
+ </td>
+ <td>
+1.6 Mbps
+ </td>
+ <td>
+4 Mbps
+ </td>
+ <td>
+5 Mbps
+ </td>
+ <td>
+20 Mbps
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="5_3_6_vp8">
+5.3.6. VP8
+ </h4>
+ <p>
+如果设备实现支持 VP8 编解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持下表中的标清解码配置。
+ </li>
+ <li>应使用满足<a href title="http://www.webmproject.org/hardware/rtc-coding-requirements/">要求</a>的硬件 VP8 编解码器。
+ </li>
+ <li>应支持下表中的高清解码配置。
+ </li>
+ </ul>
+ <p>
+如果 <code>Display.getSupportedModes()</code> 方法报告的高度等于或大于视频分辨率,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 设备实现必须支持下表中的 720p 配置。
+ </li>
+ <li>[C-2-2] 设备实现必须支持下表中的 1080p 配置。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th></th>
+ <th>
+标清(低画质)
+ </th>
+ <th>
+标清(高画质)
+ </th>
+ <th>
+高清 720p
+ </th>
+ <th>
+高清 1080p
+ </th>
+ </tr>
+ <tr>
+ <th>
+视频分辨率
+ </th>
+ <td>
+320 x 180 像素
+ </td>
+ <td>
+640 x 360 像素
+ </td>
+ <td>
+1280 x 720 像素
+ </td>
+ <td>
+1920 x 1080 像素
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频帧速率
+ </th>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps (60 fps<sup>TV</sup>)
+ </td>
+ <td>
+30 (60 fps<sup>TV</sup>)
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频比特率
+ </th>
+ <td>
+800 Kbps
+ </td>
+ <td>
+2 Mbps
+ </td>
+ <td>
+8 Mbps
+ </td>
+ <td>
+20 Mbps
+ </td>
+ </tr>
+ </tbody></table>
+ <h4 id="5_3_7_vp9">
+5.3.7. VP9
+ </h4>
+ <p>
+如果设备实现支持 VP9 编解码器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持下表中所列的标清视频解码配置。
+ </li>
+ <li>应支持下表中所列的高清解码配置。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 VP9 编解码器和硬件解码器,则:
+ </p>
+ <ul>
+ <li>[C-2-2] 必须支持下表中所列的高清解码配置。
+ </li>
+ </ul>
+ <p>
+如果 <code>Display.getSupportedModes()</code> 方法报告的高度等于或大于视频分辨率,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 设备实现必须至少支持 720、1080 和超高清配置的 VP9 或 H.265 解码之一。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th></th>
+ <th>
+标清(低画质)
+ </th>
+ <th>
+标清(高画质)
+ </th>
+ <th>
+高清 720p
+ </th>
+ <th>
+高清 1080p
+ </th>
+ <th>
+超高清
+ </th>
+ </tr>
+ <tr>
+ <th>
+视频分辨率
+ </th>
+ <td>
+320 x 180 像素
+ </td>
+ <td>
+640 x 360 像素
+ </td>
+ <td>
+1280 x 720 像素
+ </td>
+ <td>
+1920 x 1080 像素
+ </td>
+ <td>
+3840 x 2160 像素
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频帧速率
+ </th>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps
+ </td>
+ <td>
+30 fps(60 fps<sup>采用 VP9 硬件解码的 TV</sup>)
+ </td>
+ <td>
+60 fps
+ </td>
+ </tr>
+ <tr>
+ <th>
+视频比特率
+ </th>
+ <td>
+600 Kbps
+ </td>
+ <td>
+1.6 Mbps
+ </td>
+ <td>
+4 Mbps
+ </td>
+ <td>
+5 Mbps
+ </td>
+ <td>
+20 Mbps
+ </td>
+ </tr>
+ </tbody></table>
+ <h3 id="5_4_audio_recording">
+5.4. 录音
+ </h3>
+ <p>
+虽然从 Android 4.3 开始,本节中所述的一些要求列为了“应”满足的要求,但我们计划在未来版本的兼容性定义中将其更改为“必须”满足的要求。<strong>强烈建议</strong>现有的及新的 Android 设备满足这些列为“应”满足的要求,否则在升级到未来版本后将无法与 Android 兼容。
+ </p>
+ <h4 id="5_4_1_raw_audio_capture">
+5.4.1. 原始音频采集
+ </h4>
+ <p>
+如果设备实现声明了 <code>android.hardware.microphone</code>,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须允许采集具有以下特征的原始音频内容:
+ </p>
+ </li>
+ <li>
+ <p>
+ <strong>格式</strong>:16 位线性 PCM
+ </p>
+ </li>
+ <li>
+ <strong>采样率</strong>:8000、11025、16000、44100 Hz
+ </li>
+ <li>
+ <p>
+ <strong>声道</strong>:单声道
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-2] 必须在不进行升采样的情况下以上述采样率采集音频内容。
+ </p>
+ </li>
+ <li>[C-1-3] 在进行降采样的情况下以上述采样率采集音频内容时,必须包含适当的抗混叠滤波器。
+ </li>
+ <li>
+ <p>
+应允许以 AM 收音机和 DVD 品质采集原始音频内容,即具有以下特征的音频内容:
+ </p>
+ </li>
+ <li>
+ <p>
+ <strong>格式</strong>:16 位线性 PCM
+ </p>
+ </li>
+ <li>
+ <strong>采样率</strong>:22050、48000 Hz
+ </li>
+ <li>
+ <strong>声道</strong>:立体声
+ </li>
+ </ul>
+ <p>
+如果设备实现允许以 AM 收音机和 DVD 品质采集原始音频内容,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须在不进行升采样的情况下以高于 16000:22050 或 44100:48000 的任意采样率采集音频内容。
+ </li>
+ <li>[C-2-2] 对于任何升采样或降采样,必须包含适当的抗混叠滤波器。
+ </li>
+ </ul>
+ <h4 id="5_4_2_capture_for_voice_recognition">
+5.4.2. 采集音频流以进行语音识别
+ </h4>
+ <p>
+如果设备实现声明了 <code>android.hardware.microphone</code>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须以 44100 或 48000 的采样率采集来自 <code>android.media.MediaRecorder.AudioSource.VOICE_RECOGNITION</code> 音频源的音频流。
+ </li>
+ <li>[C-1-2] 在录制来自 <code>AudioSource.VOICE_RECOGNITION</code> 音频源的音频流时,必须默认停用所有降噪音频处理。
+ </li>
+ <li>[C-1-3] 在录制来自 <code>AudioSource.VOICE_RECOGNITION</code> 音频源的音频流时,必须默认停用所有自动增益控制。
+ </li>
+ <li>在录制语音识别音频流时,应保持大致平坦的幅频特性,具体来说就是:±3 dB (100 Hz - 4000 Hz)。
+ </li>
+ <li>在录制语音识别音频流时,应设置适当的输入敏感度,以确保对于 16 位的样本,1000 Hz 的 90 dB 声压级 (SPL) 音频源产生的 RMS 为 2500。
+ </li>
+ <li>在录制语音识别音频流时,如果麦克风上的 SPL 为 90 dB,则 PCM 振幅级应能够线性跟踪输入 SPL 在至少 30 dB(-18 dB 到 +12 dB)范围内的变化。
+ </li>
+ <li>在录制语音识别音频流时,如果麦克风上输入 1 kHz 的 90 dB SPL 声音,则总谐波畸变率应小于 1%。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明了 <code>android.hardware.microphone</code>,并声明了已针对语音识别进行微调的噪声抑制(降噪)技术,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须允许通过 <code>android.media.audiofx.NoiseSuppressor</code> API 控制此音频影响。
+ </li>
+ <li>[C-2-2] 必须通过 <code>AudioEffect.Descriptor.uuid</code> 字段唯一标识每项噪声抑制技术实现。
+ </li>
+ </ul>
+ <h4 id="5_4_3_capture_for_rerouting_of_playback">
+5.4.3. 采集音频流以进行重定向播放
+ </h4>
+ <p>
+<code>android.media.MediaRecorder.AudioSource</code> 类包含 <code>REMOTE_SUBMIX</code> 音频源。
+ </p>
+ <p>
+如果设备实现声明了 <code>android.hardware.audio.output</code> 和 <code>android.hardware.microphone</code>,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须正确实现 <code>REMOTE_SUBMIX</code> 音频源,以便应用使用 <code>android.media.AudioRecord</code> API 录制来自该音频源的音频流时,可以采集除以下内容之外的所有音频流的混音:
+ </p>
+ <ul>
+ <li>
+ <code>AudioManager.STREAM_RING</code>
+ </li>
+ <li>
+ <code>AudioManager.STREAM_ALARM</code>
+ </li>
+ <li>
+ <code>AudioManager.STREAM_NOTIFICATION</code>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h3 id="5_5_audio_playback">
+5.5. 音频播放
+ </h3>
+ <p>
+Android 包含相应的支持,以便应用通过音频输出外围设备(如第 7.8.2 节中定义)播放音频。
+ </p>
+ <h4 id="5_5_1_raw_audio_playback">
+5.5.1. 原始音频播放
+ </h4>
+ <p>
+如果设备实现声明了 <code>android.hardware.audio.output</code>,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须允许播放具有以下特征的原始音频内容:
+ </p>
+ <ul>
+ <li>
+ <strong>格式</strong>:16 位线性 PCM
+ </li>
+ <li>
+ <strong>采样率</strong>:8000、11025、16000、22050、32000、44100
+ </li>
+ <li>
+ <strong>声道</strong>:单声道、立体声
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+应允许播放具有以下特征的原始音频内容:
+ </p>
+ <ul>
+ <li>
+ <strong>采样率</strong>:24000、48000
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h4 id="5_5_2_audio_effects">
+5.5.2. 音效
+ </h4>
+ <p>
+Android 为设备实现提供了<a href="http://developer.android.com/reference/android/media/audiofx/AudioEffect.html">音效 API</a>。
+ </p>
+ <p>
+如果设备实现声明了 <code>android.hardware.audio.output</code> 功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 <code>EFFECT_TYPE_EQUALIZER</code> 和 <code>EFFECT_TYPE_LOUDNESS_ENHANCER</code> 实现(可通过 AudioEffect 子类 <code>Equalizer</code> 和 <code>LoudnessEnhancer</code> 进行控制)。
+ </li>
+ <li>[C-1-2] 必须支持可视化工具 API 实现(可通过 <code>Visualizer</code> 类进行控制)。
+ </li>
+ <li>应支持 <code>EFFECT_TYPE_BASS_BOOST</code>、<code>EFFECT_TYPE_ENV_REVERB</code>、<code>EFFECT_TYPE_PRESET_REVERB</code> 和 <code>EFFECT_TYPE_VIRTUALIZER</code> 实现(可通过 <code>AudioEffect</code> 子类 <code>BassBoost</code>、<code>EnvironmentalReverb</code>、<code>PresetReverb</code> 和 <code>Virtualizer</code> 进行控制)。
+ </li>
+ </ul>
+ <h4 id="5_5_3_audio_output_volume">
+5.5.3. 音频输出音量
+ </h4>
+ <p>
+Automotive 设备实现:
+ </p>
+ <ul>
+ <li>应允许按每个音频流单独调整音频音量(使用通过 <a href title="http://developer.android.com/reference/android/media/AudioAttributes.html">AudioAttributes</a> 定义的内容类型或用法,以及 <code>android.car.CarAudioManager</code> 中公开定义的车载音频系统用法)。
+ </li>
+ </ul>
+ <h3 id="5_6_audio_latency">
+5.6. 音频延迟
+ </h3>
+ <p>
+音频延迟是指音频信号通过系统时的时间延迟。许多类别的应用都依赖非常短的延迟来实现实时音效。
+ </p>
+ <p>
+在本节中,使用以下定义:
+ </p>
+ <ul>
+ <li>
+ <strong>输出延迟</strong>:从应用写入经过 PCM 编码的数据帧到相应声音在设备内置转换器处的环境中播放出来之间的时间间隔,或者从信号通过端口离开设备到可在外部听到相应声音之间的时间间隔。
+ </li>
+ <li>
+ <strong>冷输出延迟</strong>:在收到相应请求之前音频输出系统处于闲置状态且已关闭时,第一帧的输出延迟。
+ </li>
+ <li>
+ <strong>连续输出延迟</strong>:在设备开始播放音频后,后续帧的输出延迟。
+ </li>
+ <li>
+ <strong>输入延迟</strong>:从环境中发出声音到设备内置转换器处的设备捕获到该声音之间的时间间隔,或者从信号通过端口进入设备到应用读取经过 PCM 编码的相应数据帧之间的时间间隔。
+ </li>
+ <li>
+ <strong>丢失输入</strong>:输入信号中不可用或无法捕获到的初始部分。
+ </li>
+ <li>
+ <strong>冷输入延迟</strong>:在收到相应请求之前音频输入系统处于闲置状态且已关闭时,丢失输入的时长与第一帧的输入延迟之和。
+ </li>
+ <li>
+ <strong>连续输入延迟</strong>:当设备采集音频时,后续帧的输入延迟。
+ </li>
+ <li>
+ <strong>冷输出抖动</strong>:冷输出延迟值的单独测量结果之间的变化。
+ </li>
+ <li>
+ <strong>冷输入抖动</strong>:冷输入延迟值的单独测量结果之间的变化。
+ </li>
+ <li>
+ <strong>连续往返延迟</strong>:连续输入延迟、连续输出延迟,再加一个缓冲期的总和。缓冲期可让应用有时间来处理信号,并有时间来降低输入和输出流之间的相位差。
+ </li>
+ <li>
+ <strong>OpenSL ES PCM 缓冲队列 API</strong>:<a href="https://developer.android.com/ndk/index.html">Android NDK</a> 中的一组与 PCM 相关的 <a href="https://developer.android.com/ndk/guides/audio/opensl/index.html">OpenSL ES</a> API。
+ </li>
+ <li>
+ <strong>AAudio 原生音频 API</strong>:<a href="https://developer.android.com/ndk/index.html">Android NDK</a> 中的一组 <a href="https://developer.android.com/ndk/guides/audio/aaudio/aaudio.html">AAudio</a> API。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明了 <code>android.hardware.audio.output</code>,则强烈建议它们满足或超出以下要求:
+ </p>
+ <ul>
+ <li>[SR] 冷输出延迟不超过 100 毫秒
+ </li>
+ <li>[SR] 连续输出延迟不超过 45 毫秒
+ </li>
+ <li>[SR] 最大限度地降低冷输出抖动
+ </li>
+ </ul>
+ <p>
+使用 OpenSL ES PCM 缓冲队列 API 时,如果设备实现在经过任何初始校准后满足了上述要求,则对于在至少一个受支持音频输出设备上的连续输出延迟和冷输出延迟:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议通过声明 <code>android.hardware.audio.low_latency</code> 功能标记报告低延迟音频。
+ </li>
+ <li>[SR] 强烈建议还要通过 AAudio API 满足针对低延迟音频的要求。
+ </li>
+ </ul>
+ <p>
+如果设备实现未通过 OpenSL ES PCM 缓冲队列 API 满足针对低延迟音频的要求,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 不得报告支持低延迟音频。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 <code>android.hardware.microphone</code>,则强烈建议它们满足以下针对输入音频的要求:
+ </p>
+ <ul>
+ <li>[SR] 冷输入延迟不超过 100 毫秒
+ </li>
+ <li>[SR] 连续输入延迟不超过 30 毫秒
+ </li>
+ <li>[SR] 连续往返延迟不超过 50 毫秒
+ </li>
+ <li>[SR] 最大限度地降低冷输入抖动
+ </li>
+ </ul>
+ <h3 id="5_7_network_protocols">
+5.7. 网络协议
+ </h3>
+ <p>
+设备实现必须支持 Android SDK 文档中指定的适用于音频和视频播放的<a href="http://developer.android.com/guide/appendix/media-formats.html">媒体网络协议</a>。
+ </p>
+ <p>
+如果设备实现包含音频或视频解码器,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须通过 HTTP(S) 支持<a href="#5_1_media_codecs">第 5.1 节</a>中列出的所有必须支持的编解码器和容器格式。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-2] 必须通过 <a href="http://tools.ietf.org/html/draft-pantos-http-live-streaming-07">HTTP Live Streaming 草案协议(第 7 版)</a>支持下方“媒体段格式”表中列出的媒体段格式。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-3] 必须支持以下 RTP 音频视频配置以及下方 RTSP 表中的相关编解码器。有关例外情况,请参阅<a href="#5_1_media_codecs">第 5.1 节</a>中的表格脚注。
+ </p>
+ </li>
+ </ul>
+ <p>
+媒体段格式
+ </p>
+ <table>
+ <tbody><tr>
+ <th>
+段格式
+ </th>
+ <th>
+参考
+ </th>
+ <th>
+必须支持的编解码器
+ </th>
+ </tr>
+ <tr id="mp2t">
+ <td>
+MPEG-2 传输流
+ </td>
+ <td>
+ <a href="http://www.iso.org/iso/catalogue_detail?csnumber=44169">ISO 13818</a>
+ </td>
+ <td>
+视频编解码器:
+ <ul>
+ <li class="table_list">H264 AVC
+ </li>
+ <li class="table_list">MPEG-4 SP
+ </li>
+ <li class="table_list">MPEG-2
+ </li>
+ </ul>请参阅<a href="#5_1_3_video_codecs">第 5.1.3 节</a>,了解有关 H264 AVC、MPEG2-4 SP <br />和 MPEG-2 的详细信息。
+ <p>
+音频编解码器:
+ </p>
+ <ul>
+ <li class="table_list">AAC
+ </li>
+ </ul>请参阅<a href="#5_1_1_audio_codecs">第 5.1.1 节</a>,了解有关 AAC 及其变体的详细信息。
+ </td>
+ </tr>
+ <tr>
+ <td>
+采用 ADTS 框架和 ID3 标记的 AAC
+ </td>
+ <td>
+ <a href="http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?csnumber=43345">ISO 13818-7</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_1_audio_codecs">第 5.1.1 节</a>,了解有关 AAC 及其变体的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+WebVTT
+ </td>
+ <td>
+ <a href="http://dev.w3.org/html5/webvtt/">WebVTT</a>
+ </td>
+ <td></td>
+ </tr>
+ </tbody></table>
+ <p>
+RTSP(RTP、SDP)
+ </p>
+ <table>
+ <tbody><tr>
+ <th>
+配置名称
+ </th>
+ <th>
+参考
+ </th>
+ <th>
+必须支持的编解码器
+ </th>
+ </tr>
+ <tr>
+ <td>
+H264 AVC
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc6184">RFC 6184</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_3_video_codecs">第 5.1.3 节</a>,了解有关 H264 AVC 的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+MP4A-LATM
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc6416">RFC 6416</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_1_audio_codecs">第 5.1.1 节</a>,了解有关 AAC 及其变体的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+H263-1998
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc3551">RFC 3551</a><br />
+ <a href="https://tools.ietf.org/html/rfc4629">RFC 4629</a><br />
+ <a href="https://tools.ietf.org/html/rfc2190">RFC 2190</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_3_video_codecs">第 5.1.3 节</a>,了解有关 H263 的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+H263-2000
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc4629">RFC 4629</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_3_video_codecs">第 5.1.3 节</a>,了解有关 H263 的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+AMR
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc4867">RFC 4867</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_1_audio_codecs">第 5.1.1 节</a>,了解有关 AMR-NB 的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+AMR-WB
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc4867">RFC 4867</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_1_audio_codecs">第 5.1.1 节</a>,了解有关 AMR-WB 的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+MP4V-ES
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc6416">RFC 6416</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_3_video_codecs">第 5.1.3 节</a>,了解有关 MPEG-4 SP 的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+mpeg4-generic
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc3640">RFC 3640</a>
+ </td>
+ <td>
+请参阅<a href="#5_1_1_audio_codecs">第 5.1.1 节</a>,了解有关 AAC 及其变体的详细信息
+ </td>
+ </tr>
+ <tr>
+ <td>
+MP2T
+ </td>
+ <td>
+ <a href="https://tools.ietf.org/html/rfc2250">RFC 2250</a>
+ </td>
+ <td>
+请参阅 HTTP Live Streaming 下的 <a href="#mp2t">MPEG-2 传输流</a>,了解相关详细信息
+ </td>
+ </tr>
+ </tbody></table>
+ <h3 id="5_8_secure_media">
+5.8. 安全媒体
+ </h3>
+ <p>如果设备实现支持安全视频输出,并且能够支持安全 Surface,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明支持 <code>Display.FLAG_SECURE</code>。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明支持 <code>Display.FLAG_SECURE</code>,并且支持无线显示协议,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须采用经过加密的强大机制(例如 HDCP 2.x 或更高版本,适用于通过 Miracast 等无线协议连接的显示设备)来保护链接。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明支持 <code>Display.FLAG_SECURE</code>,并且支持采用有线方式连接的外部显示设备,则:
+
+ </p>
+ <ul>
+ <li>[C-3-1] 对于所有采用有线方式连接的外部显示设备,都必须支持 HDCP 1.2 或更高版本。
+ </li>
+ </ul>
+ <h3 id="5_9_musical_instrument_digital_interface_(midi)">
+5.9. 乐器数字接口 (MIDI)
+ </h3>
+ <p>
+如果设备实现支持应用间 MIDI 软件传输(虚拟 MIDI 设备),并且支持 MIDI 采用以下所有支持 MIDI 的硬件传输方式(设备实现会为此类传输提供常规非 MIDI 连接)则:<em></em>
+ </p>
+ <ul>
+ <li>[SR] 强烈建议通过 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">android.content.pm.PackageManager</a> 类报告支持 android.software.midi 功能。
+ </li>
+ </ul>
+ <p>
+支持 MIDI 的硬件传输方式包括:
+ </p>
+ <ul>
+ <li>USB 主机模式(第 7.7 节:USB)
+ </li>
+ <li>USB 外围设备模式(第 7.7 节:USB)
+ </li>
+ <li>发挥核心作用的 MIDI over Bluetooth(第 7.4.3 节:蓝牙)
+ </li>
+ </ul>
+ <p>
+如果设备实现提供常规非 MIDI 连接(采用上面列出的某种支持 MIDI 的硬件传输方式),但不支持 MIDI 采用相应的硬件传输方式,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 不得报告支持 android.software.midi 功能。
+ </li>
+ </ul>
+ <h3 id="5_10_professional_audio">
+5.10. 专业音频
+ </h3>
+ <p>
+如果设备实现通过 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">android.content.pm.PackageManager</a> 类报告支持 <code>android.hardware.audio.pro</code> 功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告支持 <code>android.hardware.audio.low_latency</code> 功能。
+ </li>
+ <li>[C-1-2] 连续往返音频延迟(如<a href="#5_6_audio_latency">第 5.6 节:音频延迟</a>中定义)不得超过 20 毫秒,并且应在至少一条支持的路径上不超过 10 毫秒。
+ </li>
+ <li>[C-1-3] 必须包含支持 USB 主机模式和 USB 外围设备模式的 USB 端口。
+ </li>
+ <li>[C-1-4] 必须报告支持 <code>android.software.midi</code> 功能。
+ </li>
+ <li>[C-1-5] 必须使用 <a href="https://developer.android.com/ndk/guides/audio/opensl-for-android.html">OpenSL ES</a> PCM 缓冲队列 API 来满足延迟和 USB 音频方面的要求。
+ </li>
+ <li>当音频在播放时,应提供可维持在一定水平的 CPU 性能。
+ </li>
+ <li>应最大限度地降低音频时钟相对于标准时间的不准确性和偏差。
+ </li>
+ <li>应最大限度地降低音频时钟相对于 CPU <code>CLOCK_MONOTONIC</code> 的偏差(当两者皆处于活动状态时)。
+ </li>
+ <li>应最大限度地缩短在设备内置转换器上的音频延迟。
+ </li>
+ <li>应最大限度地缩短在 USB 数字音频路径上的音频延迟。
+ </li>
+ <li>应记录在所有路径上的音频延迟时间测量结果。
+ </li>
+ <li>应最大限度地降低音频缓冲完成回调输入时间内的抖动,因为此类抖动会影响全 CPU 带宽中可供回调使用的百分比。
+ </li>
+ <li>在正常使用情况下(符合报告的延迟),不应出现音频欠载(输出端)或过载(输入端)。
+ </li>
+ <li>声道间延迟时间差应为零。
+ </li>
+ <li>采用各种传输方式时,都应最大限度地缩短 MIDI 平均延迟。
+ </li>
+ <li>采用各种传输方式时,都应最大限度地降低在有负载状态下的 MIDI 延迟时间变化(抖动)。
+ </li>
+ <li>采用各种传输方式时,都应提供准确的 MIDI 时间戳。
+ </li>
+ <li>应最大限度地降低在设备内置转换器上的音频信号噪声,包括刚完成冷启动后一段时间内的噪声。
+ </li>
+ <li>相应端点输入侧和输出侧(当两者皆处于活动状态时)之间的音频时钟差应为零。相应端点的示例包括设备上的麦克风和音响系统,或音频插孔输入端和输出端。
+ </li>
+ <li>应在同一线程上处理相应端点输入侧和输出侧(当两者皆处于活动状态时)的音频缓冲完成回调,并在从输入回调返回后立即进入输出回调。或者,如果在同一线程上处理回调不可行,则应在进入输入回调后很快进入输出回调,以便应用在输入侧和输出侧拥有一致的时间。
+ </li>
+ <li>应最大限度地减小相应端点输入侧和输出侧 HAL 音频缓冲之间的相位差。
+ </li>
+ <li>应最大限度地缩短触摸延迟。
+ </li>
+ <li>应最大限度地降低在有负载状态下的触摸延迟时间变化(抖动)。
+ </li>
+ </ul>
+ <p>
+如果设备实现满足上述所有要求,则:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议通过 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html"><code>android.content.pm.PackageManager</code></a> 类报告支持 <code>android.hardware.audio.pro</code> 功能。
+ </li>
+ </ul>
+ <p>
+如果设备实现通过 OpenSL ES PCM 缓冲队列 API 满足这些要求,则:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议还要通过 <a href="https://developer.android.com/ndk/guides/audio/aaudio/aaudio.html">AAudio</a> API 来满足相同的要求。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 4 导体 3.5 毫米音频耳机插孔,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须确保在音频耳机插孔路径上的连续往返音频延迟不超过 20 毫秒。
+ </li>
+ <li>[SR] 强烈建议遵循<a href="https://source.android.com/devices/accessories/headset/plug-headset-spec">有线音频耳机规范 (v1.1)</a> 的<a href="https://source.android.com/devices/accessories/headset/jack-headset-spec">移动设备(耳机插孔)规范</a>一节中的规定。
+ </li>
+ <li>在音频耳机插孔路径上的连续往返音频延迟不应超过 10 毫秒。
+ </li>
+ </ul>
+ <p>
+如果设备实现省略了 4 导体 3.5 毫米音频耳机插孔,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 连续往返音频延迟不得超过 20 毫秒。i
+ </li>
+ <li>在 USB 主机模式端口(使用 USB 音频类)上的连续往返音频延迟不应超过 10 毫秒。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含支持 USB 主机模式的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须实现 USB 音频类。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 HDMI 端口,则:
+ </p>
+ <ul>
+ <li>[C-5-1] 必须支持频率为 192 kHz、位深为 20 或 24 的八声道立体声输出,而不丢失位深或重新采样。
+ </li>
+ </ul>
+ <h3 id="5_11_capture_for_unprocessed">
+5.11. 采集未处理音频
+ </h3>
+ <p>
+Android 支持通过 <code>android.media.MediaRecorder.AudioSource.UNPROCESSED</code> 音频源录制未处理音频。在 OpenSL ES 中,可以使用录制预设 <code>SL_ANDROID_RECORDING_PRESET_UNPROCESSED</code> 来访问这些音频。
+ </p>
+ <p>
+如果设备实现打算支持未处理音频源,并使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须通过 <code>android.media.AudioManager</code> 属性 <a href="http://developer.android.com/reference/android/media/AudioManager.html#PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED">PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED</a> 报告此项支持。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-2] 对于每个用于对未处理音频源进行录音的麦克风,在中频范围内必须表现出大致平坦的幅频特性,具体来说就是:±10 dB (100 Hz - 7000 Hz)。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-3] 对于每个用于对未处理音频源进行录音的麦克风,在低频范围内必须表现出适当的振幅等级,具体来说就是:±20 dB (5 Hz - 100 Hz)(与中频范围相比)。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-4] 对于每个用于对未处理音频源进行录音的麦克风,在高频范围内必须表现出适当的振幅等级,具体来说就是:±30 dB (7000 Hz - 22 KHz)(与中频范围相比)。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-5] 对于每个用于对未处理音频源进行录音的麦克风,都必须设置适当的音频输入敏感度,以确保对于 16 位的样本,以 94 dB 声压级 (SPL) 播放的 1000 Hz 正弦音调源会产生 RMS 为 520 的响应(或对于浮点/双精度样本,则为 -36 dB 全标度)。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-6] 对于每个用于对未处理音频源进行录音的麦克风,信噪比 (SNR) 都不得低于 60 dB(SNR 是按照 94 dB SPL 和等效 SPL 自噪声之间的差异进行衡量,A 加权)。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-7] 对于每个用于对未处理音频源进行录音的麦克风,在频率为 1 kHZ、输入声压级为 90 dB SPL 时,总谐波畸变率都必须小于 1%。
+ </p>
+ </li>
+ <li>
+ <p>
+除了用于将声压级提升到所需范围的声压级倍增器之外,路径中不得有任何其他信号处理机制(例如自动增益控制、高通滤波器,或回声消除)。也就是说:
+ </p>
+ </li>
+ <li>[C-1-8] 无论架构中出于任何原因而存在信号处理机制,此类机制都必须处于停用状态,并能够有效避免在信号路径中引入任何延迟。
+ </li>
+ <li>[C-1-9] 虽然路径中允许存在声压级倍增器,但该倍增器不得在信号路径中引入延迟。
+ </li>
+ </ul>
+ <p>
+所有 SPL 测量都是直接在接受测试的麦克风旁进行。对于多麦克风配置,这些要求适用于每个麦克风。
+ </p>
+ <p>
+如果设备实现声明了 <code>android.hardware.microphone</code>,但不支持未处理音频源,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须针对 <code>AudioManager.getProperty(PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED)</code> API 方法返回 <code>null</code>,以适当指明不支持未处理音频源。
+ </li>
+ <li>[SR] 仍强烈建议尽可能多地满足未处理录音来源信号路径方面的要求。
+ </li>
+ </ul>
+ <h2 id="6_developer_tools_and_options_compatibility">
+6. 开发者工具和选项兼容性
+ </h2>
+ <h3 id="6_1_developer_tools">
+6.1. 开发者工具
+ </h3>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须支持 Android SDK 中提供的 Android 开发者工具。
+ </li>
+ <li>
+ <p>
+ <a href="http://developer.android.com/tools/help/adb.html"><strong>Android 调试桥 (adb)</strong></a>
+ </p>
+ <ul>
+ <li>[C-0-2] 必须支持所有 adb 功能(如 Android SDK 中所述),包括 <a href="https://source.android.com/devices/input/diagnostics.html">dumpsys</a>。
+ </li>
+ <li>[C-0-3] 不得更改通过 dumpsys 记录的设备系统事件(batterystats、diskstats、fingerprint、graphicsstats、netstats、notification、procstats)的格式或内容。
+ </li>
+ <li>[C-0-4] 必须使设备侧 adb 守护进程默认处于停用状态,并有一个可供用户使用的 Android 调试桥开启机制。
+ </li>
+ <li>[C-0-5] 必须支持安全 adb。Android 支持安全 adb。安全 adb 能够在经过身份验证的已知主机上启用 adb。
+ </li>
+ <li>
+ <p>
+[C-0-6] 必须提供可从主机连接 adb 的机制。例如:
+ </p>
+ <ul>
+ <li>如果设备实现没有支持外围设备模式的 USB 端口,则必须通过局域网(例如以太网或 WLAN)实现 adb。
+ </li>
+ <li>必须提供适用于 Windows 7、9 和 10 的驱动程序,以便开发者使用 adb 协议连接到设备。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+ <a href="http://developer.android.com/tools/debugging/ddms.html"><strong>Dalvik 调试监控服务 (ddms)</strong></a>
+ </p>
+ <ul>
+ <li>[C-0-7] 必须支持 Android SDK 中载述的所有 ddms 功能。由于 ddms 会使用 adb,因此虽然对 ddms 的支持应默认处于停用状态,但如果用户启用了 Android 调试桥,则必须支持 ddms,如上所述。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="http://developer.android.com/tools/help/monkey.html"><strong>Monkey</strong></a>
+ <ul>
+ <li>[C-0-8] 必须包含 Monkey 框架,并使其可供应用使用。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <a href="http://developer.android.com/tools/help/systrace.html"><strong>Systrace</strong></a>
+ <ul>
+ <li>[C-0-9] 必须支持 Android SDK 中载述的 Systrace 工具。Systrace 必须默认处于停用状态,并有一个可供用户使用的 Systrace 开启机制。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h3 id="6_2_developer_options">
+6.2. 开发者选项
+ </h3>
+ <p>
+Android 支持开发者配置与应用开发相关的设置。
+ </p>
+ <p>
+设备实现必须提供一致的开发者选项体验,它们:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须能够遵从 <a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_APPLICATION_DEVELOPMENT_SETTINGS">android.settings.APPLICATION_DEVELOPMENT_SETTINGS</a> Intent 显示与应用开发相关的设置。上游 Android 实现会默认隐藏“开发者选项”菜单,并允许用户启动该菜单(方法是在<strong>设置</strong> &gt; <strong>关于设备</strong> &gt; <strong>版本号</strong>菜单项上连按七 (7) 次)。
+ </li>
+ <li>[C-0-2] 必须默认隐藏“开发者选项”,并提供一种无需任何特殊白名单操作即可启用“开发者选项”的机制。
+ </li>
+ <li>对于需要考虑用户安全的情况,可以暂时限制访问“开发者选项”菜单(方法是在视觉上隐藏或停用该菜单),以避免分散注意力。
+ </li>
+ </ul>
+ <h2 id="7_hardware_compatibility">
+7. 硬件兼容性
+ </h2>
+ <p>
+如果设备包含的某个硬件组件具有针对第三方开发者的对应 API,则:
+ </p>
+ <ul>
+ <li>[C-0-1] 设备实现必须按照 Android SDK 文档中所述实现该 API。
+ </li>
+ </ul>
+ <p>
+如果 SDK 中的某个 API 需要与某个被规定为可选组件的硬件组件交互,但设备实现不具备该组件,则:
+ </p>
+ <ul>
+ <li>[C-0-2] 仍必须提供该组件 API 的完整类定义(如 SDK 中所述)。
+ </li>
+ <li>[C-0-3] 必须以某种合理的方式将该 API 的行为实现为空操作。
+ </li>
+ <li>[C-0-4] 在 SDK 文档允许的情况下,该 API 的方法必须返回 null 值。
+ </li>
+ <li>[C-0-5] 在 SDK 文档不允许 null 值的情况下,该 API 的方法必须返回相应类的空操作实现。
+ </li>
+ <li>[C-0-6] 该 API 的方法不得抛出 SDK 文档中未载述的异常。
+ </li>
+ <li>[C-0-7] 对于相同的细分版本指纹,设备实现必须能够始终如一地通过 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html">android.content.pm.PackageManager</a> 类中的 <code>getSystemAvailableFeatures()</code> 和 <code>hasSystemFeature(String)</code> 方法报告准确的硬件配置信息。
+ </li>
+ </ul>
+ <p>
+这些要求的一个典型适用情况示例就是电话 API:即使在非手机设备上,这些 API 也必须实现为合理的空操作。
+ </p>
+ <h3 id="7_1_display_and_graphics">
+7.1. 显示和图形
+ </h3>
+ <p>
+Android 包含一些能够适当地为设备自动调整应用资产和界面布局的方式,以确保第三方应用能够在<a href="http://developer.android.com/guide/practices/screens_support.html">各种硬件配置</a>上良好地运行。设备必须正确实现本节中详细说明的这些 API 和行为。
+ </p>
+ <p>
+本节的要求中提到的单位定义如下:
+ </p>
+ <ul>
+ <li>
+ <strong>物理对角线尺寸</strong>:显示屏亮显部分的两个对角之间的距离(以英寸为单位)。
+ </li>
+ <li>
+ <strong>每英寸的点数 (dpi)</strong>:1 英寸的线性水平或垂直跨度内包含的像素数。如果列出了 dpi 值,则水平 dpi 和垂直 dpi 都必须在该范围内。
+ </li>
+ <li>
+ <strong>宽高比</strong>:屏幕的长度像素与宽度像素之比。例如,480x854 像素的显示屏的宽高比是 854/480 = 1.779,或约为“16:9”。
+ </li>
+ <li>
+ <strong>密度无关像素 (dp)</strong>:按 160 dpi 屏幕标准化的虚拟像素单位,计算公式如下:像素 = dps *(密度/160)。
+ </li>
+ </ul>
+ <h4 id="7_1_1_screen_configuration">
+7.1.1. 屏幕配置
+ </h4>
+ <h5 id="7_1_1_1_screen_size">
+7.1.1.1. 屏幕尺寸
+ </h5>
+ <p>
+Android 界面框架支持多种不同的逻辑屏幕布局尺寸,并且允许应用通过 <code>Configuration.screenLayout</code>(使用 <code>SCREENLAYOUT_SIZE_MASK</code> 和 <code>Configuration.smallestScreenWidthDp</code> 参数)查询当前配置的屏幕布局尺寸。
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 设备实现必须针对 <code>Configuration.screenLayout</code> 报告正确的布局尺寸(如 Android SDK 文档中定义)。具体来说就是,设备实现必须报告正确的密度无关逻辑像素 (dp) 屏幕尺寸,如下所述:
+ </p>
+ <ul>
+ <li>如果设备的 <code>Configuration.uiMode</code> 设为除 UI_MODE_TYPE_WATCH 以外的任何值,并且针对 <code>Configuration.screenLayout</code> 报告的是 <code>small</code> 尺寸,则该屏幕尺寸必须至少为 426 dp x 320 dp。
+ </li>
+ <li>如果设备针对 <code>Configuration.screenLayout</code> 报告的是 <code>normal</code> 尺寸,则该屏幕尺寸必须至少为 480 dp x 320 dp。
+ </li>
+ <li>如果设备针对 <code>Configuration.screenLayout</code> 报告的是 <code>large</code> 尺寸,则该屏幕尺寸必须至少为 640 dp x 480 dp。
+ </li>
+ <li>如果设备针对 <code>Configuration.screenLayout</code> 报告的是 <code>xlarge</code> 尺寸,则该屏幕尺寸必须至少为 960 dp x 720 dp。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[C-0-2] 设备实现必须正确遵从应用通过 AndroidManifest.xml 中的 <a href="https://developer.android.com/guide/topics/manifest/supports-screens-element.html">&lt;<code>supports-screens</code>&gt;</a> 属性声明的对屏幕尺寸的支持情况(如 Android SDK 文档中所述)。
+ </p>
+ </li>
+ </ul>
+ <h5 id="7_1_1_2_screen_aspect_ratio">
+7.1.1.2. 屏幕宽高比
+ </h5>
+ <p>
+虽然对实体显示屏的屏幕宽高比没有任何限制,但用于呈现第三方应用的逻辑显示屏的屏幕宽高比(可以根据通过 <a href="https://developer.android.com/reference/android/view/Display.html"><code>view.Display</code></a> API 和 <a href="https://developer.android.com/reference/android/content/res/Configuration.html">Configuration</a> API 报告的高度值和宽度值推导出来)必须满足以下要求:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 如果设备实现的 <code>Configuration.uiMode</code> 设为 <code>UI_MODE_TYPE_NORMAL</code>,则宽高比必须介于 1.3333 (4:3) 到 1.86(约为 16:9)之间,除非应用满足下列某个条件,可被视为能够被拉伸:
+ </p>
+ <ul>
+ <li>应用已通过 <a href="https://developer.android.com/guide/practices/screens&amp;lowbar;support.html#MaxAspectRatio"><code>android.max_aspect</code></a> 元数据值声明支持更大的屏幕宽高比。
+ </li>
+ <li>应用通过 <a href="https://developer.android.com/guide/topics/ui/multi-window.html#configuring">android:resizeableActivity</a> 属性声明其大小可以调整。
+ </li>
+ <li>应用采用 API 26 级或更高级别,并且未声明会对允许的宽高比造成限制的 <a href="https://developer.android.com/reference/android/R.attr.html#maxAspectRatio"><code>android:MaxAspectRatio</code></a>。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[C-0-2] 如果设备实现的 <code>Configuration.uiMode</code> 设为 <code>UI_MODE_TYPE_WATCH</code>,则宽高比必须设为 1.0 (1:1)。
+ </p>
+ </li>
+ </ul>
+ <h5 id="7_1_1_3_screen_density">
+7.1.1.3. 屏幕密度
+ </h5>
+ <p>
+Android 界面框架定义了一组标准逻辑密度,以便应用开发者确定要采用的应用资源。
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 默认情况下,设备实现必须通过 <a href="https://developer.android.com/reference/android/util/DisplayMetrics.html#DENSITY_DEVICE_STABLE">DENSITY_DEVICE_STABLE</a> API 仅报告以下逻辑 Android 框架密度之一,并且在任何时间该值都必须保持不变;不过,设备可以根据初始启动后用户对显示配置(例如显示区域大小)所做的更改报告不同的任意密度。
+ </p>
+ <ul>
+ <li>120 dpi (ldpi)
+ </li>
+ <li>160 dpi (mdpi)
+ </li>
+ <li>213 dpi (tvdpi)
+ </li>
+ <li>240 dpi (hdpi)
+ </li>
+ <li>260 dpi (260dpi)
+ </li>
+ <li>280 dpi (280dpi)
+ </li>
+ <li>300 dpi (300dpi)
+ </li>
+ <li>320 dpi (xhdpi)
+ </li>
+ <li>340 dpi (340dpi)
+ </li>
+ <li>360 dpi (360dpi)
+ </li>
+ <li>400 dpi (400dpi)
+ </li>
+ <li>420 dpi (420dpi)
+ </li>
+ <li>480 dpi (xxhdpi)
+ </li>
+ <li>560 dpi (560dpi)
+ </li>
+ <li>640 dpi (xxxhdpi)
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+设备实现应定义数值最接近屏幕物理密度的标准 Android 框架密度,除非该逻辑密度会导致报告的屏幕尺寸低于支持的最小值。如果数值最接近物理密度的标准 Android 框架密度会导致屏幕尺寸小于支持的最小兼容屏幕尺寸(宽度为 320 dp),则设备实现应报告下一个最低的标准 Android 框架密度。
+ </p>
+ </li>
+ </ul>
+ <p>
+如果有用于更改设备显示区域大小的方式,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 不得将显示区域大小调整为任何超过本机密度 1.5 倍的尺寸,也不得产生小于 320 dp(相当于资源限定尺寸为 sw320dp)的有效最小屏幕尺寸,以先达到者为准。
+ </li>
+ <li>[C-1-2] 不得将显示区域大小调整为小于本机密度 0.85 倍的尺寸。
+ </li>
+ <li>为了确保良好的可用性和一致的字体大小,建议提供以下本机显示缩放比例选项(同时遵守上述限制)
+ </li>
+ <li>小:0.85 倍
+ </li>
+ <li>默认值:1 倍(本机显示比例)
+ </li>
+ <li>大:1.15 倍
+ </li>
+ <li>较大:1.3 倍
+ </li>
+ <li>最大:1.45 倍
+ </li>
+ </ul>
+ <h4 id="7_1_2_display_metrics">
+7.1.2. 显示指标
+ </h4>
+ <p>
+如果设备实现包含屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须为 <a href="https://developer.android.com/reference/android/util/DisplayMetrics.html"><code>android.util.DisplayMetrics</code></a> API 中定义的所有显示指标报告正确的值。
+ </li>
+ </ul>
+ <p>
+如果设备实现不包含嵌入式屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 对于模拟的默认 <code>view.Display</code>,必须为 <a href="https://developer.android.com/reference/android/util/DisplayMetrics.html"><code>android.util.DisplayMetrics</code></a> API 中定义的所有显示指标报告合理的值。
+ </li>
+ </ul>
+ <h4 id="7_1_3_screen_orientation">
+7.1.3. 屏幕方向
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须报告支持的屏幕方向(<code>android.hardware.screen.portrait</code> 和/或 <code>android.hardware.screen.landscape</code>),并且必须报告至少一个支持的方向。例如,屏幕固定为横向的设备(例如电视或笔记本电脑)应仅报告 <code>android.hardware.screen.landscape</code>。
+ </li>
+ <li>[C-0-2] 每当收到通过 <code>android.content.res.Configuration.orientation</code>、<code>android.view.Display.getOrientation()</code> 或其他 API 提交的查询时,设备实现都必须报告设备当前方向的正确值。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持两种屏幕方向,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持按应用动态设置屏幕方向(纵向或横向)。也就是说,设备必须遵从应用对特定屏幕方向的要求。
+ </li>
+ <li>[C-1-2] 更改方向时,不得更改报告的屏幕尺寸或密度。
+ </li>
+ <li>可以选择纵向或横向作为默认方向。
+ </li>
+ </ul>
+ <h4 id="7_1_4_2d_and_3d_graphics_acceleration">
+7.1.4. 2D 和 3D 图形加速
+ </h4>
+ <h5 id="7_1_4_1_opengl_es">
+7.1.4.1 OpenGL ES
+ </h5>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须通过受管理 API(例如通过 <code>GLES10.getString()</code> 方法)和本机 API 正确标识支持的 OpenGL ES 版本(1.1、2.0、3.0、3.1、3.2)。
+ </li>
+ <li>[C-0-2] 对于标识为支持的每个 OpenGL ES 版本,必须支持所有对应的受管理 API 和本机 API。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须同时支持 OpenGL ES 1.0 和 2.0,<a href="https://developer.android.com/guide/topics/graphics/opengl.html">Android SDK 文档</a>中对此进行了详细阐述。
+ </li>
+ <li>[SR] 强烈建议支持 OpenGL ES 3.0。
+ </li>
+ <li>应支持 OpenGL ES 3.1 或 3.2。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持任何 OpenGL ES 版本,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须通过 OpenGL ES 受管理 API 和本机 API 报告已实现的所有其他 OpenGL ES 扩展;反过来说就是,不得报告不支持的扩展字符串。
+ </li>
+ <li>[C-2-2] 必须支持 <code>EGL_KHR_image</code>、<code>EGL_KHR_image_base</code>、<code>EGL_ANDROID_image_native_buffer</code>、<code>EGL_ANDROID_get_native_client_buffer</code>、<code>EGL_KHR_wait_sync</code>、<code>EGL_KHR_get_all_proc_addresses</code>、<code>EGL_ANDROID_presentation_time</code>、<code>EGL_KHR_swap_buffers_with_damage</code> 以及 <code>EGL_ANDROID_recordable</code> 扩展。
+ </li>
+ <li>[SR] 强烈建议支持 EGL_KHR_partial_update。
+ </li>
+ <li>应通过 <code>getString()</code> 方法准确报告支持的所有纹理压缩格式,这些格式通常是针对特定供应商的。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明支持 OpenGL ES 3.0、3.1 或 3.2,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 除了导出 libGLESv2.so 库中的 OpenGL ES 2.0 函数符号之外,还必须导出这些版本的对应函数符号。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 OpenGL ES 3.2,则:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须支持整个 OpenGL ES Android Extension Pack。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持整个 OpenGL ES <a href="https://developer.android.com/reference/android/opengl/GLES31Ext.html">Android Extension Pack</a>,则:
+ </p>
+ <ul>
+ <li>[C-5-1] 必须通过 <code>android.hardware.opengles.aep</code> 功能标记标识此项支持。
+ </li>
+ </ul>
+ <p>
+如果设备实现通告了支持 <code>EGL_KHR_mutable_render_buffer</code> 扩展,则:
+ </p>
+ <ul>
+ <li>[C-6-1] 必须还要支持 <code>EGL_ANDROID_front_buffer_auto_refresh</code> 扩展。
+ </li>
+ </ul>
+ <h5 id="7_1_4_2_vulkan">
+7.1.4.2 Vulkan
+ </h5>
+ <p>
+Android 支持 <a href="https://www.khronos.org/registry/vulkan/specs/1.0-wsi&amp;lowbarextensions/xhtml/vkspec.html">Vulkan</a>。Vulkan 是一个适用于高性能 3D 图形的低开销、跨平台 API。
+ </p>
+ <p>
+如果设备实现支持 OpenGL ES 3.0 或 3.1,则:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议支持 Vulkan 1.0。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含屏幕或视频输出机制,则:
+ </p>
+ <ul>
+ <li>应支持 Vulkan 1.0。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 Vulkan 1.0,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须通过 <code>android.hardware.vulkan.level</code> 和 <code>android.hardware.vulkan.version</code> 功能标记报告正确的整数值。
+ </li>
+ <li>[C-1-2] 必须针对 Vulkan 本机 API <a href="https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkEnumeratePhysicalDevices.html"><code>vkEnumeratePhysicalDevices()</code></a> 列举至少一个 <code>VkPhysicalDevice</code>。
+ </li>
+ <li>[C-1-3] 必须针对列举的每个 <code>VkPhysicalDevice</code> 完整实现 Vulkan 1.0 API。
+ </li>
+ <li>[C-1-4] 必须通过 Vulkan 本机 API <a href="https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkEnumerateInstanceLayerProperties.html"><code>vkEnumerateInstanceLayerProperties()</code></a> 和 <a href="https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkEnumerateDeviceLayerProperties.html"><code>vkEnumerateDeviceLayerProperties()</code></a> 列举名为 <code>libVkLayer*.so</code> 的本机库(位于应用包的本机库目录下)中包含的层。
+ </li>
+ <li>[C-1-5] 不得列举应用包外的库提供的层,也不得提供其他方式来跟踪或拦截 Vulkan API,除非应用的 <code>android:debuggable</code> 属性设为了 <code>true</code>。
+ </li>
+ <li>[C-1-6] 必须通过 Vulkan 本机 API 报告支持的所有扩展字符串;反过来说就是,不得报告无法正确支持的扩展字符串。
+ </li>
+ </ul>
+ <p>
+如果设备实现不支持 Vulkan 1.0,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 不得声明任何 Vulkan 功能标记(例如 <code>android.hardware.vulkan.level</code>、<code>android.hardware.vulkan.version</code>)。
+ </li>
+ <li>[C-2-2] 不得针对 Vulkan 本机 API <code>vkEnumeratePhysicalDevices()</code> 列举任何 <code>VkPhysicalDevice</code>。
+ </li>
+ </ul>
+ <h5 id="7_1_4_3_renderscript">
+7.1.4.3 RenderScript
+ </h5>
+ <ul>
+ <li>[C-0-1] 设备实现必须支持 <a href="http://developer.android.com/guide/topics/renderscript/">Android RenderScript</a>(Android SDK 文档中对此进行了详细说明)。
+ </li>
+ </ul>
+ <h5 id="7_1_4_4_2d_graphics_acceleration">
+7.1.4.4 2D 图形加速
+ </h5>
+ <p>
+Android 包含一种机制,可让应用使用清单标记 <a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html">android:hardwareAccelerated</a> 或直接 API 调用声明希望在应用、Activity、窗口或视图级别启用 2D 图形硬件加速。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须默认启用硬件加速;如果开发者通过以下方式请求停用硬件加速,设备实现必须将其停用:设置 android:hardwareAccelerated="false”,或直接通过 Android View API 停用硬件加速。
+ </li>
+ <li>[C-0-2] 表现出的行为必须与 Android SDK 文档中关于<a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html">硬件加速</a>的说明一致。
+ </li>
+ </ul>
+ <p>
+Android 包含一个 TextureView 对象,可让开发者直接将经过硬件加速的 OpenGL ES 纹理作为呈现目标集成到界面层次结构中。
+ </p>
+ <ul>
+ <li>[C-0-3] 必须支持 TextureView API,并且表现出的行为必须与上游 Android 实现一致。
+ </li>
+ </ul>
+ <h5 id="7_1_4_5_wide-gamut_displays">
+7.1.4.5 宽色域显示
+ </h5>
+ <p>
+如果设备实现通过 <a href="https://developer.android.com/reference/android/view/Display.html#isWideColorGamut%28%29"><code>Display.isWideColorGamut()</code></a> 声明支持宽色域显示屏,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须有颜色经过校准的显示屏。
+ </li>
+ <li>[C-1-2] 必须有色域完整涵盖 CIE 1931 xyY 空间内 sRGB 色域的显示屏。
+ </li>
+ <li>[C-1-3] 必须有色域至少涵盖 CIE 1931 xyY 空间内 NTSC 1953 色域 90% 的显示屏。
+ </li>
+ <li>[C-1-4] 必须支持 OpenGL ES 3.0、3.1 或 3.2,并正确报告此项支持。
+ </li>
+ <li>[C-1-5] 必须通告支持 <code>EGL_KHR_no_config_context</code>、<code>EGL_EXT_pixel_format_float</code>、<code>EGL_KHR_gl_colorspace</code>、<code>EGL_EXT_colorspace_scrgb_linear</code> 和 <code>EGL_GL_colorspace_display_p3</code> 扩展。
+ </li>
+ <li>[SR] 强烈建议支持 <code>GL_EXT_sRGB</code>。
+ </li>
+ </ul>
+ <p>
+反之,如果设备实现不支持宽色域显示屏,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 尽管并未定义屏幕色域,但应涵盖 CIE 1931 xyY 空间内 100% 或更多的 sRGB。
+ </li>
+ </ul>
+ <h4 id="7_1_5_legacy_application_compatibility_mode">
+7.1.5. 旧版应用兼容模式
+ </h4>
+ <p>
+Android 指定了一种“兼容模式”,在该模式下,框架能够以“正常”屏幕尺寸等效(宽度为 320dp)模式运行,这是为了服务于针对旧版 Android(在实现屏幕尺寸独立性之前发布的旧版 Android)开发的旧版应用。
+ </p>
+ <h4 id="7_1_6_screen_technology">
+7.1.6. 屏幕技术
+ </h4>
+ <p>
+Android 平台包含一些可让应用在显示屏上呈现丰富图形的 API。除非本文档中明确许可,否则设备必须支持所有这些 API(如 Android SDK 中定义)。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须支持能够呈现 16 位彩色图形的显示屏。
+ </li>
+ <li>应支持能够呈现 24 位彩色图形的显示屏。
+ </li>
+ <li>[C-0-2] 必须支持能够呈现动画的显示屏。
+ </li>
+ <li>[C-0-3] 必须使用像素宽高比 (PAR) 介于 0.9 到 1.15 之间的显示技术。也就是说,像素宽高比必须接近方形 (1.0),并且公差在 10-15% 的范围内。
+ </li>
+ </ul>
+ <h4 id="7_1_7_secondary_displays">
+7.1.7. 辅助显示设备
+ </h4>
+ <p>
+Android 支持用于实现媒体共享功能的辅助显示设备以及用于访问外部显示设备的开发者 API。
+ </p>
+ <p>
+如果设备实现支持采用有线、无线或嵌入式附加显示设备连接方式的外部显示设备,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现 <a href="https://developer.android.com/reference/android/hardware/display/DisplayManager.html"><code>DisplayManager</code></a> 系统服务和 API(如 Android SDK 文档中所述)。
+ </li>
+ </ul>
+ <h3 id="7_2_input_devices">
+7.2. 输入设备
+ </h3>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须包含输入机制,例如<a href="#7_2_4_touchScreen_input">触摸屏</a>或<a href="#7_2_2_non-touch_navigation">非触摸导航</a>,以便在界面元素之间导航。
+ </li>
+ </ul>
+ <h4 id="7_2_1_keyboard">
+7.2.1. 键盘
+ </h4>
+ <p>
+如果设备实现支持第三方输入法编辑器 (IME) 应用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明 <a href="https://developer.android.com/reference/android/content/pm/PackageManager.html#FEATURE_INPUT_METHODS"><code>android.software.input_methods</code></a> 功能标记。
+ </li>
+ <li>[C-1-2] 必须完整实现 <a href="https://developer.android.com/reference/android/view/inputmethod/InputMethodManager.html"><code>Input Management Framework</code></a>
+ </li>
+ <li>[C-1-3] 必须有预加载的软件键盘。
+ </li>
+ </ul>
+ <p>
+设备实现:<em>[C-0-1] 不得包含与 <a href="http://developer.android.com/reference/android/content/res/Configuration.html">android.content.res.Configuration.keyboard</a> 中指定的任何格式(QWERTY 或 12 键)都不匹配的硬件键盘。</em> 应包含额外的软键盘实现。*可以包含硬件键盘。
+ </p>
+ <h4 id="7_2_2_non-touch_navigation">
+7.2.2. 非触摸导航
+ </h4>
+ <p>
+Android 支持使用方向键、轨迹球和滚轮进行非触摸导航。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须报告 <a href="https://developer.android.com/reference/android/content/res/Configuration.html#navigation">android.content.res.Configuration.navigation</a> 的正确值。
+ </li>
+ </ul>
+ <p>
+如果设备实现缺少非触摸导航,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须提供一个与输入管理引擎兼容且合理的替代界面机制,以便用户选择和编辑文字。上游 Android 开放源代码实现包含一种适合在缺少非触摸导航输入法的设备上使用的选择机制。
+ </li>
+ </ul>
+ <h4 id="7_2_3_navigation_keys">
+7.2.3. 导航键
+ </h4>
+ <p>
+<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME">主屏幕</a>、<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_APP_SWITCH">最近用过</a>和<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK">返回</a>功能(通常是在用户与专用的实体按钮或触摸屏上的单独部分互动后提供)是 Android 导航范式的基本组成部分,因此:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须提供“主屏幕”功能。
+ </li>
+ <li>应为“最近用过”和“返回”功能提供相应的按钮。
+ </li>
+ </ul>
+ <p>
+如果提供了“主屏幕”、“最近用过”或“返回”功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 当其中任何功能处于可供访问状态时,都必须可通过单次操作(点按、双击或手势等)访问。
+ </li>
+ <li>[C-1-2] 必须明确指明各个单次操作会触发哪项功能。常见的指明方式示例包括:在按钮上印制可见图标、在屏幕的导航栏部分显示软件图标,或在开箱设置期间引导用户完成分步演示流程。
+ </li>
+ </ul>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议不要为<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK">“菜单”功能</a>提供输入机制。因为从 Android 4.0 开始,由于操作栏的出现,“菜单”功能被弃用了。
+ </li>
+ </ul>
+ <p>
+如果设备实现提供“菜单”功能,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 当操作溢出菜单弹出窗口不为空且操作栏处于可见状态时,必须显示操作溢出按钮。
+ </li>
+ <li>[C-2-2] 对于在操作栏中选择溢出按钮后显示的操作溢出弹出窗口,不得修改其位置。但对于在选择“菜单”功能后显示的操作溢出弹出窗口,则可以在屏幕上将其呈现到修改后的位置。
+ </li>
+ </ul>
+ <p>
+如果设备实现未提供用于实现向后兼容的“菜单”功能,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 当 <code>targetSdkVersion</code> 小于 10 时,必须使该“菜单”功能可供应用使用(通过实体按钮、软件按键或手势)。该“菜单”功能应可供访问,除非与其他导航功能一起隐藏起来。
+ </li>
+ </ul>
+ <p>
+如果设备实现提供<a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_ASSIST">“辅助”功能</a>,则:
+ </p>
+ <ul>
+ <li>[C-4-1] 当其他导航键可供访问时,必须使该“辅助”功能可通过单次操作(例如点按、双击或手势)访问。
+ </li>
+ <li>[SR] 强烈建议将长按“主屏幕”键用作这一指定交互。
+ </li>
+ </ul>
+ <p>
+如果设备实现使用屏幕上的单独部分来显示导航键,则:
+ </p>
+ <ul>
+ <li>[C-5-1] 导航键必须位于屏幕上的单独部分,不能供应用使用,并且不得遮住或以其他方式影响屏幕上可供应用使用的部分。
+ </li>
+ <li>[C-5-2] 如果应用满足<a href="#7_1_1_screen_configuration">第 7.1.1 节</a>中定义的要求,则必须将显示屏的一部分提供给它们使用。
+ </li>
+ <li>[C-5-3] 必须遵从应用通过 <a href="https://developer.android.com/reference/android/view/View.html#setSystemUiVisibility%28int%29"><code>View.setSystemUiVisibility()</code></a> API 方法设置的标记,以便屏幕上这个单独的部分(也称为导航栏)能够正确隐藏起来(如 SDK 中所述)。
+ </li>
+ </ul>
+ <h4 id="7_2_4_touchscreen_input">
+7.2.4. 触摸屏输入
+ </h4>
+ <p>
+Android 支持多种指控输入系统,例如触摸屏、触摸板和模拟触摸输入设备。<a href="http://source.android.com/devices/tech/input/touch-devices.html">基于触摸屏的设备实现</a>会与显示屏相关联,从而让用户感觉像是在直接操控屏幕上的内容。由于用户会直接触摸屏幕,因此系统不需要使用任何额外的方式来指明所操控的对象。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应具有某种指控输入系统(类似于鼠标的输入系统或触摸式输入系统)。
+ </li>
+ <li>应支持完全独立跟踪的指针。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含触摸屏(单点触控或更好的触摸屏),则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须针对 <a href="https://developer.android.com/reference/android/content/res/Configuration.html#touchscreen"><code>Configuration.touchscreen</code></a> API 字段报告 <code>TOUCHSCREEN_FINGER</code>。
+ </li>
+ <li>[C-1-2] 必须报告 <code>android.hardware.touchscreen</code> 和 <code>android.hardware.faketouch</code> 功能标记。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含可以跟踪多个单点触控的触摸屏,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须报告与设备上的具体触摸屏类型对应的适当功能标记 <code>android.hardware.touchscreen.multitouch</code>、<code>android.hardware.touchscreen.multitouch.distinct</code>、<code>android.hardware.touchscreen.multitouch.jazzhand</code>。
+ </li>
+ </ul>
+ <p>
+如果设备实现不包含触摸屏(仅依靠指控设备),并且满足<a href="#7_2_5_fake_touch_input">第 7.2.5 节</a>中的模拟触摸要求,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 不得报告任何以 <code>android.hardware.touchscreen</code> 开头的功能标记,只能报告 <code>android.hardware.faketouch</code>。
+ </li>
+ </ul>
+ <h4 id="7_2_5_fake_touch_input">
+7.2.5. 模拟触摸输入
+ </h4>
+ <p>
+模拟触摸界面会提供一个能够模拟部分触摸屏功能的用户输入系统。例如,驱动屏幕光标的鼠标或遥控器能够模拟触摸操作,但需要用户先指向或聚焦到目标,然后再点击。鼠标、触控板、基于陀螺仪的空中鼠标、陀螺仪指针、操纵杆和多点触控板等多种输入设备都可以支持模拟触摸交互。Android 包含功能常量 android.hardware.faketouch,该常量对应于高保真非触摸(指控式)输入设备,例如可以充分模拟触摸式输入的鼠标或触控板(包括基本手势支持),并且该常量可指明设备支持所模拟的触摸屏功能子集。
+ </p>
+ <p>
+如果设备实现不包含触摸屏,但包含另一种它们想要提供的指控输入系统,则:
+ </p>
+ <ul>
+ <li>应声明支持 <code>android.hardware.faketouch</code> 功能标记。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明支持 <code>android.hardware.faketouch</code>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告指针在屏幕中的<a href="http://developer.android.com/reference/android/view/MotionEvent.html">绝对 X 和 Y 位置</a>,并在屏幕中显示可见指针。
+ </li>
+ <li>[C-1-2] 必须通过操作代码(指定<a href="http://developer.android.com/reference/android/view/MotionEvent.html">在屏幕中按下或松开指针</a>时发生的状态变化)报告触摸事件。
+ </li>
+ <li>[C-1-3] 必须支持在屏幕中的对象上按下后再松开指针,以便用户模拟点按屏幕中的对象。
+ </li>
+ <li>[C-1-4] 必须支持于时间阈值内在屏幕中对象上的同一位置按下、松开、按下后再松开指针,以便用户<a href="http://developer.android.com/reference/android/view/MotionEvent.html">模拟点按两次</a>屏幕中的对象。
+ </li>
+ <li>[C-1-5] 必须支持在屏幕中的任意一点按下指针、将指针移至屏幕中的其他任意一点,然后再松开指针,以便用户模拟触摸拖动操作。
+ </li>
+ <li>[C-1-6] 必须支持按下指针后允许用户快速将对象移至屏幕中的其他位置,然后在屏幕中松开指针,以便用户甩动屏幕中的对象。
+ </li>
+ <li>[C-1-7] 必须针对 <a href="https://developer.android.com/reference/android/content/res/Configuration.html#touchscreen"><code>Configuration.touchscreen</code></a> API 字段报告 <code>TOUCHSCREEN_NOTOUCH</code>。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明支持 <code>android.hardware.faketouch.multitouch.distinct</code>,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须声明支持 <code>android.hardware.faketouch</code>。
+ </li>
+ <li>[C-2-2] 必须支持对两个或更多个独立的指控输入分别进行跟踪。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明支持 <code>android.hardware.faketouch.multitouch.jazzhand</code>,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须声明支持 <code>android.hardware.faketouch</code>。
+ </li>
+ <li>[C-3-2] 必须支持完全独立地分别跟踪 5 个(对一只手上五根手指的操作进行跟踪)或更多个指控输入。
+ </li>
+ </ul>
+ <h4 id="7_2_6_game_controller_support">
+7.2.6. 游戏控制器支持
+ </h4>
+ <h5 id="7_2_6_1_button_mappings">
+7.2.6.1. 按钮映射
+ </h5>
+ <p>
+如果设备实现声明了 <code>android.hardware.gamepad</code> 功能标记,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须嵌入控制器,或在包装盒内随附单独的控制器,以便输入下表中列出的所有事件。
+ </li>
+ <li>[C-1-2] 必须能够将 HID 事件映射到关联的 Android <code>view.InputEvent</code> 常量(如下表中所列)。上游 Android 实现包含满足该要求的游戏控制器实现。
+ </li>
+ </ul>
+ <table>
+ <tbody><tr>
+ <th>
+按钮
+ </th>
+ <th>
+HID 用法<sup>2</sup>
+ </th>
+ <th>
+Android 按钮
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_A">A</a><sup>1</sup>
+ </td>
+ <td>0x09 0x0001
+ </td>
+ <td>KEYCODE_BUTTON_A (96)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_B">B</a><sup>1</sup>
+ </td>
+ <td>
+0x09 0x0002
+ </td>
+ <td>KEYCODE_BUTTON_B (97)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_X">X</a><sup>1</sup>
+ </td>
+ <td>
+0x09 0x0004
+ </td>
+ <td>
+KEYCODE_BUTTON_X (99)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_Y">Y</a><sup>1</sup>
+ </td>
+ <td>
+0x09 0x0005
+ </td>
+ <td>
+KEYCODE_BUTTON_Y (100)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_UP">D-pad up</a><sup>1</sup><br />
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_DOWN">D-pad down</a><sup>1</sup>
+ </td>
+ <td>
+0x01 0x0039<sup>3</sup>
+ </td>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_HAT_Y">AXIS_HAT_Y</a><sup>4</sup>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_LEFT">D-pad left</a>1<br />
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_RIGHT">D-pad right</a><sup>1</sup>
+ </td>
+ <td>
+0x01 0x0039<sup>3</sup>
+ </td>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_HAT_X">AXIS_HAT_X</a><sup>4</sup>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_L1">Left shoulder button</a><sup>1</sup>
+ </td>
+ <td>
+0x09 0x0007
+ </td>
+ <td>
+KEYCODE_BUTTON_L1 (102)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_R1">Right shoulder button</a><sup>1</sup>
+ </td>
+ <td>
+0x09 0x0008
+ </td>
+ <td>
+KEYCODE_BUTTON_R1 (103)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_THUMBL">Left stick click</a><sup>1</sup>
+ </td>
+ <td>
+0x09 0x000E
+ </td>
+ <td>
+KEYCODE_BUTTON_THUMBL (106)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BUTTON_THUMBR">Right stick click</a><sup>1</sup>
+ </td>
+ <td>
+0x09 0x000F
+ </td>
+ <td>
+KEYCODE_BUTTON_THUMBR (107)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_HOME">Home</a><sup>1</sup>
+ </td>
+ <td>
+0x0c 0x0223
+ </td>
+ <td>
+KEYCODE_HOME (3)
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_BACK">Back</a><sup>1</sup>
+ </td>
+ <td>
+0x0c 0x0224
+ </td>
+ <td>
+KEYCODE_BACK (4)
+ </td>
+ </tr>
+ </tbody></table>
+ <p class="table_footnote">
+1 <a href="http://developer.android.com/reference/android/view/KeyEvent.html">KeyEvent</a>
+ </p>
+ <p class="table_footnote">
+2 必须在 Game pad CA (0x01 0x0005) 中声明上述 HID 用法。
+ </p>
+ <p class="table_footnote">
+3 这种用法的 Logical Minimum 必须为 0,Logical Maximum 必须为 7,Physical Minimum 必须为 0,Physical Maximum 必须为 315,Units 必须为 Degrees,并且 Report Size 必须为 4。逻辑值指从纵轴顺时针旋转的角度;例如,逻辑值为 0 表示不旋转,并且按下了向上按钮,逻辑值为 1 则表示旋转 45 度,并且同时按下了向上和向左键。
+ </p>
+ <p class="table_footnote">
+4 <a href="http://developer.android.com/reference/android/view/MotionEvent.html">MotionEvent</a>
+ </p>
+ <table>
+ <tbody><tr>
+ <th>模拟控制<sup>1</sup>
+ </th>
+ <th>
+HID 用法
+ </th>
+ <th>
+Android 按钮
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_LTRIGGER">Left Trigger</a>
+ </td>
+ <td>
+0x02 0x00C5
+ </td>
+ <td>
+AXIS_LTRIGGER
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_THROTTLE">Right Trigger</a>
+ </td>
+ <td>
+0x02 0x00C4
+ </td>
+ <td>
+AXIS_RTRIGGER
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_Y">Left Joystick</a>
+ </td>
+ <td>
+0x01 0x0030<br />
+0x01 0x0031
+ </td>
+ <td>
+AXIS_X<br />
+AXIS_Y
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="http://developer.android.com/reference/android/view/MotionEvent.html#AXIS_Z">Right Joystick</a>
+ </td>
+ <td>
+0x01 0x0032<br />
+0x01 0x0035
+ </td>
+ <td>
+AXIS_Z<br />
+AXIS_RZ
+ </td>
+ </tr>
+ </tbody></table>
+ <p class="table_footnote">
+1 <a href="http://developer.android.com/reference/android/view/MotionEvent.html">MotionEvent</a>
+ </p>
+ <h4 id="7_2_7_remote_control">
+7.2.7. 遥控器
+ </h4>
+ <p>
+请参阅<a href="#2_3_1_hardware">第 2.3.1 节</a>,了解设备专属要求。
+ </p>
+ <h3 id="7_3_sensors">
+7.3. 传感器
+ </h3>
+ <p>
+如果设备实现包含某种传感器,而这种传感器具有针对第三方开发者的对应 API,则设备实现必须实现该 API,如 Android SDK 文档和 Android 开放源代码文档中关于<a href="http://source.android.com/devices/sensors/">传感器</a>的部分所述。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须根据 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html"><code>android.content.pm.PackageManager</code></a> 类准确报告是否存在传感器。
+ </li>
+ <li>[C-0-2] 必须通过 <code>SensorManager.getSensorList()</code> 和类似方法返回准确的受支持传感器列表。
+ </li>
+ <li>[C-0-3] 对于所有其他传感器 API,必须采取合理的行为(例如,在应用尝试注册监听器时视情况返回 <code>true</code> 或 <code>false</code>,在不存在对应的传感器时不调用传感器监听器,等等)。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含某种传感器,而这种传感器具有针对第三方开发者的对应 API,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 对于每种传感器(如 Android SDK 文档中定义),都必须采用相关国际单位制(公制)<a href="http://developer.android.com/reference/android/hardware/SensorEvent.html">报告所有传感器测量结果</a>。
+ </li>
+ <li>[C-1-2] 报告传感器数据的延迟时间不得超过 100 毫秒。
+ </li>
+ <li>2 * sample_time(如果传感器进行流式传输所需的最小延迟为 5 毫秒)+ 2 * sample_time(如果应用处理器处于活动状态)。该延迟不包含任何过滤延迟。
+ </li>
+ <li>[C-1-3] 必须在启用传感器后的 400 毫秒 + 2 * sample_time 内报告第一个传感器样本。该样本的精度可以为 0。
+ </li>
+ <li>
+ <p>
+[SR] 应以纳秒为单位<a href="http://developer.android.com/reference/android/hardware/SensorEvent.html#timestamp">报告事件时间</a>(如 Android SDK 文档中定义),该时间表示事件发生时的时间,与 SystemClock.elapsedRealtimeNano() 时钟同步。<strong>强烈建议</strong>现有的及新的 Android 设备满足这些要求,以便升级到未来平台版本(在未来平台版本中,此组件可能会成为必需组件)。同步误差应在 100 毫秒以内。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-7] 对于 Android SDK 文档中指明为<a href="https://source.android.com/devices/sensors/report-modes.html#continuous">连续传感器</a>的任何 API,设备实现都必须连续提供周期性数据样本,并且这些样本的抖动应低于 3%,其中抖动是指在连续事件之间报告的时间戳值之差的标准偏差。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-8] 必须确保传感器事件流不得阻止设备 CPU 进入挂起状态或从挂起状态唤醒。
+ </p>
+ </li>
+ <li>当多个传感器处于启用状态时,功耗不应超过所报告的各个传感器功耗的总和。
+ </li>
+ </ul>
+ <p>
+上述列表并不是详尽无遗的;请以 Android SDK 和 Android 开放源代码文档中关于<a href="http://source.android.com/devices/sensors/">传感器</a>的部分载述的行为为准。
+ </p>
+ <p>
+有些传感器为复合型,也就是说,它们可以从一个或多个其他传感器提供的数据推导出来。(例如方向传感器和线性加速度传感器。)
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应实现这些传感器类型,但前提是设备实现包含必要的实体传感器(如<a href="https://source.android.com/devices/sensors/sensor-types.html">传感器类型</a>中所述)。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含复合传感器,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须实现该传感器,如 Android 开放源代码文档中关于<a href="https://source.android.com/devices/sensors/sensor-types.html#composite_sensor_type_summary">复合传感器</a>的部分所述。
+ </li>
+ </ul>
+ <h4 id="7_3_1_accelerometer">
+7.3.1. 加速度计
+ </h4>
+ <ul>
+ <li>设备实现应包含 3 轴加速度计。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴加速度计,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须能够以至少 50 Hz 的频率报告事件。
+ </li>
+ <li>[C-1-2] 必须实现并报告 <a href="http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_ACCELEROMETER"><code>TYPE_ACCELEROMETER</code></a> 传感器。
+ </li>
+ <li>[C-1-3] 必须遵从 <a href="http://developer.android.com/reference/android/hardware/SensorEvent.html">Android 传感器坐标系</a>(Android API 中对此进行了详细说明)。
+ </li>
+ <li>[C-1-4] 在任意轴上都必须能够测量从自由下落到高达四倍重力加速度 (4g) 的运动过程。
+ </li>
+ <li>[C-1-5] 分辨率必须至少为 12 位。
+ </li>
+ <li>[C-1-6] 标准偏差不得高于 0.05 m/s^,其中标准偏差应按每个轴进行计算,并且应使用以最大采样率在至少 3 秒内采集的样本进行计算。
+ </li>
+ <li>[SR] <strong>强烈建议</strong>实现 <code>TYPE_SIGNIFICANT_MOTION</code> 复合传感器。
+ </li>
+ <li>[SR] 如果提供了在线加速度计校准功能,则强烈建议实现 <code>TYPE_ACCELEROMETER_UNCALIBRATED</code> 传感器。
+ </li>
+ <li>应实现 <code>TYPE_SIGNIFICANT_MOTION</code>、<code>TYPE_TILT_DETECTOR</code>、<code>TYPE_STEP_DETECTOR</code>、<code>TYPE_STEP_COUNTER</code> 复合传感器(如 Android SDK 文档中所述)。
+ </li>
+ <li>应以至少 200 Hz 的频率报告事件。
+ </li>
+ <li>分辨率应至少为 16 位。
+ </li>
+ <li>应在使用时进行校准(如果特性随生命周期发生变化)和补偿,并且在设备重新启动后直到再次重新启动之前应保留补偿参数。
+ </li>
+ <li>应进行温度补偿。
+ </li>
+ <li>还应实现 <a href="https://developer.android.com/reference/android/hardware/Sensor.html#STRING_TYPE_ACCELEROMETER_UNCALIBRATED"><code>TYPE_ACCELEROMETER_UNCALIBRATED</code></a> 传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴加速度计,并且实现了 <code>TYPE_SIGNIFICANT_MOTION</code>、<code>TYPE_TILT_DETECTOR</code>、<code>TYPE_STEP_DETECTOR</code>、<code>TYPE_STEP_COUNTER</code> 复合传感器中的任何一种,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 其功耗总和必须始终低于 4 mW。
+ </li>
+ <li>每个传感器的功耗应在设备处于动态时低于 2 mW,在设备处于静态时低于 0.5 mW。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴加速度计和陀螺仪传感器,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须实现 <code>TYPE_GRAVITY</code> 和 <code>TYPE_LINEAR_ACCELERATION</code> 复合传感器。
+ </li>
+ <li>应实现 <code>TYPE_GAME_ROTATION_VECTOR</code> 复合传感器。
+ </li>
+ <li>[SR] 强烈建议现有的及新的 Android 设备实现 <code>TYPE_GAME_ROTATION_VECTOR</code> 传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴加速度计、陀螺仪传感器和磁力计传感器,则:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须实现 <code>TYPE_ROTATION_VECTOR</code> 复合传感器。
+ </li>
+ </ul>
+ <h4 id="7_3_2_magnetometer">
+7.3.2. 磁力计
+ </h4>
+ <ul>
+ <li>设备实现应包含 3 轴磁力计(罗盘)。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴磁力计,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现 <code>TYPE_MAGNETIC_FIELD</code> 传感器。
+ </li>
+ <li>[C-1-2] 必须能够以至少 10 Hz 的频率报告事件,并且应以至少 50 Hz 的频率报告事件。
+ </li>
+ <li>[C-1-3] 必须遵从 <a href="http://developer.android.com/reference/android/hardware/SensorEvent.html">Android 传感器坐标系</a>(Android API 中对此进行了详细说明)。
+ </li>
+ <li>[C-1-4] 饱和之前,在每个轴上的测量范围都必须能够达到 -900 μT 至 +900 μT。
+ </li>
+ <li>[C-1-5] 必须通过以下方式使硬铁偏移值低于 700 μT,并且应低于 200 μT:将磁力计放在远离动态(电流感应)和静态(磁感应)磁场的位置。
+ </li>
+ <li>[C-1-6] 分辨率必须等于或高于 0.6 µT。
+ </li>
+ <li>[C-1-7] 必须支持在线校准和补偿硬铁偏差,并且在设备重新启动后直到再次重新启动之前保留补偿参数。
+ </li>
+ <li>[C-1-8] 必须应用软铁补偿 - 可以在使用期间或设备生产期间进行校准。
+ </li>
+ <li>[C-1-9] 标准偏差不得高于 1.5 µT,并且不应高于 0.5 µT,其中标准偏差是按每个轴进行计算,并且是使用以最大采样率在至少 3 秒内采集的样本进行计算。
+ </li>
+ <li>应实现 <code>TYPE_MAGNETIC_FIELD_UNCALIBRATED</code> 传感器。
+ </li>
+ <li>[SR] 强烈建议现有的及新的 Android 设备实现 <code>TYPE_MAGNETIC_FIELD_UNCALIBRATED</code> 传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴磁力计、加速度计传感器和陀螺仪传感器,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须实现 <code>TYPE_ROTATION_VECTOR</code> 复合传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴磁力计和加速度计,则:
+ </p>
+ <ul>
+ <li>可以实现 <code>TYPE_GEOMAGNETIC_ROTATION_VECTOR</code> 传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 3 轴磁力计、加速度计和 <code>TYPE_GEOMAGNETIC_ROTATION_VECTOR</code> 传感器,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 功耗必须低于 10 mW。
+ </li>
+ <li>如果传感器注册了 10 Hz 的批处理模式,则功耗应低于 3 mW。
+ </li>
+ </ul>
+ <h4 id="7_3_3_gps">
+7.3.3. GPS
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应包含 GPS/GNSS 接收器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 GPS/GNSS 接收器,并且通过 <code>android.hardware.location.gps</code> 功能标记向应用报告该功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 当收到通过 <code>LocationManager#requestLocationUpdate</code> 提交的位置信息请求时,必须支持以至少 1 Hz 的频率输出位置信息。
+ </li>
+ <li>[C-1-2] 当互联网连接的数据传输速度为 0.5 Mbps 或更快时,在露天条件(信号强,可忽略多路径,HDOP 小于 2)下必须能于 10 秒内确定位置(快速完成首次定位)。为了满足该要求,通常可以采用某种形式的辅助或预测 GPS/GNSS 技术来最大限度地缩短 GPS/GNSS 锁定时间(辅助数据包括参考时间、参考位置和卫星星历/时钟)。
+ <ul>
+ <li>[SR] 完成此类位置计算后,如果设备在一个小时内再次收到位置信息请求,强烈建议设备在露天条件下能于 10 秒内确定其位置,即使后续请求是在无数据网络连接的情况下和/或设备重新开机之后发出的也是如此。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+确定位置之后,在露天条件下,当设备处于静止状态或以小于 1 m/s2 的加速度移动时:
+ </p>
+ <ul>
+ <li>[C-1-3] 必须至少在 95% 的时间内能够确定 20 米以内的位置以及 0.5 m/s 以内的速度。
+ </li>
+ <li>[C-1-4] 必须通过 <a href="https://developer.android.com/reference/android/location/GnssStatus.Callback.html#GnssStatus.Callback()'"><code>GnssStatus.Callback</code></a> 同时跟踪和报告一个星群中的至少 8 颗卫星。
+ </li>
+ <li>应能够同时跟踪多个星群(例如 GPS 以及 Glonass、Beidou、Galileo 中的至少一个)中的至少 24 颗卫星。
+ </li>
+ <li>[C-1-5] 必须通过测试 API“getGnssYearOfHardware”报告 GNSS 技术出产年份。
+ </li>
+ <li>[SR] 在紧急通话期间继续提供正常的 GPS/GNSS 位置信息输出。
+ </li>
+ <li>[SR] 报告跟踪的所有星群的 GNSS 测量结果(在 GnssStatus 消息中报告),SBAS 除外。
+ </li>
+ <li>[SR] 报告 AGC 以及 GNSS 测量频率。
+ </li>
+ <li>[SR] 在每次报告 GPS 位置时均报告所有估算的测量结果(包括方位、速度和高度)。
+ </li>
+ <li>[SR] 强烈建议尽可能多地满足针对以下设备的附加强制性要求:通过 Test API <code>LocationManager.getGnssYearOfHardware()</code> 报告的年份为“2016”或“2017”的设备。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 GPS/GNSS 接收器,并且通过 <code>android.hardware.location.gps</code> 功能标记向应用报告该功能,而 <code>LocationManager.getGnssYearOfHardware()</code> Test API 报告的年份为“2016”或更晚,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须在发现 GPS 测量结果后立即报告,即使尚未报告通过 GPS/GNSS 计算出的位置也是如此。
+ </li>
+ <li>[C-2-2] 必须报告 GPS 伪距和伪距率,以便在确定位置之后,在露天条件下,当设备处于静止状态或以小于 0.2 m/s2 的加速度移动时,至少在 95% 的时间内能够计算出 20 米以内的位置以及 0.2 m/s 以内的速度。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 GPS/GNSS 接收器,并且通过 <code>android.hardware.location.gps</code> 功能标记向应用报告该功能,而 <code>LocationManager.getGnssYearOfHardware()</code> Test API 报告的年份为“2017”或更晚,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须在紧急通话期间继续提供正常的 GPS/GNSS 位置信息输出。
+ </li>
+ <li>[C-3-2] 必须报告跟踪的所有星群的 GNSS 测量结果(在 GnssStatus 消息中报告),SBAS 除外。
+ </li>
+ <li>[C-3-3] 必须报告 AGC 以及 GNSS 测量频率。
+ </li>
+ <li>[C-3-4] 必须在每次报告 GPS 位置时均报告所有估算的测量结果(包括方位、速度和高度)。
+ </li>
+ </ul>
+ <h4 id="7_3_4_gyroscope">
+7.3.4. 陀螺仪
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应包含陀螺仪(角度变化传感器)。
+ </li>
+ <li>除非还包含 3 轴加速度计,否则不应包含陀螺仪传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含陀螺仪,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须能够以至少 50 Hz 的频率报告事件。
+ </li>
+ <li>[C-1-2] 必须实现 <code>TYPE_GYROSCOPE</code> 传感器,并且还应实现 <code>TYPE_GYROSCOPE_UNCALIBRATED</code> 传感器。
+ </li>
+ <li>[C-1-3] 必须能够测量高达 1000 度/秒的方向变化。
+ </li>
+ <li>[C-1-4] 分辨率必须为 12 位或更高,并且应为 16 位或更高。
+ </li>
+ <li>[C-1-5] 必须进行温度补偿。
+ </li>
+ <li>[C-1-6] 必须在使用时进行校准和补偿,并在设备重新启动后直到再次重新启动之前保留补偿参数。
+ </li>
+ <li>[C-1-7] 每 Hz 方差不得超过 1e-7 rad^2/s^2(每 Hz 方差,或 rad^2/s)。方差可随采样率而变化,但不得超过该值。也就是说,如果以 1 Hz 的采样率测量陀螺仪的方差,则方差不应超过 1e-7 rad^2/s^2。
+ </li>
+ <li>[SR] 强烈建议现有的及新的 Android 设备实现 <code>SENSOR_TYPE_GYROSCOPE_UNCALIBRATED</code> 传感器。
+ </li>
+ <li>[SR] 强烈建议设备在室温下处于静止状态时的校准误差小于 0.01 rad/s。
+ </li>
+ <li>应以至少 200 Hz 的频率报告事件。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含陀螺仪、加速度计传感器和磁力计传感器,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须实现 <code>TYPE_ROTATION_VECTOR</code> 复合传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含陀螺仪和加速度计传感器,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须实现 <code>TYPE_GRAVITY</code> 和 <code>TYPE_LINEAR_ACCELERATION</code> 复合传感器。
+ </li>
+ <li>[SR] 强烈建议现有的及新的 Android 设备实现 <code>TYPE_GAME_ROTATION_VECTOR</code> 传感器。
+ </li>
+ <li>应实现 <code>TYPE_GAME_ROTATION_VECTOR</code> 复合传感器。
+ </li>
+ </ul>
+ <h4 id="7_3_5_barometer">
+7.3.5. 气压计
+ </h4>
+ <ul>
+ <li>设备实现应包含气压计(环境气压传感器)。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含气压计,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现并报告 <code>TYPE_PRESSURE</code> 传感器。
+ </li>
+ <li>[C-1-2] 必须能够以至少 5 Hz 的频率报告事件。
+ </li>
+ <li>[C-1-3] 必须进行温度补偿。
+ </li>
+ <li>[SR] 强烈建议能够报告 300hPa 到 1100hPa 之间的压力测量结果。
+ </li>
+ <li>绝对精度应为 1hPa。
+ </li>
+ <li>相对精度应为 20hPa 范围内误差不超过 0.12hPa(相当于在海平面上 200m 左右的变化误差不超过 1m 左右)。
+ </li>
+ </ul>
+ <h4 id="7_3_6_thermometer">
+7.3.6. 温度计
+ </h4>
+ <p>
+设备实现:可以包含环境温度计(温度传感器)。<em></em> 可以(但不应)包含 CPU 温度传感器。
+ </p>
+ <p>
+如果设备实现包含环境温度计(温度传感器),则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须将其定义为 <code>SENSOR_TYPE_AMBIENT_TEMPERATURE</code>,并且必须从用户与设备互动的位置(室内/车厢内)测量环境温度(以摄氏度为单位)。
+ </li>
+ <li>[C-1-2] 必须将其定义为 <code>SENSOR_TYPE_TEMPERATURE</code>。
+ </li>
+ <li>[C-1-3] 必须测量设备 CPU 的温度。
+ </li>
+ <li>[C-1-4] 不得测量任何其他温度。
+ </li>
+ </ul>
+ <p>
+请注意,<code>SENSOR_TYPE_TEMPERATURE</code> 传感器类型在 Android 4.0 中已被弃用。
+ </p>
+ <h4 id="7_3_7_photometer">
+7.3.7. 光度计
+ </h4>
+ <ul>
+ <li>设备实现可以包含光度计(环境光传感器)。
+ </li>
+ </ul>
+ <h4 id="7_3_8_proximity_sensor">
+7.3.8. 近程传感器
+ </h4>
+ <ul>
+ <li>设备实现可以包含近程传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含近程传感器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须在与屏幕相同的方向上测量物体的接近度。也就是说,近程传感器必须朝向适当方向,以便检测靠近屏幕的物体,因为此类传感器的主要用途是检测用户正在使用的手机。如果设备实现包含朝向任何其他方向的近程传感器,则不得通过该 API 访问此类传感器。
+ </li>
+ <li>[C-1-2] 精度必须至少为 1 位。
+ </li>
+ </ul>
+ <h4 id="7_3_9_high_fidelity_sensors">
+7.3.9. 高保真传感器
+ </h4>
+ <p>
+如果设备实现包含一套质量更高的传感器(如本节中定义),并使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须通过 <code>android.hardware.sensor.hifi_sensors</code> 功能标记标识该功能。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明了 <code>android.hardware.sensor.hifi_sensors</code>,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-2-1] 必须具有符合以下要求的 <code>TYPE_ACCELEROMETER</code> 传感器:
+ </p>
+ <ul>
+ <li>测量范围必须至少在 -8g 到 +8g 之间。
+ </li>
+ <li>测量分辨率必须至少为 1024 LSB/G。
+ </li>
+ <li>最小测量频率必须等于或低于 12.5 Hz。
+ </li>
+ <li>最大测量频率必须等于或高于 400 Hz。
+ </li>
+ <li>测量噪声不得高于 400 uG/√Hz。
+ </li>
+ <li>必须实现这种传感器的非唤醒形式,并且至少能够缓冲 3000 个传感器事件。
+ </li>
+ <li>批处理功耗不得高于 3 mW。
+ </li>
+ <li>24 小时静态数据集的静态噪声偏差稳定度应小于等于 15 μg/√Hz。
+ </li>
+ <li>偏差随温度的变化应小于等于 +/- 1mg/°C。
+ </li>
+ <li>最佳拟合线非线性度应小于等于 0.5%,并且灵敏度随温度的变化应小于等于 0.03%/C°。
+ </li>
+ <li>应具有白噪声谱,以确保传感器的噪声完整性充分符合要求。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[C-2-2] 必须具有 <code>TYPE_ACCELEROMETER_UNCALIBRATED</code>,并且其符合与 <code>TYPE_ACCELEROMETER</code> 相同的质量要求。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-2-3] 必须具有符合以下要求的 <code>TYPE_GYROSCOPE</code> 传感器:
+ </p>
+ <ul>
+ <li>测量范围必须至少在 -1000 dps 到 +1000 dps 之间。
+ </li>
+ <li>测量分辨率必须至少为 16 LSB/dps。
+ </li>
+ <li>最小测量频率必须等于或低于 12.5 Hz。
+ </li>
+ <li>最大测量频率必须等于或高于 400 Hz。
+ </li>
+ <li>测量噪声不得高于 0.014°/s/√Hz。
+ </li>
+ <li>24 小时静态数据集的静态噪声偏差稳定度应小于 0.0002 °/s √Hz。
+ </li>
+ <li>偏差随温度的变化应小于等于 +/- 0.05 °/s/°C。
+ </li>
+ <li>灵敏度随温度的变化应小于等于 0.02%/°C。
+ </li>
+ <li>最佳拟合线非线性度应小于等于 0.2%。
+ </li>
+ <li>噪声密度应小于等于 0.007 °/s/√Hz。
+ </li>
+ <li>应具有白噪声谱,以确保传感器的噪声完整性充分符合要求。
+ </li>
+ <li>当设备处于静态时,10-40 ℃ 温度范围内的校准误差应小于 0.002 rad/s。
+ </li>
+ </ul>
+ </li>
+ <li>
+ <p>
+[C-2-4] 必须具有 <code>TYPE_GYROSCOPE_UNCALIBRATED</code>,并且其符合与 <code>TYPE_GYROSCOPE</code> 相同的质量要求。
+ </p>
+ </li>
+ <li>[C-2-5] 必须具有符合以下要求的 <code>TYPE_GEOMAGNETIC_FIELD</code> 传感器:
+ <ul>
+ <li>测量范围必须至少在 -900 uT 到 +900 uT 之间。
+ </li>
+ <li>测量分辨率必须至少为 5 LSB/uT。
+ </li>
+ <li>最小测量频率必须等于或低于 5 Hz。
+ </li>
+ <li>最大测量频率必须等于或高于 50 Hz。
+ </li>
+ <li>测量噪声不得高于 0.5 uT。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-6] 必须具有 <code>TYPE_MAGNETIC_FIELD_UNCALIBRATED</code>,并且其除了符合与 <code>TYPE_GEOMAGNETIC_FIELD</code> 相同的质量要求外,还要符合以下要求:
+ <ul>
+ <li>必须实现这种传感器的非唤醒形式,并且至少能够缓冲 600 个传感器事件。
+ </li>
+ <li>应具有白噪声谱,以确保传感器的噪声完整性充分符合要求。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-7] 必须具有符合以下要求的 <code>TYPE_PRESSURE</code> 传感器:
+ <ul>
+ <li>测量范围必须至少在 300 hPa 到 1100 hPa 之间。
+ </li>
+ <li>测量分辨率必须至少为 80 LSB/hPa。
+ </li>
+ <li>最小测量频率必须等于或低于 1 Hz。
+ </li>
+ <li>最大测量频率必须等于或高于 10 Hz。
+ </li>
+ <li>测量噪声不得高于 2 Pa/√Hz。
+ </li>
+ <li>必须实现这种传感器的非唤醒形式,并且至少能够缓冲 300 个传感器事件。
+ </li>
+ <li>批处理功耗不得高于 2 mW。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-8] 必须具有符合以下要求的 <code>TYPE_GAME_ROTATION_VECTOR</code> 传感器:
+ <ul>
+ <li>必须实现这种传感器的非唤醒形式,并且至少能够缓冲 300 个传感器事件。
+ </li>
+ <li>批处理功耗不得高于 4 mW。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-9] 必须具有符合以下要求的 <code>TYPE_SIGNIFICANT_MOTION</code> 传感器:
+ <ul>
+ <li>当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-10] 必须具有符合以下要求的 <code>TYPE_STEP_DETECTOR</code> 传感器:
+ <ul>
+ <li>必须实现这种传感器的非唤醒形式,并且至少能够缓冲 100 个传感器事件。
+ </li>
+ <li>当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
+ </li>
+ <li>批处理功耗不得高于 4 mW。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-11] 必须具有符合以下要求的 <code>TYPE_STEP_COUNTER</code> 传感器:
+ <ul>
+ <li>当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-12] 必须具有符合以下要求的 <code>TILT_DETECTOR</code> 传感器:
+ <ul>
+ <li>当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 1.5 mW。
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-13] 加速度计、陀螺仪传感器和磁力计报告的同一物理事件的事件时间戳之间相差必须在 2.5 毫秒以内。
+ </li>
+ <li>[C-2-14] 陀螺仪传感器事件时间戳必须与摄像头子系统采用相同的时间基准,并且误差在 1 毫秒以内。
+ </li>
+ <li>[C-2-15] 当上述任一物理传感器上的数据可供应用使用时,必须在 5 毫秒内将样本提供给应用。
+ </li>
+ <li>[C-2-16] 如果启用了以下传感器的任意组合,当设备处于静态时,功耗不得高于 0.5 mW;当设备处于动态时,功耗不得高于 2.0 mW:
+ <ul>
+ <li>
+ <code>SENSOR_TYPE_SIGNIFICANT_MOTION</code>
+ </li>
+ <li>
+ <code>SENSOR_TYPE_STEP_DETECTOR</code>
+ </li>
+ <li>
+ <code>SENSOR_TYPE_STEP_COUNTER</code>
+ </li>
+ <li>
+ <code>SENSOR_TILT_DETECTORS</code>
+ </li>
+ </ul>
+ </li>
+ <li>[C-2-17] 可以有 <code>TYPE_PROXIMITY</code> 传感器,但如果存在,则必须至少能够缓冲 100 个传感器事件。
+ </li>
+ </ul>
+ <p>
+请注意,本节中的所有功耗要求都不包括应用处理器的功耗。它包含的是整个传感器链(传感器、所有辅助电路、所有专用的传感器处理系统,等等)的功耗。
+ </p>
+ <p>
+如果设备实现支持直接传感器,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须通过 <a href="https://developer.android.com/reference/android/hardware/Sensor.html#isDirectChannelTypeSupported%28int%29"><code>isDirectChannelTypeSupported</code></a> 和 <a href="https://developer.android.com/reference/android/hardware/Sensor.html#getHighestDirectReportRateLevel%28%29"><code>getHighestDirectReportRateLevel</code></a> API 正确声明支持直接通道类型和直接报告频率级别。
+ </li>
+ <li>[C-3-2] 对于声明支持传感器直接通道的所有传感器,都必须至少支持以下两种传感器直接通道类型之一:
+ <ul>
+ <li>
+ <a href="https://developer.android.com/reference/android/hardware/SensorDirectChannel.html#TYPE_HARDWARE_BUFFER"><code>TYPE_HARDWARE_BUFFER</code></a>
+ </li>
+ <li>
+ <a href="https://developer.android.com/reference/android/hardware/SensorDirectChannel.html#TYPE_MEMORY_FILE"><code>TYPE_MEMORY_FILE</code></a>
+ </li>
+ </ul>
+ </li>
+ <li>对于以下类型的主要传感器(非唤醒变体),应支持通过传感器直接通道报告事件:
+ <ul>
+ <li>
+ <code>TYPE_ACCELEROMETER</code>
+ </li>
+ <li>
+ <code>TYPE_ACCELEROMETER_UNCALIBRATED</code>
+ </li>
+ <li>
+ <code>TYPE_GYROSCOPE</code>
+ </li>
+ <li>
+ <code>TYPE_GYROSCOPE_UNCALIBRATED</code>
+ </li>
+ <li>
+ <code>TYPE_MAGNETIC_FIELD</code>
+ </li>
+ <li>
+ <code>TYPE_MAGNETIC_FIELD_UNCALIBRATED</code>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h4 id="7_3_10_fingerprint_sensor">
+7.3.10. 指纹传感器
+ </h4>
+ <p>
+如果设备实现包含安全锁定屏幕,则:
+ </p>
+ <ul>
+ <li>应包含指纹传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含指纹传感器,并使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明支持 <code>android.hardware.fingerprint</code> 功能。
+ </li>
+ <li>[C-1-2] 必须完整实现<a href="https://developer.android.com/reference/android/hardware/fingerprint/package-summary.html">对应的 API</a>(如 Android SDK 文档中所述)。
+ </li>
+ <li>[C-1-3] 错误接受率不得高于 0.002%。
+ </li>
+ <li>[C-1-4] 尝试指纹验证的失败次数达到 5 次后,必须限制在至少 30 秒内不能再次进行指纹验证。
+ </li>
+ <li>[C-1-5] 必须实现有硬件支持的密钥存储区,并在可信执行环境 (TEE) 中或在具有通向 TEE 的安全通道的芯片上执行指纹匹配。
+ </li>
+ <li>[C-1-6] 必须对所有可识别的指纹数据进行加密,并对其采用密码形式的身份验证机制,以确保在可信执行环境 (TEE) 之外无法获取、读取或更改这些数据(如 Android 开源项目网站上的<a href="https://source.android.com/devices/tech/security/authentication/fingerprint-hal.html">实现指南</a>中所述)。
+ </li>
+ <li>[C-1-7] 必须通过以下方式来防止在没有先建立信任链的情况下添加指纹:让用户确认现有设备凭据(PIN 码/图案/密码,受 TEE 保护)或添加新设备凭据;Android 开源项目实现在框架中提供了可实现这一点的机制。
+ </li>
+ <li>[C-1-8] 不得允许第三方应用区分各个指纹。
+ </li>
+ <li>[C-1-9] 必须遵从 DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT 标记。
+ </li>
+ <li>[C-1-10] 如果之前采用的是 Android 6.0 之前的版本,后来进行了升级,则必须安全迁移指纹数据以满足上述要求,或者将这些指纹数据移除。
+ </li>
+ <li>[SR] 强烈建议确保在设备上测得的错误拒绝率低于 10%。
+ </li>
+ <li>[SR] 对于已注册的指纹,强烈建议确保延迟时间(即测得的从触摸指纹传感器到屏幕解锁的时间)低于 1 秒。
+ </li>
+ <li>应使用 Android 开源项目中提供的 Android Fingerprint 图标。
+ </li>
+ </ul>
+ <h4 id="7_3_11_android_automotive-only_sensors">
+7.3.11. Android Automotive 专用传感器
+ </h4>
+ <p>
+<code>android.car.CarSensorManager API</code> 中对 Automotive 专用传感器进行了定义。
+ </p>
+ <h5 id="7_3_11_1_current_gear">
+7.3.11.1. 用电装置
+ </h5>
+ <p>
+请参阅<a href="#2_5_1_hardware">第 2.5.1 节</a>,了解设备专属要求。
+ </p>
+ <h5 id="7_3_11_2_day_night_mode">
+7.3.11.2. 日间/夜间模式
+ </h5>
+ <p>
+请参阅<a href="#2_5_1_hardware">第 2.5.1 节</a>,了解设备专属要求。
+ </p>
+ <h5 id="7_3_11_3_driving_status">
+7.3.11.3. 驾驶状态
+ </h5>
+ <p>
+请参阅<a href="#2_5_1_hardware">第 2.5.1 节</a>,了解设备专属要求。
+ </p>
+ <h5 id="7_3_11_4_wheel_speed">
+7.3.11.4. 车轮转速
+ </h5>
+ <p>
+请参阅<a href="#2_5_1_hardware">第 2.5.1 节</a>,了解设备专属要求。
+ </p>
+ <h3 id="7_3_12_pose_sensor">
+7.3.12. 姿势传感器
+ </h3>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>可以支持具有 6 个自由度的姿势传感器。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持具有 6 个自由度的姿势传感器,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现并报告 <a href="https://developer.android.com/reference/android/hardware/Sensor.html#TYPE_POSE_6DOF"><code>TYPE_POSE_6DOF</code></a> 传感器。
+ </li>
+ <li>[C-1-2] 必须比只使用旋转矢量更准确。
+ </li>
+ </ul>
+ <h3 id="7_4_data_connectivity">
+7.4. 数据连接
+ </h3>
+ <h4 id="7_4_1_telephony">
+7.4.1. 电话
+ </h4>
+ <p>
+在 Android API 和本文档中,“电话”专指与通过 GSM 或 CDMA 网络进行语音通话和发送短信相关的硬件。虽然这些语音通话可能采用也可能不采用分封交换技术,但都是为了使 Android 被视为独立于可通过同一网络实现的所有数据连接。也就是说,Android“电话”功能和 API 专指语音通话和短信。例如,如果设备无法打电话或收发短信,则无论它们是否使用移动网络进行数据连接,都不会被视为电话设备。
+ </p>
+ <ul>
+ <li>Android 可以用在不包含电话硬件的设备上。也就是说,Android 可与非电话设备兼容。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 GSM 或 CDMA 电话,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须根据该技术声明 <code>android.hardware.telephony</code> 功能标记和其他子功能标记。
+ </li>
+ <li>[C-1-2] 必须完全支持针对该技术的 API。
+ </li>
+ </ul>
+ <p>
+如果设备实现不包含电话硬件,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须将所有相关 API 实现为空操作。
+ </li>
+ </ul>
+ <h5 id="7_4_1_1_number_blocking_compatibility">
+7.4.1.1. 号码屏蔽兼容性
+ </h5>
+ <p>
+如果设备实现报告 <code>android.hardware.telephony feature</code>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持号码屏蔽。
+ </li>
+ <li>[C-1-2] 必须完整实现 <a href="http://developer.android.com/reference/android/provider/BlockedNumberContract.html"><code>BlockedNumberContract</code></a> 和对应的 API(如 SDK 文档中所述)。
+ </li>
+ <li>[C-1-3] 必须屏蔽从列入“BlockedNumberProvider”的电话号码打来的所有电话和发来的所有短信,而不与应用进行任何交互。唯一例外是当号码屏蔽被临时解除时(如 SDK 文档中所述)。
+ </li>
+ <li>[C-1-4] 不得将被屏蔽的呼叫写入<a href="http://developer.android.com/reference/android/provider/CallLog.html">平台通话记录提供程序</a>。
+ </li>
+ <li>[C-1-5] 不得将被屏蔽的短信写入<a href="http://developer.android.com/reference/android/provider/Telephony.html">电话提供程序</a>。
+ </li>
+ <li>[C-1-6] 必须实现被屏蔽号码管理界面,系统可因应 <code>TelecomManager.createManageBlockedNumbersIntent()</code> 方法返回的 Intent 打开该界面。
+ </li>
+ <li>[C-1-7] 不得允许次要用户查看或修改设备上被屏蔽的号码,因为 Android 平台会假设主用户对设备上的电话服务(单个实例)拥有完全控制权。对于次要用户,必须隐藏所有与屏蔽相关的界面,并且仍必须遵从屏蔽列表。
+ </li>
+ <li>当设备更新到 Android 7.0 时,应将被屏蔽的号码迁移到提供程序。
+ </li>
+ </ul>
+ <h4 id="7_4_2_ieee_802_11_(wi-fi)">
+7.4.2. IEEE 802.11 (WLAN)
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应支持一种或多种形式的 802.11。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 802.11,并将该功能提供给第三方应用使用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现对应的 Android API。
+ </li>
+ <li>[C-1-2] 必须报告硬件功能标记 <code>android.hardware.wifi</code>。
+ </li>
+ <li>[C-1-3] 必须实现<a href="http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html">多播 API</a>(如 SDK 文档中所述)。
+ </li>
+ <li>[C-1-4] 必须支持多播 DNS (mDNS),并且不得在操作过程中的任何时间过滤 mDNS 数据包 (224.0.0.251),其中包括:
+ <ul>
+ <li>即使屏幕未处于活动状态时。
+ </li>
+ <li>即使处于待机状态时(适用于 Android TV 设备实现)。
+ </li>
+ </ul>
+ </li>
+ <li>在 STA 断开连接时,应在每次扫描开始时对探测请求帧的来源 MAC 地址和序列号进行一次随机化处理。
+ <ul>
+ <li>一次扫描中包含的每组探测请求帧都应使用一个一致的 MAC 地址(不应在扫描期间对 MAC 地址进行随机化处理)。
+ </li>
+ <li>探测请求序列号应在扫描中包含的探测请求之间按正常方式(依序)迭代。
+ </li>
+ <li>应在以下时间对探测请求序列号进行随机化处理:一次扫描包含的最后一个探测请求和下次扫描包含的第一个探测请求之间。
+ </li>
+ </ul>
+ </li>
+ <li>在 STA 断开连接时,应仅允许在探测请求帧中使用以下信息元素:
+ <ul>
+ <li>SSID Parameter Set (0)
+ </li>
+ <li>DS Parameter Set (3)
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <h5 id="7_4_2_1_wi-fi_direct">
+7.4.2.1. WLAN 直连
+ </h5>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应支持 WLAN 直连(WLAN 对等连接)。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 WLAN 直连,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现<a href="http://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager.html">对应的 Android API</a>(如 SDK 文档中所述)。
+ </li>
+ <li>[C-1-2] 必须报告硬件功能 <code>android.hardware.wifi.direct</code>。
+ </li>
+ <li>[C-1-3] 必须支持常规的 WLAN 操作。
+ </li>
+ <li>应支持并发执行 WLAN 和 WLAN 直连操作。
+ </li>
+ </ul>
+ <h5 id="7_4_2_2_wi-fi_tunneled_direct_link_setup">
+7.4.2.2. WLAN 通道直接链路设置
+ </h5>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应支持 <a href="http://developer.android.com/reference/android/net/wifi/WifiManager.html">WLAN 通道直接链路设置 (TDLS)</a>(如 Android SDK 文档中所述)。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 TDLS,并且 TDLS 已由 WiFiManager API 启用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须通过 [<code>WifiManager.isTdlsSupported</code>] (https://developer.android.com/reference/android/net/wifi/WifiManager.html#isTdlsSupported%28%29) 声明支持 TDLS。
+ </li>
+ <li>只在能够使用且有好处时才应使用 TDLS。
+ </li>
+ <li>应进行一些试探,如果使用 TDLS 时的性能可能低于通过 WLAN 接入点连接时的性能,则不应使用 TDLS。
+ </li>
+ </ul>
+ <h5 id="7_4_2_3_wi-fi_aware">
+7.4.2.3. WLAN Aware
+ </h5>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应支持 <a href="http://www.wi-fi.org/discover-wi-fi/wi-fi-aware">WLAN Aware</a>。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 WLAN Aware,并使该功能可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现 <code>WifiAwareManager</code> API(如 <a href="http://developer.android.com/reference/android/net/wifi/aware/WifiAwareManager.html">SDK 文档</a>中所述)。
+ </li>
+ <li>[C-1-2] 必须声明 <code>android.hardware.wifi.aware</code> 功能标记。
+ </li>
+ <li>[C-1-3] 必须支持并发执行 WLAN 和 WLAN Aware 操作。
+ </li>
+ <li>[C-1-4] 每当 WLAN Aware 处于启用状态时,都必须要以不超过 30 分钟的间隔对 WLAN Aware 管理接口地址进行随机化处理。
+ </li>
+ </ul>
+ <h5 id="7_4_2_4_wi-fi_passpoint">
+7.4.2.4. WLAN Passpoint
+ </h5>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应支持 <a href="http://www.wi-fi.org/discover-wi-fi/wi-fi-certified-passpoint">WLAN Passpoint</a>。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持 WLAN Passpoint,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现与 Passpoint 相关的 <code>WifiManager</code> API(如 <a href="http://developer.android.com/reference/android/net/wifi/WifiManager.html">SDK 文档</a>中所述)。
+ </li>
+ <li>[C-1-2] 必须支持 IEEE 802.11u 标准,特别是与网络发现和选择相关的标准,例如通用通告服务协议 (GAS) 和接入网络查询协议 (ANQP)。
+ </li>
+ </ul>
+ <p>
+反之,如果设备实现不支持 WLAN Passpoint,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 与 Passpoint 相关的 <code>WifiManager</code> API 的实现必须抛出 <code>UnsupportedOperationException</code>。
+ </li>
+ </ul>
+ <h4 id="7_4_3_bluetooth">
+7.4.3. 蓝牙
+ </h4>
+ <p>
+如果设备实现支持蓝牙音频配置,则:
+ </p>
+ <ul>
+ <li>应支持高级音频编解码器和蓝牙音频编解码器(例如 LDAC)。
+ </li>
+ </ul>
+ <p>
+如果设备实现声明了 <code>android.hardware.vr.high_performance</code> 功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展。
+ </li>
+ </ul>
+ <p>
+Android 支持<a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">蓝牙和蓝牙低功耗</a>。
+ </p>
+ <p>
+如果设备实现支持蓝牙和蓝牙低功耗,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须声明相关平台功能(分别为 <code>android.hardware.bluetooth</code> 和 <code>android.hardware.bluetooth_le</code>),并实现平台 API。
+ </li>
+ <li>应实现适合设备的相关蓝牙配置,例如 A2DP、AVCP、OBEX 等。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持蓝牙低功耗,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须声明硬件功能 <code>android.hardware.bluetooth_le</code>。
+ </li>
+ <li>[C-3-2] 必须启用基于 GATT(通用属性配置)的蓝牙 API(如 SDK 文档中所述)以及 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a>。
+ </li>
+ <li>[C-3-3] 必须针对 <code>BluetoothAdapter.isOffloadedFilteringSupported()</code> 报告正确的值,以指明是否实现了针对 <a href="https://developer.android.com/reference/android/bluetooth/le/ScanFilter.html">ScanFilter</a> API 类的过滤逻辑。
+ </li>
+ <li>[C-3-4] 必须针对 <code>BluetoothAdapter.isMultipleAdvertisementSupported()</code> 报告正确的值,以指明是否支持低功耗通告。
+ </li>
+ <li>应支持在实现 <a href="https://developer.android.com/reference/android/bluetooth/le/ScanFilter.html">ScanFilter API</a> 时将过滤逻辑分载到蓝牙芯片组。
+ </li>
+ <li>应支持将批量扫描分载到蓝牙芯片组。
+ </li>
+ <li>
+ <p>
+应支持至少为 4 个槽位的多通告。
+ </p>
+ </li>
+ <li>
+ <p>
+[SR] 强烈建议实现不超过 15 分钟的可解析私有地址 (RPA) 超时,并在超时后轮转地址以保护用户隐私。
+ </p>
+ </li>
+ </ul>
+ <h4 id="7_4_4_near-field_communications">
+7.4.4. 近距离无线通信
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应包含近距离无线通信 (NFC) 所需的收发器和相关硬件。
+ </li>
+ <li>[C-0-1] 必须实现 <code>android.nfc.NdefMessage</code> 和 <code>android.nfc.NdefRecord</code> API,即使它们不支持 NFC 或未声明 <code>android.hardware.nfc</code> 功能也是如此,因为这些类表示独立于协议的数据表示格式。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 NFC 硬件,并计划使其可供第三方应用使用,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须通过 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html"><code>android.content.pm.PackageManager.hasSystemFeature()</code> 方法</a>报告 <code>android.hardware.nfc</code> 功能。
+ </li>
+ <li>必须能够通过以下 NFC 标准读取和写入 NDEF 消息:
+ </li>
+ <li>[C-1-2] 必须能够通过以下 NFC 标准充当 NFC Forum 读取器/写入器(如 NFC Forum 技术规范 NFCForum-TS-DigitalProtocol-1.0 中定义):
+ </li>
+ <li>NfcA (ISO14443-3A)
+ </li>
+ <li>NfcB (ISO14443-3B)
+ </li>
+ <li>NfcF (JIS X 6319-4)
+ </li>
+ <li>IsoDep (ISO 14443-4)
+ </li>
+ <li>NFC Forum 代码类型 1、2、3、4、5(由 NFC Forum 定义)
+ </li>
+ <li>
+ <p>
+[SR] 强烈建议能够通过以下 NFC 标准读取和写入 NDEF 消息以及原始数据。请注意,虽然此处说这些 NFC 标准是“强烈建议”遵循的标准,但我们计划在未来版本的兼容性定义中将其更改为“必须”遵循的标准。这些标准在此版本中是可选的,但在未来的版本中将是必须要遵循的。强烈建议运行此版 Android 的现有设备及新设备现在就满足这些要求,以便能够升级到未来的平台版本。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-3] 必须能够通过以下对等连接标准和协议传送和接收数据:
+ </p>
+ </li>
+ <li>ISO 18092
+ </li>
+ <li>LLCP 1.2(由 NFC Forum 定义)
+ </li>
+ <li>SDP 1.0(由 NFC Forum 定义)
+ </li>
+ <li>
+ <a href="http://static.googleusercontent.com/media/source.android.com/en/us/compatibility/ndef-push-protocol.pdf">NDEF 推送协议</a>
+ </li>
+ <li>SNEP 1.0(由 NFC Forum 定义)
+ </li>
+ <li>[C-1-4] 必须支持 <a href="http://developer.android.com/guide/topics/connectivity/nfc/nfc.html">Android Beam</a>,并且应默认启用 Android Beam。
+ </li>
+ <li>[C-1-5] 当 Android Beam 处于启用状态或有其他专有 NFC 点对点模式处于开启状态时,必须能够使用 Android Beam 收发消息。
+ </li>
+ <li>[C-1-6] 必须实现默认 SNEP 服务器。必须使用 <code>android.nfc.ACTION_NDEF_DISCOVERED</code> Intent 将默认 SNEP 服务器收到的有效 NDEF 消息发送给应用。在设置中停用 Android Beam 不得导致停用传入的 NDEF 消息的发送。
+ </li>
+ <li>[C-1-7] 必须能够遵从 <code>android.settings.NFCSHARING_SETTINGS</code> Intent 显示 <a href="http://developer.android.com/reference/android/provider/Settings.html#ACTION_NFCSHARING_SETTINGS">NFC 共享设置</a>。
+ </li>
+ <li>[C-1-8] 必须实现 NPP 服务器。必须按照处理默认 SNEP 服务器收到的消息时采用的同一种方式处理 NPP 服务器收到的消息。
+ </li>
+ <li>[C-1-9] 必须实现 SNEP 客户端,并且在 Android Beam 处于启用状态时,必须尝试将出站点对点 NDEF 消息发送到默认 SNEP 服务器。如果未找到默认 SNEP 服务器,则该客户端必须尝试将消息发送到 NPP 服务器。
+ </li>
+ <li>[C-1-10] 必须允许前台 Activity 通过 <code>android.nfc.NfcAdapter.setNdefPushMessage</code>、<code>android.nfc.NfcAdapter.setNdefPushMessageCallback</code> 和 <code>android.nfc.NfcAdapter.enableForegroundNdefPush</code> 设置出站点对点 NDEF 消息。
+ </li>
+ <li>在发送出站点对点 NDEF 消息之前,应使用手势或屏幕确认(例如“触摸即可发送”)。
+ </li>
+ <li>[C-1-11] 如果设备支持蓝牙对象推送配置,则必须支持从 NFC 连接切换到蓝牙。
+ </li>
+ <li>[C-1-12] 使用 <code>android.nfc.NfcAdapter.setBeamPushUris</code> 时,必须支持将连接切换到蓝牙,方法是实现 NFC Forum 提供的“<a href="http://members.nfc-forum.org/specs/spec_list/#conn_handover">Connection Handover version 1.2</a>”和“<a href="http://members.nfc-forum.org/apps/group_public/download.php/18688/NFCForum-AD-BTSSP_1_1.pdf">Bluetooth Secure Simple Pairing Using NFC version 1.0</a>”规范。此类实现必须实现服务名为“urn:nfc:sn:handover”的切换 LLCP 服务,以通过 NFC 交换切换请求/部分记录,并且必须使用蓝牙对象推送配置进行实际的蓝牙数据传输。为了与旧版兼容(与 Android 4.1 设备保持兼容),此类实现应仍接受 SNEP GET 请求,以便通过 NFC 交换切换请求/部分记录。不过,实现本身不应发送关于执行连接切换的 SNEP GET 请求。
+ </li>
+ <li>[C-1-13] 在 NFC 发现模式下,必须轮询所有支持的技术。
+ </li>
+ <li>当设备处于唤醒状态、屏幕处于活动状态,并且锁定屏幕已解锁时,应采用 NFC 发现模式。
+ </li>
+ <li>应能够读取 <a href="http://developer.android.com/reference/android/nfc/tech/NfcBarcode.html">Thinfilm NFC Barcode</a> 产品的条形码和网址(如果已编码)。
+ </li>
+ </ul>
+ <p>
+(请注意,上面提到的 JIS、ISO 和 NFC Forum 规范没有公开提供的链接。)
+ </p>
+ <p>
+Android 支持 NFC 主机卡模拟 (HCE) 模式。
+ </p>
+ <p>
+如果设备实现包含支持 HCE(适用于 NfcA 和/或 NfcB)的 NFC 控制器芯片组,并且支持应用 ID (AID) 路由,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须报告 <code>android.hardware.nfc.hce</code> 功能常量。
+ </li>
+ <li>[C-2-2] 必须支持 <a href="http://developer.android.com/guide/topics/connectivity/nfc/hce.html">NFC HCE API</a>(如 Android SDK 中定义)。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含支持 HCE(适用于 NfcF)的 NFC 控制器芯片组,并且针对第三方应用实现了该功能,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须报告 <code>android.hardware.nfc.hcef</code> 功能常量。
+ </li>
+ <li>[C-3-2] 必须实现 [NfcF 卡模拟 API] (https://developer.android.com/reference/android/nfc/cardemulation/NfcFCardEmulation.html)(如 Android SDK 中定义)。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持常规 NFC(如本节中所述),并且支持读取器/写入器角色中的 MIFARE 技术(MIFARE Classic、MIFARE Ultralight、NDEF on MIFARE Classic),则:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须实现对应的 Android API(如 Android SDK 中所述)。
+ </li>
+ <li>[C-4-2] 必须通过 <a href="http://developer.android.com/reference/android/content/pm/PackageManager.html"><code>android.content.pm.PackageManager.hasSystemFeature</code>()</a> 方法报告 <code>com.nxp.mifare</code> 功能。请注意,这不是标准的 Android 功能,因此不会在 <code>android.content.pm.PackageManager</code> 类中显示为常量。
+ </li>
+ </ul>
+ <h4 id="7_4_5_minimum_network_capability">
+7.4.5. 最低网络功能
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须支持一种或多种形式的数据网络。具体来说就是,设备实现必须支持至少一种能够达到 200Kbit/sec 或更高的数据标准。满足该要求的技术包括 EDGE、HSPA、EV-DO、802.11g、以太网、蓝牙 PAN 等。
+ </li>
+ <li>[C-0-2] 必须包含 IPv6 网络堆栈,并支持使用受管理 API(例如 <code>java.net.Socket</code> 和 <code>java.net.URLConnection</code>)以及本机 API(例如 <code>AF_INET6</code> 套接字)进行 IPv6 通信。
+ </li>
+ <li>[C-0-3] 必须默认启用 IPv6。
+ </li>
+ <li>必须确保 IPv6 通信和 IPv4 等一样可靠。
+ </li>
+ <li>[C-0-4] 必须使 IPv6 连接保持低电耗模式。
+ </li>
+ <li>[C-0-5] 限制发送次数不得导致设备断开与任何符合 IPv6 标准的网络(使用的 RA 生命周期至少为 180 秒)的 IPv6 连接。
+ </li>
+ <li>当物理网络标准(例如以太网)是主要数据连接标准时,还应支持至少一种常用的无线数据连接标准,例如 802.11 (WLAN)
+ </li>
+ <li>可以实现多种形式的数据连接。
+ </li>
+ </ul>
+ <p>
+所需的 IPv6 支持级别取决于网络类型,如下所述:
+ </p>
+ <p>
+如果设备实现支持 WLAN 网络,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持通过 WLAN 执行双栈和 IPv6-only 操作。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持以太网,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持通过以太网执行双栈操作。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持移动数据网络,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 当设备同时连接到多个网络(例如 WLAN 和移动数据网络)时,必须同时满足上述针对连接到的每个网络的要求。
+ </li>
+ <li>应支持通过移动数据网络执行 IPv6 操作(IPv6-only 操作,也可能是双栈操作)。
+ </li>
+ </ul>
+ <h4 id="7_4_6_sync_settings">
+7.4.6. 同步设置
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须默认启用主自动同步设置,以便方法 <a href="http://developer.android.com/reference/android/content/ContentResolver.html"><code>getMasterSyncAutomatically()</code></a> 返回“true”。
+ </li>
+ </ul>
+ <h4 id="7_4_7_data_saver">
+7.4.7. 流量节省程序
+ </h4>
+ <p>
+如果设备实现包含按流量计费的网络连接,则:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议提供流量节省程序模式。
+ </li>
+ </ul>
+ <p>
+如果设备实现提供流量节省程序模式,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持 <code>ConnectivityManager</code> 类中的所有 API(如 <a href="https://developer.android.com/training/basics/network-ops/data-saver.html">SDK 文档</a>中所述)。
+ </li>
+ <li>[C-1-2] 必须在设置中提供一个界面来处理 <a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS"><code>Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS</code></a> Intent,以便用户向白名单中添加应用或从中移除应用。
+ </li>
+ </ul>
+ <p>
+如果设备实现未提供流量节省程序模式,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须针对 <a href="https://developer.android.com/reference/android/net/ConnectivityManager.html#getRestrictBackgroundStatus%28%29"><code>ConnectivityManager.getRestrictBackgroundStatus()</code></a> 返回值 <code>RESTRICT_BACKGROUND_STATUS_DISABLED</code>。
+ </li>
+ <li>[C-2-2] 不得广播 <code>ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED</code>。
+ </li>
+ <li>[C-2-3] 必须有负责处理 <code>Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS</code> Intent 的 Activity,但可以将其实现为空操作。
+ </li>
+ </ul>
+ <h3 id="7_5_cameras">
+7.5. 摄像头
+ </h3>
+ <p>
+如果设备实现包含至少一个摄像头,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明 <code>android.hardware.camera.any</code> 功能标记。
+ </li>
+ <li>[C-1-2] 当摄像头打开着以进行基本预览和静态拍摄时,必须确保应用可以同时分配 3 个 RGBA_8888 位图,并且其大小与设备上分辨率最高的摄像头传感器所生成的图片相同。
+ </li>
+ </ul>
+ <h4 id="7_5_1_rear-facing_camera">
+7.5.1. 后置摄像头
+ </h4>
+ <p>
+后置摄像头指位于设备上背向显示屏一侧的摄像头,也就是说,与传统摄像头一样,它拍摄的是背向设备显示屏一侧的景物。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>应包含后置摄像头。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含至少一个后置摄像头,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告功能标记 <code>android.hardware.camera</code> 和 <code>android.hardware.camera.any</code>。
+ </li>
+ <li>[C-1-2] 分辨率必须至少为 200 万像素。
+ </li>
+ <li>应在摄像头驱动程序中实现硬件自动对焦或软件自动对焦(对应用软件透明)。
+ </li>
+ <li>可以具有固定焦距硬件或 EDOF(扩展景深)硬件。
+ </li>
+ <li>可以包含闪光灯。
+ </li>
+ </ul>
+ <p>
+如果摄像头包含闪光灯,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 当已在摄像头预览 Surface 上注册 <code>android.hardware.Camera.PreviewCallback</code> 实例时,闪光灯不得亮起,除非应用已通过启用 <code>Camera.Parameters</code> 对象的 <code>FLASH_MODE_AUTO</code> 或 <code>FLASH_MODE_ON</code> 属性明确启用闪光灯。请注意,此项限制不适用于设备的内置系统摄像头应用,而是仅适用于使用 <code>Camera.PreviewCallback</code> 的第三方应用。
+ </li>
+ </ul>
+ <h4 id="7_5_2_front-facing_camera">
+7.5.2. 前置摄像头
+ </h4>
+ <p>
+前置摄像头指与设备上的显示屏位于同一侧的摄像头,也就是通常用于拍摄用户自己的摄像头,例如用于视频会议及类似应用的摄像头。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>可以包含前置摄像头
+ </li>
+ </ul>
+ <p>
+如果设备实现包含至少一个前置摄像头,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告功能标记 <code>android.hardware.camera.any</code> 和 <code>android.hardware.camera.front</code>。
+ </li>
+ <li>[C-1-2] 分辨率必须至少为 VGA(640x480 像素)。
+ </li>
+ <li>[C-1-3] 不得将前置摄像头用作 Camera API 的默认摄像头,并且不得将该 API 配置为将前置摄像头视为默认后置摄像头,即使它是设备上的唯一摄像头也是如此。
+ </li>
+ <li>[C-1-5] 如果当前应用已通过调用 <a href="http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)"><code>android.hardware.Camera.setDisplayOrientation()</code></a> 方法明确请求旋转摄像头显示方向,则必须相对于应用指定的方向水平镜像摄像头预览。反之,如果当前应用未通过调用 <a href="http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)"><code>android.hardware.Camera.setDisplayOrientation()</code></a> 方法明确请求旋转摄像头显示方向,则必须沿着设备的默认水平轴镜像预览。
+ </li>
+ <li>[C-1-6] 对于最终拍好后返回给应用回调或提交到媒体存储空间的静态图像或视频流,不得对其进行镜像。
+ </li>
+ <li>[C-1-7] 必须按照镜像摄像头预览图像流时的方式镜像由 postview 显示的图像。
+ </li>
+ <li>可以包含可供后置摄像头(如<a href="#7_5_1_rear-facing_camera">第 7.5.1 节</a>中所述)使用的功能,例如自动对焦、闪光灯等。
+ </li>
+ </ul>
+ <p>
+如果用户能够旋转设备实现(例如通过加速度计自动旋转或通过用户输入手动旋转),则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须相对于设备的当前方向水平镜像摄像头预览。
+ </li>
+ </ul>
+ <h4 id="7_5_3_external_camera">
+7.5.3. 外接摄像头
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>可以支持无需一直连接到设备的外接摄像头。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持外接摄像头,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明平台功能标记 <code>android.hardware.camera.external</code> 和 <code>android.hardware camera.any</code>。
+ </li>
+ <li>[C-1-2] 如果通过 USB 端口连接外接摄像头,则必须支持 USB Video Class(UVC 1.0 或更高版本)。
+ </li>
+ <li>应支持 MJPEG 等视频压缩格式,以便传输高画质的未编码流(例如原始照片流或独立压缩的照片流)。
+ </li>
+ <li>可以支持多个摄像头。
+ </li>
+ <li>可以支持基于摄像头的视频编码。如果支持,并发的未编码/MJPEG 流(QVGA 或更高分辨率)必须可供设备实现访问。
+ </li>
+ </ul>
+ <h4 id="7_5_4_camera_api_behavior">
+7.5.4. Camera API 行为
+ </h4>
+ <p>
+Android 包含两个用于访问摄像头的 API 包,较新的 android.hardware.camera2 API 使应用可以对摄像头进行较低级别的控制,包括高效的零复制连拍/视频流,以及按帧对曝光、增益、白平衡增益、颜色转换、去噪、锐化等进行控制。
+ </p>
+ <p>
+较旧的 API 包 <code>android.hardware.Camera</code> 在 Android 5.0 中被标记为已弃用,但由于该 API 包应仍可供应用使用,因此 Android 设备实现必须确保持续支持该 API(如本节和 Android SDK 中所述)。
+ </p>
+ <p>
+设备实现必须为所有可用的摄像头实现摄像头相关 API 的以下行为。设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 如果应用从未调用过 <code>android.hardware.Camera.Parameters.setPreviewFormat(int)</code>,那么对于提供给应用回调的预览数据,必须使用 <code>android.hardware.PixelFormat.YCbCr_420_SP</code>。
+ </li>
+ <li>[C-0-2] 如果应用注册了 <code>android.hardware.Camera.PreviewCallback</code> 实例,系统调用了 <code>onPreviewFrame()</code> 方法,并且预览格式为 YCbCr_420_SP,则传递到 <code>onPreviewFrame()</code> 中的 byte[] 格式的数据必须进一步采用 NV21 编码格式。也就是说,NV21 必须是默认设置。
+ </li>
+ <li>[C-0-3] 对于 <code>android.hardware.Camera</code>,设备实现必须支持使用 YV12 格式(用 <code>android.graphics.ImageFormat.YV12</code> 常量表示)进行前置摄像头和后置摄像头的摄像头预览。(硬件视频编码器和摄像头可以使用任何本机像素格式,但设备实现必须支持将其转换为 YV12。)
+ </li>
+ <li>[C-0-4] 对于 <code>android.hardware.camera2</code>,必须通过 <code>android.media.ImageReader</code> API 支持使用 <code>android.hardware.ImageFormat.YUV_420_888</code> 和 <code>android.hardware.ImageFormat.JPEG</code> 作为输出格式。
+ </li>
+ <li>[C-0-5] 仍必须实现 Android SDK 文档中包含的完整 <a href="http://developer.android.com/reference/android/hardware/Camera.html">Camera API</a>,无论设备是否包含硬件自动对焦或其他功能都是如此。例如,没有自动对焦功能的摄像头仍必须调用所有已注册的 <code>android.hardware.Camera.AutoFocusCallback</code> 实例(即使这与非自动对焦摄像头无关)。请注意,这适用于前置摄像头。例如,虽然大多数前置摄像头都不支持自动对焦,但仍必须如所述那样“伪造”API 回调。
+ </li>
+ <li>[C-0-6] 必须识别并遵从 <a href="http://developer.android.com/reference/android/hardware/Camera.Parameters.html"><code>android.hardware.Camera.Parameters</code></a> 类中定义为常量的每个参数名称。反之,设备实现不得遵从或识别传递给 <code>android.hardware.Camera.setParameters()</code> 方法的字符串常量,在 <code>android.hardware.Camera.Parameters</code> 中载述为常量的字符串常量除外。也就是说,设备实现必须支持所有标准摄像头参数(如果硬件允许),不得支持自定义摄像头参数类型。例如,如果设备实现支持使用高动态范围 (HDR) 成像技术拍照,则必须支持摄像头参数 <code>Camera.SCENE_MODE_HDR</code>。
+ </li>
+ <li>[C-0-7] 必须通过 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#INFO_SUPPORTED_HARDWARE_LEVEL"><code>android.info.supportedHardwareLevel</code></a> 属性报告正确的支持级别(如 Android SDK 中所述),并报告相应的<a href="http://source.android.com/devices/camera/versioning.html">框架功能标记</a>。
+ </li>
+ <li>[C-0-8] 还必须通过 <code>android.request.availableCapabilities</code> 属性声明 <code>android.hardware.camera2</code> 的各项摄像头功能,并声明相应的<a href="http://source.android.com/devices/camera/versioning.html">功能标记</a>;如果连接的任何摄像头设备支持某项功能,则必须定义相应的功能标记。
+ </li>
+ <li>[C-0-9] 每当摄像头拍摄了新照片且相应的照片条目已添加到媒体存储区时,都必须广播 <code>Camera.ACTION_NEW_PICTURE</code> Intent。
+ </li>
+ <li>[C-0-10] 每当摄像头录制了新视频且相应的视频条目已添加到媒体存储区时,都必须广播 <code>Camera.ACTION_NEW_VIDEO</code> Intent。
+ </li>
+ </ul>
+ <h4 id="7_5_5_camera_orientation">
+7.5.5. 摄像头方向
+ </h4>
+ <p>
+如果设备实现具有前置或后置摄像头,则此类摄像头:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须朝向正确方向,以便摄像头的长度方向与屏幕的长度方向对齐。也就是说,当设备处于横向时,摄像头必须横向拍摄。无论设备的自然方向为何,此规则都适用;也就是说,它适用于以横向为主的设备以及以纵向为主的设备。
+ </li>
+ </ul>
+ <h3 id="7_6_memory_and_storage">
+7.6. 内存和存储空间
+ </h3>
+ <h4 id="7_6_1_minimum_memory_and_storage">
+7.6.1. 最小内存和存储空间
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须包含可供应用下载数据文件的<a href="http://developer.android.com/reference/android/app/DownloadManager.html">内容下载管理器</a>,并且应用必须能够将不小于 100MB 的各个文件下载到默认的“缓存”位置。
+ </li>
+ </ul>
+ <h4 id="7_6_2_application_shared_storage">
+7.6.2. 应用共享存储空间
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须提供可供应用共享的存储空间,该存储空间通常也称为“共享的外部存储空间”、“应用共享存储空间”,或者也可以通过该存储空间装载到的 Linux 路径“/sdcard”来指代它。
+ </li>
+ <li>[C-0-2] 必须配有默认装载的(也就是说可以直接使用的)共享存储空间:可以在内部存储组件上或可移动存储媒介(例如安全数字卡插槽)上实现该存储空间。
+ </li>
+ <li>[C-0-3] 必须直接在 Linux 路径 <code>sdcard</code> 中装载应用共享存储空间,或包含一个从 <code>sdcard</code> 到实际装载点的 Linux 符号链接。
+ </li>
+ <li>[C-0-4] 必须对该共享存储空间强制执行 <code>android.permission.WRITE_EXTERNAL_STORAGE</code> 权限(如 SDK 中所述)。必须允许任何获得该权限的应用对共享存储空间执行写入操作。
+ </li>
+ </ul>
+ <p>
+设备实现可以使用以下两者之一来满足上述要求:
+ </p>
+ <ul>
+ <li>可供用户使用的可移动存储设备,例如安全数字 (SD) 卡插槽。
+ </li>
+ <li>Android 开源项目 (AOSP) 中实现的内部(不可移动)存储空间的一部分。
+ </li>
+ </ul>
+ <p>
+如果设备实现使用可移动存储设备来满足上述要求,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现在插槽中未插入存储媒介时警告用户的消息框或弹出界面。
+ </li>
+ <li>[C-1-2] 必须包含经过 FAT 格式化的存储媒介(例如 SD 卡),或者在包装箱上以及购买时随附的其他材料上注明需单独购买存储媒介。
+ </li>
+ </ul>
+ <p>
+如果设备实现使用不可移动存储空间的一部分来满足上述要求,则:
+ </p>
+ <ul>
+ <li>应使用内部应用共享存储空间的 AOSP 实现。
+ </li>
+ <li>可以与应用隐私数据共享存储空间。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含多个共享存储空间路径(例如 SD 卡插槽和共享内部存储空间),则:
+ </p>
+ <ul>
+ <li>[C-3-1] 只能允许具有 <code>WRITE_EXTERNAL_STORAGE</code> 权限的预安装 Android 特权应用对辅助外部存储设备执行写入操作,写入到其软件包专用目录或写入到通过触发 <code>ACTION_OPEN_DOCUMENT_TREE</code> Intent 返回的 <code>URI</code> 中时除外。
+ </li>
+ </ul>
+ <p>
+如果设备实现具有支持 USB 外围设备模式的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须提供一种用于从主机访问应用共享存储空间内的数据的机制。
+ </li>
+ <li>应通过 Android 的媒体扫描程序服务和 <code>android.provider.MediaStore</code> 透明地公开上述两个存储空间路径中的内容。
+ </li>
+ <li>可以使用 USB 大容量存储设备,但应使用媒体传输协议来满足该要求。
+ </li>
+ </ul>
+ <p>
+如果设备实现具有支持 USB 外围设备模式的 USB 端口,并且支持媒体传输协议,则:
+ </p>
+ <ul>
+ <li>应与 Android MTP 参考主机(<a href="http://www.android.com/filetransfer">Android 文件传输</a>)兼容。
+ </li>
+ <li>应报告 USB 设备类 0x00。
+ </li>
+ <li>应报告 USB 接口名称“MTP”。
+ </li>
+ </ul>
+ <h4 id="7_6_3_adoptable_storage">
+7.6.3. 可合并的存储设备
+ </h4>
+ <p>
+如果设备应具有移动性(不同于 TV),则对于设备实现:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议在长期不变的固定位置实现可合并的存储设备,因为意外断开它们可能会导致数据丢失/损坏。
+ </li>
+ </ul>
+ <p>
+如果可移动存储设备端口位于长期不变的固定位置(例如电池盒或其他防护盖内),则对于设备实现:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议实现<a href="http://source.android.com/devices/storage/adoptable.html">可合并的存储设备</a>。
+ </li>
+ </ul>
+ <h3 id="7_7_usb">
+7.7. USB
+ </h3>
+ <p>
+如果设备实现具有 USB 端口,则:
+ </p>
+ <ul>
+ <li>应支持 USB 外围设备模式,并且应支持 USB 主机模式。
+ </li>
+ </ul>
+ <h4 id="7_7_1_usb_peripheral_mode">
+7.7.1. USB 外围设备模式
+ </h4>
+ <p>
+如果设备实现包含支持外围设备模式的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 该端口必须可连接到具有标准 A 型或 C 型 USB 端口的 USB 主机。
+ </li>
+ <li>[C-1-2] 必须通过 <code>android.os.Build.SERIAL</code> 报告 USB 标准设备描述符中 <code>iSerialNumber</code> 的正确值。
+ </li>
+ <li>[C-1-3] 如果它们支持 C 型 USB,则必须根据 C 型电阻标准检测 1.5A 和 3.0A 充电器,并检测通告中的变化。
+ </li>
+ <li>[SR] 该端口应使用 micro-B 型、micro-AB 型或 C 型 USB 外形规格。<strong>强烈建议</strong>现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
+ </li>
+ <li>[SR] 该端口应位于设备底部(根据自然方向),或为所有应用(包括主屏幕)启用软件屏幕旋转功能,以便设备在按照该端口位于底部的方位放置时,显示屏能够正确呈现内容。<strong>强烈建议</strong>现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
+ </li>
+ <li>[SR] 应支持在 HS 线性调频和流量传输期间采用 1.5 A 电流(如 <a href="http://www.usb.org/developers/docs/devclass_docs/BCv1.2_070312.zip">USB 电池充电规范 - 修订版 1.2</a> 中所规定)。<strong>强烈建议</strong>现有的及新的 Android 设备满足这些要求,以便能够升级到未来的平台版本。
+ </li>
+ <li>[SR] 强烈建议不要支持会修改高于默认电压的 Vbus 电压或更改接收端/源端角色的专有充电方法,因为这样可能会导致支持标准 USB Power Delivery 方法的充电器或设备出现互操作性问题。虽然此处说的是“强烈建议”,但在未来的 Android 版本中,我们可能会要求所有 C 型设备支持与标准 C 型充电器的完整互操作性。
+ </li>
+ <li>[SR] 如果它们支持 C 型 USB 和 USB 主机模式,则强烈建议支持 Power Delivery 以进行数据角色和电源角色交换。
+ </li>
+ <li>应支持 Power Delivery 以进行高压充电,并且应支持显示输出等替代模式。
+ </li>
+ <li>应实现 Android Open Accessory (AOA) API 和规范(如 Android SDK 文档中所述)。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含 USB 端口,并且实现了 AOA 规范,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须声明支持硬件功能 <a href="http://developer.android.com/guide/topics/connectivity/usb/accessory.html"><code>android.hardware.usb.accessory</code></a>。
+ </li>
+ <li>[C-2-2] USB 大容量存储设备类必须在 USB 大容量存储设备的接口描述 <code>iInterface</code> 字符串末尾添加字符串“android”。
+ </li>
+ <li>不应实现 Android Open Accessory Protocol 2.0 文档中载述的 <a href="https://source.android.com/devices/accessories/aoa2#audio-support">AOAv2 音频</a>。从 Android 8.0(API 26 级)开始,AOAv2 音频便被弃用了。
+ </li>
+ </ul>
+ <h4 id="7_7_2_usb_host_mode">
+7.7.2. USB 主机模式
+ </h4>
+ <p>
+如果设备实现包含支持主机模式的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现 Android USB 主机 API(如 Android SDK 中所述),并声明支持硬件功能 <a href="http://developer.android.com/guide/topics/connectivity/usb/host.html"><code>android.hardware.usb.host</code></a>。
+ </li>
+ <li>[C-1-2] 必须支持连接标准 USB 外围设备,也就是说,它们必须满足以下条件之一:
+ <ul>
+ <li>具有设备自带的 C 型端口,或附带用于将设备自带的专有端口适配到标准 USB C 型端口(USB C 型设备)的数据线。
+ </li>
+ <li>具有设备自带的 A 型端口,或附带用于将设备自带的专有端口适配到标准 USB A 型端口的数据线。
+ </li>
+ <li>具有设备自带的 micro-AB 型端口,该端口应附带用于适配到标准 A 型端口的数据线。
+ </li>
+ </ul>
+ </li>
+ <li>[C-1-3] 不得附带将 USB A 型端口或 micro-AB 端口转接到 C 型端口(插口)的适配器。
+ </li>
+ <li>[SR] 强烈建议实现 <a href="http://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_AUDIO">USB 音频类</a>(如 Android SDK 文档中所述)。
+ </li>
+ <li>应支持在主机模式下为连接的 USB 外围设备充电;为 USB C 型连接器使用至少 1.5A 的源电流(如 <a href="http://www.usb.org/developers/docs/usb_31_021517.zip">USB C 型数据线和连接器规范 - 修订版 1.2</a> 中的“端接参数”部分所规定),或为 Micro-AB 型连接器使用充电下行端口 (CDP) 输出电流范围(如 <a href="http://www.usb.org/developers/docs/devclass_docs/BCv1.2_070312.zip">USB 电池充电规范 - 修订版 1.2</a> 中所规定)。
+ </li>
+ <li>应实现并支持与 USB C 型相关的标准。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含支持主机模式和 USB 音频类的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持 <a href="https://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_HID">USB HID 类</a>。
+ </li>
+ <li>[C-2-2] 必须支持检测 <a href="http://www.usb.org/developers/hidpage/Hut1_12v2.pdf">USB HID 用法表</a>和<a href="http://www.usb.org/developers/hidpage/Voice_Command_Usage.pdf">语音指令用法请求</a>中指定的以下 HID 数据字段,并支持将其映射到 <a href="https://developer.android.com/reference/android/view/KeyEvent.html"><code>KeyEvent</code></a> 常量,如下所示:
+ <ul>
+ <li>用法页 (0xC) 用法 ID (0x0CD):<code>KEYCODE_MEDIA_PLAY_PAUSE</code>
+ </li>
+ <li>用法页 (0xC) 用法 ID (0x0E9):<code>KEYCODE_VOLUME_UP</code>
+ </li>
+ <li>用法页 (0xC) 用法 ID (0x0EA):<code>KEYCODE_VOLUME_DOWN</code>
+ </li>
+ <li>用法页 (0xC) 用法 ID (0x0CF):<code>KEYCODE_VOICE_ASSIST</code>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+如果设备实现包含支持主机模式和存储访问框架 (SAF) 的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须能够识别任何远程连接的 MTP(媒体传输协议)设备,并通过 <code>ACTION_GET_CONTENT</code>、<code>ACTION_OPEN_DOCUMENT</code> 和 <code>ACTION_CREATE_DOCUMENT</code> Intent 使其内容可供访问。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含支持主机模式和 USB C 型的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须实现双重角色端口功能(如 USB C 型规范(第 4.5.1.3.3 节)中定义)。
+ </li>
+ <li>[SR] 强烈建议支持 DisplayPort,应支持 USB SuperSpeed 数据传输速率,并且强烈建议支持 Power Delivery 以进行数据角色和电源角色交换。
+ </li>
+ <li>[SR] 强烈建议不要支持音频适配器配件模式(如 <a href="http://www.usb.org/developers/docs/">USB C 型数据线和连接器规范 - 修订版 1.2</a> 的附录 A 中所述)。
+ </li>
+ <li>应实现最适合设备外形规格的 Try.* 模型。例如,手持设备应实现 Try.SNK 模型。
+ </li>
+ </ul>
+ <h3 id="7_8_audio">
+7.8. 音频
+ </h3>
+ <h4 id="7_8_1_microphone">
+7.8.1. 麦克风
+ </h4>
+ <p>
+如果设备实现包含麦克风,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告 <code>android.hardware.microphone</code> 功能常量。
+ </li>
+ <li>[C-1-2] 必须满足<a href="#5_4_audio_recording">第 5.4 节</a>中的录音要求。
+ </li>
+ <li>[C-1-3] 必须满足<a href="#5_6_audio_latency">第 5.6 节</a>中的音频延迟要求。
+ </li>
+ <li>[SR] 强烈建议支持近超声录音(如<a href="#7_8_3_near_ultrasound">第 7.8.3 节</a>中所述)。
+ </li>
+ </ul>
+ <p>
+如果设备实现省略了麦克风,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 不得报告 <code>android.hardware.microphone</code> 功能常量。
+ </li>
+ <li>[C-2-2] 必须至少按照<a href="#7_hardware_compatibility">第 7 节</a>中的规定将录音 API 实现为空操作。
+ </li>
+ </ul>
+ <h4 id="7_8_2_audio_output">
+7.8.2. 音频输出
+ </h4>
+ <p>
+如果设备实现包含扬声器,或包含用于连接音频输出外围设备的音频/多媒体输出端口(例如 4 导体 3.5 毫米音频耳机插孔或使用 <a href="https://source.android.com/devices/audio/usb#audioClass">USB 音频类</a>的 USB 主机模式),则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须报告 <code>android.hardware.audio.output</code> 功能常量。
+ </li>
+ <li>[C-1-2] 必须满足<a href="#5_5_audio_playback">第 5.5 节</a>中的音频播放要求。
+ </li>
+ <li>[C-1-3] 必须满足<a href="#5_6_audio_latency">第 5.6 节</a>中的音频延迟要求。
+ </li>
+ <li>[SR] 强烈建议支持近超声播放(如<a href="#7_8_3_near_ultrasound">第 7.8.3 节</a>中所述)。
+ </li>
+ </ul>
+ <p>
+如果设备实现不包含扬声器或音频输出端口,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 不得报告 <code>android.hardware.audio output</code> 功能。
+ </li>
+ <li>[C-2-2] 必须至少将与音频输出机制相关的 API 实现为空操作。
+ </li>
+ </ul>
+ <p>
+在本节中,“输出端口”是指<a href="https://en.wikipedia.org/wiki/Computer_port_%28hardware%29">实体接口</a>,例如 3.5 毫米音频耳机插孔、HDMI 端口,或使用 USB 音频类的 USB 主机模式端口。支持通过无线协议(例如蓝牙、WLAN 或移动网络)输出音频不算作包含“输出端口”。
+ </p>
+ <h5 id="7_8_2_1_analog_audio_ports">
+7.8.2.1. 模拟音频端口
+ </h5>
+ <p>
+为了兼容 Android 生态系统中使用 3.5 毫米音频插头的<a href="http://source.android.com/accessories/headset-spec.html">耳机和其他音频配件</a>,如果设备实现包含一个或多个模拟音频端口,则至少有一个音频端口应为 4 导体 3.5 毫米音频耳机插孔。
+ </p>
+ <p>
+如果设备实现具有 4 导体 3.5 毫米音频耳机插孔,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持将音频播放到带麦克风的立体声头戴式耳机和立体声耳机。
+ </li>
+ <li>[C-1-2] 必须支持采用 CTIA 引脚顺序的 TRRS 音频插头。
+ </li>
+ <li>[C-1-3] 必须支持检测音频插头上的麦克风导体和接地导体之间以下 3 个范围的等效阻抗,并支持将其映射到相应的键码:
+ <ul>
+ <li>
+ <strong>70 欧姆或更低</strong>:<code>KEYCODE_HEADSETHOOK</code>
+ </li>
+ <li>
+ <strong>210-290 欧姆</strong>:<code>KEYCODE_VOLUME_UP</code>
+ </li>
+ <li>
+ <strong>360-680 欧姆</strong>:<code>KEYCODE_VOLUME_DOWN</code>
+ </li>
+ </ul>
+ </li>
+ <li>[C-1-4] 必须在插入插头时触发 <code>ACTION_HEADSET_PLUG</code>,但只能在插头上的所有触点都已接触到耳机插孔上各自的相关部分后才能触发。
+ </li>
+ <li>[C-1-5] 必须能够在 32 欧姆扬声器阻抗上驱动至少 150mV ± 10% 的输出电压。
+ </li>
+ <li>[C-1-6] 麦克风偏置电压必须介于 1.8V 到 2.9V 之间。
+ </li>
+ <li>[SR] 强烈建议检测音频插头上的麦克风导体和接地导体之间以下范围的等效阻抗,并且强烈建议将其映射到相应的键码:
+ <ul>
+ <li>
+ <strong>110-180 欧姆</strong>:<code>KEYCODE_VOICE_ASSIST</code>
+ </li>
+ </ul>
+ </li>
+ <li>应支持具有 OMTP 引脚顺序的音频插头。
+ </li>
+ <li>应支持使用带麦克风的立体声耳机进行录音。
+ </li>
+ </ul>
+ <p>
+如果设备实现具有 4 导体 3.5 毫米音频耳机插孔,支持麦克风,并且广播 <code>android.intent.action.HEADSET_PLUG</code>(其中包含一个设为 1 的额外参数“microphone”),则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持检测插入的音频配件上是否有麦克风。
+ </li>
+ </ul>
+ <h4 id="7_8_3_near-ultrasound">
+7.8.3. 近超声
+ </h4>
+ <p>
+近超声音频的频带为 18.5 kHz 到 20 kHz。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>必须通过 <a href="http://developer.android.com/reference/android/media/AudioManager.html#getProperty%28java.lang.String%29">AudioManager.getProperty</a> API 正确报告对近超声音频功能的支持情况,如下所述:
+ </li>
+ </ul>
+ <p>
+如果 <a href="http://developer.android.com/reference/android/media/AudioManager.html#PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND"><code>PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND</code></a> 为“true”,则 <code>VOICE_RECOGNITION</code> 和 <code>UNPROCESSED</code> 音频源必须满足以下要求:
+ </p>
+ <ul>
+ <li>[C-1-1] 麦克风在 18.5 kHz 到 20 kHz 频带之间的平均功率响应与在 2 kHz 下的响应相比,低不能超过 15 dB。
+ </li>
+ <li>[C-1-2] 对于 -26 dBFS 的 19 kHz 音调,麦克风在 18.5 kHz 到 20 kHz 频带内的不加权信噪比不得低于 50 dB。
+ </li>
+ </ul>
+ <p>
+如果 <a href="http://developer.android.com/reference/android/media/AudioManager.html#PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND"><code>PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND</code></a> 为“true”,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 扬声器在 18.5 kHz 到 20 kHz 之间的平均响应与在 2 kHz 下的响应相比,低不能超过 40 dB。
+ </li>
+ </ul>
+ <h3 id="7_9_virtual_reality">
+7.9. 虚拟实境
+ </h3>
+ <p>
+Android 包含包含一些相应的 API 和工具,以便构建提供高品质移动 VR 体验的“虚拟实境”(VR) 应用。设备实现必须正确实现这些 API 和行为(本节中对此进行了详细说明)。
+ </p>
+ <h4 id="7_9_1_virtual_reality_mode">
+7.9.1. 虚拟实境模式
+ </h4>
+ <p>
+Android 支持 <a href="https://developer.android.com/reference/android/app/Activity.html#setVrModeEnabled%28boolean,%20android.content.ComponentName%29">VR 模式</a>,该模式用于处理通知的立体呈现,并会在 VR 应用获得用户聚焦时停用单目系统界面组件。
+ </p>
+ <h4 id="7_9_2_virtual_reality_high_performance">
+7.9.2. 虚拟实境高性能
+ </h4>
+ <p>
+如果设备实现通过 <code>android.hardware.vr.high_performance</code> 功能标记标识支持在较长的用户周期内使用高性能 VR,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须有至少 2 个实体核心。
+ </li>
+ <li>[C-1-2] 必须声明 <code>android.software.vr.mode feature</code>。
+ </li>
+ <li>[C-1-3] 必须支持持续性能模式。
+ </li>
+ <li>[C-1-4] 必须支持 OpenGL ES 3.2。
+ </li>
+ <li>[C-1-5] 必须支持 Vulkan Hardware Level 0,并且应支持 Vulkan Hardware Level 1。
+ </li>
+ <li>[C-1-6] 必须实现 <a href="https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_mutable_render_buffer.txt"><code>EGL_KHR_mutable_render_buffer</code></a>、<a href="https://www.khronos.org/registry/EGL/extensions/ANDROID/EGL_ANDROID_front_buffer_auto_refresh.txt"><code>EGL_ANDROID_front_buffer_auto_refresh</code></a>、<a href="https://www.khronos.org/registry/EGL/extensions/ANDROID/EGL_ANDROID_get_native_client_buffer.txt"><code>EGL_ANDROID_get_native_client_buffer</code></a>、<a href="https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_fence_sync.txt"><code>EGL_KHR_fence_sync</code></a>、<a href="https://www.khronos.org/registry/EGL/extensions/KHR/EGL_KHR_wait_sync.txt"><code>EGL_KHR_wait_sync</code></a>、<a href="https://www.khronos.org/registry/EGL/extensions/IMG/EGL_IMG_context_priority.txt"><code>EGL_IMG_context_priority</code></a> 和 <a href="https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_protected_content.txt"><code>EGL_EXT_protected_content</code></a>,并在可用 EGL 扩展列表中公开这些扩展。
+ </li>
+ <li>[C-1-7] GPU 和显示屏必须能够同步访问共享的前端缓冲区,以便在两个呈现环境中以 60fps 的速率交替呈现 VR 内容,而没有可见的撕裂现象。
+ </li>
+ <li>[C-1-8] 必须实现 <a href="https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture.txt"><code>GL_EXT_multisampled_render_to_texture</code></a>、<a href="https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview.txt"><code>GL_OVR_multiview</code></a>、<a href="https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview2.txt"><code>GL_OVR_multiview2</code></a>、<a href="https://www.khronos.org/registry/OpenGL/extensions/OVR/OVR_multiview_multisampled_render_to_texture.txt"><code>GL_OVR_multiview_multisampled_render_to_texture</code></a> 和 <a href="https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_protected_textures.txt"><code>GL_EXT_protected_textures</code></a>,并在可用 GL 扩展列表中公开这些扩展。
+ </li>
+ <li>[C-1-9] 必须支持 <a href="https://developer.android.com/ndk/reference/hardware__buffer_8h.html"><code>AHardwareBuffer</code></a> 标记 <code>AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER</code> 和 <code>AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA</code>(如 NDK 中所述)。
+ </li>
+ <li>[C-1-10] 必须支持具有多个层的 <code>AHardwareBuffers</code>。
+ </li>
+ <li>[C-1-11] 必须支持以至少 3840x2160@30fps-40Mbps 的分辨率和速度(相当于 4 个 1920x1080@30fps-10Mbps 实例或 2 个 1920x1080@60fps-20Mbps 实例)进行 H.264 解码。
+ </li>
+ <li>[C-1-12] 必须支持 HEVC 和 VP9,必须能够以至少 1920x1080@30fps-10Mbps 的分辨率和速度进行解码,并且应能够以 3840x2160@30fps-20Mbps 的分辨率和速度进行解码(相当于 4 个 1920x1080@30fps-5Mbps 实例)。
+ </li>
+ <li>[C-1-13] 必须支持 <code>HardwarePropertiesManager.getDeviceTemperatures</code> API,并返回表层温度的准确值。
+ </li>
+ <li>[C-1-14] 必须具有嵌入式屏幕,并且其分辨率必须至少为全高清 (1080p),强烈建议分辨率为四倍高清 (1440p) 或更高。
+ </li>
+ <li>[C-1-15] 显示屏对角线尺寸必须在 4.7 英寸到 6 英寸之间。
+ </li>
+ <li>[C-1-16] 显示屏在 VR 模式下的更新频率必须至少为 60 Hz。
+ </li>
+ <li>[C-1-17] 显示屏的“灰到灰”、“白到黑”和“黑到白”切换时间延迟必须小于等于 3 毫秒。
+ </li>
+ <li>[C-1-18] 显示屏必须支持低持久性模式(持久性小于等于 5 毫秒),持久性指像素发光的时间长度。
+ </li>
+ <li>[C-1-19] 必须支持蓝牙 4.2 和蓝牙 LE 数据长度扩展(<a href="#7_4_3_bluetooth">第 7.4.3 节</a>)。
+ </li>
+ <li>[SR] 对于 <code>android.hardware.hifi_sensors</code>,强烈建议支持 <code>android.hardware.sensor.hifi_sensors</code> 功能,并且必须满足与陀螺仪、加速度计和磁力计相关的要求。
+ </li>
+ <li>可以为前台应用提供专用核心,并且可以支持 <code>Process.getExclusiveCores</code> API,以便返回专供最靠前的前台应用使用的 CPU 内核数。如果支持专用核心,则该核心不得允许任何其他用户空间进程(应用使用的设备驱动程序除外)在其上运行,但在必要时可以允许一些内核进程在其上运行。
+ </li>
+ </ul>
+ <h2 id="8_performance_and_power">
+8. 性能和功耗
+ </h2>
+ <p>
+有些最低性能和功耗标准对用户体验至关重要,并且会影响开发者在开发应用时所做的基准假设。
+ </p>
+ <h3 id="8_1_user_experience_consistency">
+8.1. 用户体验一致性
+ </h3>
+ <p>
+如果有特定的最低要求来确保应用和游戏保持一致的帧速率和响应时间,则可以为最终用户提供流畅的界面。根据设备类型,设备实现可以有针对界面延迟和任务切换的可衡量要求(如<a href="#2_device-types">第 2 节</a>中所述)。
+ </p>
+ <h3 id="8_2_file_i/o_access_performance">
+8.2. 文件 I/O 访问性能
+ </h3>
+ <p>
+通过提供在应用隐私数据存储空间(<code>/data</code> 分区)上实现一致的文件访问性能所需的常用基准,应用开发者可以设定有助于进行软件设计的适当预期。根据设备类型,设备实现可以包含针对以下读取和写入操作的特定要求(如<a href="#2_device-type">第 2 节</a>中所述):
+ </p>
+ <ul>
+ <li>
+ <strong>顺序写入性能</strong>:通过使用 10MB 写入缓冲区写入一个 256MB 的文件来衡量。
+ </li>
+ <li>
+ <strong>随机写入性能</strong>:通过使用 4KB 写入缓冲区写入一个 256MB 的文件来衡量。
+ </li>
+ <li>
+ <strong>顺序读取性能</strong>:通过使用 10MB 写入缓冲区读取一个 256MB 的文件来衡量。
+ </li>
+ <li>
+ <strong>随机读取性能</strong>:通过使用 4KB 写入缓冲区读取一个 256MB 的文件来衡量。
+ </li>
+ </ul>
+ <h3 id="8_3_power-saving_modes">
+8.3. 节电模式
+ </h3>
+ <p>
+Android 包含应用待机和低电耗节电模式,以便优化电池的使用。<em>[SR] 强烈建议让最终用户能够看到所有无需进入这两种模式的应用。</em> [SR] 强烈建议这两种节电模式的触发、维护、唤醒算法以及对全局系统设置的使用都不得违背 Android 开源项目。
+ </p>
+ <p>
+除了节电模式之外,Android 设备实现还可以实现任意或全部 4 种休眠电源状态(如高级配置与电源接口 (ACPI) 中定义)。
+ </p>
+ <p>
+如果设备实现已实现 S3 和 S4 电源状态(如 ACPI 中定义),则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须只有在合上属于设备本身一部分的盖子时才会进入这些状态。
+ </li>
+ </ul>
+ <h3 id="8_4_power_consumption_accounting">
+8.4. 功耗计算
+ </h3>
+ <p>
+更准确地计算和报告功耗有助于应用开发者找出能够优化应用功耗模式的措施和工具。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议提供一个关于各组件功耗的配置文件,其中要定义每种硬件组件的<a href="http://source.android.com/devices/tech/power/values.html">耗电值</a>,以及组件在一段时间内大概消耗的电量(如 Android 开源项目网站上所述)。
+ </li>
+ <li>[SR] 强烈建议以毫安小时 (mAh) 为单位报告所有功耗值。
+ </li>
+ <li>[SR] 强烈建议按每个进程的 UID 报告 CPU 功耗。Android 开源项目通过 <code>uid_cputime</code> 内核模块实现来满足该要求。
+ </li>
+ <li>[SR] 强烈建议能让应用开发者通过 <a href="http://source.android.com/devices/tech/power/batterystats.html"><code>adb shell dumpsys batterystats</code></a> shell 命令查看此功耗。
+ </li>
+ <li>如果无法将硬件组件的功耗归于某个应用,则应将其归于硬件组件本身。
+ </li>
+ </ul>
+ <h3 id="8_5_consistent_performance">
+8.5. 性能一致
+ </h3>
+ <p>
+高性能应用在长时间运行时,性能可能会因后台运行的其他应用或由于温度限制导致的 CPU 节流而出现大幅波动。Android 包含可编程接口,以便在设备胜任的情况下,最靠前的前台应用能够请求系统优化资源的分配,来应对这种波动。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 必须通过 <a href="https://developer.android.com/reference/android/os/PowerManager.html#isSustainedPerformanceModeSupported%28%29"><code>PowerManager.isSustainedPerformanceModeSupported()</code></a> API 方法准确报告对持续性能模式的支持情况。
+ </p>
+ </li>
+ <li>
+ <p>
+应支持持续性能模式。
+ </p>
+ </li>
+ </ul>
+ <p>
+如果设备报告支持持续性能模式,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须能够让最靠前的前台应用至少在 30 分钟内保持稳定的性能水平(当该应用请求时)。
+ </li>
+ <li>[C-1-2] 必须遵从 <a href="https://developer.android.com/reference/android/view/Window.html#setSustainedPerformanceMode%28boolean%29"><code>Window.setSustainedPerformanceMode()</code></a> API 和其他相关 API。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含两个或更多个 CPU 核心,则:
+ </p>
+ <ul>
+ <li>应至少提供一个可预留给最靠前的前台应用使用的专用核心。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持为最靠前的前台应用预留一个专用核心,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须通过 <a href="https://developer.android.com/reference/android/os/Process.html#getExclusiveCores%28%29"><code>Process.getExclusiveCores()</code></a> API 方法报告可预留给最靠前的前台应用使用的专用核心的 ID 号。
+ </li>
+ <li>[C-2-2] 不得允许任何用户空间进程(应用使用的设备驱动程序除外)在专用核心上运行,但在必要时可以允许一些内核进程在其上运行。
+ </li>
+ </ul>
+ <p>
+如果设备实现不支持专用核心,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 必须通过 <a href="https://developer.android.com/reference/android/os/Process.html#getExclusiveCores%28%29"><code>Process.getExclusiveCores()</code></a> API 方法返回一个空列表。
+ </li>
+ </ul>
+ <h2 id="9_security_model_compatibility">
+9. 安全模型兼容性
+ </h2>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 必须实现与 Android 平台安全模型(如 Android 开发者文档 &gt; API 指南 &gt; <a href="http://developer.android.com/guide/topics/security/permissions.html">安全和权限参考文档</a>中定义)一致的安全模型。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-2] 必须支持安装自签名应用(无需从任何第三方/权威机构获得任何额外的权限/证书)。具体来说就是,与 Android 兼容的设备必须支持以下小节中所述的安全机制。
+ </p>
+ </li>
+ </ul>
+ <h3 id="9_1_permissions">
+9.1. 权限
+ </h3>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 必须支持 <a href="http://developer.android.com/guide/topics/security/permissions.html">Android 权限模型</a>(如 Android 开发者文档中定义)。具体来说就是,必须强制执行定义的每项权限(如 SDK 文档中所述);不得省略、更改或忽略任何权限。
+ </p>
+ </li>
+ <li>
+ <p>
+可以添加额外的权限,但前提是新权限的 ID 字符串不在 <code>android.\*</code> 命名空间内。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-2] 只能将 <code>protectionLevel</code> 为 <a href="https://developer.android.com/reference/android/content/pm/PermissionInfo.html#PROTECTION&amp;lowbar;FLAG&amp;lowbar;PRIVILEGED"><code>PROTECTION_FLAG_PRIVILEGED</code></a> 的权限授予在系统映像的特权路径中加载的应用,并且此类权限只能位于明确为各个应用列入白名单的权限的子集中。AOSP 实现通过以下方式来满足该要求:从 <code>etc/permissions/</code> 路径下的文件中读取为各个应用列入白名单的权限、遵从此类权限,并将 <code>system/priv-app</code> 路径用作特权路径。
+ </p>
+ </li>
+ </ul>
+ <p>
+保护级别为“危险”的权限属于运行时权限。<code>targetSdkVersion</code> 高于 22 的应用会在运行时请求这些权限。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-3] 必须显示一个专用界面,以便用户决定是否授予请求的运行时权限;此外还必须提供一个供用户管理运行时权限的界面。
+ </li>
+ <li>[C-0-4] 对于这两个界面,必须有且只能有一个实现。
+ </li>
+ <li>[C-0-5] 不得向预安装的应用授予任何运行时权限,除非:
+ </li>
+ <li>可以在应用使用运行时权限之前获得用户同意
+ </li>
+ <li>运行时权限与符合以下条件的某个 Intent 模式相关联:已将预安装的应用设为其默认处理程序
+ </li>
+ </ul>
+ <p>
+如果设备实现包含预安装的应用,或者希望允许第三方应用访问使用情况统计信息,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 强烈建议能够因应 <a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION&amp;lowbar;USAGE&amp;lowbar;ACCESS&amp;lowbar;SETTINGS"><code>android.settings.ACTION_USAGE_ACCESS_SETTINGS</code></a> Intent 提供一种可供用户使用的机制,以便他们为声明了 <code>android.permission.PACKAGE_USAGE_STATS</code> 权限的应用授予或撤消对使用情况统计信息的访问权限。
+ </li>
+ </ul>
+ <p>
+如果设备实现打算禁止所有应用(包括预安装的应用)访问使用情况统计信息,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须仍有负责处理 <a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION&amp;lowbar;USAGE&amp;lowbar;ACCESS&amp;lowbar;SETTINGS"><code>android.settings.ACTION_USAGE_ACCESS_SETTINGS</code></a> Intent 模式的 Activity,但必须将其实现为空操作,也就是具有和用户访问被拒时同等的行为。
+ </li>
+ </ul>
+ <h3 id="9_2_uid_and_process_isolation">
+9.2. UID 和进程隔离
+ </h3>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须支持 Android 应用沙盒模型。在该模型中,每个应用都是在单独的进程中作为独一无二的 Unixstyle UID 运行。
+ </li>
+ <li>[C-0-2] 必须支持以同一 Linux 用户 ID 运行多个应用,但前提是这些应用已经过适当签名,并采用了适当的构建方式(如<a href="http://developer.android.com/guide/topics/security/permissions.html">安全和权限参考</a>中定义)。
+ </li>
+ </ul>
+ <h3 id="9_3_filesystem_permissions">
+9.3. 文件系统权限
+ </h3>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须支持 Android 文件访问权限模型(如<a href="http://developer.android.com/guide/topics/security/permissions.html">安全和权限参考</a>中定义)。
+ </li>
+ </ul>
+ <h3 id="9_4_alternate_execution_environments">
+9.4. 替代执行环境
+ </h3>
+ <p>
+设备实现必须能够使 Android 安全性和权限模型保持一致性,即使它们包含存在以下情况的运行时环境也是如此:使用除了 Dalvik 可执行文件格式或本机代码以外的一些其他软件或技术来执行应用。也就是说:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 替代运行时本身必须是 Android 应用,并且遵循标准的 Android 安全模型(如<a href="#9_security_model_compatibility">第 9 节</a>中的其他部分所述)。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-2] 不得授权替代运行时访问受以下权限保护的资源:未在替代运行时的 <code>AndroidManifest.xml</code> 文件中通过 &lt;<code>uses-permission</code>&gt; 机制请求的权限。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-3] 替代运行时不得允许应用使用受仅限系统应用享有的 Android 权限保护的功能。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-4] 替代运行时必须遵循 Android 沙盒模型,并且使用替代运行时的已安装应用不得重复使用设备上已安装的任何其他应用的沙盒,除非通过共享用户 ID 和签名证书这两种标准 Android 机制。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-5] 不得使用对应于其他 Android 应用的沙盒启动替代运行时,不得向替代运行时授予对这些沙盒的访问权限,替代运行时也不得向其他应用授予此类访问权限。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-6] 不得使替代运行时在启动时获得超级用户 (root) 或任何其他用户 ID 的任何权限,不得向替代运行时授予任何此类权限,替代运行时也不得向其他应用授予任何此类权限。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-7] 如果设备实现的系统映像中包含替代运行时的 <code>.apk</code> 文件,则这些文件必须已签名,并且签名时所用的密钥必须不同于对设备实现包含的其他应用签名时使用的密钥。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-8] 在安装应用时,替代运行时必须就应用使用的 Android 权限获得用户同意。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-9] 如果某个应用需要使用具有相应 Android 权限的设备资源(例如摄像头、GPS,等等),则替代运行时必须通知用户,让他们知道该应用将能够访问相应资源。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-10] 如果运行时环境不会以这种方式记录应用功能,则在安装任何使用该运行时的应用时,运行时环境都必须列出运行时自身拥有的所有权限。
+ </p>
+ </li>
+ <li>
+ <p>
+替代运行时应通过 <code>PackageManager</code> 将应用安装到单独的 Android 沙盒(Linux 用户 ID 等)中。
+ </p>
+ </li>
+ <li>
+ <p>
+替代运行时可以提供一个供所有使用替代运行时的应用共享的 Android 沙盒。
+ </p>
+ </li>
+ </ul>
+ <h3 id="9_5_multi-user_support">
+9.5. 多用户支持
+ </h3>
+ <p>
+Android <a href="http://developer.android.com/reference/android/os/UserManager.html">支持多用户功能</a>,并支持完全用户隔离。
+ </p>
+ <ul>
+ <li>如果设备实现使用<a href="http://developer.android.com/reference/android/os/Environment.html">可移动媒体</a>作为主要的外部存储设备,则可以但不应启用多用户功能。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含多位用户,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须满足与<a href="http://source.android.com/devices/storage/traditional.html">多用户支持</a>相关的以下要求。
+ </li>
+ <li>[C-1-2] 必须为每位用户实现与 Android 平台安全模型(如 API 指南内的<a href="http://developer.android.com/guide/topics/security/permissions.html">安全和权限参考文档</a>中定义)一致的安全模型。
+ </li>
+ <li>[C-1-3] 对于每个用户实例,都必须在共享应用存储空间(也称为 <code>/sdcard</code>)中有单独的隔离目录。
+ </li>
+ <li>[C-1-4] 必须确保归指定用户所有且以其名义运行的应用无法列出、读取或写入到归任何其他用户所有的文件中,即使双方的数据都存储在相同的卷或文件系统中也是如此。
+ </li>
+ <li>[C-1-5] 如果设备实现针对外部存储 API 使用可移动媒介,则必须使用仅存储在只有系统可访问的不可移动媒介上的密钥对 SD 卡中的内容加密(如果启用了多用户功能)。这样会使主机 PC 无法读取相应媒介,所以设备实现将需要切换到 MTP 或类似系统,才能为主机 PC 提供访问当前用户的数据的权限。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含多位用户,并且未声明 <code>android.hardware.telephony</code> 功能标记,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须支持受限配置文件,该配置文件可让设备所有者管理设备上的其他用户以及他们可以使用的功能。借助受限配置文件,设备所有者可以快速设置供其他用户使用的单独环境,同时还能在可于这些环境中运行的应用内管理更精细的限制。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含多位用户,并且声明了 <code>android.hardware.telephony</code> 功能标记,则:
+ </p>
+ <ul>
+ <li>[C-3-1] 不得支持受限配置文件,但必须与用于允许/禁止其他用户访问语音通话和短信的控件的 AOSP 实现保持一致。
+ </li>
+ </ul>
+ <h3 id="9_6_premium_sms_warning">
+9.6. 付费短信警告
+ </h3>
+ <p>
+Android 支持针对任何外发<a href="http://en.wikipedia.org/wiki/Short_code">付费短信</a>向用户发出警告。付费短信是指向已在运营商处注册且可能需要用户付费的服务发送的短信。
+ </p>
+ <p>
+如果设备实现声明支持 <code>android.hardware.telephony</code>,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 在向通过设备的 <code>/data/misc/sms/codes.xml</code> 文件中定义的正则表达式识别出的号码发送短信之前,必须警告用户。上游 Android 开源项目提供满足该要求的实现。
+ </li>
+ </ul>
+ <h3 id="9_7_kernel_security_features">
+9.7. 内核安全功能
+ </h3>
+ <p>
+Android 沙盒包含使用安全增强型 Linux (SELinux) 强制访问控制 (MAC) 系统、seccomp 沙盒功能以及 Linux 内核中其他安全功能的功能。因此,设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须与现有应用保持兼容,即使 SELinux 或任何其他安全功能是在 Android 框架以下实现的。
+ </li>
+ <li>[C-0-2] 当在 Android 框架以下实现的安全功能检测到并成功阻止安全违规行为时,不得显示可见界面;但当发生未被阻止的安全违规行为且该行为导致漏洞被成功利用时,则可以显示可见界面。
+ </li>
+ <li>[C-0-3] 必须确保用户或应用开发者无法对 SELinux 或任何其他在 Android 框架以下实现的安全功能进行配置。
+ </li>
+ <li>[C-0-4] 不得允许可通过 API(例如 Device Administration API)影响其他应用的应用配置会破坏兼容性的政策。
+ </li>
+ <li>[C-0-5] 必须将媒体框架拆分为多个进程,以便能够更精细地为每个进程授予访问权限(如 Android 开源项目网站上<a href="https://source.android.com/devices/media/framework-hardening.html#arch_changes">所述</a>)。
+ </li>
+ <li>[C-0-6] 必须实现一种允许使用多线程程序中的可配置政策对系统调用进行过滤的内核应用沙盒机制。上游 Android 开源项目通过启用采用 threadgroup 同步 (TSYNC) 的 seccomp-BPF(如 <a href="http://source.android.com/devices/tech/config/kernel.html#Seccomp-BPF-TSYNC">source.android.com 上的“内核配置”部分</a>所述)来满足该要求。
+ </li>
+ </ul>
+ <p>
+内核完整性和自保护功能对于确保 Android 安全性至关重要。因此,设备实现:
+ </p>
+ <ul>
+ <li>[C-0-7] 必须实现内核堆栈缓冲区溢出保护机制(例如 <code>CONFIG_CC_STACKPROTECTOR_STRONG</code>)。
+ </li>
+ <li>[C-0-8] 当可执行代码为只读、只读数据不可执行且不可写入,以及可写入数据不可执行时,必须实现严格的内核内存保护机制(例如 <code>CONFIG_DEBUG_RODATA</code> 或 <code>CONFIG_STRICT_KERNEL_RWX</code>)。
+ </li>
+ <li>[SR] 强烈建议使仅在初始化期间会被写入的内核数据在初始化之后被标记为只读(例如 <code>__ro_after_init</code>)。
+ </li>
+ <li>[SR} 强烈建议实现对用户空间和内核空间之间的副本进行静态和动态对象尺寸边界检查(例如 <code>CONFIG_HARDENED_USERCOPY</code>)。
+ </li>
+ <li>[SR] 强烈建议在任何情况下都不执行在内核中运行的用户空间内存(例如硬件 PXN,或通过 <code>CONFIG_CPU_SW_DOMAIN_PAN</code> 或 <code>CONFIG_ARM64_SW_TTBR0_PAN</code> 模拟)。
+ </li>
+ <li>[SR] 强烈建议在任何情况下都不在正常用户副本访问 API 之外对内核中的用户空间内存执行读取或写入操作(例如硬件 PAN,或通过 <code>CONFIG_CPU_SW_DOMAIN_PAN</code> 或 <code>CONFIG_ARM64_SW_TTBR0_PAN</code> 模拟)。
+ </li>
+ <li>[SR] 强烈建议对内核代码和内存的布局进行随机化处理,并避免会影响此项处理的曝光(例如通过 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/chosen.txt"><code>/chosen/kaslr-seed Device Tree node</code></a> 或 <a href="https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/efi-rng-protocol"><code>EFI_RNG_PROTOCOL</code></a> 并采用引导加载程序熵执行 <code>CONFIG_RANDOMIZE_BASE</code>)。
+ </li>
+ </ul>
+ <p>
+如果设备实现使用 Linux 内核,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须实现 SELinux。
+ </li>
+ <li>[C-1-2] 必须将 SELinux 设置为全局强制模式。
+ </li>
+ <li>[C-1-3] 必须将所有域配置为强制模式。不允许使用宽容模式域,包括特定于设备/供应商的域。
+ </li>
+ <li>[C-1-4] 对于 AOSP SELinux 域以及特定于设备/供应商的域,不得修改、省略或替换上游 Android 开源项目 (AOSP) 中提供的 system/sepolicy 文件夹中存在的 neverallow 规则,并且政策必须在所有 neverallow 规则都存在的情况下编译。
+ </li>
+ <li>应保留上游 Android 开源项目的 system/sepolicy 文件夹中提供的默认 SELinux 政策,并且应仅针对自己的设备特定配置向该政策进一步添加内容。
+ </li>
+ </ul>
+ <p>
+如果设备实现使用 Linux 以外的内核,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须使用与 SELinux 相当的强制访问控制系统。
+ </li>
+ </ul>
+ <h3 id="9_8_privacy">
+9.8. 隐私权
+ </h3>
+ <h4 id="9_8_1_usage_history">
+9.8.1. 使用情况历史记录
+ </h4>
+ <p>
+Android 会存储用户所做选择的历史记录,并会通过 <a href="https://developer.android.com/reference/android/app/usage/UsageStatsManager.html">UsageStatsManager</a> 管理此类记录。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须保证此类用户历史记录具有合理的保留期限。
+ </li>
+ <li>[SR] 强烈建议在 AOSP 实现中保留默认配置的 14 天保留期限。
+ </li>
+ </ul>
+ <h4 id="9_8_2_recording">
+9.8.2. 录制
+ </h4>
+ <p>
+如果设备实现在系统中包含用于捕获屏幕上显示的内容和/或录制设备上播放的音频流的功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 每当该功能处于启用状态并主动捕获内容/录音时,必须持续向用户显示通知。
+ </li>
+ </ul>
+ <p>
+如果设备实现包含一个能够录制环境音频(以便推断关于用户所在环境的实用信息)且开箱即启用的组件,则:
+ </p>
+ <ul>
+ <li>[C-2-1] 除非用户明确同意,否则不得将录制的原始音频或以下任何格式的音频存储在设备上的永久性存储空间内,也不得将其发送到设备以外的位置:可以转换回原始音频或转换为与原始音频近似的副本的格式。
+ </li>
+ </ul>
+ <h4 id="9_8_3_connectivity">
+9.8.3. 连接
+ </h4>
+ <p>
+如果设备实现具有支持 USB 外围设备模式的 USB 端口,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 在允许通过 USB 端口访问共享存储空间的内容之前,必须先显示一个征求用户同意的界面。
+ </li>
+ </ul>
+ <h4 id="9_8_4_network_traffic">
+9.8.4. 网络流量
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须为系统信任的证书授权机构 (CA) 存储区预安装根证书(与上游 Android 开源项目中<a href="https://source.android.com/security/overview/app-security.html#certificate-authorities">提供</a>的根证书相同)。
+ </li>
+ <li>[C-0-2] 必须搭载空的用户根 CA 存储区。
+ </li>
+ <li>[C-0-3] 当添加了用户根 CA 时,必须向用户显示警告,以指明网络流量可能会受到监控。
+ </li>
+ </ul>
+ <p>
+如果设备流量通过 VPN 路由,则设备实现:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须向用户显示警告,以指明以下两者之一:
+ <ul>
+ <li>该网络流量可能会受到监控。
+ </li>
+ <li>该网络流量通过提供 VPN 的特定 VPN 应用路由。
+ </li>
+ </ul>
+ </li>
+ </ul>
+ <p>
+如果设备实现具有一种旨在通过代理服务器或 VPN 网关路由网络数据流量且开箱即默认启用的机制(例如预加载已被授予 <code>android.permission.CONTROL_VPN</code> 权限的 VPN 服务),则:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须在启用该机制之前征求用户同意,除非相应 VPN 由设备政策控制器通过 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setAlwaysOnVpnPackage%28android.content.ComponentName,%20java.lang.String,%20boolean%29"><code>DevicePolicyManager.setAlwaysOnVpnPackage()</code></a> 启用,在这种情况下,用户不需要单独表示同意,只需收到通知即可。
+ </li>
+ </ul>
+ <h3 id="9_9_data_storage_encryption">
+9.9. 数据存储加密
+ </h3>
+ <p>
+如果设备实现支持安全锁定屏幕(如<a href="#9_11_1_secure_lock_screen">第 9.11.1 节</a>中所述),则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须支持对应用隐私数据 (<code>/data partition</code>) 以及应用共享存储分区(<code>/sdcard partition</code>,如果它是设备上不可取除的永久部分)进行数据存储加密。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持安全锁定屏幕(如<a href="#9_11_1_secure_lock_screen">第 9.11.1 节</a>中所述),并且支持以高于 50 MiB/s 的高级加密标准 (AES) 加密性能进行数据存储加密,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-2-1] 必须在用户完成开箱设置时默认启用数据存储加密。如果设备实现已使用默认停用加密功能的较低 Android 版本启动,则由于此类设备无法通过系统软件更新来满足该要求,因此可以不遵守该要求。
+ </p>
+ </li>
+ <li>
+ <p>
+应通过实现<a href="https://source.android.com/security/encryption/file-based.html">文件级加密</a> (FBE) 来满足上述数据存储加密要求。
+ </p>
+ </li>
+ </ul>
+ <h4 id="9_9_1_direct_boot">
+9.9.1. 直接启动
+ </h4>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-0-1] 必须实现<a href="http://developer.android.com/preview/features/direct-boot.html">直接启动模式</a> API,即使它们不支持存储加密也是如此。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-0-2] 必须仍广播 <a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_LOCKED_BOOT_COMPLETED"><code>ACTION_LOCKED_BOOT_COMPLETED</code></a> 和 <a href="https://developer.android.com/reference/android/content/Intent.html#ACTION_USER_UNLOCKED"><code>ACTION_USER_UNLOCKED</code></a> Intent,以便让直接启动感知型应用知道设备加密 (DE) 和凭据加密 (CE) 存储位置可供用户使用。
+ </p>
+ </li>
+ </ul>
+ <h4 id="9_9_2_file_based_encryption">
+9.9.2. 文件级加密
+ </h4>
+ <p>
+如果设备实现支持 FBE,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 启动时不得要求用户提供凭据,并且在广播 <code>ACTION_LOCKED_BOOT_COMPLETED</code> 消息后允许直接启动感知型应用访问设备加密 (DE) 存储空间。
+ </li>
+ <li>[C-1-2] 只有在用户已通过提供凭据(例如密码、PIN 码、图案或指纹)解锁设备并且系统已广播 <code>ACTION_USER_UNLOCKED</code> 消息后,才能允许访问凭据加密 (CE) 存储空间。
+ </li>
+ <li>[C-1-3] 不得提供任何在用户未提供凭据的情况下解锁受 CE 保护的存储空间的方法。
+ </li>
+ <li>[C-1-4] 必须支持验证启动,并确保 DE 密钥以加密形式绑定到设备的硬件信任根。
+ </li>
+ <li>[C-1-5] 必须支持使用 AES 算法(密钥长度为 256 位,且采用 XTS 模式)对文件内容进行加密。
+ </li>
+ <li>
+ <p>
+[C-1-6] 必须支持使用 AES 算法(密钥长度为 256 位,且采用 CBC-CTS 模式)对文件名进行加密。
+ </p>
+ </li>
+ <li>
+ <p>
+用于保护 CE 和 DE 存储区域的密钥:
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-7] 必须以加密形式绑定到有硬件支持的密钥存储区。
+ </p>
+ </li>
+ <li>[C-1-8] CE 密钥必须绑定到用户的锁定屏幕凭据。
+ </li>
+ <li>[C-1-9] 如果用户未指定锁定屏幕凭据,则 CE 密钥必须绑定到默认密码。
+ </li>
+ <li>
+ <p>
+[C-1-10] 必须是独一无二的,也就是说,任何用户的 CE 或 DE 密钥都不能与其他用户的 CE 或 DE 密钥一致。
+ </p>
+ </li>
+ <li>
+ <p>
+应将预加载的必要应用(例如闹钟、电话和 Messenger)设为直接启动感知型应用。
+ </p>
+ </li>
+ <li>可以支持使用替代加密方式、密钥长度和模式对文件内容和文件名进行加密,但默认情况下必须使用强制支持的加密方式、密钥长度和模式。
+ </li>
+ </ul>
+ <p>
+上游 Android 开源项目提供了该功能的首选实现(基于 Linux 内核 EXT4 加密功能)。
+ </p>
+ <h4 id="9_9_3_full_disk_encryption">
+9.9.3. 全盘加密
+ </h4>
+ <p>
+如果设备实现支持<a href="http://source.android.com/devices/tech/security/encryption/index.html">全盘加密</a> (FDE),则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须使用 AES 算法,密钥长度必须为 128 位(或更长),且必须采用专为存储加密设计的模式(例如 AES-XTS、AES-CBC-ESSIV)。
+ </li>
+ <li>[C-1-2] 必须使用默认密码封装加密密钥;在任何情况下,都不得将未经加密的加密密钥写入到存储空间。
+ </li>
+ <li>[C-1-3] 必须让用户能够通过已采用慢扩展算法(例如 PBKDF2 或 scrypt)进行扩展的锁定屏幕凭据对加密密钥进行 AES 加密(除非加密密钥正在使用中)。
+ </li>
+ <li>[C-1-4] 如果用户未指定锁定屏幕凭据,或已停用使用密码进行加密,并且设备提供了有硬件支持的密钥存储区,则上述默认密码扩展算法必须以加密形式绑定到该密钥存储区。
+ </li>
+ <li>[C-1-5] 不得将加密密钥发送到设备以外的位置,即使已使用用户密码和/或硬件绑定密钥进行封装也是如此。
+ </li>
+ </ul>
+ <p>
+上游 Android 开源项目提供了该功能的首选实现(基于 Linux 内核功能 dm-crypt)。
+ </p>
+ <h3 id="9_10_device_integrity">
+9.10. 设备完整性
+ </h3>
+ <p>
+以下要求旨在确保设备完整性状态的透明性。设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须通过系统 API 方法 <code>PersistentDataBlockManager.getFlashLockState()</code> 正确报告引导加载程序所处的状态是否允许刷写系统映像。<code>FLASH_LOCK_UNKNOWN</code> 状态专用于从不存在这种新系统 API 方法的较低 Android 版本进行升级的设备实现。
+ </li>
+ </ul>
+ <p>
+验证启动是一项旨在保证设备软件完整性的功能。如果设备实现支持该功能,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须声明平台功能标记 <code>android.software.verified_boot</code>。
+ </li>
+ <li>[C-2-1] 必须对每个启动序列执行验证。
+ </li>
+ <li>[C-3-1] 必须从作为信任根的不可变硬件密钥开始验证,一直验证到系统分区。
+ </li>
+ <li>[C-4-1] 必须实现每个验证阶段,以便在执行下一阶段中的代码之前,先检查下一阶段中所有字节的完整性和真实性。
+ </li>
+ <li>[C-5-1] 必须使用与 NIST 针对哈希算法 (SHA-256) 和公钥大小 (RSA-2048) 给出的最新建议一样强大的验证算法。
+ </li>
+ <li>[C-6-1] 当系统验证失败时,不得允许完成启动,除非用户同意仍然尝试启动,在这种情况下,不得使用任何未经验证的存储块中的数据。
+ </li>
+ <li>[C-7-1] 不得允许修改设备上经过验证的分区,除非用户已明确解锁引导加载程序。
+ </li>
+ <li>[SR] 如果设备中有多个离散芯片(例如无线装置、专门的图片处理器),强烈建议其中每个芯片的启动进程在启动时验证每个阶段。
+ </li>
+ <li>[SR] 当引导加载程序处于解锁状态时,强烈建议使用防篡改的存储空间。防篡改的存储空间意味着:如果存储空间在 HLOS(高级操作系统)内被篡改,启动加载程序可以检测到。
+ </li>
+ <li>[SR] 强烈建议在允许从启动加载程序锁定模式转换为启动加载程序解锁模式之前提示用户(如果他们在使用设备),并要求用户进行物理确认。
+ </li>
+ <li>[SR] 强烈建议针对 HLOS(例如启动、系统分区)实现回滚保护,并使用防篡改存储空间来存储用于确定允许使用的最低操作系统版本的元数据。
+ </li>
+ <li>应针对具有持久性固件(例如调制解调器、摄像头)的任何组件实现回滚保护,并且应使用防篡改存储空间来存储用于确定允许使用的最低版本的元数据。
+ </li>
+ </ul>
+ <p>
+上游 Android 开源项目在 <a href="http://android.googlesource.com/platform/external/avb/"><code>external/avb/</code></a> 存储区中提供了该功能的首选实现,该实现可以集成到用于加载 Android 的引导加载程序中。
+ </p>
+ <p>
+高级加密标准 (AES) 加密性能高于 50 MiB/s 的设备实现:
+ </p>
+ <ul>
+ <li>[C-8-1] 必须支持验证启动以确保设备完整性。
+ </li>
+ </ul>
+ <p>
+如果设备实现已在不支持验证启动的情况下使用较低 Android 版本启动,则由于此类设备无法通过系统软件更新来添加对该功能的支持,因此可以不遵守该要求。
+ </p>
+ <h3 id="9_11_keys_and_credentials">
+9.11. 密钥和凭据
+ </h3>
+ <p>
+通过 <a href="https://developer.android.com/training/articles/keystore.html">Android Keystore 系统</a>,应用开发者可以将加密密钥存储在容器中,并可以通过 <a href="https://developer.android.com/reference/android/security/KeyChain.html">KeyChain API</a> 或 <a href="https://developer.android.com/reference/java/security/KeyStore.html">Keystore API</a> 在加密操作中使用它们。因此,设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须至少允许导入超过 8192 个密钥。
+ </li>
+ <li>[C-0-2] 锁定屏幕身份验证机制必须对尝试次数加以限制,并采用指数退避算法。尝试身份验证的失败次数超过 150 次后,每次尝试的时间间隔必须至少为 24 小时。
+ </li>
+ <li>不应限制可以生成的密钥数。
+ </li>
+ </ul>
+ <p>
+如果设备实现支持安全锁定屏幕,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 必须使用安全硬件备份 Keystore 实现。
+ </li>
+ <li>[C-1-2] 必须具有 RSA、AES、ECDSA 和 HMAC 加密算法以及 MD5、SHA1 和 SHA-2 系列哈希函数的实现,以便在与内核上及更上面运行的代码安全隔离的区域中正确支持 Android Keystore 系统支持的算法。安全隔离必须能够阻止内核或用户空间代码可能会借以获取隔离环境内部状态的所有潜在机制,包括 DMA。上游 Android 开源项目 (AOSP) 通过使用 <a href="https://source.android.com/security/trusty/">Trusty</a> 实现来满足该要求,但也可以使用其他基于 ARM TrustZone 的解决方案,或使用基于管理程序的适当隔离方法的安全实现(如果已经过第三方审核)。
+ </li>
+ <li>[C-1-3] 必须在隔离的执行环境中执行锁定屏幕身份验证,并且只有在成功通过验证时,才允许使用与身份验证绑定的密钥。上游 Android 开源项目提供了可用于满足该要求的 <a href="http://source.android.com/devices/tech/security/authentication/gatekeeper.html">Gatekeeper 硬件抽象层 (HAL)</a> 和 Trusty。
+ </li>
+ <li>[C-1-4] 如果认证签名密钥有安全硬件保护,并且签名是在安全硬件中进行,则必须支持密钥认证。认证签名密钥必须在足够多的设备之间共享,以防止此类密钥被用作设备标识符。满足该要求的一种方法是共享相同的认证密钥,除非生成了至少 10 万个单元的给定 SKU。如果生成了超过 100 万个单元的 SKU,则可以针对每 100 万个单元使用一个不同的密钥。
+ </li>
+ </ul>
+ <p>
+请注意,如果设备实现已使用较低 Android 版本启动,则此类设备无需满足具有有硬件支持的密钥存储区这一要求,除非它声明了 <code>android.hardware.fingerprint</code> 功能(该功能需要有硬件支持的密钥存储区)。
+ </p>
+ <h4 id="9_11_1_secure_lock_screen">
+9.11.1. 安全锁定屏幕
+ </h4>
+ <p>
+如果设备实现包含安全锁定屏幕,并且包含一个或多个实现 <code>TrustAgentService</code> System API 的可信代理,则:
+ </p>
+ <ul>
+ <li>[C-1-1] 在屏幕自动锁定被可信代理推迟或屏幕锁定可被可信代理解锁的情况下,必须在“设置”中和锁定屏幕界面中向用户指明这一点。AOSP 通过以下方式来满足该要求:针对“自动锁定设置”和“电源按钮即时锁定设置”菜单显示文字说明,并在锁定屏幕上显示显眼的图标。
+ </li>
+ <li>[C-1-2] 必须遵从并完整实现 <code>DevicePolicyManager</code> 类中的所有可信代理 API,例如 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#KEYGUARD&amp;lowbarDISABLE&amp;lowbarTRUST&amp;lowbarAGENTS"><code>KEYGUARD_DISABLE_TRUST_AGENTS</code></a> 常量。
+ </li>
+ <li>[C-1-3] 不得在主要供个人使用的设备(例如手持设备)上完整实现 <code>TrustAgentService.addEscrowToken()</code> 功能,但可以在通常供多人共享的设备实现上完整实现该功能。
+ </li>
+ <li>[C-1-4] 在将通过 <code>TrustAgentService.addEscrowToken()</code> 添加的令牌存储在设备上之前,必须先对其进行加密。
+ </li>
+ <li>[C-1-5] 不得将加密密钥存储在设备上。
+ </li>
+ <li>[C-1-6] 在启用第三方托管令牌以解密数据存储之前,必须先将会对安全性造成对影响通知用户。
+ </li>
+ </ul>
+ <p>
+如果设备实现会添加或修改用于解锁锁定屏幕的身份验证方法,则为了使此类方法被视为安全的屏幕锁定方式,必须符合以下条件:
+ </p>
+ <ul>
+ <li>[C-2-1] 必须是<a href="https://developer.android.com/training/articles/keystore.html#UserAuthentication">要求进行用户身份验证才能使用密钥</a>中所述的用户身份验证方法。
+ </li>
+ <li>[C-2-2] 必须解锁所有密钥,以便在用户解锁安全锁定屏幕时供第三方开发者应用使用。例如,必须通过相关 API(例如 <a href="https://developer.android.com/reference/android/app/KeyguardManager.html#createConfirmDeviceCredentialIntent%28java.lang.CharSequence,%20java.lang.CharSequence%29"><code>createConfirmDeviceCredentialIntent</code></a> 和 <a href="https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setUserAuthenticationRequired%28boolean%29"><code>setUserAuthenticationRequired</code></a>)使所有密钥都可供第三方开发者应用使用。
+ </li>
+ </ul>
+ <p>
+如果设备实现会添加或修改用于解锁锁定屏幕且基于已知密钥的身份验证方法,则为了使此类方法被视为安全的屏幕锁定方式,必须符合以下条件:
+ </p>
+ <ul>
+ <li>[C-3-1] 允许的最短输入内容长度的熵必须大于 10 位。
+ </li>
+ <li>[C-3-2] 所有可能的输入内容的最大熵必须大于 18 位。
+ </li>
+ <li>[C-3-3] 不得替换 AOSP 中实现和提供的任何现有身份验证方法(PIN 码、图案或密码)。
+ </li>
+ <li>[C-3-4] 当设备政策控制器 (DPC) 应用已通过 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29"><code>DevicePolicyManager.setPasswordQuality()</code></a> 方法(具有比 <code>PASSWORD_QUALITY_SOMETHING</code> 限制性更强的质量常量)设置密码质量政策时,它们必须处于停用状态。
+ </li>
+ </ul>
+ <p>
+如果设备实现会添加或修改用于解锁锁定屏幕且基于物理令牌或位置的身份验证方法,则为了使此类方法被视为安全的屏幕锁定方式,必须符合以下条件:
+ </p>
+ <ul>
+ <li>[C-4-1] 必须具有回退机制,以使用符合以下条件的主要身份验证方法之一:基于已知密钥,且满足被视为安全锁定屏幕的要求。
+ </li>
+ <li>[C-4-2] 当设备政策控制器 (DPC) 应用已通过 <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setKeyguardDisabledFeatures%28android.content.ComponentName,%20int%29"><code>DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_TRUST_AGENTS)</code></a> 方法或 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29"><code>DevicePolicyManager.setPasswordQuality()</code></a> 方法(具有比 <code>PASSWORD_QUALITY_UNSPECIFIED</code> 限制性更强的质量常量)设置政策时,它们必须处于停用状态,仅允许使用主要身份验证方法来解锁屏幕。
+ </li>
+ <li>[C-4-3] 必须至少每隔 72 小时对用户进行一次主要身份验证(例如 PIN 码、图案、密码)。
+ </li>
+ </ul>
+ <p>
+如果设备实现会添加或修改用于解锁锁定屏幕且基于生物识别技术的身份验证方法,则为了使此类方法被视为安全的屏幕锁定方式,必须符合以下条件:
+ </p>
+ <ul>
+ <li>[C-5-1] 必须具有回退机制,以使用符合以下条件的主要身份验证方法之一:基于已知密钥,且满足被视为安全锁定屏幕的要求。
+ </li>
+ <li>[C-5-2] 当设备政策控制器 (DPC) 应用已通过调用 <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setKeyguardDisabledFeatures%28android.content.ComponentName,%20int%29"><code>DevicePolicyManager.setKeyguardDisabledFeatures(KEYGUARD_DISABLE_FINGERPRINT)</code></a> 方法设置锁屏功能政策时,它们必须处于停用状态,并且仅允许使用主要身份验证方法来解锁屏幕。
+ </li>
+ <li>[C-5-3] 必须具有与指纹传感器所需的错误接受率相等或更严格的错误接受率(如第 7.3.10 节中所述);否则当设备政策控制器 (DPC) 应用已通过 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29"><code>DevicePolicyManager.setPasswordQuality()</code></a> 方法(具有比 <code>PASSWORD_QUALITY_BIOMETRIC_WEAK</code> 限制性更强的质量常量)设置密码质量政策时,它们必须处于停用状态,并且仅允许使用主要身份验证方法来解锁屏幕。
+ </li>
+ <li>[C-5-4] 必须至少每隔 72 小时对用户进行一次主要身份验证(例如 PIN 码、图案、密码)。
+ </li>
+ </ul>
+ <p>
+如果设备实现会添加或修改用于解锁锁定屏幕的身份验证方法,并且如果此类身份验证方法将用于解锁锁屏,但不会被视为安全的锁定屏幕,则:
+ </p>
+ <ul>
+ <li>[C-6-1] 必须针对 <a href="http://developer.android.com/reference/android/app/KeyguardManager.html#isKeyguardSecure%28%29"><code>KeyguardManager.isKeyguardSecure()</code></a> 和 <a href="https://developer.android.com/reference/android/app/KeyguardManager.html#isDeviceSecure%28%29"><code>KeyguardManager.isDeviceSecure()</code></a> 方法返回 <code>false</code>。
+ </li>
+ <li>[C-6-2] 当设备政策控制器 (DPC) 应用已通过 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordQuality%28android.content.ComponentName,%20int%29"><code>DevicePolicyManager.setPasswordQuality()</code></a> 方法(具有比 <code>PASSWORD_QUALITY_UNSPECIFIED</code> 限制性更强的质量常量)设置密码质量政策时,它们必须处于停用状态。
+ </li>
+ <li>[C-6-3] 不得重置通过 <a href="http://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#setPasswordExpirationTimeout%28android.content.ComponentName,%20long%29"><code>DevicePolicyManager.setPasswordExpirationTimeout()</code></a> 设置的密码有效期计时器。
+ </li>
+ <li>[C-6-4] 如果应用已调用 <a href="https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder.html#setUserAuthenticationRequired%28boolean%29"><code>KeyGenParameterSpec.Builder.setUserAuthenticationRequired(true)</code></a>,则不得对密钥存储区的访问进行身份验证。
+ </li>
+ </ul>
+ <h3 id="9_12_data_deletion">
+9.12. 数据删除
+ </h3>
+ <p>
+所有设备实现:
+ </p>
+ <ul>
+ <li>[C-0-1] 必须为用户提供一种用于执行“恢复出厂设置”的机制。
+ </li>
+ <li>[C-0-2] 必须删除所有由用户生成的数据,即除以下各项以外的所有数据:
+ <ul>
+ <li>系统映像
+ </li>
+ <li>系统映像所需的所有操作系统文件
+ </li>
+ </ul>
+ </li>
+ <li>[C-0-3] 必须采用符合相关行业标准(例如 NIST SP800-88)的方式删除数据。
+ </li>
+ <li>[C-0-4] 当主要用户的设备政策控制器应用调用 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#wipeData%28int%29"><code>DevicePolicyManager.wipeData()</code></a> API 时,必须触发上述“恢复出厂设置”流程。
+ </li>
+ <li>可以提供仅会执行逻辑数据清空操作的快速数据擦除功能。
+ </li>
+ </ul>
+ <h3 id="9_13_safe_boot_mode">
+9.13. 安全启动模式
+ </h3>
+ <p>
+Android 提供了安全启动模式,可让用户启动到仅允许运行预安装的系统应用而停用所有第三方应用的模式。这种模式称为“安全启动模式”,它可以让用户卸载潜在有害的第三方应用。
+ </p>
+ <p>
+设备实现:
+ </p>
+ <ul>
+ <li>[SR] 强烈建议实现安全启动模式。
+ </li>
+ </ul>
+ <p>
+如果设备实现已实现安全启动模式,则:
+ </p>
+ <ul>
+ <li>
+ <p>
+[C-1-1] 必须为用户提供一个用于进入安全启动模式的选项,并确保在进入该模式时不会被设备上安装的第三方应用中断,除非第三方应用是设备政策控制器,并且已将 <a href="https://developer.android.com/reference/android/os/UserManager.html#DISALLOW_SAFE_BOOT"><code>UserManager.DISALLOW_SAFE_BOOT</code></a> 标记设为 true。
+ </p>
+ </li>
+ <li>
+ <p>
+[C-1-2] 必须让用户能够在安全模式下卸载任何第三方应用。
+ </p>
+ </li>
+ <li>
+ <p>
+应为用户提供一个用于从启动菜单进入安全启动模式的选项(采用的工作流程不同于正常启动时的工作流程)。
+ </p>
+ </li>
+ </ul>
+ <h3 id="9_14_automotive_vehicle_system_isolation">
+9.14. Automotive 车载系统隔离
+ </h3>
+ <p>
+Android Automotive 设备应使用<a href="http://source.android.com/devices/automotive.html">车载 HAL</a> 与关键车载子系统交换数据,以便通过车载网络(如 CAN 总线)收发消息。
+ </p>
+ <p>
+可以通过以下方式保护数据交换的安全性:在 Android 框架层以下实现安全功能,以防止与这些子系统进行恶意交互或意外交互。
+ </p>
+ <h2 id="10_software_compatibility_testing">
+10. 软件兼容性测试
+ </h2>
+ <p>
+设备实现必须通过本节中所述的所有测试。
+ </p>
+ <p>
+不过请注意,任何软件测试包都不是详尽无遗的。因此,<strong>强烈建议</strong>设备实现者尽可能减少对可从 Android 开源项目获得的 Android 参考实现和首选实现进行更改。这样有助于最大限度地降低引入错误的风险,从而避免由此造成需要进行返工和潜在设备更新的不兼容问题。
+ </p>
+ <h3 id="10_1_compatibility_test_suite">
+10.1. 兼容性测试套件
+ </h3>
+ <p>
+设备实现必须通过 Android 开源项目提供的 <a href="http://source.android.com/compatibility/index.html">Android 兼容性测试套件 (CTS)</a> 的测试(使用设备上最终交付的软件)。此外,设备实现者应尽可能多地使用 Android 开放源代码树中的参考实现,并且对于 CTS 中不明确的情况,以及参考源代码中部分内容的任何重新实现,都必须确保兼容性。
+ </p>
+ <p>
+CTS 能够在实际设备上运行。与所有软件一样,CTS 自身也可能包含错误。CTS 的版本发布独立于本兼容性定义,我们可能会针对 Android 8.0 发布多个 CTS 修订版本。设备实现必须通过设备软件发布时可用的最新 CTS 版本的测试。
+ </p>
+ <h3 id="10_2_cts_verifier">
+10.2. CTS 验证程序
+ </h3>
+ <p>
+设备实现必须正确执行 CTS 验证程序中的所有适用用例。CTS 验证程序包含在兼容性测试套件中,以便人工操作员运行该验证程序来测试无法由自动化系统测试的功能(例如,测试摄像头和传感器是否能够正常工作)。
+ </p>
+ <p>
+CTS 验证程序已经对多种类型的硬件(其中包括一些选配硬件)进行测试。设备实现必须通过针对其具备的硬件的所有测试;例如,如果某台设备具备加速度计,则必须正确执行 CTS 验证程序中的加速度计测试用例。可跳过或省略本兼容性定义中注明为可选的功能的测试用例。
+ </p>
+ <p>
+如上所述,每种设备和每个细分版本都必须正确运行 CTS 验证程序。不过,由于很多细分版本都非常相似,因此设备实现者并不需要对只有细微差别的细分版本明确运行 CTS 验证程序。具体来说就是,如果设备实现与某个已通过 CTS 验证程序测试的实现只是在所包含的语言区域、品牌信息等方面存在差别,则可以省略 CTS 验证程序测试。
+ </p>
+ <h2 id="11_updatable_software">
+11. 可更新软件
+ </h2>
+ <p>
+设备实现必须包含可用于整个替换系统软件的机制。该机制不需要执行“实时”升级 - 也就是说,可能需要重新启动设备。
+ </p>
+ <p>
+可以使用任何方法,但前提是相应方法可以整个替换设备上预安装的软件。例如,以下任何方法都可以满足该要求:
+ </p>
+ <ul>
+ <li>“无线下载 (OTA)”(通过重新启动进行离线更新)。
+ </li>
+ <li>从主机 PC 上通过 USB 进行“网络共享”更新。
+ </li>
+ <li>通过重新启动进行“离线”更新,以及通过可移动存储设备上的文件进行更新。
+ </li>
+ </ul>
+ <p>
+不过,如果设备实现支持 802.11 或蓝牙 PAN(个人局域网)配置等不按流量计费的数据网络连接,则必须支持 OTA 下载(通过重新启动进行离线更新)。
+ </p>
+ <p>
+使用的更新机制必须支持在不擦除用户数据的情况下进行更新。也就是说,更新机制必须保留应用隐私数据和应用共享数据。请注意,上游 Android 软件包含满足该要求的更新机制。
+ </p>
+ <p>
+对于搭载 Android 6.0 及更高版本的设备实现,更新机制应支持在 OTA 之后验证系统映像是否为与预期结果完全相同的二进制文件。上游 Android 开源项目中基于块的 OTA 实现(从 Android 5.1 开始添加了此实现)可满足该要求。
+ </p>
+ <p>
+此外,设备实现还应支持 <a href="https://source.android.com/devices/tech/ota/ab_updates.html">A/B 系统更新</a>。AOSP 使用启动控件 HAL 实现了该功能。
+ </p>
+ <p>
+在设备实现发布后,如果在其合理的产品生命周期内发现其中存在错误,并且经与 Android 兼容性团队磋商后确定该错误会影响第三方应用的兼容性,则设备实现者必须通过可按上述机制应用的可用软件更新来更正该错误。
+ </p>
+ <p>
+Android 包含一些可让设备所有者应用(如果存在)控制系统更新安装的功能。为了方便起见,对于报告 android.software.device_admin 的设备,系统更新子系统必须实现 <a href="http://developer.android.com/reference/android/app/admin/SystemUpdatePolicy.html">SystemUpdatePolicy</a> 类中所述的行为。
+ </p>
+ <h2 id="12_document_changelog">
+12. 文档更改日志
+ </h2>
+ <p>
+有关对此版本中的兼容性定义所做更改的摘要,请参阅:
+ </p>
+ <ul>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/?pretty=full&amp;no-merges">文档更改日志</a>
+ </li>
+ </ul>
+ <p>
+有关对各节所做更改的摘要,请参阅:
+ </p>
+ <ol>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/1_introduction?pretty=full&amp;no-merges">简介</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/2_device_types?pretty=full&amp;no-merges">设备类型</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/3_software?pretty=full&amp;no-merges">软件</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/4_application-packaging?pretty=full&amp;no-merges">应用打包</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/5_multimedia?pretty=full&amp;no-merges">多媒体</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/6_dev-tools-and-options?pretty=full&amp;no-merges">开发者工具和选项</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/7_hardware-compatibility?pretty=full&amp;no-merges">硬件兼容性</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/8_performance-and-power?pretty=full&amp;no-merges">性能和功耗</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/9_security-model?pretty=full&amp;no-merges">安全模型</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/10_software-compatibility-testing?pretty=full&amp;no-merges">软件兼容性测试</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/11_updatable-software?pretty=full&amp;no-merges">可更新软件</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/12_document-changelog?pretty=full&amp;no-merges">文档更改日志</a>
+ </li>
+ <li>
+ <a href="https://android.googlesource.com/platform/compatibility/cdd/+log/oreo-dev/13_contact-us?pretty=full&amp;no-merges">与我们联系</a>
+ </li>
+ </ol>
+ <h3 id="12_1_changelog_viewing_tips">
+12.1. 更改日志查看提示
+ </h3>
+ <p>
+更改采用以下标记方式:
+ </p>
+ <ul>
+ <li>
+ <p>
+ <strong>CDD</strong><br />
+对兼容性要求所做的重大更改。
+ </p>
+ </li>
+ <li>
+ <p>
+ <strong>文档</strong><br />
+与美观性或细分版本相关的更改。
+ </p>
+ </li>
+ </ul>
+ <p>
+为了最便捷地查看相关更改,请将 <code>pretty=full</code> 和 <code>no-merges</code> 网址参数附加到更改日志网址。
+ </p>
+ <h2 id="13_contact_us">
+13. 与我们联系
+ </h2>
+ <p>
+ 您可以加入 <a href="https://groups.google.com/forum/#!forum/android-compatibility">android-compatibility 论坛</a>,以便发帖咨询或提出您认为本文档中未涵盖的任何问题。
+ </p>
+
+</body></html> \ No newline at end of file
diff --git a/zh-cn/license.html b/zh-cn/license.html
index 65976fa1..8f5a6484 100644
--- a/zh-cn/license.html
+++ b/zh-cn/license.html
@@ -54,7 +54,7 @@
<li>使用 SDK 中提供(或本文档中显示)的示例源代码时,需遵循 <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 许可</a>中详述的条件。</li>
</ul>
-<h2 id="attribution">归因理论</h2>
+<h2 id="attribution">注明出处</h2>
<p>当您重复使用网页上显示的根据 Creative Commons Attribution 许可条款提供的内容或创建其修改版本时,需注明相应的出处。在该网站上,需注明出处的要求仅适用于非文档内容(如上文所述)。要了解关于注明出处的完整要求,请参阅 <a href="https://creativecommons.org/licenses/by/3.0/legalcode">Creative Commons 法律规定</a>的 4b 部分。
</p>
<p>在实际使用情形中,我们要求您根据创作作品所用媒介的特点,尽可能注明出处来自 Android 开放源代码项目。此要求可能适用于以下几种典型方式:</p>
diff --git a/zh-cn/security/bulletin/2017-06-01.html b/zh-cn/security/bulletin/2017-06-01.html
index 0be759e1..a111472b 100644
--- a/zh-cn/security/bulletin/2017-06-01.html
+++ b/zh-cn/security/bulletin/2017-06-01.html
@@ -45,8 +45,7 @@
</ul>
<h2 id="mitigations">Android 和 Google Play 保护机制缓解措施</h2>
-<p>本部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。
-这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+<p>本部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
<ul>
<li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。</li>
<li>Android 安全团队会积极利用 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>来监控滥用行为,并会在发现<a href="/security/reports/Google_Android_Security_PHA_classifications.pdf">可能有害的应用</a>时向用户发出警告。在预装有 <a href="http://www.android.com/gms">Google 移动服务</a>的设备上,Google Play 保护机制在默认情况下处于启用状态。对于安装来自 Google Play 以外的应用的用户来说,这项功能尤为重要。</li>
@@ -1153,7 +1152,7 @@
<colgroup><col width="25%" />
<col width="75%" />
</colgroup><tbody><tr>
- <th>缩写</th>
+ <th>缩写词</th>
<th>定义</th>
</tr>
<tr>
@@ -1177,7 +1176,7 @@
<td>没有分类</td>
</tr>
</tbody></table>
-<p><strong>4.“参考信息”列中的条目表示什么意思?<em></em></strong></p>
+<p><strong>4. “参考信息”列中的条目表示什么意思?<em></em></strong></p>
<p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em></p>
@@ -1209,7 +1208,7 @@
<td>Broadcom 参考编号</td>
</tr>
</tbody></table>
-<p id="asterisk"><strong>5.“参考信息”列中的“Android Bug ID”旁边的 <a href="#asterisk">*</a> 表示什么意思?<em></em></strong></p>
+<p id="asterisk"><strong>5. “参考信息”列中的“Android Bug ID”旁边的 <a href="#asterisk">*</a> 表示什么意思?<em></em></strong></p>
<p>如果“参考信息”列的“Android Bug ID”旁边标有 <a href="#asterisk">*</a>,则表示相应问题未公开发布。<em></em><a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中通常包含针对此问题的更新。</p>