Docs: Changes to source.android.com

  - 183705100 Move CVE-2017-13225 from the Android public bulletin to t... by Android Partner Docs <[email protected]>
  - 183689692 Fix references to patches, add direct links to them by Clay Murphy <[email protected]>
  - 183669179 Devsite localized content from translation request b3ea6a... by Android Partner Docs <[email protected]>
  - 183341488 Devsite localized content from translation request b89a83... by Android Partner Docs <[email protected]>
  - 183267044 Devsite localized content from translation request dc7035... by Android Partner Docs <[email protected]>
  - 183267033 Devsite localized content from translation request 3e98f2... by Android Partner Docs <[email protected]>
  - 183186837 Devsite localized content from translation request abc2ba... by Android Partner Docs <[email protected]>
  - 183119625 Devsite localized content from translation request 0e9220... by Android Partner Docs <[email protected]>
  - 183119585 Devsite localized content from translation request 8603a0... by Android Partner Docs <[email protected]>
  - 183119485 Devsite localized content from translation request d5f27b... by Android Partner Docs <[email protected]>
  - 182963525 Add DEX const-method-handle and const-method-type, update... by Clay Murphy <[email protected]>
  - 182894798 Update the DEX bytecode list by Android Partner Docs <[email protected]>
  - 182861804 Update for EMR builds. by Android Partner Docs <[email protected]>

PiperOrigin-RevId: 183705100
Change-Id: I5bc9a987212a5c1917cfb4561af644c226c08405
diff --git a/en/_index.yaml b/en/_index.yaml
index 00e5133..3f4fab6 100644
--- a/en/_index.yaml
+++ b/en/_index.yaml
@@ -73,6 +73,14 @@
       image_path: /images/android_stack.png
   - heading: News
     items:
+    - heading: ART DEX bytecode improvements
+      description: >
+        Android runtime (ART) now includes bytecode documentation for
+        <code>const-method-handle</code> and <code>const-method-type</code>, as
+        well as updates to <code>invoke-polymorphic</code>.
+      buttons:
+      - label: January 19th, 2018
+        path: /devices/tech/dalvik/dalvik-bytecode
     - heading: January Security Bulletins
       description: >
         The January 2018 Android and Pixel/Nexus Security Bulletins have been
@@ -87,13 +95,6 @@
       buttons:
       - label: December 5th, 2017
         path: /setup/site-updates#Dec-2017
-    - heading: HIDL Reference Updates
-      description: >
-        The reference materials for the HAL Interface Description Language
-        (HIDL) have been updated to reflect the Android 8.1 release.
-      buttons:
-      - label: December 5th. 2017
-        path: /reference/hidl/
   - classname: devsite-landing-row-100 tf-row-centered
     items:
     - buttons:
diff --git a/en/devices/tech/dalvik/dalvik-bytecode.html b/en/devices/tech/dalvik/dalvik-bytecode.html
index 5861452..8e18c0e 100644
--- a/en/devices/tech/dalvik/dalvik-bytecode.html
+++ b/en/devices/tech/dalvik/dalvik-bytecode.html
@@ -6,7 +6,7 @@
   </head>
   <body>
   <!--
-      Copyright 2017 The Android Open Source Project
+      Copyright 2018 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.
@@ -1021,24 +1021,25 @@
   <td>fa 45cc</td>
   <td>invoke-polymorphic {vC, vD, vE, vF, vG}, meth@BBBB, proto@HHHH</td>
   <td>
-    <code>A:</code> argument word count (4 bits) </br>
-    <code>B:</code> method reference index (16 bits) </br>
-    <code>C:</code> method handle reference to invoke (16 bits) </br>
-    <code>D..G:</code> argument registers (4 bits each) </br>
-    <code>H:</code> prototype reference index (16 bits) </br>
+    <code>A:</code> argument word count (4 bits) <br/>
+    <code>B:</code> method reference index (16 bits) <br/>
+    <code>C:</code> receiver (16 bits) <br/>
+    <code>D..G:</code> argument registers (4 bits each) <br/>
+    <code>H:</code> prototype reference index (16 bits)
   </td>
   <td>
-    Invoke the indicated method handle. The result (if any) may be stored
+    Invoke the indicated signature polymorphic method. The result (if any) may be stored
     with an appropriate <code>move-result*</code> variant as the immediately
     subsequent instruction.
-    <p> The method reference must be to <code>java.lang.invoke.MethodHandle.invoke</code>
-        or <code>java.lang.invoke.MethodHandle.invokeExact</code>.
+    <p> The method reference must be to a signature polymorphic method, such as
+      <code>java.lang.invoke.MethodHandle.invoke</code> or
+      <code>java.lang.invoke.MethodHandle.invokeExact</code>.
+    <p> The receiver must be an object supporting the signature polymorphic method being invoked.
     <p> The prototype reference describes the argument types provided
         and the expected return type.
     <p> The <code>invoke-polymorphic</code> bytecode may raise exceptions when it
         executes. The exceptions are described in the API documentation
-        for <code>java.lang.invoke.MethodHandle.invoke</code> and
-        <code>java.lang.invoke.MethodHandle.invokeExact</code>.
+        for the signature polymorphic method being invoked.
     <p> Present in Dex files from version <code>038</code> onwards.
   </td>
 </tr>
@@ -1046,10 +1047,10 @@
   <td>fb 4rcc</td>
   <td>invoke-polymorphic/range {vCCCC .. vNNNN}, meth@BBBB, proto@HHHH</td>
   <td>
-    <code>A:</code> argument word count (8 bits) </br>
-    <code>B:</code> method reference index (16 bits) </br>
-    <code>C:</code> method handle reference to invoke (16 bits) </br>
-    <code>H:</code> prototype reference index (16 bits) </br>
+    <code>A:</code> argument word count (8 bits) <br/>
+    <code>B:</code> method reference index (16 bits) <br/>
+    <code>C:</code> receiver (16 bits) <br/>
+    <code>H:</code> prototype reference index (16 bits) <br/>
     <code>N = A + C - 1</code>
   </td>
   <td>
@@ -1118,10 +1119,26 @@
   </td>
 </tr>
 <tr>
-  <td>fe..ff 10x</td>
-  <td><i>(unused)</i></td>
-  <td>&nbsp;</td>
-  <td><i>(unused)</i></td>
+  <td>fe 21c</td>
+  <td>const-method-handle vAA, method_handle@BBBB</td>
+  <td><code>A:</code> destination register (8 bits)<br/>
+    <code>B:</code> method handle index (16 bits)</td>
+  <td>
+    Move a reference to the method handle specified by the given index into the
+    specified register.
+    <p> Present in Dex files from version <code>039</code> onwards.
+  </td>
+</tr>
+<tr>
+  <td>ff 21c</td>
+  <td>const-method-type vAA, proto@BBBB</td>
+  <td><code>A:</code> destination register (8 bits)<br/>
+    <code>B:</code> method prototype reference (16 bits)</td>
+  <td>
+    Move a reference to the method prototype specified by the given index into the
+    specified register.
+    <p> Present in Dex files from version <code>039</code> onwards.
+  </td>
 </tr>
 </tbody>
 </table>
diff --git a/en/devices/tech/dalvik/instruction-formats.html b/en/devices/tech/dalvik/instruction-formats.html
index ab30d8a..746be50 100644
--- a/en/devices/tech/dalvik/instruction-formats.html
+++ b/en/devices/tech/dalvik/instruction-formats.html
@@ -6,7 +6,7 @@
   </head>
   <body>
   <!--
-      Copyright 2017 The Android Open Source Project
+      Copyright 2018 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.
@@ -291,10 +291,14 @@
   <td>21c</td>
   <td><i><code>op</code></i> vAA, type@BBBB<br/>
     <i><code>op</code></i> vAA, field@BBBB<br/>
+    <i><code>op</code></i> vAA, method_handle@BBBB<br/>
+    <i><code>op</code></i> vAA, proto@BBBB<br/>
     <i><code>op</code></i> vAA, string@BBBB
   </td>
   <td>check-cast<br/>
     const-class<br/>
+    const-method-handle<br/>
+    const-method-type<br/>
     const-string
   </td>
 </tr>
diff --git a/en/devices/tech/display/widgets-shortcuts.html b/en/devices/tech/display/widgets-shortcuts.html
index ac15238..9364e91 100644
--- a/en/devices/tech/display/widgets-shortcuts.html
+++ b/en/devices/tech/display/widgets-shortcuts.html
@@ -72,11 +72,11 @@
     (<code>packages/apps/Launcher3</code>) as reference.
     </p>
     <p>
-    Relevant Launcher3 changes:
+    Find the relevant Launcher3 changes in the Android Open Source Project (AOSP):
     </p>
     <ul>
-      <li>Change-Id: I664366822fe8088742faff2cce006239ab0771bc
-      <li>Change-Id: I905532ba44a8898c9c17476f9f75bc309eeb7b41
+      <li>Change-Id: <a href="https://android.googlesource.com/platform/packages/apps/Launcher3/+/8b2002e28072c52d78f6d052c6ff6da50a2d0324">8b2002e28072c52d78f6d052c6ff6da50a2d0324</a>
+      <li>Change-Id: <a href="https://android.googlesource.com/platform/packages/apps/Launcher3/+/278359539c02ca160caf1df54ce96053a2a2ef59">278359539c02ca160caf1df54ce96053a2a2ef59</a>
     </ul>
     <h2 id="validation">Validation</h2>
     <p>
@@ -86,5 +86,3 @@
     </p>
   </body>
 </html>
-
-
diff --git a/en/security/bulletin/2018-01-01.html b/en/security/bulletin/2018-01-01.html
index ee037f1..5ee8ee9 100644
--- a/en/security/bulletin/2018-01-01.html
+++ b/en/security/bulletin/2018-01-01.html
@@ -20,7 +20,7 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-<p><em>Published January 2, 2018 | Updated January 5, 2018</em></p>
+<p><em>Published January 2, 2018 | Updated January 29, 2018</em></p>
 
 <p>
 The Android Security Bulletin contains details of security vulnerabilities
@@ -492,35 +492,6 @@
 </table>
 
 
-<h3 id="mediatek-components">MediaTek components</h3>
-<p>The most severe vulnerability in this section could enable a local malicious
-application to execute arbitrary code within the context of a privileged
-process.</p>
-
-<table>
-  <col width="17%">
-  <col width="19%">
-  <col width="9%">
-  <col width="14%">
-  <col width="39%">
-  <tr>
-    <th>CVE</th>
-    <th>References</th>
-    <th>Type</th>
-    <th>Severity</th>
-    <th>Component</th>
-  </tr>
-  <tr>
-    <td>CVE-2017-13225</td>
-    <td>A-38308024<a href="#asterisk">*</a><br />
-        M-ALPS03495789</td>
-    <td>EoP</td>
-    <td>High</td>
-    <td>MTK Media</td>
-  </tr>
-</table>
-
-
 <h3 id="nvidia-components">NVIDIA components</h3>
 <p>The most severe vulnerability in this section could enable a local malicious
 application to execute arbitrary code within the context of a privileged
@@ -833,5 +804,10 @@
    <td>January 5, 2018</td>
    <td>Bulletin revised to include AOSP links.</td>
   </tr>
+  <tr>
+    <td>1.3</td>
+    <td>January 29, 2018</td>
+    <td>CVE-2017-13225 moved to <a href="/security/bulletin/pixel/">Pixel / Nexus
+      Security Bulletin</a>.</td>
 </table>
 </body></html>
diff --git a/en/security/bulletin/pixel/2018-01-01.html b/en/security/bulletin/pixel/2018-01-01.html
index 4c6dd4a..e956aba 100644
--- a/en/security/bulletin/pixel/2018-01-01.html
+++ b/en/security/bulletin/pixel/2018-01-01.html
@@ -20,7 +20,7 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-<p><em>Published January 2, 2018 | Updated January 5, 2018</em></p>
+<p><em>Published January 2, 2018 | Updated January 29, 2018</em></p>
 
 <p>
 The Pixel&hairsp;/&hairsp;Nexus Security Bulletin contains details of security
@@ -446,6 +446,29 @@
     <th>Component</th>
   </tr>
   <tr>
+    <td>CVE-2017-13225</td>
+    <td>A-38308024<a href="#asterisk">*</a><br />
+        M-ALPS03495789</td>
+    <td>EoP</td>
+    <td>High</td>
+    <td>MTK Media</td>
+  </tr>
+</table>
+
+<table>
+  <col width="17%">
+  <col width="19%">
+  <col width="9%">
+  <col width="14%">
+  <col width="39%">
+  <tr>
+    <th>CVE</th>
+    <th>References</th>
+    <th>Type</th>
+    <th>Severity</th>
+    <th>Component</th>
+  </tr>
+  <tr>
     <td>CVE-2017-13226</td>
     <td>A-32591194<a href="#asterisk">*</a><br />
         M-ALPS03149184</td>
@@ -788,6 +811,11 @@
    <td>January 5, 2018</td>
    <td>Bulletin revised to include AOSP links.</td>
   </tr>
+  <tr>
+   <td>1.2</td>
+   <td>January 29, 2018</td>
+   <td>Added CVE-2017-13225.</td>
+  </tr>
 </table>
 </body></html>
 
diff --git a/en/setup/build-numbers.html b/en/setup/build-numbers.html
index 5f2d08c..2054199 100644
--- a/en/setup/build-numbers.html
+++ b/en/setup/build-numbers.html
@@ -213,6 +213,18 @@
   </thead>
   <tbody>
     <tr>
+      <td>OPM5.171019.014</td>
+      <td>android-8.1.0_r9</td>
+      <td>Oreo</td>
+      <td>Nexus 5X, Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>OPM2.171019.016</td>
+      <td>android-8.1.0_r8</td>
+      <td>Oreo</td>
+      <td>Pixel 2</td>
+    </tr>
+    <tr>
       <td>OPM3.171019.013</td>
       <td>android-8.1.0_r7</td>
       <td>Oreo</td>
diff --git a/zh-cn/devices/accessories/headset/jack-headset-spec.html b/zh-cn/devices/accessories/headset/jack-headset-spec.html
index 508887f..39164a5 100644
--- a/zh-cn/devices/accessories/headset/jack-headset-spec.html
+++ b/zh-cn/devices/accessories/headset/jack-headset-spec.html
@@ -55,7 +55,7 @@
     <td>功能 A 控件事件</td>
     <td>必需</td>
     <td>输入事件:<code>KEY_MEDIA</code>
-<p>Android 按键:<code>KEYCODE_HEADSETHOOK<code></code></code></p></td>
+<p>Android 按键:<code>KEYCODE_MEDIA_PLAY_PAUSE<code></code></code></p></td>
  </tr>
  <tr>
     <td>功能 D 控件事件</td>
diff --git a/zh-cn/devices/accessories/headset/usb-headset-spec.html b/zh-cn/devices/accessories/headset/usb-headset-spec.html
index 44e357f..3fee17e 100644
--- a/zh-cn/devices/accessories/headset/usb-headset-spec.html
+++ b/zh-cn/devices/accessories/headset/usb-headset-spec.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>USB 耳机:配件规格</title>
+    <title>USB 耳机:配件规范</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
@@ -23,7 +23,7 @@
 <p>
 本文档详细说明了 USB 耳机上各个按钮的行为,以使其在整个 Android 生态系统中保持一致。设备制造商还应参考 <a href="/devices/audio/usb.html">USB 数字音频</a>页面,以了解有关在 Android 设备上实现 USB 的更多信息;以及参考 <a href="http://source.android.com/compatibility/android-cdd.html">Android 兼容性定义文档 (CDD)</a>,以了解与 Android 设备相关的要求。
 </p>
-<p>此外,本文档还介绍了面向配件制造商的 <a href="plug-headset-spec.html">3.5 毫米耳机</a>规格和面向设备制造商的 <a href="jack-headset-spec.html">3.5 毫米耳机插孔</a>规格。
+<p>此外,本文档还介绍了 <a href="plug-headset-spec.html">3.5 毫米耳机</a>规范(适用于配件制造商)和 <a href="jack-headset-spec.html">3.5 毫米耳机插孔</a>规范(适用于设备制造商)。
 </p>
 <p>
 本文档给出的是最低要求,我们鼓励配件制造商在满足这些要求的基础上添加新的功能。
@@ -31,7 +31,7 @@
 <h2 id="control-function-mapping">控件-功能映射</h2>
 <table>
   <tbody><tr>
-   <th>控件功能</th>
+   <th>控制功能</th>
    <th>配件支持</th>
    <th>说明</th>
   </tr>
@@ -97,7 +97,7 @@
   <tr>
    <td><strong>输入</strong>:长按<br />
        <strong>输出</strong>:启动语音命令<br />
-       <strong>发送</strong>:<code>android.intent.action.VOICE_SEARCH_HANDS_FREE</code></td>
+       <strong>发送</strong>:<code>android.speech.action.VOICE_SEARCH_HANDS_FREE</code>(如果设备被锁定或其屏幕已关闭)。否则发送 <code>android.speech.RecognizerIntent.ACTION_WEB_SEARCH</code></td>
   </tr>
   <tr>
    <td rowspan="2">来电</td>
diff --git a/zh-cn/devices/architecture/hidl/fmq.html b/zh-cn/devices/architecture/hidl/fmq.html
index c5fb1fd..05372de 100644
--- a/zh-cn/devices/architecture/hidl/fmq.html
+++ b/zh-cn/devices/architecture/hidl/fmq.html
@@ -27,7 +27,7 @@
 <p class="caution">仅 C++ 支持快速消息队列。</p>
 
 <h2 id="flavors">MessageQueue 类型</h2>
-<p>Android 支持两种队列类型:</p>
+<p>Android 支持两种队列类型(称为“风格”<em></em>):</p>
 <ul>
 <li>未同步队列:可以溢出,并且可以有多个读取器;每个读取器都必须及时读取数据,否则数据将会丢失。<em></em>
 </li><li>已同步队列:不能溢出,并且只能有一个读取器。<em></em></li>
@@ -83,13 +83,13 @@
 </ul>
 
 <h3 id="second-object">创建第二个 MessageQueue 对象</h3>
-<p>使用从消息队列的第一侧获取的 <code>MQDescriptor</code> 对象创建消息队列的第二侧。通过 HIDL RPC 调用将 <code>MQDescriptor</code> 对象发送到将容纳消息队列末端的进程。<code>MQDescriptor</code> 包含该队列的相关信息:</p>
+<p>使用从消息队列的第一侧获取的 <code>MQDescriptor</code> 对象创建消息队列的第二侧。通过 HIDL RPC 调用将 <code>MQDescriptor</code> 对象发送到将容纳消息队列末端的进程。<code>MQDescriptor</code> 包含该队列的相关信息,其中包括:</p>
 
 <ul>
 <li>用于映射缓冲区和写入指针的信息。</li>
-<li>(如果队列已同步)用于映射读取指针的信息。</li>
-<li>(如果队列是阻塞队列)用于映射事件标记字词的信息。</li>
-<li>对象类型被制作成一个具有 HIDL 定义的队列元素类型和风格(已同步或未同步)的模板。</li>
+<li>用于映射读取指针的信息(如果队列已同步)。</li>
+<li>用于映射事件标记字词的信息(如果队列是阻塞队列)。</li>
+<li>对象类型 (<code>&lt;T, flavor&gt;</code>),其中包含 <a href="/devices/architecture/hidl-cpp/types.html">HIDL 定义的队列元素类型</a>和队列风格(已同步或未同步)。</li>
 </ul>
 
 <p><code>MQDescriptor</code> 对象可用于构建 <code>MessageQueue</code> 对象:</p>
@@ -98,13 +98,19 @@
 MessageQueue&lt;T, flavor&gt;::MessageQueue(const MQDescriptor&lt;T, flavor&gt;&amp; Desc, bool resetPointers)
 </pre>
 
-<p><code>resetPointers</code> 参数表示是否在创建此 <code>MessageQueue</code> 对象时将读取和写入位置重置为 0。在未同步队列中,读取位置(在未同步队列中,是每个 <code>MessageQueue</code> 对象的本地位置)在此对象创建过程中始终设为 0。通常,<code>MQDescriptor</code> 是在创建第一个消息队列对象过程中初始化的。要对共享内存进行额外的控制,您可以手动设置 <code>MQDescriptor</code>(<code>MQDescriptor</code> 是在 <a href="https://android.googlesource.com/platform/system/libhidl/+/master/base/include/hidl/MQDescriptor.h" class="external"><code>system/libhidl/base/include/hidl/MQDescriptor.h</code></a> 中定义的),然后按照本部分所述创建每个 <code>MessageQueue</code> 对象。
+<p><code>resetPointers</code> 参数表示是否在创建此 <code>MessageQueue</code> 对象时将读取和写入位置重置为 0。在未同步队列中,读取位置(在未同步队列中,是每个 <code>MessageQueue</code> 对象的本地位置)在此对象创建过程中始终设为 0。通常,<code>MQDescriptor</code> 是在创建第一个消息队列对象过程中初始化的。要对共享内存进行额外的控制,您可以手动设置 <code>MQDescriptor</code>(<code>MQDescriptor</code> 是在 <a href="https://android.googlesource.com/platform/system/libhidl/+/master/base/include/hidl/MQDescriptor.h" class="external"><code>system/libhidl/base/include/hidl/MQDescriptor.h</code></a> 中定义的),然后按照本部分所述内容创建每个 <code>MessageQueue</code> 对象。
 </p>
 
 <h3 id="blocking">阻塞队列和事件标记</h3>
 <p>默认情况下,队列不支持阻塞读取/写入。有两种类型的阻塞读取/写入调用:</p>
 <ul>
-<li>短格式:有三个参数(数据指针、项数、超时)。<em></em>支持阻塞针对单个队列的各个读取/写入操作。在使用这种格式时,队列将在内部处理事件标记和位掩码,并且第一个消息队列对象必须初始化为第二个参数为 <code>true</code>。</li>
+<li>短格式:有三个参数(数据指针、项数、超时)。<em></em>支持阻塞针对单个队列的各个读取/写入操作。在使用这种格式时,队列将在内部处理事件标记和位掩码,并且<a href="#first-object">第一个消息队列对象</a>必须初始化为第二个参数为 <code>true</code>。例如:<pre>
+// For an unsynchronized FMQ that supports blocking
+mFmqUnsynchronizedBlocking =
+  new (std::nothrow) MessageQueue&lt;uint16_t, kUnsynchronizedWrite&gt;
+      (kNumElementsInQueue, true /* enable blocking operations */);
+<pre>
+</pre></pre></li>
 <li>长格式:有六个参数(包括事件标记和位掩码)。<em></em>支持在多个队列之间使用共享 <code>EventFlag</code> 对象,并允许指定要使用的通知位掩码。在这种情况下,必须为每个读取和写入调用提供事件标记和位掩码。</li>
 </ul>
 
@@ -166,11 +172,11 @@
 
 <p><code>readBlocking()</code> 会等待 <code>writeNotification</code> 位;如果该参数为 0,则调用一定会失败。如果 <code>readNotification</code> 值为 0,则调用不会失败,但成功的读取操作将不会设置任何通知位。在已同步队列中,这意味着相应的 <code>writeBlocking()</code> 调用一定不会唤醒,除非已在其他位置对相应的位进行设置。在未同步队列中,<code>writeBlocking()</code> 将不会等待(它应仍用于设置写入通知位),而且对于读取操作来说,不适合设置任何通知位。同样,如果 <code>readNotification</code> 为 0,<code>writeblocking()</code> 将会失败,并且成功的写入操作会设置指定的 <code>writeNotification</code> 位。</p>
 
-<p>要一次等待多个队列,请使用 <code>EventFlag</code> 对象的 <code>wait()</code> 方法来等待通知的位掩码。<code>wait()</code> 方法会返回一个状态字词以及导致系统设置唤醒的位。然后,用户可以使用该信息检查相应的队列,看看是否有足够的空间或数据来完成所需的写入或读取操作,并执行非阻塞 <code>read()</code>/<code>write()</code>。接下来,如果要收到操作后通知,可以再次调用 <code>EventFlag</code> 的 <code>wake()</code> 方法。有关 <code>EventFlag</code> 抽象的定义,请参阅 <a href="https://android.googlesource.com/platform/system/libfmq/+/master/include/fmq/EventFlag.h" class="external"><code>system/libfmq/include/fmq/EventFlag.h</code></a>。
+<p>要一次等待多个队列,请使用 <code>EventFlag</code> 对象的 <code>wait()</code> 方法来等待通知的位掩码。<code>wait()</code> 方法会返回一个状态字词以及导致系统设置唤醒的位。然后,该信息可用于验证相应的队列是否有足够的控件或数据来完成所需的写入/读取操作,并执行非阻塞 <code>write()</code>/<code>read()</code>。要获取操作后通知,请再次调用 <code>EventFlag</code> 的 <code>wake()</code> 方法。有关 <code>EventFlag</code> 抽象的定义,请参阅 <a href="https://android.googlesource.com/platform/system/libfmq/+/master/include/fmq/EventFlag.h" class="external"><code>system/libfmq/include/fmq/EventFlag.h</code></a>。
 </p>
 
 <h2 id="zero">零复制操作</h2>
-<p><code>read</code>/<code>write</code>/<code>readBlocking</code>/<code>writeBlocking()</code> API 会将指向输入/输出缓冲区的指针作为参数,并在内部使用 <code>memcpy()</code> 调用,以便在相应缓冲区和 FMQ 环形缓冲区之间复制数据。为了提高性能,Android O 包含一组 API,这些 API 可提供对环形缓冲区的直接指针访问,这样便无需使用 <code>memcpy</code> 调用。</p>
+<p><code>read</code>/<code>write</code>/<code>readBlocking</code>/<code>writeBlocking()</code> API 会将指向输入/输出缓冲区的指针作为参数,并在内部使用 <code>memcpy()</code> 调用,以便在相应缓冲区和 FMQ 环形缓冲区之间复制数据。为了提高性能,Android 8.0 及更高版本包含一组 API,这些 API 可提供对环形缓冲区的直接指针访问,这样便无需使用 <code>memcpy</code> 调用。</p>
 
 <p>使用以下公共 API 执行零复制 FMQ 操作:</p>
 
@@ -185,7 +191,7 @@
 <ul>
 <li><code>beginWrite</code> 方法负责提供用于访问 FMQ 环形缓冲区的基址指针。在数据写入之后,使用 <code>commitWrite()</code> 提交数据。<code>beginRead</code>/<code>commitRead</code> 方法的运作方式与之相同。</li>
 <li><code>beginRead</code>/<code>Write</code> 方法会将要读取/写入的消息条数视为输入,并会返回一个布尔值来指示是否可以执行读取/写入操作。如果可以执行读取或写入操作,则 <code>memTx</code> 结构体中会填入基址指针,这些指针可用于对环形缓冲区共享内存进行直接指针访问。</li>
-<li><code>MemRegion</code> 结构体包含有关内存块的详细信息,其中包括基址指针(内存块的基址)和以 <code>T</code> 表示的长度(以 HIDL 定义的消息队列类型表示的内存块长度)。</li>
+<li><code>MemRegion</code> 结构体包含有关内存块的详细信息,其中包括基础指针(内存块的基址)和以 <code>T</code> 表示的长度(以 HIDL 定义的消息队列类型表示的内存块长度)。</li>
 <li><code>MemTransaction</code> 结构体包含两个 <code>MemRegion</code> 结构体(<code>first</code> 和 <code>second</code>),因为对环形缓冲区执行读取或写入操作时可能需要绕回到队列开头。这意味着,要对 FMQ 环形缓冲区执行数据读取/写入操作,需要两个基址指针。</li>
 </ul>
 
diff --git a/zh-cn/devices/audio/latency.html b/zh-cn/devices/audio/latency.html
index 2296cf3..cc370b0 100644
--- a/zh-cn/devices/audio/latency.html
+++ b/zh-cn/devices/audio/latency.html
@@ -32,7 +32,7 @@
 </tr>
 <tr>
   <td>为确保 Android 兼容性的音频延迟说明</td>
-  <td><a href="/compatibility/android-cdd.pdf">Android CDD</a><br /><em>第 5.5 节:音频延迟</em></td>
+  <td><a href="/compatibility/android-cdd#5_6_audio_latency">Android CDD</a><br /><em>第 5.6 节:音频延迟</em></td>
 </tr>
 <tr>
   <td>音频延迟的常见原因</td>
diff --git a/zh-cn/devices/automotive/ivi_connectivity.html b/zh-cn/devices/automotive/ivi_connectivity.html
new file mode 100644
index 0000000..1d45eec
--- /dev/null
+++ b/zh-cn/devices/automotive/ivi_connectivity.html
@@ -0,0 +1,197 @@
+<html devsite><head>
+    <title>IVI 连接</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>
+将设备连接到车载信息娱乐系统 (IVI) 时,Android 8.0 将带来更顺畅的蓝牙用户体验。IVI 会监听事件(例如解锁车门或启动发动机),并且会自动搜索检测范围内的蓝牙设备。它还将同时连接到单独的设备,以便用户可以在任何设备上进行免提通话。
+    </p>
+
+    <h2 id="bluetooth-connection-management">蓝牙连接管理</h2>
+
+      <p>
+在 Android 7.x 及更低版本中,仅当蓝牙适配器已接通电源时,IVI 蓝牙堆栈才会搜索设备。当 IVI 蓝牙处于开启状态时,如果用户的设备进入检测范围,他们必须手动连接才能连接到其设备。使用 Android 8.0,用户将无需再通过 IVI 设置应用手动连接设备。
+      </p>
+
+      <p>
+当蓝牙适配器处于开启状态且未连接到设备时,可自定义的触发事件(例如解锁车门或启动发动机)会导致 IVI 蓝牙搜索检测范围内的设备,以便与可用配置文件配对。然后,IVI 蓝牙会根据优先级列表来确定要连接到哪台设备。
+      </p>
+
+      <p>
+除了触发事件,您还可以针对每个配置文件指定设备优先级。在默认实现中,IVI 蓝牙会优先考虑最近连接过的设备。对于每项蓝牙服务,都有一个单独的优先级列表,以便每个服务配置文件可以分别连接到不同的设备。此外,每个蓝牙服务配置文件都有不同的连接限制。
+      </p>
+
+      <table>
+        <tbody><tr>
+         <th>服务</th>
+         <th>配置文件</th>
+         <th>连接限制</th>
+        </tr>
+        <tr>
+         <td rowspan="2">电话</td>
+         <td>HFP</td>
+         <td>2</td>
+        </tr>
+        <tr>
+         <td>PBAP</td>
+         <td>2</td>
+        </tr>
+        <tr>
+         <td>短信</td>
+         <td>MAP</td>
+         <td>1</td>
+        </tr>
+        <tr>
+         <td>音频</td>
+         <td>A2DP</td>
+         <td>1</td>
+        </tr>
+      </tbody></table>
+
+      <h3 id="implement-connection-management">实现连接管理</h3>
+
+        <p>
+为了在 Android 8.0 中支持自动连接,蓝牙连接管理逻辑从蓝牙服务移到了汽车服务内的政策中。在政策中,您可以自定义蓝牙自动连接功能应在何时搜索新设备,以及应该先尝试连接哪些设备。
+        </p>
+
+        <p>
+您可以在以下位置找到默认连接政策:<code><a href="https://android.googlesource.com/platform/packages/services/Car/+/oreo-r6-release/service/src/com/android/car/BluetoothDeviceConnectionPolicy.java">
+          service/src/com/android/car/BluetoothDeviceConnectionPolicy.java</a></code>。要使用自定义电话政策,请将 <code>enable_phone_policy</code> 设为 <code>false</code>,以停用 <code><a href="https://android.googlesource.com/platform/packages/apps/Bluetooth/+/master/res/values/config.xml">
+          res/values/config.xml</a></code> 中的默认电话政策。
+        </p>
+
+        <p>
+要创建触发事件,请将监听器注册到相应的汽车服务。新传感器事件示例:
+</p>
+
+<pre class="prettyprint">
+  /**
+  * Handles events coming in from the {@link CarSensorService}
+  * Upon receiving the event that is of interest, initiate a connection attempt by
+  * calling the policy {@link BluetoothDeviceConnectionPolicy}
+  */
+  private class CarSensorEventListener extends ICarSensorEventListener.Stub {
+    @Override
+    public void onSensorChanged(List&lt;CarSensorEvent&gt; events) throws RemoteException {
+      if (events != null &amp; !events.isEmpty()) {
+        CarSensorEvent event = events.get(0);
+        if (event.sensorType == CarSensorManager.SOME_NEW_SENSOR_EVENT) {
+          initiateConnection();
+        }
+      ...
+  }
+</pre>
+
+        <p>
+要针对每个配置文件配置设备优先级,请在 <code><a href="https://android.googlesource.com/platform/packages/services/Car/+/oreo-r6-release/service/src/com/android/car/BluetoothDeviceConnectionPolicy.java">
+          BluetoothDeviceConnectionPolicy</a></code> 中修改以下方法:
+        </p>
+
+        <ul>
+          <li><code>updateDeviceConnectionStatus()</code></li>
+          <li><code>findDeviceToConnect()</code></li>
+        </ul>
+
+      <h3 id="verify-connection-management">验证连接管理</h3>
+
+        <p>
+通过在 Android Automotive IVI 上开启/关闭蓝牙来验证蓝牙连接管理功能的行为,看看它是否能够自动连接到适当的设备。
+        </p>
+
+        <p>
+您可以使用以下 <code>adb</code> 命令通过模拟的车辆事件来测试您的 IVI:
+        </p>
+
+        <ul>
+          <li>对于 <code>CarCabinManager.ID_DOOR_LOCK</code>:
+            <pre class="devsite-terminal devsite-click-to-copy">adb shell dumpsys activity service com.android.car inject-event zoned-boolean 0x16200b02 1 false</pre>
+          </li>
+          <li>对于 <code>CarSensorManager.SENSOR_TYPE_IGNITION_STATE</code>:
+            <pre class="devsite-terminal devsite-click-to-copy">adb shell dumpsys activity service com.android.car inject-event global-integer 0x11400409 5</pre>
+          </li>
+        </ul>
+
+    <h2 id="bluetooth-multi-device-connectivity">蓝牙多设备连接</h2>
+
+      <p>
+在 Android 8.0 中,IVI 可以支持通过蓝牙同时连接多台设备。通过多设备蓝牙电话服务,用户可以连接单独的设备(例如个人电话和工作电话),并使用任一设备进行免提通话。该功能有助于减少干扰,提升驾驶安全性;而且可以充分利用汽车音频系统,提升通话体验。
+      </p>
+
+      <h3 id="multi-device-connectivity">多设备连接</h3>
+
+        <p>
+当触发事件发生时,<a href="https://android.googlesource.com/platform/packages/services/Car/+/oreo-r6-release/service/src/com/android/car/BluetoothDeviceConnectionPolicy.java">蓝牙连接管理政策</a>会确定在每个蓝牙配置文件上连接哪些设备。然后,该政策会将连接 intent 发送到配置文件客户端服务。接下来,配置文件客户端服务会创建客户端状态机实例来管理与每台设备的连接。
+        </p>
+
+        <h4 id="hands-free-profile">免提模式配置文件</h4>
+
+          <p>
+Android 8.0 中的蓝牙免提模式配置文件 (HFP) 允许两台设备并发连接,并且其中每台设备都可以拨打或接听电话。为了做到这一点,每个连接都会向电信管理器注册一个单独的电话帐号,而电信管理器会将这些电话帐号告知 IVI 应用。
+          </p>
+
+          <p>
+当用户从设备拨打或接听电话时,相应的电话帐号会创建一个 <code>HfpClientConnection</code> 对象。拨号器应用会与 <code>HfpClientConnection</code> 对象进行交互以管理通话功能,例如接听电话或挂断。不过,拨号器应用不会指出来电来自哪台设备。在用户拨打电话时,应用将使用上次连接的设备。制造商可以通过自定义拨号器应用来更改此行为。
+          </p>
+
+        <h4 id="phone-book-access-profile">电话簿访问配置文件</h4>
+
+          <p>
+蓝牙电话簿访问配置文件 (PBAP) 会从所有已连接的设备下载联系人信息。PBAP 会维护一个可搜索的联系人信息汇总列表,该列表由 PBAP 客户端状态机进行更新。由于每台设备都是与单独的 PBAP 客户端状态机交互,因此在用户拨打电话时,联系人会与适当的设备相关联。当 PBAP 客户端断开连接时,内部数据库会移除与该电话关联的所有联系人信息。
+          </p>
+
+        <h3 id="implement-multi-device-hfp">实现多设备 HFP</h3>
+
+          <p>
+利用默认的 Android 蓝牙堆栈,IVI 能够自动连接到 HFP 上的多台设备。<code><a href="https://android.googlesource.com/platform/packages/apps/Bluetooth/+/master/src/com/android/bluetooth/hfpclient/HeadsetClientService.java">
+            HeadsetClientService</a></code> 中的 <code>MAX_STATE_MACHINES_POSSIBLE</code> 指定了可以同时进行的 HFP 连接的最大数量。
+          </p>
+
+          <aside class="note"><strong>注意</strong>:对于 HFP 同步连接导向型 (SCO) 连接和电话音频路由,需要在应用 Binder 中使用 <code><a href="https://android.googlesource.com/platform/system/bt/+/master/binder/android/bluetooth/IBluetoothHeadsetClient.aidl">
+            connectAudio</a></code> 手动进行。
+          </aside>
+
+          <p>
+实现多设备 HFP 时,应自定义拨号器应用界面,以便用户在拨打电话时选择使用哪个设备帐号。这样,应用便可以使用正确的帐号来调用 <code>telecomManager.placeCall</code>。
+          </p>
+
+      <h3 id="verify-multi-device-hfp">验证多设备 HFP</h3>
+
+        <p>
+要通过蓝牙检查多设备连接是否能够正常工作,请执行以下操作:
+        </p>
+
+        <ol>
+          <li>通过蓝牙将设备连接到 IVI 并从设备流式传输音频。</li>
+          <li>通过蓝牙将两部手机连接到 IVI。</li>
+          <li>选择一部手机。直接从该手机拨打电话,然后使用 IVI 拨打电话。<ol>
+              <li>在两次呼叫中,验证流式传输的音频是否会暂停,以及电话音频是否能够通过连接 IVI 的音响系统播放。</li>
+            </ol>
+          </li>
+          <li>直接在前面使用的手机上接听来电,然后使用 IVI 接听来电。<ol>
+              <li>在两次接听来电中,验证流式传输的音频是否会暂停,以及电话音频是否能够通过连接 IVI 的音响系统播放。</li>
+            </ol>
+          </li>
+          <li>使用连接的其他手机重复第 3 步和第 4 步。</li>
+        </ol>
+
+        <aside class="note"><strong>注意</strong>:蓝牙 PBAP 配置文件(例如 MAP 配置文件)是单向的。要在这些配置文件上连接设备,需要从 IVI(而不是源设备)将连接实例化。
+        </aside>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/bluetooth/ble_advertising.html b/zh-cn/devices/bluetooth/ble_advertising.html
new file mode 100644
index 0000000..a468968
--- /dev/null
+++ b/zh-cn/devices/bluetooth/ble_advertising.html
@@ -0,0 +1,222 @@
+<html devsite><head>
+    <title>蓝牙低功耗公告功能</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>
+蓝牙低功耗 (BLE) 大部分时间处于睡眠模式,以节省电量。它只会在进行公告和进行短促连接时唤醒,因此这些公告会影响电量消耗和数据传输带宽。
+    </p>
+
+    <h2 id="bluetooth-5-advertising-extension">蓝牙 5 公告功能扩展</h2>
+
+    <p>Android 8.0 支持蓝牙 5,该版本针对 BLE 对广播功能进行了改进,并提供了灵活的数据公告功能。蓝牙 5 支持 BLE 物理层 (PHY),PHY 不仅保留了蓝牙 4.2 的耗电量少这一优点,还允许用户选择更大的带宽或范围。如需更多信息,请参阅<a href="https://www.bluetooth.com/specifications/adopted-specifications">蓝牙 5 核心规格</a>。
+    </p>
+
+      <h3 id="implementation">实现</h3>
+
+        <p>
+蓝牙 5 的新功能可自动适用于运行 Android 8.0 且具有兼容蓝牙控制器的设备。您可以使用这些 <code><a href="https://developer.android.com/reference/android/bluetooth/BluetoothAdapter.html">
+            BluetoothAdapter</a></code> 方法来检查设备是否支持蓝牙 5 的功能:
+        </p>
+
+        <ul>
+          <li><code>isLe2MPhySupported()</code></li>
+          <li><code>isLeCodedPhySupported()</code></li>
+          <li><code>isLeExtendedAdvertisingSupported()</code></li>
+          <li><code>isLePeriodicAdvertisingSupported()</code></li>
+        </ul>
+
+        <p>
+要停用公告功能,请联系蓝牙芯片供应商来停用芯片组支持。
+        </p>
+
+        <p>
+蓝牙 PHY 是互斥的,并且每个 PHY 的行为均由蓝牙 SIG 预先定义。默认情况下,Android 8.0 使用蓝牙 4.2 的蓝牙 LE 1M PHY。<code><a href="https://developer.android.com/reference/android/bluetooth/le/package-summary.html">
+            android.bluetooth.le</a></code> 程序包通过以下 API 提供蓝牙 5 的公告功能:
+        </p>
+
+        <ul>
+          <li><code>AdvertisingSet</code></li>
+          <li><code>AdvertisingSetCallback</code></li>
+          <li><code>AdvertisingSetParameters</code></li>
+          <li><code>PeriodicAdvertisingParameters</code></li>
+        </ul>
+
+        <p>
+通过使用 <code><a href="https://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html">
+          android.bluetooth.le.BluetoothLeAdvertiser</a></code> 中的 <code><a href="https://developer.android.com/reference/android/bluetooth/le/BluetoothLeAdvertiser.html#startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters,
+          android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData,
+          android.bluetooth.le.PeriodicAdvertisingParameters,
+          android.bluetooth.le.AdvertiseData,
+          android.bluetooth.le.AdvertisingSetCallback)">
+          startAdvertisingSet()</a></code> 方法,可以创建 <code><a href="https://developer.android.com/reference/android/bluetooth/le/AdvertisingSet.html">
+          AdvertisingSet</a></code> 来修改蓝牙公告设置。即使对蓝牙 5 或其公告功能的支持被停用,API 功能也可以应用于 LE 1M PHY。
+        </p>
+
+        <h4 id="examples">示例</h4>
+
+          <p>
+该示例应用使用蓝牙 LE 1M PHY 进行公告:
+          </p>
+
+<pre class="prettyprint">
+  // Start legacy advertising. Works for devices with 5.x controllers,
+  and devices that support multi-advertising.
+
+  void example1() {
+   BluetoothLeAdvertiser advertiser =
+      BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
+
+   AdvertisingSetParameters parameters = (new AdvertisingSetParameters.Builder())
+           .setLegacyMode(true) // True by default, but set here as a reminder.
+           .setConnectable(true)
+           .setInterval(AdvertisingSetParameters.INTERVAL_HIGH)
+           .setTxPowerLevel(AdvertisingSetParameters.TX_POWER_MEDIUM)
+           .build();
+
+   AdvertiseData data = (new AdvertiseData.Builder()).setIncludeDeviceName(true).build();
+
+   AdvertisingSetCallback callback = new AdvertisingSetCallback() {
+       @Override
+       public void onAdvertisingSetStarted(AdvertisingSet advertisingSet, int txPower, int status) {
+           Log.i(LOG_TAG, "onAdvertisingSetStarted(): txPower:" + txPower + " , status: "
+             + status);
+           currentAdvertisingSet = advertisingSet;
+       }
+
+       @Override
+       public void onAdvertisingDataSet(AdvertisingSet advertisingSet, int status) {
+           Log.i(LOG_TAG, "onAdvertisingDataSet() :status:" + status);
+       }
+
+       @Override
+       public void onScanResponseDataSet(AdvertisingSet advertisingSet, int status) {
+           Log.i(LOG_TAG, "onScanResponseDataSet(): status:" + status);
+       }
+
+       @Override
+       public void onAdvertisingSetStopped(AdvertisingSet advertisingSet) {
+           Log.i(LOG_TAG, "onAdvertisingSetStopped():");
+       }
+   };
+
+   advertiser.startAdvertisingSet(parameters, data, null, null, null, callback);
+
+   // After onAdvertisingSetStarted callback is called, you can modify the
+   // advertising data and scan response data:
+   currentAdvertisingSet.setAdvertisingData(new AdvertiseData.Builder().
+     setIncludeDeviceName(true).setIncludeTxPowerLevel(true).build());
+   // Wait for onAdvertisingDataSet callback...
+   currentAdvertisingSet.setScanResponseData(new
+     AdvertiseData.Builder().addServiceUuid(new ParcelUuid(UUID.randomUUID())).build());
+   // Wait for onScanResponseDataSet callback...
+
+   // When done with the advertising:
+   advertiser.stopAdvertisingSet(callback);
+}</pre>
+
+        <p>
+该示例应用使用 BLE 2M PHY 进行公告。该应用会首先检查设备是否支持要使用的功能。如果设备支持公告功能,该应用会将 BLE 2M PHY 配置为主 PHY。当 2M PHY 处于活动状态时,公告功能不支持蓝牙 4.x 控制器,因此 <code>setLegacyMode</code> 会被设为 <code>false</code>。该示例可在进行公告时修改参数,也可暂停公告。
+        </p>
+
+<pre class="prettyprint">void example2() {
+   BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+   BluetoothLeAdvertiser advertiser =
+     BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();
+
+   // Check if all features are supported
+   if (!adapter.isLe2MPhySupported()) {
+       Log.e(LOG_TAG, "2M PHY not supported!");
+       return;
+   }
+   if (!adapter.isLeExtendedAdvertisingSupported()) {
+       Log.e(LOG_TAG, "LE Extended Advertising not supported!");
+       return;
+   }
+
+   int maxDataLength = adapter.getLeMaximumAdvertisingDataLength();
+
+   AdvertisingSetParameters.Builder parameters = (new AdvertisingSetParameters.Builder())
+           .setLegacyMode(false)
+           .setInterval(AdvertisingSetParameters.INTERVAL_HIGH)
+           .setTxPowerLevel(AdvertisingSetParameters.TX_POWER_MEDIUM)
+           .setPrimaryPhy(BluetoothDevice.PHY_LE_2M)
+           .setSecondaryPhy(BluetoothDevice.PHY_LE_2M);
+
+   AdvertiseData data = (new AdvertiseData.Builder()).addServiceData(new
+     ParcelUuid(UUID.randomUUID()),
+           "You should be able to fit large amounts of data up to maxDataLength. This goes
+           up to 1650 bytes. For legacy advertising this would not
+           work".getBytes()).build();
+
+   AdvertisingSetCallback callback = new AdvertisingSetCallback() {
+       @Override
+       public void onAdvertisingSetStarted(AdvertisingSet advertisingSet, int txPower, int status) {
+           Log.i(LOG_TAG, "onAdvertisingSetStarted(): txPower:" + txPower + " , status: "
+            + status);
+           currentAdvertisingSet = advertisingSet;
+       }
+
+       @Override
+       public void onAdvertisingSetStopped(AdvertisingSet advertisingSet) {
+           Log.i(LOG_TAG, "onAdvertisingSetStopped():");
+       }
+   };
+
+   advertiser.startAdvertisingSet(parameters.build(), data, null, null, null, callback);
+
+   // After the set starts, you can modify the data and parameters of currentAdvertisingSet.
+   currentAdvertisingSet.setAdvertisingData((new
+     AdvertiseData.Builder()).addServiceData(new ParcelUuid(UUID.randomUUID()),
+           "Without disabling the advertiser first, you can set the data, if new data is
+            less than 251 bytes long.".getBytes()).build());
+
+   // Wait for onAdvertisingDataSet callback...
+
+   // Can also stop and restart the advertising
+   currentAdvertisingSet.enableAdvertising(false, 0, 0);
+   // Wait for onAdvertisingEnabled callback...
+   currentAdvertisingSet.enableAdvertising(true, 0, 0);
+   // Wait for onAdvertisingEnabled callback...
+
+   // Or modify the parameters - i.e. lower the tx power
+   currentAdvertisingSet.enableAdvertising(false, 0, 0);
+   // Wait for onAdvertisingEnabled callback...
+   currentAdvertisingSet.setAdvertisingParameters(parameters.setTxPowerLevel
+     (AdvertisingSetParameters.TX_POWER_LOW).build());
+   // Wait for onAdvertisingParametersUpdated callback...
+   currentAdvertisingSet.enableAdvertising(true, 0, 0);
+   // Wait for onAdvertisingEnabled callback...
+
+   // When done with the advertising:
+   advertiser.stopAdvertisingSet(callback);
+}</pre>
+
+      <h3 id="verification">验证</h3>
+
+        <p>运行适用的<a href="https://www.bluetooth.com/develop-with-bluetooth/test-tools">蓝牙产品测试</a>,以验证设备是否与蓝牙 5 兼容。
+        </p>
+
+        <p>
+AOSP 包含 Android 通讯测试套件 (ACTS),其中包括针对蓝牙 5 的测试。您可以在以下位置找到针对蓝牙 5 的 ACTS 测试:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/ble/bt5/">
+          tools/test/connectivity/acts/tests/google/ble/bt5</a></code>。
+        </p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/bluetooth/services.html b/zh-cn/devices/bluetooth/services.html
new file mode 100644
index 0000000..e9489a8
--- /dev/null
+++ b/zh-cn/devices/bluetooth/services.html
@@ -0,0 +1,407 @@
+<html devsite><head>
+    <title>蓝牙服务</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>
+通过蓝牙,设备可以传输数据并供各种交互式服务(例如音频、短信和电话)使用。您可以在以下位置找到用于不同服务的蓝牙配置文件:<code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware">
+        hardware/libhardware/include/hardware/</a></code>。
+    </p>
+
+    <h2 id="audio">音频</h2>
+
+      <aside class="note"><strong>注意</strong>:目前只有传统版(非低功耗)蓝牙支持所有类型的音频流式传输。
+      </aside>
+
+      <p>
+利用蓝牙连接,用户可在启用了蓝牙的设备上流式传输音频。对于大多数音频用例,Android 设备是音频源,呈现设备(例如音响设备或耳机)是接收器。
+      </p>
+
+      <h3 id="absolute-volume-control">绝对音量控制</h3>
+
+        <p>
+在 Android 6.0 及更高版本中,Android 蓝牙堆栈允许音频源设置绝对音量,以便用户准确控制音频音量。音频源设备会将音量信息和未衰减的音频发送到接收器。然后,接收器会根据音量信息放大音频,以便用户听到准确的播放音量。
+        </p>
+
+        <p>
+音频源设备还可以注册接收音量通知。进行此项注册后,当用户使用接收器上的控件更改音量时,接收器便会向音频源发送通知。这样一来,音频源便能够准确地在界面上显示音量信息。
+        </p>
+
+        <p>
+绝对音量控制默认处于开启状态。要停用绝对音量控制,用户可以依次转到<strong>设置</strong> &gt; <strong>系统</strong> &gt; <strong>开发者选项</strong>,然后选择<strong>停用绝对音量功能</strong>开关。
+        </p>
+
+        <h3 id="advanced-audio-codecs">高级音频编解码器</h3>
+
+          <p>
+在 Android 8.0 中,使用高级音频分发配置文件 (A2DP) 的设备可以支持额外的音频编解码器。当设备连接到远程音频接收器时,蓝牙堆栈支持音频编解码器协商。该协商旨在选择发送器和接收器都支持的最佳编解码器,以提供高质量的音频。之后,所有音频都会先路由选定的编码器,然后再发送到接收器。
+          </p>
+
+          <h4 id="implementation">实现</h4>
+
+            <p>
+运行 Android 8.0 且支持 A2DP 的设备会自动获得额外编解码器支持。设备制造商可能需要针对某些专有音频编解码器获得单独的许可和二进制 Blob。除了 SBC,Android 8.0 还支持以下编解码器:
+
+</p>
+
+            <ul>
+              <li>AAC</li>
+              <li>aptX</li>
+              <li>aptX HD</li>
+              <li>LDAC</li>
+            </ul>
+
+            <p>
+设备制造商可以选择他们的设备首先尝试使用哪些编解码器。可以通过在 <code><a href="https://android.googlesource.com/platform/packages/apps/Bluetooth/+/master/res/values/config.xml">
+              res/values/config.xml</a></code> 中更改以下值来设置编解码器的优先级:
+
+</p>
+
+<pre class="prettyprint">
+  &lt;!-- Configuring priorities of A2DP source codecs. Larger value means
+          higher priority. Value -1 means the codec is disabled.
+          Value 0 is reserved and should not be used here. Enabled codecs
+          should have priorities in the interval [1, 999999], and each
+          priority value should be unique. --&gt;
+        &lt;integer name="a2dp_source_codec_priority_sbc"&gt;1001&lt;/integer&gt;
+        &lt;integer name="a2dp_source_codec_priority_aac"&gt;2001&lt;/integer&gt;
+        &lt;integer name="a2dp_source_codec_priority_aptx"&gt;3001&lt;/integer&gt;
+        &lt;integer name="a2dp_source_codec_priority_aptx_hd"&gt;4001&lt;/integer&gt;
+        &lt;integer name="a2dp_source_codec_priority_ldac"&gt;5001&lt;/integer&gt;
+      </pre>
+
+        <h4 id="ldac-certification">LDAC 认证</h4>
+
+          <p>
+Android 开源项目纳入了索尼的 LDAC 编解码器,因此对于该编解码器,不需要单独的许可或 Blob。要将 LDAC 编解码器集成到您的设备中,请向索尼提交申请,并按照 <a href="https://www.sony.net/Products/LDAC/aosp/">LDAC 认证流程</a>进行操作。
+          </p>
+
+          <p>
+LDAC 认证网站上提供了关于 LDAC 的文档(例如规范和操作手册),而且还提供了针对移动设备和平板电脑设备的验证和互操作性测试。需要将表明通过测试的结果发送给索尼,才能完成 LDAC 认证。
+          </p>
+
+        <h4 id="ui-features">界面功能</h4>
+
+          <p>
+除了额外编解码器支持,Android 8.0 还提供了一项面向用户的设置,用于停用高清 (HD) 蓝牙音频编解码器。
+          </p>
+
+          <ol>
+            <li>依次转到<strong>设置</strong> &gt; <strong>已连接的设备</strong> &gt; <strong>蓝牙</strong>。</li>
+            <li>点按您要停用编解码器的接收器旁边的齿轮图标。</li>
+            <li>取消选中 <strong>HD 音频</strong>复选框。</li>
+          </ol>
+
+          <p>
+对“设置”进行自定义的设备制造商应为用户实现一种停用高清编解码器的方式。
+          </p>
+
+    <h2 id="messaging">短信</h2>
+
+      <p>
+借助通过蓝牙发送短信的功能,用户可以从远程设备阅读、浏览和撰写短信。该功能通常是在将手机连接到车载信息娱乐系统时使用。
+      </p>
+
+      <aside class="note"><strong>注意</strong>:蓝牙短信服务目前仅支持短信,不支持电子邮件和即时通讯。
+      </aside>
+
+    <h2 id="telephony">电话</h2>
+
+      <p>
+通过蓝牙电话服务,用户可以将通话从手机流式传输到另一台蓝牙设备,并可以将手机中的联系人信息同步到另一台蓝牙设备。这些功能经常是在用户开车时用于进行免提通话。
+      </p>
+
+      <p>
+在 Android 8.0 中,蓝牙支持手机默认铃声。当通过蓝牙连接的手机收到来电时,接收器上将会播放铃声。要启用手机默认铃声,请依次转到<strong>设置</strong> &gt; <strong>系统</strong> &gt; <strong>开发者选项</strong>,然后选择<strong>启用手机默认铃声</strong>开关。
+      </p>
+
+    <h2>蓝牙功能</h2>
+      <p>为了实现蓝牙服务,蓝牙堆栈支持多种配置文件和功能。
+    </p>
+
+      <h3 id="bluetooth-profiles">蓝牙配置文件</h3>
+
+        <p>
+可用的蓝牙配置文件如下:
+</p>
+
+        <table>
+          <tbody><tr>
+            <th colspan="2">功能</th>
+            <th colspan="5">Android 版本</th>
+          </tr>
+          <tr>
+            <th>名称</th>
+            <th>说明</th>
+            <th>6.0</th>
+            <th>7.0</th>
+            <th>7.1</th>
+            <th>7.1.2</th>
+            <th>8 </th>
+          </tr>
+          <tr>
+            <td><strong>SAP</strong></td>
+            <td>SIM 卡访问配置文件</td>
+            <td>1.1</td>
+            <td>1.1</td>
+            <td>1.1</td>
+            <td>1.1</td>
+            <td>1.1</td>
+          </tr>
+          <tr>
+            <td><strong>MAP</strong></td>
+            <td>用于短信的消息访问配置文件</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+          </tr>
+          <tr>
+            <td><strong>OPP</strong></td>
+            <td>对象推送配置文件</td>
+            <td>1.1</td>
+            <td>1.1</td>
+            <td>1.1</td>
+            <td>1.1</td>
+            <td>1.2</td>
+          </tr>
+          <tr>
+            <td><strong>OBEX over L2CAP</strong></td>
+            <td>通过逻辑链路控制和适配协议进行对象交换</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+          </tr>
+          <tr>
+            <td><strong>HFP 音频网关</strong></td>
+            <td>免提模式配置文件</td>
+            <td>1.6</td>
+            <td>1.6</td>
+            <td>1.7</td>
+            <td>1.7</td>
+            <td>1.7</td>
+          </tr>
+          <tr>
+            <td><strong>HSP</strong></td>
+            <td>耳机配置文件</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+          </tr>
+          <tr>
+            <td><strong>A2DP</strong></td>
+            <td>高级音频分发配置文件</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+          </tr>
+          <tr>
+            <td><strong>AVRCP</strong></td>
+            <td>音频/视频远程控制配置文件</td>
+            <td>1.3</td>
+            <td>1.3</td>
+            <td>1.3</td>
+            <td>1.3</td>
+            <td>1.4</td>
+          </tr>
+          <tr>
+            <td><strong>HID</strong></td>
+            <td>人机接口设备配置文件</td>
+            <td>1.0</td>
+            <td>1.0</td>
+            <td>1.0</td>
+            <td>1.0</td>
+            <td>1.0</td>
+          </tr>
+          <tr>
+            <td><strong>PBAP</strong></td>
+            <td>电话簿访问配置文件</td>
+            <td>1.1.1</td>
+            <td>1.1.1</td>
+            <td>1.1.1</td>
+            <td>1.1.1</td>
+            <td>1.2</td>
+          </tr>
+          <tr>
+            <td><strong>HDP</strong></td>
+            <td>健康设备配置文件</td>
+            <td>1.0</td>
+            <td>1.0</td>
+            <td>1.1</td>
+            <td>1.1</td>
+            <td>1.1</td>
+          </tr>
+          <tr>
+            <td><strong>SPP</strong></td>
+            <td>串行端口配置文件</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+            <td>1.2</td>
+          </tr>
+          <tr>
+            <td><strong>PAN/BNEP</strong></td>
+            <td>个人区域网络配置文件/蓝牙网络封装协议</td>
+            <td>1.0</td>
+            <td>1.0</td>
+            <td>1.0</td>
+            <td>1.0</td>
+            <td>1.0</td>
+          </tr>
+          <tr>
+            <td><strong>DIP</strong></td>
+            <td>设备 ID 配置文件</td>
+            <td>1.3</td>
+            <td>1.3</td>
+            <td>1.3</td>
+            <td>1.3</td>
+            <td>1.3</td>
+          </tr>
+          <tr>
+            <td><strong>HOGP 1.0</strong></td>
+            <td>HID over GATT</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+          </tr>
+          <tr>
+            <td><strong>高清音频</strong><sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></td>
+            <td>请参阅上面的“高级音频编解码器”</td>
+            <td>否</td>
+            <td>否</td>
+            <td>否</td>
+            <td>否</td>
+            <td>是</td>
+          </tr>
+        </tbody></table>
+
+        <p>
+          <sup id="fn1">1</sup>实现高清音频同时取决于音频源和接收器上的设备功能。
+        </p>
+
+      <h3 id="bluetooth-low-energy-features">蓝牙低功耗功能</h3>
+
+        <p>
+可用的 BLE 功能如下:
+</p>
+
+        <table>
+          <tbody><tr>
+            <th>功能</th>
+            <th colspan="5">Android 版本</th>
+          </tr>
+          <tr>
+            <th>名称</th>
+            <th>6.0</th>
+            <th>7.0</th>
+            <th>7.1</th>
+            <th>7.1.2</th>
+            <th>8 </th>
+          </tr>
+          <tr>
+            <td><strong>BR/EDR 安全连接</strong></td>
+            <td>4.1 </td>
+            <td>4.1 </td>
+            <td>4.1 </td>
+            <td>4.1 </td>
+            <td>5.0</td>
+          </tr>
+          <tr>
+            <td><strong>LE 隐私</strong></td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>5.0</td>
+          </tr>
+          <tr>
+            <td><strong>LE 安全连接</strong></td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>5.0</td>
+          </tr>
+          <tr>
+            <td><strong>数据包扩展</strong></td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>4.2 </td>
+            <td>5.0</td>
+          </tr>
+          <tr>
+            <td><strong>32 位 UUID</strong></td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+          </tr>
+          <tr>
+            <td><strong>双模式 LE(中央/外设)</strong></td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+          </tr>
+          <tr>
+            <td><strong>LE 外设模式</strong></td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+          </tr>
+          <tr>
+            <td><strong>Google HCI 要求</strong></td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+            <td>是</td>
+          </tr>
+          <tr>
+            <td><strong>LE 连接导向型频道</strong></td>
+            <td>否</td>
+            <td>否</td>
+            <td>否</td>
+            <td>否</td>
+            <td>是<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup>
+            </td>
+          </tr>
+        </tbody></table>
+
+        <p>
+          <sup id="fn2">2</sup>实现 LE 连接导向型频道同时取决于音频源和接收器上的设备功能。
+        </p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/bluetooth/verifying_debugging.html b/zh-cn/devices/bluetooth/verifying_debugging.html
new file mode 100644
index 0000000..cbdda3a
--- /dev/null
+++ b/zh-cn/devices/bluetooth/verifying_debugging.html
@@ -0,0 +1,96 @@
+<html devsite><head>
+    <title>验证和调试</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>要验证和调试蓝牙堆栈,请使用 AOSP 中提供的工具以及蓝牙技术联盟 (SIG) 的测试。</p>
+
+    <h2 id="testing-and-verifying">测试和验证</h2>
+      <p>为了测试蓝牙堆栈,AOSP 提供了一系列单元测试、CTS 测试,以及旨在辅助 Bluetooth Profile Tuning Suite 的工具。</p>
+
+      <h3 id="unit-tests-in-aosp">AOSP 中的单元测试</h3>
+        <p>AOSP 包括针对默认蓝牙堆栈的功能测试和单元测试。这些测试位于 <code><a href="https://android.googlesource.com/platform/system/bt/+/master/test/">
+          system/bt/test</a></code> 中。要运行 AOSP 测试,请执行以下操作:</p>
+
+        <ol>
+          <li>停止 Android 运行时:
+          <pre class="devsite-terminal devsite-click-to-copy">adb shell stop</pre></li>
+          <li>从测试目录中运行 shell 可执行文件,如果要运行特定测试或测试套件,请包含相应选项:
+          <pre class="devsite-terminal devsite-click-to-copy">./run_unit_tests.sh <var>TEST_GROUP_NAME</var> <var>TEST_NAME</var> <var>OPTIONS</var></pre></li>
+          <li>测试完成后,重新启用 Android 运行时:
+          <pre class="devsite-terminal devsite-click-to-copy">adb shell start</pre></li>
+        </ol>
+
+        <p>测试名称列表位于以下文件中:<code><a href="https://android.googlesource.com/platform/system/bt/+/master/test/run_unit_tests.sh">
+        system/bt/test/run_unit_tests.sh</a></code>。</p>
+
+      <h3 id="android-comms-test-suite">Android 通讯测试套件</h3>
+        <p>Android 通讯测试套件 (ACTS) 用于执行对连接堆栈(例如 WLAN、蓝牙和移动网络服务)的自动测试。该测试工具需要 adb 和 python,您可以在以下文件中找到它:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts">
+          tools/test/connectivity/acts</a></code>。</p>
+
+        <p>针对蓝牙和蓝牙低功耗的 ACTS 测试分别位于以下文件中:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/bt/">
+          tools/test/connectivity/acts/tests/google/bt</a></code> 和 <code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/ble">
+          tools/test/connectivity/acts/tests/google/ble</a></code>。</p>
+
+      <h3 id="profile-tuning-suite">Profile Tuning Suite</h3>
+        <p>Bluetooth SIG 提供了 Bluetooth Profile Tuning Suite (PTS),这是一种用于测试协议和配置文件互操作性的工具。如需更多信息,请访问 <a href="https://www.bluetooth.com/develop-with-bluetooth/test-tools/profile-tuning-suite">Bluetooth Profile Tuning Suite</a> 网站。</p>
+
+        <p>AOSP 提供了额外的工具来辅助 Bluetooth PTS。这些工具位于以下位置:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/bt/pts/">
+          tools/test/connectivity/acts/tests/google/bt/pts</a></code>。</p>
+
+      <h3 id="cts-tests">CTS 测试</h3>
+        <p><a href="https://source.android.com/compatibility/cts/">兼容性测试套件</a> (CTS) 包括针对蓝牙堆栈的测试。这些测试位于以下位置:<code><a href="https://android.googlesource.com/platform/cts/+/master/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/">
+            cts/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth</a></code>。</p>
+
+    <h2 id="debugging-options">调试选项</h2>
+      <p>AOSP 提供了多种调试设备蓝牙堆栈的方法,其中包括日志和错误报告。这些方法可能不适用于无法再现的问题或可能受平台和设备的多个部分影响的音频问题。
+      </p>
+
+      <h3 id="debugging-with-bug-reports">使用错误报告进行调试</h3>
+        <p>要使用 <code>dumpsys</code> 检查蓝牙服务状态,请使用以下命令:</p>
+
+        <pre class="devsite-terminal devsite-click-to-copy">adb shell dumpsys bluetooth_manager</pre>
+
+        <p>默认情况下,所有日志消息的跟踪级别均为 2。要了解有关日志记录级别的更多信息,以及要更改不同配置文件的日志记录级别,请查看 <code><a href="https://android.googlesource.com/platform/system/bt/+/master/conf/bt_stack.conf">
+          system/bt/conf/bt_stack.conf</a></code>。</p>
+
+        <p>要从错误报告中提取信息收集日志,请使用 <code>btsnooz</code> 脚本。</p>
+
+        <ol>
+          <li>获取 <code><a href="https://android.googlesource.com/platform/system/bt/+/master/tools/scripts/btsnooz.py">
+            btsnooz.py</a></code>。</li>
+          <li>提取错误报告的文本版本。</li>
+          <li>对错误报告的文本版本运行 <code>btsnooz.py</code>:
+          <pre class="devsite-terminal devsite-click-to-copy">btsnooz.py <em>BUG_REPORT</em>.txt &gt; <em>BTSNOOP</em>.log</pre>
+          </li>
+        </ol>
+
+      <h3 id="debugging-with-logs">使用日志进行调试</h3>
+        <p>在 Android 4.4 及更高版本中,您可以手动收集 BTSnoop 日志(类似于 RFC 1761 中的信息收集格式)。这些日志可捕获主机控制器接口 (HCI) 数据包。对于大多数 Android 设备,这些日志都存储在 <code>data/misc/bluetooth/logs</code> 中。</p>
+
+        <p>出于保护隐私方面的考虑,始终处于开启状态且位于“内存中”的 BTSnoop 仅会记录非个人信息和事件。要记录所有数据,用户需要通过执行以下操作来启用蓝牙 HCI 信息收集:</p>
+
+        <ol>
+          <li>启用设备上的<strong>开发者选项</strong>。</li>
+          <li>在<strong>开发者选项</strong>菜单中,打开<strong>启用蓝牙 HCI 信息收集日志</strong>开关。</li>
+          <li>重新启动蓝牙以使日志记录功能生效。</li>
+        </ol>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/camera/camera3_requests_methods.html b/zh-cn/devices/camera/camera3_requests_methods.html
index 0509315..7301030 100644
--- a/zh-cn/devices/camera/camera3_requests_methods.html
+++ b/zh-cn/devices/camera/camera3_requests_methods.html
@@ -22,42 +22,42 @@
 
 <h2 id="request-creation">创建和提交请求</h2>
 <h3 id="default-settings">construct_default_request_settings</h3>
-<p>为标准相机用例创建拍照设置。设备必须返回配置为满足所请求用例的设置缓冲区,该用例必须是其中一个 CAMERA3_TEMPLATE_* 枚举。所有请求控制字段都必须包括在内。<br />
-  HAL 保留对此结构的所有权,但指向该结构的指针必须在设备关闭之前保持有效。此调用返回缓冲区后,框架和 HAL 不能对其进行修改。可以为同一模板或其他模板的后续调用返回相同的缓冲区。</p>
+<p>为标准相机用例创建拍照设置。设备必须返回一个设置缓冲区,并且该缓冲区已配置为满足所请求用例(必须是 <code>CAMERA3_TEMPLATE_*</code> 枚举之一)的需求。所有请求控制字段都必须包括在内。</p>
+<p>HAL 保留对该结构的所有权,但指向该结构的指针在设备关闭之前必须一直保持有效。该调用返回缓冲区后,框架和 HAL 便不能再修改相应缓冲区。对于针对同一模板或针对其他模板的后续调用,可以返回同一个缓冲区。</p>
 <h4><strong>返回值</strong></h4>
 <ul>
   <li>有效的元数据:在成功创建默认设置缓冲区时返回。</li>
-  <li>NULL:在发生致命错误时返回。返回此值后,框架只能成功调用 close() 方法。</li>
+  <li><code>NULL</code>:在发生严重错误时返回。如果返回了该值,框架将只能成功调用 <code>close()</code> 方法。</li>
 </ul>
 <h3 id="process-request">process_capture_request</h3>
-<p>向 HAL 发送新的拍照请求。HAL 在准备好接受下一个要处理的请求之前,不会从这里调用返回。框架一次只能对 process_capture_request() 执行一次调用,而且调用将全部来自同一个线程。新请求及其关联的缓冲区可用后,会立即对 process_capture_request() 进行下一次调用。在正常的预览场景中,这意味着框架几乎会立即重新调用该函数。<br />
-  实际请求处理是异步的,拍照结果由 HAL 通过 process_capture_result() 调用返回。此调用要求结果元数据可用,但输出缓冲区可以只提供等待的同步栅栏。多个请求应同时发出,以保持全输出帧速率。<br />
-  框架保留对请求结构的所有权。这仅保证在此调用中有效。HAL 设备必须复制需要保留用于拍照处理的信息。HAL 负责等待和关闭缓冲区的栅栏并将缓冲区句柄返回给框架。<br />
-  如果 input_buffer 的返回值不是 NULL,则 HAL 必须将输入缓冲区释放同步栅栏的文件描述符写入 input_buffer-&gt;release_fence。如果 HAL 为输入缓冲区释放同步栅栏返回 -1,则框架可以立即重新使用输入缓冲区。否则,框架将等待同步栅栏,然后再重新填充和重新使用输入缓冲区。</p>
+<p>向 HAL 发送新的拍照请求。在准备好可以接受下一个要处理的请求之前,HAL 不会从该调用返回。框架一次只会对 <code>process_capture_request()</code> 进行一次调用,并且调用将全部来自同一个线程。一旦有新的请求并且其关联的缓冲区处于可用状态,框架会立即对 <code>process_capture_request()</code> 进行下一次调用。在正常预览情况下,这意味着框架几乎会立即再次调用该函数。</p>
+<p>实际的请求处理是异步进行的,拍照结果由 HAL 通过 <code>process_capture_result()</code> 调用返回。该调用要求结果元数据可用,但输出缓冲区可能只会提供要等待的同步 Fence。如果有多个请求,系统会立即对其进行快速处理,以保持全输出帧速率。</p>
+<p>框架保留对请求结构的所有权。系统只能保证请求结构在该调用期间有效。对于需要保留以用于拍照处理的信息,HAL 设备必须为其创建多个副本。HAL 负责等待并关闭缓冲区的 Fence,并将缓冲区句柄返回给框架。</p>
+<p>如果 <code>input_buffer</code> 不是 <code>NULL</code>,则 HAL 必须将输入缓冲区释放同步 Fence 的文件描述符写入到 <code>input_buffer</code>-&gt;<code>release_fence</code>。如果 HAL 为输入缓冲区释放同步 Fence 返回 <code>-1</code>,则框架可以立即重新使用输入缓冲区。否则,框架将等待同步 Fence,然后再重新填充和重新使用输入缓冲区。</p>
 <h4><strong>返回值</strong></h4>
 <ul>
-  <li>0:在成功开始处理拍照请求时返回。</li>
-  <li>-EINVAL:在输入格式不正确(在不允许的情况下设置为 NULL、没有输出缓冲区等),且拍照处理无法开始时返回。请求处理过程中的故障应通过调用 camera3_callback_ops_t.notify() 来处理。如果出现此错误,框架仍会负责处理流缓冲区的栅栏和缓冲区句柄;HAL 不应通过 process_capture_result 关闭栅栏或者返回这些缓冲区。</li>
-  <li>-ENODEV:在相机设备遇到严重错误时返回。返回此错误后,框架只能成功调用 close() 方法。</li>
+  <li><code>0</code>:在成功开始处理拍照请求时返回。</li>
+  <li><code>-EINVAL</code>:在输入格式不正确(不允许各项设置设为 <code>NULL</code> 但却被设为了 NULL、没有输出缓冲区,等等)且无法开始处理拍照时返回。请求处理过程中发生的故障应通过调用 <code>camera3_callback_ops_t.notify()</code> 来处理。如果出现此错误,框架仍将负责流缓冲区的 Fence 和缓冲区句柄;HAL 不应关闭 Fence 或通过 <code>process_capture_result</code> 返回这些缓冲区。</li>
+  <li><code>-ENODEV</code>:在相机设备遇到严重错误时返回。如果返回了此错误,框架将只能成功调用 <code>close()</code> 方法。</li>
 </ul>
 <h2 id="misc-methods">其他方法</h2>
 <h3 id="get-metadata">get_metadata_vendor_tag_ops</h3>
-<p>获取方法以查询供应商扩展元数据标签信息。HAL 应填充所有供应商标签操作方法;或者在没有定义供应商标签的情况下,保持操作不变。vendor_tag_query_ops_t 的定义可以在 system/media/camera/include/system/camera_metadata.h 中找到。</p>
-<h3 id="dump">转储</h3>
-<p>打印出相机设备的调试状态。当相机服务要求进行调试转储时,框架将调用调试转储。在使用 dumpsys 工具或捕获错误报告时,就会出现这种情况。传入文件描述符可用于使用 dprintf() 或 write() 来编写调试文本。该文本应仅采用 ASCII 编码。</p>
-<h3 id="flush">刷新</h3>
-<p>在给定设备上的管道中,刷新当前正在进行的所有拍照和所有缓冲区。框架将使用它来尽快转储所有状态,以准备 configure_streams() 调用。<br />
-  由于无需成功返回缓冲区,因此在 flush()(不管是否成功填充)时持有的每个缓冲区都可能返回 CAMERA3_BUFFER_STATUS_ERROR。请注意,仍允许 HAL 在此调用期间返回有效的 (STATUS_OK) 缓冲区,前提是已成功填充缓冲区。<br />
-  目前在 HAL 中的所有请求都会尽快返回。未在处理的请求会立即返回错误。所有可中断的硬件块均会停止,而所有不可中断的块均会等待。<br />
-  仅当 HAL 中不再有未完成的缓冲区或请求时,flush() 才会返回。框架可能会调用 configure_streams(因为 HAL 状态现在为已停顿),也可能会发出新的请求。<br />
-  flush() 调用只需要 100 毫秒或更短时间,最多花费 1 秒钟。</p>
+<p>获取方法以查询供应商扩展元数据标签信息。HAL 应填充所有供应商标签操作方法,或者使操作保持不变(如果未定义供应商标签)。可以在以下位置找到 <code>vendor_tag_query_ops_t</code> 的定义:<code>system/media/camera/include/system/camera_metadata.h</code>。</p>
+<h3 id="dump">dump</h3>
+<p>打印出相机设备的调试状态。当相机服务收到调试转储请求时,框架将调用该方法。在使用 <code>dumpsys</code> 工具或捕获错误报告时,会发生这种情况。传入的文件描述符可用于编写调试文本(使用 <code>dprintf()</code> 或 <code>write()</code>)。该文本应仅采用 ASCII 编码。</p>
+<h3 id="flush">flush</h3>
+<p>在给定设备上的管道中,刷新当前正在进行的所有拍照和所有缓冲区。框架将使用该方法来尽快转储所有状态,以便为调用 <code>configure_streams()</code> 做准备。</p>
+<p>由于无需成功返回缓冲区,因此可以返回在 <code>flush()</code> 时占用的每个缓冲区(不管是否已成功填充),并显示 <code>CAMERA3_BUFFER_STATUS_ERROR</code>。请注意,HAL 仍可在此调用期间返回有效的 (<code>STATUS_OK</code>) 缓冲区,但前提是已成功填充这些缓冲区。</p>
+<p>目前在 HAL 中的所有请求都应被尽快返回。未在处理的请求应立即返回错误。应停止所有可中断的硬件块,并且应等待所有不可中断的块。</p>
+<p>仅当 HAL 中不再有待处理的缓冲区或请求时,<code>flush()</code> 才应返回。框架可能会调用 <code>configure_streams</code>(因为 HAL 状态现在为已停顿),也可能会发出新的请求。</p>
+<p><code>flush()</code> 调用所用时间不应超过 100 毫秒,且最长不得超过 1 秒。</p>
 <h4><strong>版本信息</strong></h4>
-<p>版本信息仅在设备版本不低于 CAMERA_DEVICE_API_VERSION_3_1 时可用。</p>
+<p>仅当设备版本不低于 <code>CAMERA_DEVICE_API_VERSION_3_1</code> 时,才能获得版本信息。</p>
 <h4><strong>返回值</strong></h4>
 <ul>
-  <li>0:在成功刷新相机 HAL 时返回。</li>
-  <li>-EINVAL:在输入格式不正确时(设备无效)返回。</li>
-  <li>-ENODEV:在相机设备遇到严重错误时返回。返回此错误后,框架只能成功调用 close() 方法。</li>
+  <li><code>0</code>:在成功刷新相机 HAL 时返回。</li>
+  <li><code>-EINVAL</code>:在输入格式不正确(设备无效)时返回。</li>
+  <li><code>-ENODEV</code>:在相机设备遇到严重错误时返回。如果返回了此错误,框架将只能成功调用 <code>close()</code> 方法。</li>
 </ul>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/graphics/arch-gameloops.html b/zh-cn/devices/graphics/arch-gameloops.html
index fde6781..8e9e3ad 100644
--- a/zh-cn/devices/graphics/arch-gameloops.html
+++ b/zh-cn/devices/graphics/arch-gameloops.html
@@ -77,6 +77,6 @@
 
 <p>当绘图代码唤醒时,它就会抓住锁,获取块的当前位置,释放锁,然后进行绘制。您无需基于帧间增量时间进行分数移动,只需要有一个移动对象的线程,以及另一个在绘制开始时随地绘制对象的线程。</p>
 
-<p>如果您想要针对复杂的场景创建即将到来的事件列表(按唤醒时间排序),且场景在下一个事件结束之前保持休眠状态,则原理是一样的。</p>
+<p>对于任何复杂的场景,都请创建一个即将发生的事件的列表(按唤醒时间排序),并使绘图代码保持睡眠状态,直到该发生下一个事件为止。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/input/getevent.html b/zh-cn/devices/input/getevent.html
index e185e30..d16143e 100644
--- a/zh-cn/devices/input/getevent.html
+++ b/zh-cn/devices/input/getevent.html
@@ -110,6 +110,6 @@
 [   78826.468719] EV_ABS       ABS_MT_TRACKING_ID   ffffffff
 [   78826.468719] EV_SYN       SYN_REPORT           00000000
 </pre>
-<p class="note"><strong>注意</strong>:<code>getevent</code> 时间戳使用 CLOCK_MONOTONIC 时基中的 $SECONDS.$MICROSECONDS 格式。有关详情,请参阅 getevent.c。</p>
+<p class="note"><strong>注意</strong>:<code>getevent</code> 时间戳采用 CLOCK_MONOTONIC 时基,并使用 $SECONDS.$MICROSECONDS 格式。有关详情,请参阅 getevent.c。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/input/key-layout-files.html b/zh-cn/devices/input/key-layout-files.html
index f942ebc..dddb024 100644
--- a/zh-cn/devices/input/key-layout-files.html
+++ b/zh-cn/devices/input/key-layout-files.html
@@ -84,15 +84,18 @@
 <pre class="devsite-click-to-copy">
 axis 0x05 invert BRAKE
 </pre>
-<p>在上述示例中,如果 <code>ABS_RZ</code> 的值为 <code>2</code>,则 <code>AXIS_BRAKE</code> 设置为 <code>-2</code>。</p>
+<p>在上述示例中,如果 <code>ABS_RZ</code> 的值为 <code>2</code>,则 <code>AXIS_BRAKE</code> 会被设为 <code>-2</code>。</p>
 
-<h4 id="center-flat-position-option">中心平面位置选项</h4>
-<p>中心平面位置是坐标轴的中间位置,例如,当方向键处于其范围的正中间位置且用户未触摸它时。</p>
-<p>Linux 输入协议为输入设备驱动程序提供了一种方法来指定操纵杆坐标轴的中心平面位置,但并不是所有驱动程序都这样做,其中一些提供的值并不正确。要解决此问题,坐标轴声明可后跟 <code>flat</code> 选项,以指定该坐标轴的中心平面位置的值。</p>
+<h4 id="center-flat-option">中心平面选项</h4>
+<p>由于存在噪声,即使在操纵杆未被使用时,操纵杆设备也可能会报告输入事件。这种噪声通常来自左侧杆和/或右侧杆,会导致驱动程序报告接近 0 的位置值。“中心平面”值用于指定预期会从处于静止状态的控制杆获得的噪声量。</p>
+<p>Linux 输入协议为输入设备驱动程序提供了一种用于指定操纵杆轴中心平面值的方式,但并非所有驱动程序都会报告该值,并且有些驱动程序会提供不正确的值。为了解决这个问题,可以在轴声明后面加一个 <code>flat</code> 选项,以用于指定轴的中心位置周围多宽的区域应被视为居中的区域。</p>
+<p>例如,如果设备驱动程序报告的 <code>AXIS_X</code> 值介于 0 到 100 之间,则 Android 输入系统会将 0 映射到 -1,并将 100 映射到 1。该范围的中心在未缩放的坐标中为 50,在经过缩放的坐标中为 0。如果平面值等于 10,那么开发者应假定报告的任何介于 -0.1 到 0.1 之间的 <code>AXIS_X</code> 值(在未缩放的坐标中,则是介于 40 到 60 之间)均为噪声,并将来自操纵杆的这些值视为零。</p>
+<p class="note"><strong>注意</strong>:尽管按键布局文件会指定驱动程序坐标空间的值,但由 android.view.InputDevice.MotionRange#getFlat() 报告的值是在 Android 坐标空间内的值。</p>
+
 <pre class="devsite-click-to-copy">
 axis 0x03 Z flat 4096
 </pre>
-<p>在上述示例中,中心平面位置设置为 <code>4096</code>。
+<p>在以上示例中,中心平面值设为了 <code>4096</code>。
 </p>
 
 <h3 id="comments">注释</h3>
diff --git a/zh-cn/devices/sensors/power-use.html b/zh-cn/devices/sensors/power-use.html
index ef72308..1c8a264 100644
--- a/zh-cn/devices/sensors/power-use.html
+++ b/zh-cn/devices/sensors/power-use.html
@@ -27,16 +27,16 @@
   <li>大幅运动感测器</li>
   <li>计步器</li>
   <li>步测器</li>
-  <li>倾斜探测器</li>
+  <li>倾斜检测器</li>
 </ul>
-<p>它们在<a href="sensor-types.html#composite_sensor_type_summary">复合传感器类型汇总</a>表中带有低功率 (<img src="images/battery_icon.png" width="20" height="20" alt="低功率传感器"/>) 图标。</p>
-<p>这些传感器类型不能在高功率下实现,因为它们的主要优势就是耗电量低。这些传感器预计会长期处于激活状态,很可能是全天候。对于低功率传感器,宁愿不实现,也不要在高功率下实现,否则会导致过度耗电。</p>
-<p>复合低功率传感器类型(如步测器)的处理过程必须在硬件中进行。</p>
-<p>有关具体的功率要求,请参阅 CDD,并应在 CTS 中进行测试来验证这些功率要求。</p>
+<p>在<a href="sensor-types.html#composite_sensor_type_summary">复合传感器类型汇总</a>表中,这些传感器都带有低功率 (<img src="images/battery_icon.png" width="20" height="20" alt="低功率传感器"/>) 图标。</p>
+<p>这些传感器类型不能实现为高功率传感器,因为它们的主要优势就是耗电量低。这些传感器预期会长期处于启用状态,并且很可能是全天候启用。宁愿不实现低功率传感器,也不要将其实现为高功率传感器,否则会导致大量耗电。</p>
+<p>对于低功率复合传感器类型(如步测器),必须在硬件中对其进行处理。</p>
+<p>有关具体的功率要求,请参阅 CDD。建议在 CTS 中进行测试,来验证这些功率要求。</p>
 <h2 id="power_measurement_process">功率测量过程</h2>
-<p>功率是在电池处测量。对于以毫瓦为单位的值,我们使用电池的额定电压,这表示电压为 4 伏时,1 毫安的电流必须相应地计为 4 毫瓦。</p>
-<p>在 SoC 处于休眠状态时测量功率,并且在 SoC 休眠的几秒钟内计算平均值,以便将来自传感器芯片的周期性功率峰值考虑在内。</p>
-<p>对于单次唤醒传感器,在传感器未触发时测量功率(因此不会唤醒 SoC)。同样,对于其他传感器,会在传感器数据存储在硬件 FIFO 中时测量功率,因此 SoC 不会被唤醒。</p>
-<p>当没有传感器激活时,通常以增量形式测量功率。当有多个传感器激活时,功率增量不得大于各激活的传感器的功率之和。如果加速度计的电流为 0.5 毫安,步测器的电流也为 0.5 毫安,则同时激活两者所产生的电流必须小于 0.5 + 0.5 = 1 毫安。</p>
+<p>功率是在电池处测量。对于以毫瓦为单位的值,我们使用电池的额定电压,这意味着电压为 4 伏且电流为 1 毫安时必须计为 4 毫瓦。</p>
+<p>在 SoC 处于休眠状态时测量功率,并且计算 SoC 处于休眠状态时几秒钟内的平均值,以便将来自传感器芯片的周期性功率峰值考虑在内。</p>
+<p>对于单次唤醒传感器,则在传感器未触发时测量功率(因此不会唤醒 SoC)。同样,对于其他传感器,则在传感器数据存储在硬件 FIFO 中时测量功率,因此 SoC 不会被唤醒。</p>
+<p>当没有传感器处于启用状态时,通常以增量形式测量功率。当有多个传感器处于启用状态时,功率增量不得大于各个已启用传感器的功率之和。比如,如果加速度计的电流为 0.5 毫安,步测器的电流也为 0.5 毫安,则同时启用这两者所产生的电流必须小于 0.5 + 0.5 = 1 毫安。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/sensors/sensor-stack.html b/zh-cn/devices/sensors/sensor-stack.html
index 0855f4e..d203eda 100644
--- a/zh-cn/devices/sensors/sensor-stack.html
+++ b/zh-cn/devices/sensors/sensor-stack.html
@@ -57,15 +57,15 @@
   <li>没有将数据从应用向下发送至传感器或其驱动程序的机制。这样可以确保某个应用无法修改传感器的行为,从而不会对其他应用造成破坏。</li>
 </ul>
 <h3 id="sensor_fusion">传感器融合</h3>
-<p>Android 框架为部分复合传感器提供默认实现。如果一个设备上有<a href="sensor-types.html#gyroscope">陀螺仪</a>、<a href="sensor-types.html#accelerometer">加速度计</a>和<a href="sensor-types.html#magnetic_field_sensor">磁力计</a>,但没有<a href="sensor-types.html#rotation_vector">旋转矢量</a>、<a href="sensor-types.html#gravity">重力</a>和<a href="sensor-types.html#linear_acceleration">线性加速度</a>传感器,则框架会实现这些传感器,以便应用仍然可以使用它们。</p>
+<p>Android 框架为部分复合传感器提供默认实现。如果设备上有<a href="sensor-types.html#gyroscope">陀螺仪</a>、<a href="sensor-types.html#accelerometer">加速度计</a>和<a href="sensor-types.html#magnetic_field_sensor">磁力计</a>,但没有<a href="sensor-types.html#rotation_vector">旋转矢量</a>、<a href="sensor-types.html#gravity">重力</a>和<a href="sensor-types.html#linear_acceleration">线性加速度</a>传感器,则该框架会实现这些传感器,以便应用仍可以使用它们。</p>
 <p>默认实现无法访问其他实现可以访问的所有数据,并且必须在 SoC 上运行,因此它不像其他实现那样精准和省电。设备制造商应尽可能定义自己的融合传感器(旋转矢量传感器、重力传感器和线性加速度传感器,以及<a href="sensor-types.html#game_rotation_vector">游戏旋转矢量</a>传感器等较新的复合传感器),而非依赖该默认实现。此外,设备制造商也可以要求传感器芯片供应商为其提供实现。</p>
 <p>默认的传感器融合实现没有相关的维护,且可能导致依赖它的设备无法通过 CTS 验证。</p>
 <h3 id="under_the_hood">深入了解</h3>
 <p>本部分作为背景信息提供,适用于 Android 开放源代码项目 (AOSP) 框架代码的维护人员,与硬件制造商无关。</p>
 <h4 id="jni">JNI</h4>
-<p>框架使用的是与 <a href="http://developer.android.com/reference/android/hardware/package-summary.html">android.hardware</a> 相关联的 Java 本机接口 (JNI)(位于 <code>frameworks/base/core/jni/</code> 目录中)。该代码会调用较低级别的原生代码,以获取对相应传感器硬件的访问权限。</p>
+<p>该框架使用与 <a href="http://developer.android.com/reference/android/hardware/package-summary.html">android.hardware</a> 相关联且位于 <code>frameworks/base/core/jni/</code> 目录中的 Java 本机接口 (JNI)。该代码会调用较低级别的原生代码,以获取对相应传感器硬件的访问权限。</p>
 <h4 id="native_framework">原生框架</h4>
-<p>原生框架在 <code>frameworks/native/</code> 中定义,提供相当于 <a href="http://developer.android.com/reference/android/hardware/package-summary.html">android.hardware</a> 文件包的原生内容。原生框架会调用 Binder IPC 代理,以获取对传感器专属服务的访问权限。</p>
+<p>原生框架在 <code>frameworks/native/</code> 中定义,并提供相当于 <a href="http://developer.android.com/reference/android/hardware/package-summary.html">android.hardware</a> 软件包的原生内容。原生框架会调用 Binder IPC 代理,以获取对传感器专属服务的访问权限。</p>
 <h4 id="binder_ipc">Binder IPC</h4>
 <p>Binder IPC 代理用于促进跨越进程边界的通信。</p>
 <h2 id="hal">HAL</h2>
@@ -79,7 +79,10 @@
 <p>传感器驱动程序可与物理设备进行交互。在某些情况下,HAL 实现和驱动程序是同一软件实体。在其他情况下,硬件集成者会要求传感器芯片制造商提供相应驱动程序,但是它们是用于编写 HAL 实现的驱动程序。</p>
 <p>在所有情况下,HAL 实现和内核驱动程序都由硬件制造商负责提供,Android 不提供首选编写方式。</p>
 <h2 id="sensor_hub">传感器中枢</h2>
-<p>设备的传感器堆栈可视需要添加传感器中枢。在 SoC 可以处于暂停模式时,传感器中枢对执行一些低功耗的低级计算任务非常有用。例如,计步功能或传感器融合功能可以在这些芯片上执行。此外,它也是实施传感器批处理以及为传感器事件添加硬件 FIFO 的理想位置。请参阅<a href="batching.html">批处理</a>,了解详情。</p>
+<p>设备的传感器堆栈可视需要添加传感器中枢。在 SoC 可以处于暂停模式时,传感器中枢对执行一些低功耗的低级计算任务非常有用。例如,计步功能或传感器融合功能可以在这些芯片上执行。此外,它也是实施传感器批处理以及为传感器事件添加硬件 FIFO 的理想位置。如需更多信息,请参阅<a href="batching.html">批处理</a>。</p>
+
+<p class="note"><strong>注意</strong>:要开发采用新传感器或 LED 的新 ContextHub 功能,您还可以使用连接到 HiKey 或 HiKey960 开发板的 <a href="/source/devices.html#neonkey">Neonkey SensorHub</a>。</p>
+
 <p>传感器中枢的具体化方式取决于架构。它有时是一个单独的芯片,有时包含在与 SoC 相同的芯片上。传感器中枢的重要特征是,应该包含足够的内存来进行批处理,并消耗极少的电量以便能实现低功耗 Android 传感器。部分传感器中枢包含一个微控制器(用于通用计算)和硬件加速器(用于针对低电耗传感器实现极低功耗计算)。</p>
 <p>传感器中枢的架构方式以及与传感器和 SoC(I2C 总线、SPI 总线等)的通信方式并非由 Android 指定,但应该以最大程度减少整体功耗为目标。</p>
 <p>有一种方案似乎会对实现的简单性产生重大影响,即从传感器中枢到 SoC 设置两个中断行:一个用于唤醒中断(适用于唤醒传感器),另一个用于非唤醒中断(适用于非唤醒传感器)。</p>
diff --git a/zh-cn/devices/sensors/suspend-mode.html b/zh-cn/devices/sensors/suspend-mode.html
index 68040c7..042677e 100644
--- a/zh-cn/devices/sensors/suspend-mode.html
+++ b/zh-cn/devices/sensors/suspend-mode.html
@@ -23,15 +23,15 @@
 <h2 id="soc_power_states">SoC 电源状态</h2>
 <p>系统芯片 (SoC) 的电源状态包括:开启、空闲和挂起。“开启”表示 SoC 正在运行。“空闲”表示一种中等耗电模式,在该模式下,SoC 已接通电源但不执行任何任务。“挂起”表示 SoC 未通电的低功耗模式。该模式下的设备功耗通常是“开启”模式的 1/100。</p>
 <h2 id="non-wake-up_sensors">非唤醒传感器</h2>
-<p>非唤醒传感器是不阻止 SoC 进入挂起模式,也不会将 SoC 唤醒以报告数据的传感器。尤其是,不允许驱动程序持有唤醒锁定。如果应用要在屏幕关闭时从非唤醒传感器那接收事件,则其有责任保留部分唤醒锁定。当 SoC 处于挂起模式时,传感器必须继续工作并生成事件,这些事件会放入硬件 FIFO 中。(有关详情,请参阅<a href="batching.html">批处理</a>。)当 SoC 唤醒时,FIFO 中的事件将传送到应用。如果 FIFO 太小而无法存储所有事件,则较旧的事件将丢失;最旧的数据将被删除以容纳最新的数据。在不存在 FIFO 的极端情况下,在 SoC 处于挂起模式时生成的所有事件都将丢失。一个例外情况是来自每个变化模式传感器的最新事件:最后一个事件<a href="batching.html#precautions_to_take_when_batching_non-wake-up_on-change_sensors">必须保存</a>在 FIFO 之外,以使其不会丢失。</p>
+<p>非唤醒传感器是不阻止 SoC 进入挂起模式,也不会将 SoC 唤醒以报告数据的传感器。尤其是,不允许驱动程序持有唤醒锁定。如果应用要在屏幕关闭时从非唤醒传感器处接收事件,则其有责任保留部分唤醒锁定。当 SoC 处于挂起模式时,传感器必须继续工作并生成事件,这些事件会放入硬件 FIFO 中。(有关详情,请参阅<a href="batching.html">批处理</a>。)当 SoC 唤醒时,FIFO 中的事件将传送到应用。如果 FIFO 太小而无法存储所有事件,则较旧的事件将丢失;最旧的数据将被删除以容纳最新的数据。在不存在 FIFO 的极端情况下,在 SoC 处于挂起模式时生成的所有事件都将丢失。一种例外情况是来自采用 On-change 触发方式的传感器的最新事件:最后一个事件<a href="batching.html#precautions_to_take_when_batching_non-wake-up_on-change_sensors">必须保存</a>在 FIFO 之外,以使其不会丢失。</p>
 <p>一旦 SoC 退出挂起模式,就会报告来自 FIFO 的所有事件,并且操作将恢复正常。</p>
-<p>使用非唤醒传感器的应用要么应持有唤醒锁定以确保系统不会挂起,在不需要传感器时取消注册传感器,要么会在 SoC 处于挂起模式期间丢失事件。</p>
+<p>使用非唤醒传感器的应用要么应持有唤醒锁定以确保系统不会挂起,在不需要传感器时取消注册传感器,要么接受 SoC 处于挂起模式期间的事件会丢失这一事实。</p>
 <h2 id="wake-up_sensors">唤醒传感器</h2>
-<p>与非唤醒传感器相反,唤醒传感器会确保其数据在传输时不依赖于 SoC 状态。当 SoC 唤醒时,唤醒传感器的行为就像非唤醒传感器。当 SoC 休眠时,唤醒传感器必须唤醒 SoC 以发送事件。它们仍必须让 SoC 进入挂起模式,但是当需要报告事件时,还必须唤醒 SoC。也就是说,在达到最大报告延迟时间或硬件 FIFO 已满之前,传感器必须唤醒 SoC 并传送事件。有关详情,请参阅<a href="batching.html">批处理</a>。</p>
+<p>与非唤醒传感器相反,唤醒传感器会确保其数据传输不依赖于 SoC 状态。当 SoC 唤醒时,唤醒传感器的行为就像非唤醒传感器。当 SoC 休眠时,唤醒传感器必须唤醒 SoC 以发送事件。它们必须仍可让 SoC 进入挂起模式,但是当需要报告事件时,还必须唤醒 SoC。也就是说,在达到最大报告延迟时间或硬件 FIFO 已满之前,传感器必须唤醒 SoC 并传送事件。有关详情,请参阅<a href="batching.html">批处理</a>。</p>
 <p>为确保应用有时间在 SoC 返回休眠状态之前接收事件,每次报告事件时,驱动程序必须持有“超时唤醒锁定”200 毫秒。<em>也就是说,在唤醒中断后的 200 毫秒内,不允许 SoC 返回休眠状态。</em> 此要求将在未来的 Android 版本中消失,在此之前,我们需要该超时唤醒锁定。</p>
 <h2 id="how_to_define_wake-up_and_non-wake-up_sensors">如何定义唤醒和非唤醒传感器?</h2>
-<p>在 KitKat 及更早版本中,某个传感器是唤醒传感器还是非唤醒传感器由传感器类型确定:除<a href="sensor-types.html#proximity">近程</a>传感器和<a href="sensor-types.html#significant_motion">大幅度动作检测器</a>之外,大多数传感器都是非唤醒传感器。</p>
-<p>从 L 版本开始,给定传感器是否为唤醒传感器由传感器定义中的标记指定。大多数传感器均可由同一传感器的唤醒和非唤醒变体对来定义,在这种情况下,它们必须表现为两个独立的传感器,且彼此不进行交互。有关详情,请参阅<a href="interaction.html">交互性</a>。</p>
+<p>在 KitKat 及更早版本中,某个传感器是唤醒传感器还是非唤醒传感器取决于传感器类型:除<a href="sensor-types.html#proximity">近程</a>传感器和<a href="sensor-types.html#significant_motion">大幅度动作检测器</a>之外,大多数传感器都是非唤醒传感器。</p>
+<p>从 L 版本开始,传感器是否为唤醒传感器由传感器定义中的标记指定。大多数传感器均可由同一传感器的唤醒和非唤醒变体对来定义,在这种情况下,它们必须表现为两个独立的传感器,且彼此不进行交互。有关详情,请参阅<a href="interaction.html">交互性</a>。</p>
 <p>除非在传感器类型定义中另行指定,否则建议为<a href="sensor-types.html">传感器</a>类型中列出的每种传感器类型实现一个唤醒传感器和一个非唤醒传感器。在每个传感器类型定义中,查看 <code>SensorManager.getDefaultSensor(sensorType)</code> 将返回什么样的传感器(唤醒还是非唤醒)。它是大多数应用将使用的传感器。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/storage/adoptable.html b/zh-cn/devices/storage/adoptable.html
index 430304a..55f01a7 100644
--- a/zh-cn/devices/storage/adoptable.html
+++ b/zh-cn/devices/storage/adoptable.html
@@ -20,9 +20,11 @@
       limitations under the License.
   -->
 
-<p>Android 一直都支持外部存储配件(如 SD 卡),但由于预期的无常性以及为<a href="/devices/storage/traditional.html">传统外部存储设备</a>只提供最低限度的数据保护,因此这些配件一直以来仅限于简单的文件存储。Android 6.0 推出了<a href="http://developer.android.com/about/versions/marshmallow/android-6.0.html#adoptable-storage">合并</a>外部存储媒介以充当内部存储设备的功能。</p>
+<p>Android 一直都支持外部存储配件(如 SD 卡),但由于这些配件存在预期的无常性,以及<a href="/devices/storage/traditional.html">传统外部存储设备</a>只受最低限度的数据保护,因此这些配件一直以来仅限于进行简单的文件存储。Android 6.0 推出了<a href="http://developer.android.com/about/versions/marshmallow/android-6.0.html#adoptable-storage">合并</a>外部存储媒介(使其可以像内部存储设备一样使用)的功能。</p>
 
-<p>当合并外部存储媒介时,系统将对其进行格式化和加密处理,以便一次仅与单个 Android 设备配合使用。由于该媒介与合并它的 Android 设备紧密关联,因此可以安全地为所有用户存储应用和私密数据。</p>
+<p class="warning"><strong>警告</strong>:<a href="/security/encryption/file-based.html">文件级加密</a>目前不支持可合并的存储设备。在使用文件级加密的设备上,必须将新的存储媒介(如 SD 卡)作为<a href="/devices/storage/traditional.html">传统存储设备</a>使用。</p>
+
+<p>当合并外部存储媒介时,系统将对其进行格式化和加密处理,以便一次只在一台 Android 设备上使用。由于该媒介与合并它的 Android 设备紧密关联,因此可以安全地为所有用户存储应用和私密数据。</p>
 
 <p>当用户将新的存储媒介(如 SD卡)插入到可合并的位置时,Android 会询问他们想要如何使用该媒介。他们可以选择合并该媒介,这样的话,系统会对该媒介进行格式化和加密处理,或者也可以继续按原样将其用于简单的文件存储。如果他们选择合并媒介,平台会询问是否将主要共享存储内容(通常装载在 <code>/sdcard</code> 上)迁移到新合并的媒介上,从而腾出宝贵的内部存储空间。不同于因使用 <a href="https://en.wikipedia.org/wiki/Master_boot_record">MBR</a> 而限制为 2TB 的传统存储设备,可合并的存储设备使用 <a href="https://en.wikipedia.org/wiki/GUID_Partition_Table">GPT</a>,因而文件存储限制约为 9ZB。</p>
 
@@ -44,6 +46,6 @@
 
 <p>合并的设备必须使用支持 POSIX 权限和扩展属性(如 <code>ext4</code> 或 <code>f2fs</code>)的文件系统进行格式化。为了获得最佳性能,建议基于闪存的存储设备使用 <code>f2fs</code> 文件系统。</p>
 
-<p>在执行周期性空闲维护时,平台将向合并的媒介发出 <code>FI_TRIM</code>(就像对待内部存储设备那样)。目前的 SD 卡规格不支持 <code>DISCARD</code> 命令;内核转而会使用 <code>ERASE</code> 命令,SD 卡固件可以选择使用该命令来满足优化目的。</p>
+<p>在执行周期性空闲维护时,平台将向合并的媒介发出 <code>FI_TRIM</code>(就像对待内部存储设备那样)。目前的 SD 卡规范不支持 <code>DISCARD</code> 命令;不过,内核会回退到使用 <code>ERASE</code> 命令,SD 卡固件可以选择使用该命令来实现优化目的。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/storage/config.html b/zh-cn/devices/storage/config.html
index 380f186..298711c 100644
--- a/zh-cn/devices/storage/config.html
+++ b/zh-cn/devices/storage/config.html
@@ -20,12 +20,15 @@
       limitations under the License.
   -->
 
-<p>外部存储由 <code>vold</code> init 服务和 <code>MountService</code> 系统服务共同管理。外部物理存储卷的装载由 <code>vold</code> 处理,它通过执行分阶段操作来准备好媒体,然后再将其提供给应用。</p>
+<p>外部存储空间由 <code>vold</code> init 服务和 <code>StorageManagerService</code> 系统服务共同管理。外部实体存储卷的装载由 <code>vold</code> 处理:通过执行分阶段操作准备好媒体,然后再将其提供给应用。</p>
+
+<p class="note"><strong>注意</strong>:在 Android 8.0 中,<code>MountService</code> 类已更名为 <code>StorageManagerService</code>。</p>
 
 <h2 id="file_mappings">文件映射</h2>
 <p>对于 Android 4.2.2 及更早版本,特定于设备的 <code>vold.fstab</code> 配置文件定义从 sysfs 设备到文件系统装载点的映射,每行都遵循以下格式:</p>
-<pre><code>dev_mount &lt;label&gt; &lt;mount_point&gt; &lt;partition&gt; &lt;sysfs_path&gt; [flags]
-</code></pre>
+<pre class="devsite-click-to-copy">
+dev_mount &lt;label&gt; &lt;mount_point&gt; &lt;partition&gt; &lt;sysfs_path&gt; [flags]
+</pre>
 <ul>
 <li><code>label</code>:卷的标签。</li>
 <li><code>mount_point</code>:要装载卷的文件系统路径。</li>
@@ -34,8 +37,9 @@
 <li><code>flags</code>:可选的逗号分隔标记列表,不能包含 <code>/</code>。可能的值包括 <code>nonremovable</code> 和 <code>encryptable</code>。</li>
 </ul>
 <p>对于 Android 4.3 及更高版本,init、vold 和 recovery 所使用的各种 fstab 文件在 <code>/fstab.&lt;device&gt;</code> 文件中进行统一。对于由 <code>vold</code> 管理的外部存储卷,条目应采用以下格式:</p>
-<pre><code>&lt;src&gt; &lt;mnt_point&gt; &lt;type&gt; &lt;mnt_flags&gt; &lt;fs_mgr_flags&gt;
-</code></pre>
+<pre class="devsite-click-to-copy">
+&lt;src&gt; &lt;mnt_point&gt; &lt;type&gt; &lt;mnt_flags&gt; &lt;fs_mgr_flags&gt;
+</pre>
 <ul>
 <li><code>src</code>:sysfs(通常在 /sys 下装载)下可以提供装载点的设备的路径。路径必须以 <code>/</code> 开头。</li>
 <li><code>mount_point</code>:要装载卷的文件系统路径。</li>
@@ -45,9 +49,11 @@
 </ul>
 
 <h2 id="configuration_details">配置详情</h2>
-<p>框架层以及以上的外部存储交互通过 <code>MountService</code> 进行处理。由于 Android 6.0 中进行了配置更改(例如移除了 storage_list.xml 资源叠加层),因此配置详情分为两类。
+<p>框架层级以及更高层级的外部存储交互通过 <code>StorageManagerService</code> 来处理。由于 Android 6.0 中进行了配置更改(例如移除了 storage_list.xml 资源叠加层),因此配置详情分成了两类。</p>
 
-</p><h3 id="android_5_x_and_earlier">Android 5.x 及更早版本</h3>特定于设备的 <code>storage_list.xml</code> 配置文件(通常通过 <code>frameworks/base</code> 叠加层提供)定义存储设备的属性和限制。<code>&lt;StorageList&gt;</code> 元素包含一个或多个 <code>&lt;storage&gt;</code> 元素,其中一个元素应被标记为主元素。<code>&lt;storage&gt;</code> 属性包括:<p></p>
+<h3 id="android_5_x_and_earlier">Android 5.x 及更低版本</h3>
+
+<p>设备专属的 <code>storage_list.xml</code> 配置文件(通常通过 <code>frameworks/base</code> 叠加层提供)定义存储设备的属性和限制。<code>&lt;StorageList&gt;</code> 元素包含一个或多个 <code>&lt;storage&gt;</code> 元素,其中一个元素应被标记为主元素。<code>&lt;storage&gt;</code> 属性包括:</p>
 <ul>
 <li><code>mountPoint</code>:此装载的文件系统路径。</li>
 <li><code>storageDescription</code>:描述此装载的字符串资源。</li>
@@ -59,10 +65,11 @@
 <li><code>maxFileSize</code>:最大文件大小(以 MB 为单位)。</li>
 </ul>
 <p>设备可以通过模拟由内部存储支持的文件系统(不区分大小写,无需权限)来提供外部存储。<code>system/core/sdcard</code> 中的 FUSE 守护进程提供一个可能的实现,可添加为特定于设备的 <code>init.rc</code> 服务:</p>
-<pre><code># virtual sdcard daemon running as media_rw (1023)
+<pre class="devsite-click-to-copy">
+# virtual sdcard daemon running as media_rw (1023)
 service sdcard /system/bin/sdcard &lt;source_path&gt; &lt;dest_path&gt; 1023 1023
     class late_start
-</code></pre>
+</pre>
 <p>其中,<code>source_path</code> 为提供支持的内部存储,<code>dest_path</code> 为目标装载点。</p>
 <p>配置特定于设备的 <code>init.rc</code> 脚本时,必须将 <code>EXTERNAL_STORAGE</code> 环境变量定义为主要外部存储的路径。<code>/sdcard</code> 路径也必须通过符号链接解析到同一位置。如果设备在平台更新之间调整外部存储的位置,则应创建符号链接,以便旧的路径继续发挥作用。</p>
 
@@ -79,18 +86,20 @@
 <p>除了这些配置更改之外,Android 6.0 还包含可合并的存储设备的概念。对于 Android 6.0 设备,任何未被合并的物理媒体都被视为便携式设备。</p>
 
 <h4 id="adoptable_storage">可合并的存储设备</h4>
-<p>要在 <code>fstab</code> 中表示可合并的存储设备,请使用 <code>fs_mgr_flags</code> 字段中的 <code>encryptable=userdata</code> 属性。典型定义如下:</p>
-<pre><code>/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
+<p>要在 <code>fstab</code> 中表示可合并的存储设备,请在 <code>fs_mgr_flags</code> 字段中使用 <code>encryptable=userdata</code> 属性。典型定义如下:</p>
+<pre class="devsite-click-to-copy">
+/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
 voldmanaged=sdcard1:auto,encryptable=userdata
-</code></pre>
+</pre>
 <p>合并存储设备时,该平台会擦除内容并写入定义两个分区的 GUID 分区表:</p>
 <ul>
    <li>一个较小的空 <code>android_meta</code> 分区,预留以备将来使用的。分区类型 GUID 为 19A710A2-B3CA-11E4-B026-10604B889DCF。</li><li>一个较大的 <code>android_ext</code> 分区,使用 dm-crypt 加密并使用 <code>ext4</code> 或 <code>f2fs</code>(取决于内核功能)格式化。分区类型 GUID 为 193D1EA4-B3CA-11E4-B075-10604B889DCF。</li></ul>
 <h4 id="portable_storage">便携式存储设备</h4>
 <p>在 <code>fstab</code> 中,具有 <code>voldmanaged</code> 属性的存储设备默认被视为便携式设备,除非定义了其他属性(如 <code>encryptable=userdata</code>)。例如,典型的 USB OTG 设备的定义如下:</p>
-<pre><code>/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
+<pre class="devsite-click-to-copy">
+/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                     voldmanaged=usb:auto
-</code></pre>
+</pre>
 <p>该平台在装载之前使用 <code>blkid</code> 检测文件系统类型,用户可以选择在文件系统不受支持时将媒体格式化。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/admin/index.html b/zh-cn/devices/tech/admin/index.html
index d686239..533f789 100644
--- a/zh-cn/devices/tech/admin/index.html
+++ b/zh-cn/devices/tech/admin/index.html
@@ -20,16 +20,16 @@
       limitations under the License.
   -->
 
-<p>运行 Android 5.0 及更高版本且声明了 managed_users 功能的设备可在各公司信息技术 (IT) 部门的支持下用于<a href="http://www.android.com/work/">企业环境</a>中。只需引入<a href="multi-user.html">多用户</a>、<a href="managed-profiles.html">托管资料</a>和企业移动管理 (EMM) 应用,并完善默认<a href="/security/encryption/index.html">加密</a>、<a href="/security/verifiedboot/index.html">验证启动</a>和 <a href="/security/selinux/index.html">SELinux</a>,即可实现这一点。</p>
+<p>运行 Android 5.0 及更高版本且声明了 managed_users 功能的设备可在各公司信息技术 (IT) 部门的支持下用于<a href="http://www.android.com/work/">企业环境</a>中。通过引入<a href="multi-user.html">多用户</a>和<a href="managed-profiles.html">受管理资料</a>概念以及企业移动管理 (EMM) 应用,并增强默认的<a href="/security/encryption/index.html">加密功能</a>、<a href="/security/verifiedboot/index.html">验证启动</a>和 <a href="/security/selinux/index.html">SELinux</a>,可以实现这一点。</p>
 
-<p>借助这些增强功能,用户或其 IT 部门便能创建可将公司雇主数据与个人用户信息分开的托管资料。请按照本网站该部分中的文档操作,以正确实施企业设备管理。</p>
+<p>借助这些增强功能,用户或其 IT 部门便能创建可将公司雇主数据与个人用户信息分开的受管理资料。请按照本网站该部分中的文档操作,以正确实施企业设备管理。</p>
 
 <h2 id="summary">摘要</h2>
 
 <p>请按照下述流程实施设备管理:</p>
 
 <ol>
-  <li>了解关键概念,例如<a href="multi-user.html">多用户</a>和<a href="managed-profiles.html">托管资料</a>。
+  <li>了解关键概念,例如<a href="multi-user.html">多用户</a>和<a href="managed-profiles.html">受管理资料</a>。
   </li><li>通过自定义叠加文件<a href="implement.html">实施设备管理</a>。
   </li><li>借助 EMM 提供商和应用<a href="testing-setup.html">测试</a>和验证您的设备。
 </li></ol>
diff --git a/zh-cn/devices/tech/admin/managed-profiles.html b/zh-cn/devices/tech/admin/managed-profiles.html
index 053af9b..d605bb0 100644
--- a/zh-cn/devices/tech/admin/managed-profiles.html
+++ b/zh-cn/devices/tech/admin/managed-profiles.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>“受管理资料”或“工作资料”是在管理方式和视觉外观方面具有额外特殊属性的 Android <a href="multi-user.html">用户</a>。<em></em><em></em></p>
+<p>“受管理资料”或“工作资料”是指在管理方式和视觉外观方面具有额外特殊属性的 Android <a href="multi-user.html">用户</a>。<em></em><em></em></p>
 
 <p>受管理资料的主要目的是为受管理的数据(如企业数据)创建一个隔离且安全的存储空间。资料管理员可以全权控制数据的范围、入口、出口及其有效期。这些政策可以赋予极高的权限,因此需由受管理资料(而非设备管理员)负责执行。</p>
 
@@ -52,11 +52,15 @@
 
 <p>受管理资料按以下原则被实现为一种新的次要用户:</p>
 
-<pre>uid = 100000 * userid + appid</pre>
+<pre class="devsite-click-to-copy">
+uid = 100000 * userid + appid
+</pre>
 
 <p>与常规用户一样,它们具有独立的应用数据:</p>
 
-<pre>/data/user/&lt;userid&gt;</pre>
+<pre class="devsite-click-to-copy">
+/data/user/&lt;userid&gt;
+</pre>
 
 <p>系统会使用 <code>Binder.getCallingUid()</code> 为所有系统请求计算 UserId,并且所有系统状态和响应都由 UserId 分隔。您可以考虑使用 <code>Binder.getCallingUserHandle</code>(而非 <code>getCallingUid</code>),以避免在 Uid 与 UserId 之间引起混淆。</p>
 
diff --git a/zh-cn/devices/tech/admin/multi-user.html b/zh-cn/devices/tech/admin/multi-user.html
index 18f77e4..2275d83 100644
--- a/zh-cn/devices/tech/admin/multi-user.html
+++ b/zh-cn/devices/tech/admin/multi-user.html
@@ -56,7 +56,8 @@
 
 <p>从 Android 5.0 开始,多用户功能默认处于停用状态。要启用这项功能,设备制造商必须定义资源叠加层,以取代 <code>frameworks/base/core/res/res/values/config.xml</code> 中的以下值:</p>
 
-<pre>&lt;!--  Maximum number of supported users --&gt;
+<pre class="devsite-click-to-copy">
+&lt;!--  Maximum number of supported users --&gt;
 &lt;integer name="config_multiuserMaximumUsers"&gt;1&lt;/integer&gt;
 &lt;!--  Whether Multiuser UI should be shown --&gt;
 &lt;bool name="config_enableMultiUserUI"&gt;false&lt;/bool&gt;
diff --git a/zh-cn/devices/tech/config/ambient.html b/zh-cn/devices/tech/config/ambient.html
new file mode 100644
index 0000000..6f7f1eb
--- /dev/null
+++ b/zh-cn/devices/tech/config/ambient.html
@@ -0,0 +1,98 @@
+<html devsite><head>
+    <title>实现 Ambient 权能</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>
+借助此类权能,Linux 进程可以舍弃大多数类似于 root 的权限,同时保留执行其权能所需的权限。此类权能的原始实现使得经过 fork + exec 处理的进程无法继承权能,除非正在执行的文件已配置文件权能。而文件权能会带来安全风险,这是因为任何进程只要执行具有文件权能的文件,则一律会获得这些权能。
+    </p>
+    <p>
+Ambient 权能允许系统服务在其 <code>.rc</code> 文件中配置各项权能,从而将其所有配置放入单个文件中,而不必将权能配置单独放入 <code>fs_config.c</code> 文件中。
+    </p>
+    <h2 id="reference-implementation">参考实现</h2>
+    <p>
+参考实现是 Android 通用内核 <a href="https://android.googlesource.com/kernel/common/">https://android.googlesource.com/kernel/common/</a>
+    </p>
+    <h2 id="required-patches">必需的补丁程序</h2>
+    <p>
+必需的补丁程序已反向移植到所有相关的 Android 通用内核分支。
+    </p>
+    <p>
+主要 Ambient 权能补丁程序 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08">https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08</a> 已反向移植到:
+
+</p>
+    <ul>
+    <li>android-3.10 分支:
+    <ul>
+      <li><a href="https://android.googlesource.com/kernel/common/+/bdcd4484f1b399dfcb2fd7dd82b6869b2b6b60cd">https://android.googlesource.com/kernel/common/+/bdcd4484f1b399dfcb2fd7dd82b6869b2b6b60cd</a>
+    </li></ul>
+    </li><li>android-3.14 分支:
+    <ul>
+      <li><a href="https://android.googlesource.com/kernel/common/+/5440f16f1296ca05f33dfde51e8bb7ad48699640">https://android.googlesource.com/kernel/common/+/5440f16f1296ca05f33dfde51e8bb7ad48699640</a>
+    </li></ul>
+    </li><li>android-3.18:
+    <ul>
+      <li><a href="https://android.googlesource.com/kernel/common/+/d6a9a74487e86b528c44965f871de75671b6adb0">https://android.googlesource.com/kernel/common/+/d6a9a74487e86b528c44965f871de75671b6adb0</a>
+    </li></ul>
+    </li><li>android-4.1:
+    <ul>
+      <li><a href="https://android.googlesource.com/kernel/common/+/0381789d78d552462ef576d9759e9aa6fcaae3bb">https://android.googlesource.com/kernel/common/+/0381789d78d552462ef576d9759e9aa6fcaae3bb</a></li>
+    </ul>
+   </li></ul>
+
+    <p>
+一个小的安全修复程序 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3">https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3</a> 已反向移植到:</p>
+
+    <ul>
+      <li>android-3.10 分支:
+    <ul>
+        <li><a href="https://android.googlesource.com/kernel/common/+/ef89def080c52eb7ea6a9455eb32b1b05867133b">https://android.googlesource.com/kernel/common/+/ef89def080c52eb7ea6a9455eb32b1b05867133b</a>
+      </li></ul>
+    </li><li>android-3.14 分支:
+    <ul>
+      <li><a href="https://android.googlesource.com/kernel/common/+/f75626b3092fad4e0bd8f2aed06947352781eb77">https://android.googlesource.com/kernel/common/+/f75626b3092fad4e0bd8f2aed06947352781eb77</a>
+    </li></ul>
+    </li><li>android-3.18:
+    <ul>
+      <li><a href="https://android.googlesource.com/kernel/common/+/7bc0ef844a537ebb786ba0574932bd65751818c6">https://android.googlesource.com/kernel/common/+/7bc0ef844a537ebb786ba0574932bd65751818c6</a>
+    </li></ul>
+    </li><li>android-4.1:
+    <ul>
+     <li><a href="https://android.googlesource.com/kernel/common/+/dda568cc40d855bde2dfa9c04a7a1628c80b7f63">https://android.googlesource.com/kernel/common/+/dda568cc40d855bde2dfa9c04a7a1628c80b7f63</a></li>
+    </ul>
+    </li></ul>
+
+    <p>
+版本低于 3.18 的内核所需的内存泄漏修复程序 <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6d6f3328422a3bc56b0d8dd026a5de845d2abfa7">https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6d6f3328422a3bc56b0d8dd026a5de845d2abfa7</a> 已反向移植到:
+</p>
+
+    <ul>
+    <li>android-3.10 分支:
+    <ul>
+      <li><a href="https://android.googlesource.com/kernel/common/+/900e52782988ee11a1cb7d600e9edea48fc70f0f">https://android.googlesource.com/kernel/common/+/900e52782988ee11a1cb7d600e9edea48fc70f0f</a></li>
+    </ul>
+  </li></ul>
+
+    <h2 id="validation">验证</h2>
+    <p>
+    <a href="https://android.googlesource.com/platform/bionic/+/master#Running-the-tests">仿生单元测试</a>包括针对 Ambient 权能的单元测试。此外,如果在 Android init 中为某项服务使用“capabilities”关键字,然后检查该服务是否获得了预期的权能,则可以对 Ambient 权能进行运行时测试。
+    </p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/config/uicc.html b/zh-cn/devices/tech/config/uicc.html
index 7e882dc..2bbc3cf 100644
--- a/zh-cn/devices/tech/config/uicc.html
+++ b/zh-cn/devices/tech/config/uicc.html
@@ -21,7 +21,7 @@
   -->
 
 <p>Android 5.1 引入了一种机制,即如果 API 与通用集成电路卡 (UICC) 所有者的应用相关,则可以向 API 授予特殊权限。Android 平台会加载存储在 UICC 上的证书,并向由这些证书签名的应用授予权限,允许其调用一些特殊的 API。</p>
-<p>Android 7.0 针对 UICC 运营商权限规则,对该功能进行了扩展,以支持其他存储源(例如访问规则文件 (ARF)),从而大幅增加了可以使用此类 API 的运营商数量。有关 API 参考,请参阅 <a href="#carrierconfigmanager">CarrierConfigManager</a>;有关说明,请参阅<a href="/devices/tech/config/carrier.html">运营商配置</a>。</p>
+<p>Android 7.0 对该功能进行了扩展,以支持从其他存储源(例如访问规则文件 (ARF))读取 UICC 运营商权限规则,目的是大幅增加可以使用此类 API 的运营商数量。有关 API 参考,请参阅 <a href="#carrierconfigmanager">CarrierConfigManager</a>;有关说明,请参阅<a href="/devices/tech/config/carrier.html">运营商配置</a>。</p>
 
 <p>由于运营商拥有对 UICC 的完全控制权,该机制不仅提供了一种安全而灵活的方式来管理移动网络运营商 (MNO) 在通用应用分发渠道(如 Google Play)上托管的应用,同时运营商还保留对设备的特殊权限,无需使用针对单个设备的平台证书对应用进行签名,也无需作为系统应用进行预安装。</p>
 
@@ -44,10 +44,12 @@
 
 <h3 id="rule_example">规则示例</h3>
 <p>应用名称为 <code>com.google.android.apps.myapp</code>,并且 SHA-1 证书的十六进制字符串形式为:</p>
-<pre>AB:CD:92:CB:B1:56:B2:80:FA:4E:14:29:A6:EC:EE:B6:E5:C1:BF:E4</pre>
+<pre class="devsite-click-to-copy">
+AB:CD:92:CB:B1:56:B2:80:FA:4E:14:29:A6:EC:EE:B6:E5:C1:BF:E4
+</pre>
 
 <p>UICC 上规则的十六进制字符串形式为:</p>
-<pre>
+<pre class="devsite-click-to-copy">
 E243 &lt;= 43 is value length in hex
   E135
     C114 ABCD92CBB156B280FA4E1429A6ECEEB6E5C1BFE4
@@ -60,10 +62,13 @@
 <p>Android 7.0 增加了对从访问规则文件 (ARF) 中读取运营商授权规则的支持。</p>
 <p>Android 平台会首先尝试选择访问规则小程序 (ARA) 应用标识符 (AID) <code>A00000015141434C00</code>。如果在通用集成电路卡 (UICC) 上找不到 AID,则 Android 会通过选择 PKCS15 AID <code>A000000063504B43532D3135</code> 回退到 ARF。然后,Android 会读取 <code>0x4300</code> 处的访问控制规则文件 (ACRF),并查找具有 AID <code>FFFFFFFFFFFF</code> 的条目。具有不同 AID 的条目将被忽略,从而确保其他用例的规则可以同时存在。</p>
 <p>十六进制字符串形式的 ACRF 内容示例:</p>
-<pre>30 10 A0 08 04 06 FF FF FF FF FF FF 30 04 04 02 43 10</pre>
+<pre class="devsite-click-to-copy">
+30 10 A0 08 04 06 FF FF FF FF FF FF 30 04 04 02 43 10
+</pre>
 
 <p>访问控制条件文件 (ACCF) 内容示例:</p>
-<pre>30 16 04 14 61 ED 37 7E 85 D3 86 A8 DF EE 6B 86 4B D8 5B 0B FA A5 AF 81
+<pre class="devsite-click-to-copy">
+30 16 04 14 61 ED 37 7E 85 D3 86 A8 DF EE 6B 86 4B D8 5B 0B FA A5 AF 81
 </pre>
 
 <p>在上述示例中,<code>0x4310</code> 是 ACCF 的地址,该地址包含证书哈希值 <code>61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81</code>。由此证书签名的应用获得了运营商权限。</p>
@@ -75,10 +80,10 @@
 <h3 id="telephonymanager">TelephonyManager</h3>
 
 <ul>
-<li>允许运营商应用向 UICC 请求挑战/响应的 API:<a href="https://developer.android.com/reference/android/telephony/TelephonyManager.html#getIccAuthentication(int,%20int,%20java.lang.String)"><code>getIccAuthentication</code></a>。
+<li>用于允许运营商应用向 UICC 请求质询/响应的 API:<a href="https://developer.android.com/reference/android/telephony/TelephonyManager.html#getIccAuthentication(int,%20int,%20java.lang.String)"><code>getIccAuthentication</code></a>。
 </li>
 
-<li>用于检查发起呼叫的应用是否获得运营商权限的 API:<a href="http://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()"><code>hasCarrierPrivileges</code></a>。
+<li>用于检查发起呼叫的应用是否已获得运营商权限的 API:<a href="http://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()"><code>hasCarrierPrivileges</code></a>。
 </li>
 
 <li>用于覆盖品牌和号码的 API:<ul>
@@ -110,7 +115,7 @@
 
 <h3 id="carriermessagingservice">CarrierMessagingService</h3>
 
-<p>当用户发送或接收新的短信和彩信时接收系统调用的服务。要扩展此类,请在您的清单文件中通过 <code>android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE</code> 权限声明该服务,并附带一个包含 <code>#SERVICE_INTERFACE</code> 操作的 Intent 过滤器。API 包括:</p>
+<p>当用户发送或接收新的短信和彩信时接收系统调用的服务。要扩展此类,请在您的清单文件中声明该服务具有 <code>android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE</code> 权限,并包含一个具有 <code>#SERVICE_INTERFACE</code> 操作的 intent 过滤器。API 包括:</p>
 <ul>
   <li><code>onFilterSms</code></li>
   <li><code>onSendTextSms</code></li>
@@ -122,11 +127,11 @@
 
 <h3 id="telephonyprovider">TelephonyProvider</h3>
 
-<p>允许对电话数据库进行修改(插入、删除、更新和查询)的内容提供程序 API。字段值在 <a href="https://developer.android.com/reference/android/provider/Telephony.Carriers.html"><code>Telephony.Carriers</code></a> 中进行定义;要了解更多详情,请参阅 developer.android.com 上的 <a href="https://developer.android.com/reference/android/provider/Telephony.html">Telephony</a> API 参考资料。</p>
+<p>允许对电话数据库进行修改(插入、删除、更新和查询)的内容提供程序 API。值字段在 <a href="https://developer.android.com/reference/android/provider/Telephony.Carriers.html"><code>Telephony.Carriers</code></a> 中定义;如需更多详细信息,请参阅 developer.android.com 上的<a href="https://developer.android.com/reference/android/provider/Telephony.html">电话</a> API 参考。</p>
 
 <h2 id="android_platform">Android 平台 </h2>
 
-<p>Android 平台会在检测到的 UICC 上构建内部 UICC 对象,该对象将运营商权限规则作为 UICC 的一部分包含在内。<a href="https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java"><code>UiccCarrierPrivilegeRules.java</code></a> 会加载规则、在 UICC 卡上对规则进行解析,并将它们缓存在内存中。如果需要进行权限检查,<code>UiccCarrierPrivilegeRules</code> 会将来电者证书与其自身的规则逐一对比。如果 UICC 被移除,规则会连同 UICC 对象一起被销毁。</p>
+<p>Android 平台会在检测到的 UICC 上构建内部 UICC 对象,此类对象会将运营商权限规则作为 UICC 的一部分包含在内。<a href="https://android.googlesource.com/platform/frameworks/opt/telephony/+/master/src/java/com/android/internal/telephony/uicc/UiccCarrierPrivilegeRules.java"><code>UiccCarrierPrivilegeRules.java</code></a> 会加载规则、在 UICC 卡上对规则进行解析,并将它们缓存在内存中。如果需要进行权限检查,<code>UiccCarrierPrivilegeRules</code> 会将来电者证书与其自身的规则逐一对比。如果 UICC 被移除,规则会连同 UICC 对象一起被销毁。</p>
 
 <h2 id="validation">验证</h2>
 <p>Android 7.0 CTS 包括针对 <code>CtsCarrierApiTestCases.apk</code> 中的运营商 API 的测试。由于此功能取决于 UICC 上的证书,因此您必须准备 UICC 以通过这些测试。</p>
@@ -134,7 +139,7 @@
 <h3 id="prepare_uicc">准备 UICC</h3>
 <p>默认情况下,<code>CtsCarrierApiTestCases.apk</code> 由 Android 开发者密钥进行签名,其哈希值为 <code>61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81</code>。如果 UICC 上的证书不匹配,那么测试也会输出预期的证书哈希值。</p>
 <p>输出示例:</p>
-<pre>
+<pre class="devsite-click-to-copy">
 junit.framework.AssertionFailedError: This test requires a SIM card with carrier privilege rule on it.
 Cert hash: 61ed377e85d386a8dfee6b864bd85b0bfaa5af81
 </pre>
@@ -143,7 +148,9 @@
 
 <h3 id="run_tests">运行测试</h3>
 <p>为方便起见,Android 7.0 CTS 支持用来限制测试仅在配置了相同令牌的设备上运行的设备令牌。运营商 API CTS 测试支持设备令牌 <code>sim-card-with-certs</code>。例如,下面的设备令牌限制运营商 API 测试仅在 <code>abcd1234</code> 设备上运行:</p>
-<pre>cts-tradefed run cts  --device-token abcd1234:sim-card-with-certs</pre>
+<pre class="devsite-terminal devsite-click-to-copy">
+cts-tradefed run cts  --device-token abcd1234:sim-card-with-certs
+</pre>
 
 <p>如果在不使用设备令牌的情况下运行测试,则测试将在所有设备上运行。</p>
 
diff --git a/zh-cn/devices/tech/config/usb-hal.html b/zh-cn/devices/tech/config/usb-hal.html
new file mode 100644
index 0000000..d365757
--- /dev/null
+++ b/zh-cn/devices/tech/config/usb-hal.html
@@ -0,0 +1,66 @@
+<html devsite><head>
+    <title>实现 USB HAL</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+Android O 版本将 USB 命令的处理从 <code>init</code> 脚本移到了原生 USB 守护进程,以实现更好的配置和代码可靠性。对于 Gadget 函数配置,系统会使用 <code>init</code> 脚本(属性触发器)执行设备专属的小工具操作。
+</p>
+
+<p>
+在以前的版本中,这些设备专属的配置通过设备专属的 <code>init</code> 脚本来实现(使用属性触发器)。移至硬件抽象层 (HAL) 这种设计可以获得能够解决以下问题且更为明晰的实现:
+</p>
+
+<ol>
+<li>操作(例如写入到内核 sysfs 节点)可能会失败,但系统不会将操作结果传回设置属性触发器的框架代码。因此,框架会误认为这些操作已成功,即使它们已静默失败也是如此。</li>
+<li><code>init</code> 脚本包含有限个可执行的操作。</li>
+</ol>
+
+<h2 id="hal-and-treble">HAL 和 Treble</h2>
+
+<p>
+过去,系统使用设备专属的 <code>init</code> 脚本替代 HAL 层来执行设备专属的 USB 操作。USB(通过 ADB)是用于调试系统问题的主要接口。让原生守护进程执行 USB 配置可以消除对框架代码的依赖,这样即使框架崩溃,USB 也应该能够正常运行。
+</p>
+
+<p>
+Android O 中还引入了 <a href="https://android-developers.googleblog.com/2017/05/here-comes-treble-modular-base-for.html">Treble</a> 模型,在该模型下,所有 HAL 都与系统服务隔离开来,并且都需要在各自的原生守护进程中运行。这样就不需要使用专有的 USB 守护进程,因为 HAL 层可兼做 USB 守护进程。
+</p>
+
+<p>
+默认 HAL 实现支持 Android 版本低于 O 的所有设备。因此,对于这些设备,不需要执行任何设备专属的工作。O 使用 HAL 接口查询 USB 端口的状态,以及执行数据角色和电源角色交换。
+</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>
+需要在运行 O 的每台设备上实现新的 USB HAL 接口。默认实现应支持 Android 版本低于 O 的设备。如果设备使用 <code>dual_role_usb</code> 类来报告 C 型端口的状态,默认实现便足以满足需求。可能需要在设备专属的 USB 脚本中进行细微的更改,以便将 C 型节点的所有权转移给系统。
+</p>
+
+<p>
+没有引入任何新的平台 API。
+</p>
+
+<h2 id="validation">验证</h2>
+
+<p>
+VTS 将测试新的 USB HAL。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/connect/oob-users.html b/zh-cn/devices/tech/connect/oob-users.html
new file mode 100644
index 0000000..70e0588
--- /dev/null
+++ b/zh-cn/devices/tech/connect/oob-users.html
@@ -0,0 +1,133 @@
+<html devsite><head>
+    <title>为流量已用完的用户自定义设备行为</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="introduction">简介</h2>
+
+<p>流量已用完的 Android 设备允许网络流量通过,但需要运营商和电信服务商来实现缓解协议。该功能实现了一个通用解决方案,使运营商和电信服务商能够在设备用完流量时予以指示。</p>
+
+<p>Android 平台提供了一个默认的运营商应用,该应用具有基于强制门户检测信号的流量缓解默认行为。此外,它还使运营商和原始设备制造商 (OEM) 能够以较低的成本和极大的灵活性对该行为进行自定义。</p>
+
+<h2 id="examples-and-source">示例和源代码</h2>
+
+<p>默认的运营商应用位于以下位置:<code>platform/frameworks/base/packages/CarrierDefaultApp/</code>。</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>默认的运营商应用已经过预先配置,以便为未配置的运营商提供更好的体验。运营商可以使用该默认行为,也可以通过向运营商配置 XML 文件添加“信号-操作”映射来覆盖该默认行为。他们可以不使用默认应用,而是使用 UICC 权限和自己的独立运营商应用。</p>
+
+<h3 id="implementation-introduction">实现简介</h3>
+
+<h4 id="signals">信号</h4>
+
+<p>Android 框架支持为以下参数化信号配置操作:</p>
+
+<ul>
+<li><code>TelephonyIntents.ACTION_CARRIER_SIGNAL_REDIRECTED</code>
+</li><li><code>TelephonyIntents.ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED</code></li>
+</ul>
+
+<p>这些信号位于以下位置:<code>frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java</code>。</p>
+
+<h4 id="supported-actions">支持的操作</h4>
+
+<p>默认运营商应用定义了一组支持的操作,这些操作可映射到支持的信号。这些操作是在 <code>CarrierActionUtils.java</code> 中定义的:</p>
+
+<pre class="devsite-click-to-copy">
+    public static final int CARRIER_ACTION_ENABLE_METERED_APNS               = 0;
+    public static final int CARRIER_ACTION_DISABLE_METERED_APNS              = 1;
+    public static final int CARRIER_ACTION_DISABLE_RADIO                     = 2;
+    public static final int CARRIER_ACTION_ENABLE_RADIO                      = 3;
+    public static final int CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION          = 4;
+    public static final int CARRIER_ACTION_SHOW_NO_DATA_SERVICE_NOTIFICATION = 5;
+    public static final int CARRIER_ACTION_CANCEL_ALL_NOTIFICATIONS          = 6;
+</pre>
+
+<p class="note"><strong>注意</strong>:如果运营商实现了自己的独立应用,则可以为本部分中介绍的信号之外的其他信号实现支持。他们还可以定义和配置自己的操作。</p>
+
+<h3 id="default-signal-action-mappings">默认“信号-操作”映射</h3>
+
+<p>可以按照以下步骤配置默认操作:</p>
+
+<ol>
+<li>为支持的信号定义键。
+<p><code>CarrierConfigManager.java</code> 中定义了默认的“信号-操作”映射。每个支持的信号都有一个键:</p>
+
+<pre class="devsite-click-to-copy">
+public static final String KEY_CARRIER_DEFAULT_ACTIONS_ON_REDIRECTION_STRING_ARRAY = "carrier_default_actions_on_redirection_string_array";
+public static final String KEY_CARRIER_DEFAULT_ACTIONS_ON_DCFAILURE_STRING_ARRAY =
+"carrier_default_actions_on_dcfailure_string_array";
+</pre></li>
+
+<li>将默认操作与信号键相关联。
+<p>默认操作 ID 会与信号键相关联:</p>
+
+<pre class="devsite-click-to-copy">
+sDefaults.putStringArray(KEY_CARRIER_DEFAULT_ACTIONS_ON_REDIRECTION_STRING_ARRAY,                new String[]{
+                "1, 4"
+                //1: CARRIER_ACTION_SHOW_PORTAL_NOTIFICATION
+                //4: CARRIER_ACTION_DISABLE_METERED_APNS
+         });
+</pre>
+
+<p>电话框架会将这些操作映射到相应的信号。</p>
+</li>
+</ol>
+
+<h3>覆盖默认操作</h3>
+
+<p>通过将操作 ID 与信号键(在 <code>CarrierConfigManager.java</code> 中定义)相关联,您可以为运营商配置 XML 文件中的受支持信号定义自定义操作。例如,以下映射会停用按流量计费的 APN,并会在重定向时显示门户网站通知:</p>
+
+<pre class="devsite-click-to-copy">
+&lt;string-array name="carrier_default_actions_on_redirection_string_array" num="2"&gt;
+            &lt;item value="1" /&gt;
+            &lt;item value="4" /&gt;
+&lt;/string-array&gt;
+</pre>
+
+<p>电话框架会加载这些配置并覆盖默认操作。</p>
+
+<h2 id="validation">验证</h2>
+
+<p>没有针对该功能的 CTS、CTS 验证程序或 GTS 测试。</p>
+
+<p>您可以按照以下手动验证测试来验证该功能:</p>
+
+<ol>
+<li>验证电信服务商在设备流量用完时的信号通知。
+</li><li>验证在流量用完状态和 WLAN 关闭期间的流量重定向限制。
+</li><li>验证在流量用完状态期间网络流量是否会被关闭并且系统是否会显示通知界面。
+</li><li>验证在流量用完状态期间的语音通话/VoLTE 功能。
+</li><li>验证在流量用完状态下视频通话是否会被屏蔽。
+</li><li>在启用 WLAN 的情况下,验证在流量用完状态下用户是否可以继续浏览网页,并且浏览流量是否不会开启网络流量。
+</li><li>验证在流量用完状态期间的 WLAN、WFC 和蓝牙功能。
+</li><li>关闭 WLAN。验证流量用完通知界面,并验证普通浏览流量是否不会被重定向到电信服务商的注册网站。验证在点击通知界面中的链接后是否会使浏览器转到电信服务商的注册网站。
+</li><li>验证切换飞行模式是否不会重置流量限制状态。
+</li><li>验证换用可正常使用的 SIM 卡是否会重置网络流量状态。
+</li><li>验证重新插入流量用完的 SIM 卡是否会重新启动流量重定向并再次开启网络流量限制。
+</li><li>验证重新启动手机是否会重新启用重定向并恢复流量限制和通知界面。</li><li>点按“captiveportal”通知。验证是否建立了受限网络连接以允许用户充值。
+</li><li>验证 SIM 卡重新充值或重新启用是否会使移动网络流量恢复,以及电信服务商链接和流量用完通知是否会消失。
+</li><li>移动网络服务恢复后的健康测试。
+</li></ol>
+
+<p>默认应用提供了一些单元测试示例和一个用于运行它们的脚本(请参阅 <code>tests/runtest.sh</code>)。实现自定义版本或行为时,您应将这些自定义镜像到专用的单元测试。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/dalvik/configure.html b/zh-cn/devices/tech/dalvik/configure.html
index 9d7dfb1..52ceca4 100644
--- a/zh-cn/devices/tech/dalvik/configure.html
+++ b/zh-cn/devices/tech/dalvik/configure.html
@@ -20,183 +20,218 @@
       limitations under the License.
   -->
 
-<p>本文讨论如何配置 ART 及其编译选项。本文涉及的主题包括系统映像的预编译配置、首次启动时(及 OTA 后)的 dex2oat 编译选项,以及如何在系统分区空间、数据分区空间和性能三者之间取得平衡。</p>
+<p>本页中介绍了如何配置 ART 及其编译选项。讨论的主题包括:系统映像预编译配置、dex2oat 编译选项,以及如何在系统分区空间、数据分区空间和性能这三者之间取得平衡。</p>
 
-<p>请参阅 <a href="http://source.android.com/devices/tech/dalvik/index.html">ART 与 Dalvik</a>、<a href="http://source.android.com/devices/tech/dalvik/dex-format.html">Dalvik 可执行文件格式</a>以及 source.android.com 上的其他页面,了解如何使用 ART。请参阅<a href="http://developer.android.com/guide/practices/verifying-apps-art.html">在 Android Runtime (ART) 上验证应用行为</a>,确保您的应用运行正常。</p>
+<p>请参阅 <a href="http://source.android.com/devices/tech/dalvik/index.html">ART 和 Dalvik</a>、<a href="http://source.android.com/devices/tech/dalvik/dex-format.html">Dalvik 可执行文件格式</a>,以及 source.android.com 上的其他页面,了解如何使用 ART。请参阅<a href="http://developer.android.com/guide/practices/verifying-apps-art.html">在 Android Runtime (ART) 上验证应用行为</a>,了解如何确保您的应用能够正常运行。</p>
 
-<h2 id="how_art_works">ART 的工作原理</h2>
+<h2 id="how_art_works">ART 的运作方式</h2>
 
-<p>ART 是面向 Android 5.0(Lollipop 或 L)版本及更高版本推出的新 Android 运行时。Dalvik 将不再可用。</p>
+<p>ART 使用预先 (AOT) 编译,并且从 Android 7.0(Nougat 或 N)开始使用 AOT、即时 (JIT) 编译和配置文件引导型编译的混合组合。所有这些编译模式的组合均可配置,我们将在本部分中对此进行介绍。例如,Pixel 设备配置了以下编译流程:</p>
+<ol>
+<li>最初安装应用时不进行任何 AOT 编译。应用在前几次运行时,系统会对其进行解译,并且会对经常执行的方法进行 JIT 编译。</li>
+<li>当设备闲置和充电时,编译守护进程会运行,以便根据在应用前几次运行期间生成的配置文件对常用代码进行 AOT 编译。</li>
+<li>下一次重新启动应用时将会使用配置文件引导型代码,并避免在运行时对已经过编译的方法进行 JIT 编译。在应用后续运行期间被 JIT 编译的方法将会被添加到配置文件中,然后编译守护进程将会收集这些方法。</li>
+</ol>
 
-<p>请注意,本节仅简要介绍 ART 的配置。如需深入了解,请参阅 2014 年 Google I/O 大会上有关 <a href="https://www.google.com/events/io/io14videos/b750c8da-aebe-e311-b297-00155d5066d7">Android Runtime</a> 的演示内容。</p>
-
-<p>ART 采用预先 (AOT) 编译的方法。这意味着,在安装时,dex 代码会被编译为 OAT 文件中的原生代码,并替换 Dalvik 的 odex 文件。这种做法有以下几点意义:</p>
-
+<p>ART 包括一个编译器(<code>dex2oat</code> 工具)和一个为启动 Zygote 而加载的运行时 (<code>libart.so</code>)。<code>dex2oat</code> 工具将会收到一个 APK 文件,并生成一个或多个编译软件工件文件,然后运行时将会加载这些文件。文件的个数、扩展名和名称会因版本而异,但从 Android O 版本开始,将会生成以下文件:</p>
 <ul>
-  <li>与 Dalvik 相比,性能得到了提高。在实验室中测得的能耗也有相应的改善。
-  </li><li>没有运行时代码缓存。OAT 文件被映射到内存(因此可分页)。从 Proportional Set Size(简称 PSS,或各进程之间平均共享的内存)来看,OAT 文件占用的 RAM 内存似乎更大了。不过,我们发现,由于 OAT 文件可分页,而 Dalvik JIT 缓存不可分页,因此就实际内存压力而言,对系统的影响反而有所减轻。
-  </li><li>与 zygote 中的预加载类相似,ART 在编译时会尝试预先初始化一组类。这会创建一个“boot.art”文件,其中包含预先初始化的类和相关对象的压缩堆的映像。此文件会在 zygote 启动时映射到内存中。尽管这会占用额外的存储空间(通常为 10MB),但它可以加快 zygote 的启动,并可以创造机会,让系统在内存压力较大的情况下能够交换出某些预先加载的类。此外,这还有助于改善 ART 的<a href="http://source.android.com/devices/tech/config/low-ram.html">低 RAM</a> 性能,因为在 Dalvik 中,大部分此类信息都存储在线性分配空间的脏页中。
-  </li><li>Dex 文件编译使用名为 dex2oat 的工具,比 dexopt 更耗时。所增加的时间各有不同,但是编译时间增加 2-3 倍的情况并不少见。例如,使用 dexopt 通常只需 1 秒就能安装的应用,如果使用 dex2oat,则可能需要 2-3 秒。
-  </li><li>如果启用全编译,则 OAT 文件比 odex 文件大。我们会在本文档的后面部分讨论降低此成本的选项。
-</li></ul>
+<li><code>.vdex</code>:其中包含 APK 的未压缩 DEX 代码,另外还有一些旨在加快验证速度的元数据。</li>
+<li><code>.odex</code>:其中包含 APK 中的方法的代码(已经过 AOT 编译)。</li>
+<li><code>.art (optional)</code>:其中包含 APK 中列出的某些字符串和类的 ART 内部表示,用于加快应用启动速度。</li>
+</ul>
 
 <h2 id="compilation_options">编译选项</h2>
 
-<p>与 dexopt 相比,Dex 文件编译需要更多时间,特别是在首次启动(恢复出厂设置或接收 OTA 后)过程中必须编译用户的所有应用时,这一点尤为明显。为了减少所需的编译量,ART 支持对系统分区中的库和应用进行预先优化的选项。纳入预先优化的 dex 文件会占用系统映像的空间。因此,这些选项实际是以牺牲首次启动时间来换取系统映像大小。请注意,OTA 相对而言不是太频繁,并且之后的启动时间,无论是否进行预先优化,都应该是相同的。</p>
+<p>ART 的编译选项分为以下两个类别:
+</p><ol>
+<li>系统 ROM 配置:编译系统映像时,会对哪些代码进行 AOT 编译。</li>
+<li>运行时配置:ART 如何在设备上编译和运行应用。</li>
+</ol>
+<p></p>
 
-<h3 id="undefined">WITH_DEXPREOPT</h3>
+<p>用于配置这两个类别的一个核心 ART 选项是编译过滤器。<em></em>编译过滤器可控制 ART 如何编译 DEX 代码,是一个传递给 <code>dex2oat</code> 工具的选项。从 Android O 开始,有四个官方支持的过滤器:</p>
+<ul>
+<li>verify:只运行 DEX 代码验证。<em></em></li>
+<li>quicken:运行 DEX 代码验证,并优化一些 DEX 指令,以获得更好的解译器性能。<em></em></li>
+<li>speed:运行 DEX 代码验证,并对所有方法进行 AOT 编译。<em></em></li>
+<li>speed-profile:运行 DEX 代码验证,并对配置文件中列出的方法进行 AOT 编译。<em></em></li>
+</ul>
 
-<p>预先优化由构建选项 <code>WITH_DEXPREOPT</code> 控制。在 L 版本之前,该选项在“用户”构建中默认启用。自 L 版本起,该选项为选择启用的选项,需要在产品配置(如设备的 BoardConfig.mk 文件)中启用。</p>
+<h3 id="system_rom">系统 ROM 配置</h3>
 
-<p>启用 <code>WITH_DEXPREOPT</code> 会导致对系统映像中的所有内容进行预先优化。如果这会导致系统映像过大,则可以指定其他选项来减少预先优化量。请注意,以下名称中带有“PREOPT”的所有构建选项都必须启用 <code>WITH_DEXPREOPT</code> 才能工作。</p>
+<p>有一些 ART 编译选项可用于配置系统 ROM。如何配置这些选项取决于 <code>/system</code> 的可用存储空间以及预先安装的应用数量。编译到系统 ROM 的 JAR/APK 可以分为以下四个类别:</p>
+<ul>
+<li>启动相关的类路径代码:默认使用 speed 编译过滤器进行编译。<em></em></li>
+<li>系统服务器代码:默认使用 speed 编译过滤器进行编译。<em></em></li>
+<li>产品专属的核心应用:默认使用 speed 编译过滤器进行编译。<em></em></li>
+<li>所有其他应用:默认使用 quicken 编译过滤器进行编译。<em></em></li>
+</ul>
 
-<p>使用示例(在产品的 BoardConfig.mk 中):</p>
+<h4 id="build_options">Makefile 选项</h4>
+<ul>
 
-<pre><code>WITH_DEXPREOPT := true</code></pre>
+<li><code>WITH_DEXPREOPT</code></li>
+<p>
+是否针对在系统映像上安装的 DEX 代码调用 <code>dex2oat</code>。默认处于启用状态。
+</p>
 
-<h3 id="dont_dexpreopt_prebuilts">DONT_DEXPREOPT_PREBUILTS</h3>
+<li><code>DONT_DEXPREOPT_PREBUILTS</code>(从 Android 5.0 开始)</li>
+<p>
+启用 <code>DONT_DEXPREOPT_PREBUILTS</code> 可防止对经过预编译的应用进行预先优化。这些都是在 <code>Android.mk</code> 中指定了 <code>include $(BUILD_PREBUILT)</code> 的应用,例如 Gmail。不对可能通过 Google Play 进行更新且经过预编译的应用进行预先优化可以节省 <code>/system</code> 空间,但是会增加首次启动时间。
+</p>
 
-<p>启用 <code>DONT_DEXPREOPT_PREBUILTS</code> 可防止对预构建进行预先优化。这些都是在其 Android.mk 中指定了 <code>include $(BUILD_PREBUILT)</code> 的应用,例如 Gmail。跳过对可能通过 Google Play 进行更新的预构建应用的预先优化,可以节省 /system 空间,但是会增加首次启动的时间。</p>
+<li><code>WITH_DEXPREOPT_BOOT_IMG_ONLY</code></li>
 
-<p>使用示例(在产品的 BoardConfig.mk 中):</p>
+<p>如果启用 <code>WITH_DEXPREOPT_BOOT_IMG_ONLY</code>,将只会预先优化启动相关的类路径。
 
-<pre><code>WITH_DEXPREOPT := true
-DONT_DEXPREOPT_PREBUILTS := true</code></pre>
+</p><li><code>LOCAL_DEX_PREOPT</code></li>
 
-<h3 id="with_dexpreopt_boot_img_only">WITH_DEXPREOPT_BOOT_IMG_ONLY</h3>
+<p>通过在模块定义中指定 <code>LOCAL_DEX_PREOPT</code> 选项,还可以针对个别应用启用或停用预先优化功能。这有助于停用对于可能会立即收到 Google Play 更新的应用的预先优化,因为更新会在已过时的系统映像中执行预先优化的代码。此外,这还有助于在进行主要版本升级 OTA 时节省空间,因为用户的数据分区中可能已经有了较新版本的应用。</p>
 
-<p>启用 <code>WITH_DEXPREOPT_BOOT_IMG_ONLY</code> 只会预先优化启动映像。启动映像由含有映像类的 boot.art 和含有启动相关的类路径代码的 boot.oat 组成。启用该选项可大幅节省 /system 空间,但也意味着在首次启动时会对所有应用进行优化。通常情况下,最好通过 <code>DONT_DEXPREOPT_PREBUILTS</code> 或 add-product-dex-preopt-module-config 选择性地停用应用预先优化功能。</p>
+<p><code>LOCAL_DEX_PREOPT</code> 支持分别通过值“true”和“false”来启用和停用预先优化功能。此外,如果预先优化不应将 <code>classes.dex</code> 文件从 APK 或 JAR 文件中剥离出来,则可以指定“nostripping”。通常情况下,该文件会被剥离出来,因为预先优化之后将不再需要该文件;但若要使第三方 APK 签名仍保持有效,最后的这个选项则是必需的。</p>
 
-<p>使用示例(在产品的 BoardConfig.mk 中):</p>
+<li><code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code></li>
+<p>
+将选项传递给 <code>dex2oat</code> 以控制如何编译启动映像。该选项可用于指定自定义映像类列表、已编译类列表,以及编译过滤器。
+</p>
 
-<pre><code>WITH_DEXPREOPT := true
-WITH_DEXPREOPT_BOOT_IMG_ONLY := true</code></pre>
+<li><code>PRODUCT_DEX_PREOPT_DEFAULT_FLAGS</code></li>
+<p>
+将选项传递给 <code>dex2oat</code> 以控制如何编译除启动映像之外的所有内容。
+</p>
 
-<h3 id="local_dex_preopt">LOCAL_DEX_PREOPT</h3>
+<li><code>PRODUCT_DEX_PREOPT_MODULE_CONFIGS</code></li>
+<p>
+用于为特定模块和产品配置传递 <code>dex2oat</code> 选项。可以通过 <code>$(call add-product-dex-preopt-module-config,&lt;modules&gt;,&lt;option&gt;)</code> 在产品的 <code>device.mk</code> 文件中设置该选项,其中 <code>&lt;modules&gt;</code> 是一个列表,用于列出 JAR 和 APK 文件各自的 LOCAL_MODULE 和 LOCAL_PACKAGE 名称。
+</p>
 
-<p>通过在模块定义中指定 <code>LOCAL_DEX_PREOPT</code> 选项,还可以基于单个应用启用或停用预先优化功能。这有助于停用对于可能会立即收到 Google Play 更新的应用的预先优化,因为更新会在已过时的系统映像中执行预先优化的代码。此外,这还有助于节省主要版本升级 OTA 的空间,因为用户的数据分区中可能已经有了较新版本的应用。</p>
+<li><code>PRODUCT_DEXPREOPT_SPEED_APPS (New in Android O)</code></li>
+<p>
+应用列表,用于列出哪些应用已被确定为产品的核心应用并且最好是使用 speed 编译过滤器进行编译。<em></em>例如,常驻应用(如 SystemUI)只有在下次系统重新启动时才有机会使用配置文件引导型编译,因此对于产品来说,让这些应用始终采用 AOT 编译可能会更好。
+</p>
 
-<p><code>LOCAL_DEX_PREOPT</code> 支持通过值“true”和“false”分别表示启用和停用预先优化。此外,如果预先优化不应将 classes.dex 文件从 apk 或 jar 文件中剥离,还可以指定“nostripping”。通常情况下,此文件会被剥离,因为预先优化之后便不再需要该文件;但若要使第三方 APK 签名保持有效状态,则最后一个选项必不可少。</p>
+<li><code>PRODUCT_SYSTEM_SERVER_APPS (New in Android O)</code></li>
+<p>
+系统服务器加载的应用的列表。这些应用将默认使用 speed 编译过滤器进行编译。<em></em>
+</p>
 
-<p>使用示例(在应用的 Android.mk 中):</p>
+<li><code>PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Post Android O)</code></li>
+<p>
+是否在设备上包含 ART 的调试版本。默认情况下,系统会针对 userdebug 和 eng 细分版本启用该选项。可以通过将该选项明确设为“true”或“false”来覆盖此行为。<em></em><em></em>
+</p>
+<p>
+默认情况下,设备将使用非调试版本 (<em>libart.so</em>)。要进行切换,请将系统属性 <code>persist.sys.dalvik.vm.lib.2</code> 设为 <em>libartd.so</em>。
+</p>
 
-<pre><code>LOCAL_DEX_PREOPT := false</code></pre>
+<li><code>WITH_DEXPREOPT_PIC (Removed in Android O)</code></li>
 
-<h3 id="product_dex_preopt_*">PRODUCT_DEX_PREOPT_*</h3>
+<p>在 Android 5.1.0 到 Android 6.0.1 的所有版本中,都可以指定 <code>WITH_DEXPREOPT_PIC</code> 来启用位置无关代码 (PIC)。这样一来,就不必将来自映像的编译代码从 /system 迁移到 /data/dalvik-cache,因此可以节省数据分区中的空间。不过,因为该选项会停用利用位置相关代码进行的优化,所以会对运行时产生轻微的影响。通常情况下,需要节省 /data 空间的设备应启用 PIC 编译。</p>
 
-<p>自 L 之后的 Android 开放源代码项目 (AOSP) 版本起,我们已添加了大量标记,以进一步控制预先优化的执行方式。<code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code> 将选项传递给 dex2oat 以控制启动映像的编译方式。该选项可用于指定自定义映像类列表、已编译类的列表和编译器过滤器,这些内容将在下文进行介绍。同样,<code>PRODUCT_DEX_PREOPT_DEFAULT_FLAGS</code> 控制传递给 dex2oat 的默认标记,以编译除启动映像之外的所有文件,即 jar 和 apk 文件。</p>
+<p>在 Android 7.0 中,PIC 编译默认处于启用状态。</p>
 
-<p>通过 <code>PRODUCT_DEX_PREOPT_MODULE_CONFIGS</code>,可为特定模块和产品配置传递 dex2oat 选项。这通过 <code>$(call
-add-product-dex-preopt-module-config,&lt;modules&gt;,&lt;option&gt;)</code> 在产品的 device.mk 文件中进行设置,其中 &lt;modules&gt; 为 jar 和 apk 文件各自的 <code>LOCAL_MODULE</code> 和 <code>LOCAL_PACKAGE</code> 名称的列表。借助此标记,可以对每个 dex 文件和特定设备的预先优化进行精细控制。此类微调可让 /system 空间最大限度地用于改进首次启动时间。</p>
+</ul>
 
-<p>使用示例(在产品的 device.mk 中):</p>
+<h4 id="boot_classpath">启动相关的类路径配置</h4>
 
-<pre><code>PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := --compiler-filter=interpret-only
-$(call add-product-dex-preopt-module-config,services,--compiler-filter=space)</code></pre>
-
-<p>通过在产品的 device.mk 文件中指定 <code>$(call
-add-product-dex-preopt-module-config,&lt;modules&gt;,disable)</code>,这些标记还可用于选择性地停用特定模块或软件包的预先优化。</p>
-
-<p>使用示例(产品的 device.mk 中):</p>
-
-<pre><code>$(call add-product-dex-preopt-module-config,Calculator,disable)</code></pre>
-
-<h2 id="other_odex">DEX_PREOPT 文件的首次启动安装</h2>
-
-<p>自 Android 7.0 起,设备可以使用两个系统分区来启用 <a href="/devices/tech/ota/ab_updates.html">A/B 系统更新</a>。要想在控制系统分区大小和实现高效首次启动的同时允许使用 DEX_PREOPT,可以将预选文件安装在未使用的第二个系统分区中。这些文件会在首次启动时被复制到数据分区。</p>
-
-<p>使用示例(在 device-common.mk 中):</p>
-
-<pre><code>PRODUCT_PACKAGES += \
-     cppreopts.sh
-PRODUCT_PROPERTY_OVERRIDES += \
-     ro.cp_system_other_odex=1
-</code></pre>
-
-<p>在设备的 BoardConfig.mk 中:</p>
-<pre><code>BOARD_USES_SYSTEM_OTHER_ODEX := true</code></pre>
-
-<p>如需在系统映像中选择性地包含编译脚本和二进制文件,请参阅<a href="/devices/tech/ota/ab_updates.html#compilation">后台中的应用编译</a>。</p>
-
-<h2 id="preloaded_classes_list">预加载类列表</h2>
+<ul>
+<li>预加载类列表</li>
 
 <p>预加载类列表是 zygote 将在启动时初始化的一个类列表。通过该列表,每个应用无需单独运行这些类初始化程序,从而可以更快地启动并共享内存中的页面。预加载类列表文件默认位于 frameworks/base/preloaded-classes 中,其中包含一个针对典型的手机用途微调的列表。这可能不适用于其他设备(如穿戴式设备),而应进行相应的微调。做微调时应格外小心,因为添加太多的类会造成加载不使用的类而浪费内存;而添加的类太少又会导致每个应用都必须拥有自己的副本,同样会造成内存浪费。</p>
 
 <p>使用示例(在产品的 device.mk 中):</p>
 
-<pre><code>PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/preloaded-classes</code></pre>
+<pre class="devsite-click-to-copy">
+PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/preloaded-classes
+</pre>
 
-<p class="note"><strong>注意</strong>:必须将此行放置于沿用任何从 build/target/product/base.mk 中获得默认值的产品配置 makefile 之前。</p>
+<p class="note"><strong>注意</strong>:必须将此行放在沿用任何从 <code>build/target/product/base.mk</code> 获得默认值的产品配置 Makefile 之前</p>
 
-<h2 id="image_classes_list">映像类列表</h2>
+<li>映像类列表</li>
 
-<p>映像类列表是 dex2oat 预先初始化并存储在 boot.art 文件中的类列表。通过该列表,zygote 可以在启动时从 boot.art 文件中加载这些结果,而无需在预加载期间自行运行这些类的初始化程序。其中一个重要特点是,从映像加载并在进程之间共享的页面是干净的,因此可在内存不足的情况下轻松将它们交换出去。在 L 版本中,默认情况下,映像类列表和预加载类列表使用同一个列表。自 L 之后的 AOSP 版本起,可以使用 <code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code> 指定自定义映像类。</p>
+<p>映像类列表是 dex2oat 预先初始化并存储在 boot.art 文件中的类列表。通过该列表,zygote 可以在启动时从 boot.art 文件中加载这些结果,而无需在预加载期间自行运行这些类的初始化程序。其中一个重要特点是,从映像加载并在进程之间共享的页面是干净的,因此可在内存不足的情况下轻松将它们交换出去。在 L 版本中,默认情况下,映像类列表和预加载类列表使用同一个列表。从 L 之后的 AOSP 版本开始,可以使用以下命令指定自定义映像类列表:</p>
 
-<p>使用示例(在产品的 device.mk 中):</p>
+<pre class="devsite-click-to-copy">
+PRODUCT_DEX_PREOPT_BOOT_FLAGS
+</pre>
 
-<pre><code>PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=&lt;filename&gt;</code></pre>
+<p>使用示例(在产品的 <code>device.mk</code> 中):</p>
 
-<h2 id="compiled_classes_list">已编译类的列表</h2>
+<pre class="devsite-click-to-copy">
+PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=&lt;filename&gt;
+</pre>
 
-<p>在 L 之后的 AOSP 版本中,可以指定使用已编译类的列表,在预先优化期间编译来自启动的类路径的类子集。对于空间非常紧张且无法满足整个预先优化启动映像需求的设备来说,此选项很有帮助。不过,请注意,此列表未指定的类将不会被编译(即使在设备上也不会被编译),且必须对其进行解释,这可能会影响运行时性能。默认情况下,dex2oat 会在 $OUT/system/etc/compiled-classes 中查找已编译类的列表,因此,可以通过 device.mk 将自定义的类列表复制到该位置。此外,还可以使用 <code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code> 指定特定文件位置。</p>
+<li>已编译类列表</li>
 
-<p>使用示例(在产品的 device.mk 中):</p>
+<p>在 L 之后的 AOSP 版本中,可以指定使用已编译类的列表,在预先优化期间编译来自启动的类路径的类子集。对于空间非常紧张且无法满足整个预先优化启动映像需求的设备来说,此选项很有帮助。不过,请注意,此列表未指定的类将不会被编译(即使在设备上也不会被编译),且必须对其进行解释,这可能会影响运行时性能。默认情况下,dex2oat 会在 $OUT/system/etc/compiled-classes 中查找已编译类列表,因此,可以通过 device.mk 将自定义类列表复制到该位置。也可以使用以下命令指定特定文件位置:
 
-<pre><code>PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/compiled-classes</code></pre>
+</p><pre class="devsite-click-to-copy">
+PRODUCT_DEX_PREOPT_BOOT_FLAGS
+</pre>
 
-<p class="note"><strong>注意</strong>:必须将此行放置于沿用任何从 build/target/product/base.mk 中获得默认值的产品配置 makefile 之前。</p>
+<p>使用示例(在产品的 <code>device.mk</code> 中):</p>
 
-<h2 id="compiler_filters">编译器过滤器</h2>
+<pre class="devsite-click-to-copy">
+PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/compiled-classes
+</pre>
 
-<p>在 L 版本中,dex2oat 通过各种编译器过滤器选项来控制其编译方式。传递特定应用的编译器过滤器标记可指定其预先优化的方式。下面对各个可用选项进行了说明:</p>
+<p class="note"><strong>注意</strong>:必须将此行放在沿用任何从 <code>build/target/product/base.mk</code> 获得默认值的产品配置 Makefile 之前</p>
+</ul>
+
+<h3 id="runtime_configuration">运行时配置</h3>
+
+<h4 id="jit_options">Jit 选项</h4>
+
+<p>仅在 ART JIT 编译器可用的情况下,以下选项才会影响 Android 版本。</p>
 
 <ul>
-  <li>everything - 编译几乎所有内容,但太大以致无法通过编译器的内部表示法进行表示的类初始化程序及一些罕见的方法除外。<em></em>
-  </li><li>speed - 编译大多数方法并尽可能提升运行时性能,这是默认选项。<em></em>
-  </li><li>balanced - 尝试在编译投入上获得最佳性能回报。<em></em>
-  </li><li>space - 编译有限数量的方法,并优先编译存储空间相关的部分。<em></em>
-  </li><li>interpret-only - 跳过所有编译并依靠解释器来运行代码。<em></em>
-  </li><li>verify-none - 跳过验证和编译的特殊选项,应仅用于可信系统代码。<em></em>
+<li>dalvik.vm.usejit:是否启用 JIT。</li>
+<li>dalvik.vm.jitinitialsize(默认为 64K):代码缓存初始容量。代码缓存将定期进行垃圾回收 (GC),并将视需要增加。
+</li><li>dalvik.vm.jitmaxsize(默认为 64M):代码缓存最大容量。
+</li><li>dalvik.vm.jitthreshold(默认为 10000):方法的“热度”计数器必须超过该阈值,系统才会对方法进行 JIT 编译。“热度”计数器是运行时的内部指标。它包括调用次数、后向分支及其他因素。
+</li><li>dalvik.vm.usejitprofiles:是否启用 JIT 配置文件;即使 dalvik.vm.usejit 为 false,也可以使用该选项。请注意,如果该选项为 false,编译过滤器 speed-profile 将不会对任何方法进行 AOT 编译,并且相当于 quicken。<em></em><em></em>
+</li><li>dalvik.vm.jitprithreadweight(默认为 dalvik.vm.jitthreshold/20):应用界面线程的 JIT“样本”(请参阅 jitthreshold)的权重。用于加快以下方法的编译速度:当用户与应用交互时,会直接影响用户体验的方法。
+</li><li>dalvik.vm.jittransitionweight(默认为 dalvik.vm.jitthreshold/10):调用时需要在编译代码和解译器之间进行转换的方法的权重。这有助于确保对所涉及的方法进行编译以尽可能减少转换(转换需要很大开销)。
+</li>
+</ul>
+
+<h4 id="pkg_mgr_options">软件包管理器选项</h4>
+
+<p>
+从 Android 7.0 开始,提供了一种用于指定在各个阶段发生的编译/验证级别的通用方式。可以通过系统属性配置编译级别,默认级别为:
+</p>
+
+<ul>
+<li>pm.dexopt.install=quicken</li>
+<p>这是通过 Google Play 安装应用时使用的编译过滤器。要加快安装速度,可以尝试使用 quicken 编译过滤器。<em></em>
+</p>
+<li>pm.dexopt.bg-dexopt=speed-profile</li>
+<p>
+这是在设备闲置、充电以及充满电时使用的编译过滤器。要充分利用配置文件引导型编译并节省存储空间,可以尝试使用 <em>speed-profile</em> 编译过滤器。
+</p>
+<li>pm.dexopt.boot=verify</li>
+<p>
+无线下载更新后使用的编译过滤器。对于该选项,我们<strong>强烈</strong>建议使用 <em>verify</em> 编译过滤器,以免启动时间过长。
+</p>
+<li>pm.dexopt.first-boot=quicken</li><li>
+<p>
+在设备初次启动时使用的编译过滤器。此时使用的过滤器只会影响出厂后的启动时间。对于这种情况,我们建议使用 quicken 过滤器,以免用户在首次使用手机时需要很长时间等待手机启动。<em></em>请注意,如果 <code>/system</code> 中的所有应用都已使用 quicken 编译过滤器进行编译,或者已使用 speed 或 speed-profile 编译过滤器进行编译,<code>pm.dexopt.first-boot</code> 将不会产生任何影响。<em></em><em></em><em></em>
+</p>
+
 </li></ul>
 
-<h2 id="with_dexpreopt_pic">WITH_DEXPREOPT_PIC</h2>
+<h4 id="dex2oat_options">Dex2oat 选项</h4>
 
-<p>在 Android 5.1.0 到 Android 6.0.1 的版本中,可以指定 <code>WITH_DEXPREOPT_PIC</code> 以启用位置无关代码 (PIC)。这样一来,就不必将来自映像的编译代码从 /system 迁移到 /data/dalvik-cache,因此可以节省数据分区中的空间。不过,因为该选项会停用利用位置相关代码进行的优化,所以会对运行时产生轻微的影响。通常情况下,需要节省 /data 空间的设备应启用 PIC 编译。</p>
+<p>请注意,这些选项在设备编译期间以及预先优化期间都会影响 <code>dex2oat</code>,但是前面讨论的大多数选项都只会影响预先优化。</p>
 
-<p>使用示例(在产品的 device.mk 中):</p>
-
-<pre><code>WITH_DEXPREOPT := true
-WITH_DEXPREOPT_PIC := true</code></pre>
-
-<p>自 Android 7.0 起,PIC 编译默认处于启用状态。</p>
-
-<h2 id="with_art_small_mode">WITH_ART_SMALL_MODE</h2>
-
-<p>对于空间非常有限的设备,可以启用 <code>WITH_ART_SMALL_MODE</code>。此选项仅编译启动相关的类路径,由于跳过了大多数编译,因此可以大大缩短首次启动时间。此选项还可以节省存储空间,因为没有针对应用的编译代码。但是,由于必须解释应用代码,因此这会影响运行时性能。不过,由于仍会编译框架中的大部分性能敏感型代码,因此对运行时性能的影响非常有限,但是在基准化分析中的表现可能会出现退化的情况。</p>
-
-<p>使用示例(在产品的 device.mk 中):</p>
-
-<pre><code>WITH_ART_SMALL_MODE := true</code></pre>
-
-<p>在未来的版本中,该选项可以通过以下代码(在产品的 device.mk 中)来实现,因此会将其移除:</p>
-
-<pre><code>PRODUCT_PROPERTY_OVERRIDES += \
-     dalvik.vm.dex2oat-filter=interpret-only \
-     dalvik.vm.image-dex2oat-filter=speed</code></pre>
-
-<h2 id="dalvik_vm_properties">dalvik.vm 属性</h2>
-
-<p>ART 中的大多数 dalvik.vm 属性都与 Dalvik 类似,但是新增了以下属性。请注意,这些选项在设备编译期间和预先优化期间都会影响 dex2oat,但是前面讨论的大多数选项只会影响预先优化。</p>
-
-<p>在 dex2oat 编译启动映像时对其进行控制:</p>
+<p>在 <code>dex2oat</code> 编译启动映像时对其进行控制:</p>
 
 <ul>
-  <li>dalvik.vm.image-dex2oat-Xms:初始堆大小</li><li>dalvik.vm.image-dex2oat-Xmx:最大堆大小</li><li>dalvik.vm.image-dex2oat-filter:编译器过滤器选项</li><li>dalvik.vm.image-dex2oat-threads:要使用的线程数</li></ul>
+  <li>dalvik.vm.image-dex2oat-Xms:初始堆大小</li><li>dalvik.vm.image-dex2oat-Xmx:最大堆大小</li><li>dalvik.vm.image-dex2oat-filter:编译过滤器选项</li><li>dalvik.vm.image-dex2oat-threads:要使用的线程数</li></ul>
 
-<p>在 dex2oat 编译除启动映像之外的所有内容时对其进行控制:</p>
+<p>在 <code>dex2oat</code> 编译除启动映像之外的所有内容时对其进行控制:</p>
 
 <ul>
-  <li>dalvik.vm.dex2oat-Xms:初始堆大小</li><li>dalvik.vm.dex2oat-Xmx:最大堆大小</li><li>dalvik.vm.dex2oat-filter:编译器过滤器选项</li></ul>
+  <li>dalvik.vm.dex2oat-Xms:初始堆大小</li><li>dalvik.vm.dex2oat-Xmx:最大堆大小</li><li>dalvik.vm.dex2oat-filter:编译过滤器选项</li></ul>
 
 <p>Android 6.0 之前的版本提供了一个适用于编译除启动映像之外的所有内容的附加选项:</p>
 <ul>
@@ -208,78 +243,46 @@
 
 <p>Android 7.1 及之后的版本提供了两个选项来控制编译除启动映像之外的所有内容时的内存使用方式:</p>
 <ul>
-  <li>dalvik.vm.dex2oat-very-large:停用 AOT 编译的最小总 dex 文件大小(以字节为单位)</li><li>dalvik.vm.dex2oat-swap:使用 dex2oat 交换文件(用于低内存设备)</li></ul>
+  <li>dalvik.vm.dex2oat-very-large:停用 AOT 编译的最小总 dex 文件大小(以字节为单位)</li><li>dalvik.vm.dex2oat-swap:使用 dex2oat 交换文件(用于内存较低的设备)</li></ul>
 
-<p>控制 dex2oat 的初始堆大小和最大堆大小的选项,可以限制可对哪些应用进行编译,因此不应被减少。</p>
+<p>不应减少用于控制 <code>dex2oat</code> 初始堆大小和最大堆大小的选项,因为它们可以限制可对哪些应用进行编译。</p>
 
-<h2 id="sample_usage">使用示例</h2>
+<h2 id="other_odex">A/B 具体配置</h2>
 
-<p>这些编译器选项的目标是通过利用系统和数据分区中的可用空间,来减少必须由设备执行的 dex2oat 的数量。</p>
+<h3 id="rom_config">ROM 配置</h3>
 
-<p>如果设备具有充足的系统和数据空间,则启用 dex 预先优化十分必要。
+<p>从 Android 7.0 开始,设备可以使用两个系统分区来实现 <a href="/devices/tech/ota/ab_updates.html">A/B 系统更新</a>。为了节省系统分区大小,可以将经过预先优化的文件安装在未使用的第二个系统分区中。在系统首次启动时,这些文件会被复制到数据分区。</p>
 
-</p><p>BoardConfig.mk:</p>
+<p>使用示例(在 <code>device-common.mk</code> 中):</p>
 
-<pre><code>WITH_DEXPREOPT := true</code></pre>
+<pre class="devsite-click-to-copy">
+PRODUCT_PACKAGES += \
+     cppreopts.sh
+PRODUCT_PROPERTY_OVERRIDES += \
+     ro.cp_system_other_odex=1
+</pre>
 
-<p>如果这导致系统映像变得过大,可以尝试停用预构建的预先优化。
+<p>在设备的 <code>BoardConfig.mk</code> 中:</p>
 
-</p><p>BoardConfig.mk:</p>
+<pre class="devsite-click-to-copy">
+BOARD_USES_SYSTEM_OTHER_ODEX := true
+</pre>
 
-<pre><code>WITH_DEXPREOPT := true
-DONT_DEXPREOPT_PREBUILTS := true</code></pre>
+<p>请注意,启动相关的类路径代码、系统服务器代码以及产品专属的核心应用始终会被编译到系统分区。默认情况下,所有其他应用都会被编译到未使用的第二个系统分区。可以使用 <code>SYSTEM_OTHER_ODEX_FILTER</code> 控制此行为,其值默认为:</p>
 
-<p>如果系统映像仍然很大,则可以尝试仅对启动映像进行预先优化。
+<pre class="devsite-click-to-copy">
+SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
+</pre>
 
-</p><p>BoardConfig.mk:</p>
+<h3 id="background_ota">后台 dexopt OTA</h3>
 
-<pre><code>WITH_DEXPREOPT := true
-WITH_DEXPREOPT_BOOT_IMG_ONLY := true</code></pre>
+<p>在启用了 A/B 的设备上,可以在后台对应用进行编译,以更新到新的系统映像。如需在系统映像中选择性地包含编译脚本和二进制文件,请参阅<a href="/devices/tech/ota/ab_updates.html#compilation">后台中的应用编译</a>。可以通过以下命令控制用于此编译的编译过滤器:</p>
+<pre class="devsite-click-to-copy">
+pm.dexopt.ab-ota=speed-profile
+</pre>
 
-<p>不过,如果仅对启动映像进行预先优化,那么所有的应用就只能在首次启动时优化。为了避免出现这种情况,可以将这些高级标记与更精细的控件结合使用,以期预先优化尽可能多的应用。</p>
-
-<p>例如,如果停用对预构建的预先优化可以达到基本适合系统分区,则通过“space”选项编译启动相关的类路径就可以达到完全适合。请注意,这会减少编译启动相关的类路径中的方法,因此有可能会解释更多代码,进而影响运行时性能。
-
-</p><p>BoardConfig.mk:</p>
-
-<pre><code>WITH_DEXPREOPT := true
-DONT_DEXPREOPT_PREBUILTS := true</code></pre>
-
-<p>device.mk:</p>
-
-<pre><code>PRODUCT_DEX_PREOPT_BOOT_FLAGS := --compiler-filter=space</code></pre>
-
-<p>如果设备的系统分区空间非常有限,则可以使用已编译类列表编译启动相关的类路径中的类子集。因为必须对未包含在此列表中的启动相关的类路径方法进行解释,所以可能会影响运行时性能。
-
-</p><p>BoardConfig.mk:</p>
-
-<pre><code>WITH_DEXPREOPT := true
-WITH_DEXPREOPT_BOOT_IMG_ONLY := true</code></pre>
-
-<p>device.mk:</p>
-
-<pre><code>PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/compiled-classes</code></pre>
-
-<p>如果设备的系统分区空间和数据分区空间都很有限,则可以使用编译器过滤器标记来停用对某些应用的编译。在这种情况下,由于不会有任何编译代码,因此会节省系统和数据分区的空间,但是必须对这些应用进行解释。此示例配置会预先优化启动相关的类路径,但会阻止编译不属于预构建的其他应用。不过,为了防止 system_server 出现明显的性能下降,仍会对 services.jar 进行编译,但对空间占用进行了优化。请注意,用户安装的应用仍将使用默认的 speed 编译器过滤器。
-
-</p><p>BoardConfig.mk:</p>
-
-<pre><code>WITH_DEXPREOPT := true
-DONT_DEXPREOPT_PREBUILTS := true</code></pre>
-
-<p>device.mk:</p>
-
-<pre><code>PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := --compiler-filter=interpret-only
-$(call add-product-dex-preopt-module-config,services,--compiler-filter=space)</code></pre>
-
-<p>对于主要版本升级 OTA,由于某些应用可能已过期,因此将它们添加到黑名单以避免对其进行预先优化,会非常有帮助。可以通过指定 <code>LOCAL_DEX_PREOPT</code>(针对所有产品)或使用 <code>PRODUCT_DEX_PREOPT_MODULE_CONFIGS</code>(针对特定产品)来实现。
-
-</p><p>BoardConfig.mk:</p>
-
-<pre><code>WITH_DEXPREOPT := true</code></pre>
-
-<p>Android.mk(已添加到黑名单的应用):</p>
-
-<pre><code>LOCAL_DEX_PREOPT := false</code></pre>
+<p>
+我们建议使用 speed-profile,以充分利用配置文件引导型编译并节省存储空间。<em></em>
+</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/datausage/index.html b/zh-cn/devices/tech/datausage/index.html
index 65f115c..8bce4d8 100644
--- a/zh-cn/devices/tech/datausage/index.html
+++ b/zh-cn/devices/tech/datausage/index.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>数据使用情况技术信息</title>
+    <title>流量消耗情况技术信息</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
diff --git a/zh-cn/devices/tech/debug/asan.html b/zh-cn/devices/tech/debug/asan.html
index a98a943..c8fbb8e 100644
--- a/zh-cn/devices/tech/debug/asan.html
+++ b/zh-cn/devices/tech/debug/asan.html
@@ -20,40 +20,40 @@
       limitations under the License.
   -->
 
-<p>AddressSanitizer (ASan) 是一种基于编译器的快速检测工具,用于检测原生代码中的内存错误。它与 Valgrind(Memcheck 工具)相差无几,不同之处在于,ASan:</p>
+<p>AddressSanitizer (ASan) 是一种基于编译器的快速检测工具,用于检测原生代码中的内存错误。它与 Valgrind(Memcheck 工具)相差不大,但 ASan 具备以下独有特性:</p>
 
 <ul>
-  <li>+ 检测堆栈和全局对象是否有溢出</li><li>- 不检测未初始化的读取和内存泄露</li><li>+ 速度更快(Valgrind 的 20-100x 与其相比,慢 2-3 倍)</li><li>+ 内存占用空间较少</li></ul>
+  <li>+ 会检测堆栈和全局对象是否有溢出</li><li>- 不检测未初始化的读取和内存泄露</li><li>+ 速度更快(Valgrind 的 20-100x 与其相比,慢 2-3 倍)</li><li>+ 内存占用空间较少</li></ul>
 
-<p>本文档介绍了如何使用 AddressSanitizer 构建和运行 Android 平台的组成部分。如果您希望利用 AddressSanitizer 构建独立的(即 SDK/NDK)应用,请改为参阅 <a href="https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid">AddressSanitizerOnAndroid</a> 公共项目网站。</p>
+<p>本文档介绍了如何使用 AddressSanitizer 来编译和运行 Android 平台的各组成部分。如果您希望利用 AddressSanitizer 编译独立的(即 SDK/NDK)应用,请改为参阅 <a href="https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid">AddressSanitizerOnAndroid</a> 公共项目网站。</p>
 
 <p>AddressSanitizer 包括一个编译器 (<code>external/clang</code>) 和一个运行时库 (<code>external/compiler-rt/lib/asan</code>)。</p>
 
-<p class="note"><strong>注意</strong>:请立即使用当前的 master 分支获取对 <a href="#sanitize_target">SANITIZE_TARGET</a> 功能的访问权限,并获取利用 AddressSanitizer 构建整个 Android 平台的能力。否则,您将只能使用 <code>LOCAL_SANITIZE</code>。</p>
+<p class="note"><strong>注意</strong>:使用最新的 master 分支即可获得 <a href="#sanitize_target">SANITIZE_TARGET</a> 功能,并能够使用 AddressSanitizer 一次性编译整个 Android 平台。否则,您将只能使用 <code>LOCAL_SANITIZE</code>。</p>
 
-<h2 id="building_with_clang">使用 Clang 构建</h2>
+<h2 id="building_with_clang">使用 Clang 编译</h2>
 
-<p>要构建使用 ASan 进行测试的二进制文件,第一步是要确保您的代码是使用 Clang 进行构建的。默认情况下,系统会在 master 分支上完成这一步骤,因此您无需执行任何操作。如果您认为自己要测试的模块是使用 GCC 构建的,则可以向构建规则中添加 <code>LOCAL_CLANG:=true</code>,从而切换至 Clang。Clang 可以发现 GCC 遗漏的代码错误。</p>
+<p>要编译使用 ASan 进行测试的二进制文件,第一步是要确保您的代码是使用 Clang 进行编译的。默认情况下,系统会在 master 分支上完成这一步骤,因此您无需执行任何操作。如果您认为自己要测试的模块是使用 GCC 编译的,则可以向编译规则中添加 <code>LOCAL_CLANG:=true</code>,从而切换至 Clang。Clang 可以发现 GCC 遗漏的代码错误。</p>
 
-<h2 id="building_executables_with_addresssanitizer">使用 AddressSanitizer 构建可执行文件</h2>
+<h2 id="building_executables_with_addresssanitizer">使用 AddressSanitizer 编译可执行文件</h2>
 
-<p>将 <code>LOCAL_SANITIZE:=address</code> 添加到可执行文件的构建规则中。</p>
+<p>将 <code>LOCAL_SANITIZE:=address</code> 添加到可执行文件的编译规则中。</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 LOCAL_SANITIZE:=address
 </pre>
 
 <p>检测到错误时,ASan 会向标准输出文件和 <code>logcat</code> 发送一份详细报告,然后让相应进程崩溃。</p>
 
-<h2 id="building_shared_libraries_with_addresssanitizer">使用 AddressSanitizer 构建共享库</h2>
+<h2 id="building_shared_libraries_with_addresssanitizer">使用 AddressSanitizer 编译共享库</h2>
 
-<p>根据 ASan 的工作原理,未采用 ASan 构建的可执行文件将无法使用采用 ASan 构建的库。</p>
+<p>根据 ASan 的工作原理,未采用 ASan 编译的可执行文件将无法使用采用 ASan 编译的库。</p>
 
-<p class="note">注意:如果 ASan 库加载到错误的进程,则在运行时,您会看到开头为 <code>_asan</code> 或 <code>_sanitizer</code> 的未解决错误符号信息。</p>
+<p class="note"><strong>注意</strong>:在运行时,如果 ASan 库加载到错误的进程中,系统将会显示以 <code>_asan</code> 或 <code>_sanitizer</code> 开头的消息,以提示您有无法解决的符号。</p>
 
-<p>要清理多个可执行文件(并非所有这些可执行文件都是使用 ASan 构建的)使用的共享库,您需要获取该库的 2 个副本。要获取副本,建议您针对相应的模块向 <code>Android.mk</code> 中添加以下内容:</p>
+<p>要清理多个可执行文件(并非所有这些可执行文件都是使用 ASan 编译的)使用的共享库,您需要该库的 2 个副本。为此,建议您针对相应的模块向 <code>Android.mk</code> 中添加以下内容:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 LOCAL_SANITIZE:=address
 LOCAL_MODULE_RELATIVE_PATH := asan
 </pre>
@@ -62,27 +62,27 @@
 
 <p>对于系统守护程序,将以下内容添加到 <code>/init.rc</code> 或 <code>/init.$device$.rc</code> 的相应部分。</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 setenv LD_LIBRARY_PATH /system/lib/asan
 </pre>
 
-<p class="warning"><strong>警告</strong>:<code>LOCAL_MODULE_RELATIVE_PATH</code> 设置会将您的库<strong>移动</strong>至 <code>/system/lib/asan</code>,这意味着,如果从头开始重写并重新构建,则会导致库从 <code>/system/lib</code> 中缺失,且很可能会产生无法启动的映像。这是当前构建系统存在的一个令人遗憾的限制。不要重写;而是进行 <code>make -j $N</code> 和 <code>adb
+<p class="warning"><strong>警告</strong>:<code>LOCAL_MODULE_RELATIVE_PATH</code> 设置会将您的库<strong>移至</strong> <code>/system/lib/asan</code>,这意味着,如果从头开始重写并重新编译,将会导致 <code>/system/lib</code> 中缺少该库,并且生成的映像可能会无法启动。这是当前编译系统存在的一个令人遗憾的限制。请不要重写;而是执行 <code>make -j $N</code> 和 <code>adb
 sync</code>。</p>
 
-<p>当通过读取 <code>/proc/$PID/maps</code> 显示相应进程时,验证其使用的是否为来自 <code>/system/lib/asan</code> 的库。如果不是,您可能需要停用 SELinux,如下所示:</p>
+<p>通过读取 <code>/proc/$PID/maps</code>,验证相应进程使用的是否为来自 <code>/system/lib/asan</code> 的库(如果此库存在)。如果不是,您可能需要停用 SELinux,如下所示:</p>
 
-<pre>
-$ adb root
-$ adb shell setenforce 0
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb root</code>
+<code class="devsite-terminal">adb shell setenforce 0</code>
 # restart the process with adb shell kill $PID
 # if it is a system service, or may be adb shell stop; adb shell start.
 </pre>
 
 <h2 id="better_stack_traces">更出色的堆栈跟踪</h2>
 
-<p>AddressSanitizer 使用基于框架指针的快速展开程序,针对程序中的每个内存分配和取消分配事件记录堆栈跟踪。大部分 Android 平台都未使用框架指针进行构建。因此,您通常仅会获得 1 个或 2 个有意义的框架。要解决此问题,请使用 ASan(推荐)或以下方法重新构建库:</p>
+<p>AddressSanitizer 使用基于框架指针的快速展开程序 (unwinder),根据程序中的每个内存分配和取消分配事件来记录堆栈跟踪信息。大部分 Android 平台都未使用框架指针进行编译。因此,您通常仅会获得 1 个或 2 个有意义的框架。要解决此问题,请使用 ASan(推荐)或以下方法重新编译库:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 LOCAL_CFLAGS:=-fno-omit-frame-pointer
 LOCAL_ARM_MODE:=arm
 </pre>
@@ -94,24 +94,24 @@
 <p>最初,ASan 报告中包含对二进制文件和共享库中的偏移量的引用。您可以通过以下两种方法获取源文件和行信息:</p>
 
 <ul>
-  <li>确保 <code>/system/bin</code> 中有 llvm-symbolizer 二进制文件。Llvm-symbolizer 在 <code>third_party/llvm/tools/llvm-symbolizer</code> 的源文件中构建 </li><li>通过 <code>external/compiler-rt/lib/asan/scripts/symbolize.py</code> 脚本过滤报告。
+  <li>确保 <code>/system/bin</code> 中有 llvm-symbolizer 二进制文件。Llvm-symbolizer 根据 <code>third_party/llvm/tools/llvm-symbolizer</code> 中的源文件进行编译 </li><li>通过 <code>external/compiler-rt/lib/asan/scripts/symbolize.py</code> 脚本过滤报告。
 </li></ul>
 
 <p>由于可以使用主机上的符号化库,因此第二种方法可以提供更多数据(即 file:line 位置)。</p>
 
 <h2 id="addresssanitizer_in_the_apps">应用中的 AddressSanitizer</h2>
 
-<p>AddressSanitizer 无法了解 Java 代码的情况,但可以检测 JNI 库中的错误。为此,您需要使用 ASan 构建可执行文件,在此情况下是 <code>/system/bin/app_process(<em>32|64</em></code>)。这样一来,便可以同时启用设备上所有应用中的 ASan,这会给设备带来一点压力,但 2GB RAM 设备可以从容处理任何情况。</p>
+<p>AddressSanitizer 无法检查 Java 代码,但可以检测 JNI 库中的错误。因此,您需要使用 ASan 编译可执行文件(在此情况下是 <code>/system/bin/app_process(<em>32|64</em>)</code>)。这将在设备上的所有应用中同时启用 ASan,这会给设备带来一些压力,但 2GB 内存的设备可以从容处理这种情况。</p>
 
-<p>向 <code>frameworks/base/cmds/app_process</code> 中的 app_process 构建规则添加常规 <code>LOCAL_SANITIZE:=address</code>。暂时忽略同一文件中的 <code>app_process__asan</code> 目标(如果当您阅读该文档时仍存在于文件中)。修改 <code>system/core/rootdir/init.zygote(<em>32|64</em>).rc</code> 中的 Zygote 记录,以添加以下行:</p>
+<p>向 <code>frameworks/base/cmds/app_process</code> 中的 app_process 编译规则添加常规 <code>LOCAL_SANITIZE:=address</code>。暂时忽略同一个文件中的 <code>app_process__asan</code> 目标(如果在您阅读该文件时这个目标仍存在于其中)。在 <code>system/core/rootdir/init.zygote(<em>32|64</em>).rc</code> 中修改 Zygote 记录,以添加以下行:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 setenv LD_LIBRARY_PATH /system/lib/asan:/system/lib
 setenv ASAN_OPTIONS
 allow_user_segv_handler=true
 </pre>
 
-<p>构建,进行 adb 同步,fastboot 刷写启动,然后重新启动。</p>
+<p>编译,然后依次执行以下命令:adb sync、fastboot flash boot、reboot。</p>
 
 <h2 id="using_the_wrap_property">使用 wrap 属性</h2>
 
@@ -119,49 +119,49 @@
 
 <p>为实现这一目标,您可以借助“wrap”属性(用于在 Valgrind 下运行应用的同一属性)启动应用。下面是在 ASan 下运行 Gmail 应用的示例:</p>
 
-<pre>
-$ adb root
-$ adb shell setenforce 0  # disable SELinux
-$ adb shell setprop wrap.com.google.android.gm "asanwrapper"
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb root</code>
+<code class="devsite-terminal">adb shell setenforce 0  # disable SELinux</code>
+<code class="devsite-terminal">adb shell setprop wrap.com.google.android.gm "asanwrapper"</code>
 </pre>
 
-<p>在这种情况下,asanwrapper 会将 <code>/system/bin/app_process</code> 重写至 <code>/system/bin/asan/app_process</code>(使用 AddressSanitizer 构建)。此外,它还会在动态库搜索路径的开头处添加 <code>/system/lib/asan</code>。这样一来,借助 asanwrapper 运行应用时,与 <code>/system/lib</code> 中的普通库相比,系统更倾向于使用 <code>/system/lib/asan</code> 中用 ASan 进行测试的库。</p>
+<p>在这种情况下,asanwrapper 会将 <code>/system/bin/app_process</code> 重写至 <code>/system/bin/asan/app_process</code>(使用 AddressSanitizer 编译)。此外,它还会在动态库搜索路径的开头处添加 <code>/system/lib/asan</code>。这样一来,借助 asanwrapper 运行应用时,与 <code>/system/lib</code> 中的普通库相比,系统更倾向于使用 <code>/system/lib/asan</code> 中用 ASan 进行测试的库。</p>
 
 <p>同样,如果发现错误,应用会崩溃,且系统会将报告记录到日志中。</p>
 
 <h2 id="sanitize_target">SANITIZE_TARGET</h2>
 
-<p>master 分支支持立即使用 AddressSanitizer 构建整个 Android 平台。</p>
+<p>master 分支支持使用 AddressSanitizer 一次性编译整个 Android 平台。</p>
 
-<p>在同一构建树中运行以下命令。</p>
+<p>在同一编译树中运行以下命令。</p>
 
-<pre>
-$ make -j42
-$ SANITIZE_TARGET=address make -j42
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">make -j42</code>
+<code class="devsite-terminal">SANITIZE_TARGET=address make -j42</code>
 </pre>
 
 <p>在此模式下,<code>userdata.img</code> 中包含其他库,必须也刷写到设备上。请使用以下命令行:</p>
 
-<pre>
-$ fastboot flash userdata &amp;&amp; fastboot flashall
+<pre class="devsite-terminal devsite-click-to-copy">
+fastboot flash userdata &amp;&amp; fastboot flashall
 </pre>
 
 <p>写入时,现今的 Nexus 和 Pixel 设备会启动到该模式中的界面。</p>
 
-<p>其工作原理是构建两组共享库:<code>/system/lib</code> 中的常规库(第一次 make 调用),<code>/data/asan/lib</code> 中使用 ASan 进行测试的库(第二次 make 调用)。第二次构建中的可执行文件会覆盖第一次构建中的可执行文件。通过使用 PT_INTERP 中的“/system/bin/linker_asan”,使用 ASan 进行测试的可执行文件会获得一个不同的库搜索路径,该路径会在 <code>/system/lib</code> 前添加 <code>/data/asan/lib</code>。</p>
+<p>其工作原理是编译两组共享库:<code>/system/lib</code> 中的常规库(第一次 make 调用),<code>/data/asan/lib</code> 中使用 ASan 进行测试的库(第二次 make 调用)。第二次编译出的可执行文件会覆盖第一次编译出的可执行文件。通过使用 PT_INTERP 中的“/system/bin/linker_asan”,使用 ASan 进行测试的可执行文件会获得一个不同的库搜索路径,该路径会在 <code>/system/lib</code> 前添加 <code>/data/asan/lib</code>。</p>
 
-<p>如果 <code>$SANITIZE_TARGET</code> 值已更改,则构建系统会重写中间对象目录。这样一来,系统便会强制重新构建所有目标,同时保留 <code>/system/lib</code> 下已安装的二进制文件。</p>
+<p>如果 <code>$SANITIZE_TARGET</code> 值已更改,则编译系统会重写中间对象目录。这样一来,系统便会强制重新编译所有目标,同时保留 <code>/system/lib</code> 下已安装的二进制文件。</p>
 
-<p>以下目标不能使用 ASan 进行构建:</p>
+<p>以下目标不能使用 ASan 进行编译:</p>
 
 <ul>
   <li>静态关联的可执行文件。
   </li><li><code>LOCAL_CLANG:=false</code> 目标</li><li>不会针对 <code>SANITIZE_TARGET=address</code> 进行 ASan 操作的 <code>LOCAL_SANITIZE:=false</code>
 </li></ul>
 
-<p>在 SANITIZE_TARGET 构建中,系统会跳过此类可执行文件,且会将第一次 make 调用中的版本留在 <code>/system/bin</code> 中。</p>
+<p>在 SANITIZE_TARGET 编译中,系统会跳过此类可执行文件,且会将第一次 make 调用中的版本留在 <code>/system/bin</code> 中。</p>
 
-<p>此类库只是未使用 ASan 进行构建,但它们仍然可以包含一些来自自己依赖的静态库的 ASan 代码。</p>
+<p>此类库只是未使用 ASan 进行编译,但它们仍然可以包含一些来自自己依赖的静态库的 ASan 代码。</p>
 
 <h2 id="supporting_documentation">支持文档</h2>
 
diff --git a/zh-cn/devices/tech/debug/gdb.html b/zh-cn/devices/tech/debug/gdb.html
index cd5222a..2ae357f 100644
--- a/zh-cn/devices/tech/debug/gdb.html
+++ b/zh-cn/devices/tech/debug/gdb.html
@@ -64,7 +64,7 @@
 <p>要调试应用启动,请使用“设置”中的开发者选项,指示应用等待附加 Java 调试程序:</p>
 
 <ol>
-<li>请依次转到“设置”&gt;“开发者选项”&gt;“选择调试应用”,并从列表中选择您的应用,然后按<em></em><strong>等待调试程序</strong>。</li>
+<li><em></em>请依次转到“设置”&gt;“开发者选项”&gt;“选择调试应用”,并从列表中选择您的应用,然后按<strong>等待调试程序</strong>。</li>
 
 <li>启动应用,您可以从启动器启动,也可以在命令行中运行以下命令来启动:<pre class="devsite-terminal devsite-click-to-copy">
 am start -a android.intent.action.MAIN -n <var>APP_NAME</var>/.<var>APP_ACTIVITY</var>
diff --git a/zh-cn/devices/tech/debug/native-crash.html b/zh-cn/devices/tech/debug/native-crash.html
index e5018bd..ab29c63 100644
--- a/zh-cn/devices/tech/debug/native-crash.html
+++ b/zh-cn/devices/tech/debug/native-crash.html
@@ -27,12 +27,13 @@
 <p>以下部分详细介绍了最常见的几类原生代码崩溃问题。每类崩溃问题都包含一段 <code>debuggerd</code> 输出示例,其中的关键证据可以帮助您区分特定类型的崩溃问题(以橙色斜体突出显示)。
 </p>
 <h3 id="abort">中止</h3>
-<p>中止操作很有趣,因为这是刻意而为。中止方法多种多样(包括调用 <code><a href="http://man7.org/linux/man-pages/man3/abort.3.html">abort(3)</a></code>、<code><a href="http://man7.org/linux/man-pages/man3/assert.3.html">assert(3)</a></code> 失败、使用 Android 专用的严重记录类型之一),但所有这些方法都涉及调用 <code>abort</code>。调用 <code>abort</code> 基本上表示调用的线程附加了 SIGABRT,因此在 <code>libc.so</code> 中有 SIGABRT 并显示“abort”的帧是要在 <code>debuggerd</code> 的输出中查找以识别这种情况。
+<p>中止操作很有趣,因为这是刻意而为。有多种中止方法(包括调用 <code><a href="http://man7.org/linux/man-pages/man3/abort.3.html">abort(3)</a></code>、使 <code><a href="http://man7.org/linux/man-pages/man3/assert.3.html">assert(3)</a></code> 失败、使用 Android 特有的严重记录类型之一),但所有这些方法都涉及调用 <code>abort</code>。调用 <code>abort</code> 基本上会向调用线程发出 SIGABRT 信号,因此要识别这种情况,需要在 <code>debuggerd</code> 输出中查找以下两项内容:<code>libc.so</code> 中显示“abort”的帧,以及 SIGABRT 信号。</p>
 
-</p><p>如上文所述,可能会显示明确的“中止消息”行。不过,您还应该查看 <code>logcat</code> 输出,看看此线程在刻意终止自身之前记录的内容,因为基本的中止基元不接受消息。
+<p>如上文所述,可能会显示明确的“中止消息”行。不过,您还应该查看 <code>logcat</code> 输出,看看此线程在刻意终止自身之前记录的内容,因为基本的中止基元不接受消息。
 </p>
-<p>旧版 Android(特别是 32 位 ARM 的 Android)遵循原始中止调用(此处为帧 4)与信号实际发送(此处为帧 0)之间的复杂路径:</p>
-<pre class="no-pretty-print">
+<p>在原始中止调用(此处为帧 4)与实际发送信号(此处为帧 0)之间,较低版本的 Android(特别是运行在 32 位 ARM 上的 Android)需要遵循复杂的路径:
+</p>
+<pre class="devsite-click-to-copy">
 pid: 1656, tid: 1656, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
 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'
@@ -52,7 +53,10 @@
     #08 pc 00016795  /system/lib/libc.so (__libc_init+44)
     #09 pc 00000abc  /system/xbin/crasher
 </pre>
-<p>较新版本直接从 <code>abort</code> 调用 <code><a href="http://man7.org/linux/man-pages/man2/tgkill.2.html">tgkill(2)</a></code>,因此您在到达所关注帧之前需要跳过的堆栈帧更少:</p><pre class="no-pretty-print">pid: 25301, tid: 25301, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
+<p>较新版本则直接从 <code><a href="http://man7.org/linux/man-pages/man2/tgkill.2.html">tgkill(2)</a></code> 调用 <code>abort</code>,因此您在到达感兴趣的帧之前需要跳过的堆栈帧会较少:</p>
+
+<pre class="devsite-click-to-copy">
+pid: 25301, tid: 25301, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
 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
@@ -73,10 +77,11 @@
 <h3 id="nullpointer">纯 Null 指针解引用</h3>
 <p>这是典型的原生代码崩溃问题,虽然它只是下一类崩溃问题的特殊情况,但值得单独说明,因为这类崩溃问题通常无需细细思量。
 </p>
-<p>在以下示例中,尽管崩溃函数在 <code>libc.so</code> 中,但因为字符串函数仅在指定给它们的指针上进行操作,所以您可以推断出 <code><a href="http://man7.org/linux/man-pages/man3/strlen.3.html">strlen(3)</a></code> 通过 Null 指针进行调用,且此类崩溃问题应直接发送给调用代码的作者。在这种情况下,帧 #01 是不良调用程序。
+<p>在以下示例中,尽管崩溃函数在 <code>libc.so</code> 中,但因为字符串函数仅在指定给它们的指针处进行操作,所以您可以推断出在调用 <code><a href="http://man7.org/linux/man-pages/man3/strlen.3.html">strlen(3)</a></code> 时指定的是 Null 指针;对于此类崩溃问题,应直接找调用代码的作者加以解决。在这种情况下,帧 #01 是不良调用程序。
 </p>
 
-<pre class="no-pretty-print">pid: 25326, tid: 25326, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
+<pre class="devsite-click-to-copy">
+pid: 25326, tid: 25326, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
 signal 11 (<i style="color:Orange">SIGSEGV</i>), code 1 (SEGV_MAPERR), <i style="color:Orange">fault addr 0x0</i>
     r0 00000000  r1 00000000  r2 00004c00  r3 00000000
     r4 ab088071  r5 fff92b34  r6 00000002  r7 fff92b40
@@ -95,10 +100,13 @@
 strlen-NULL</code> 重现此类崩溃问题的实例
 </p>
 <h3 id="lowaddress">低地址 Null 指针解引用</h3>
-<p>在许多情况下,故障地址不会为 0,而是其他一些小数字。两位或三位地址尤其常见,而六位地址几乎肯定不是 Null 指针解引用 - 这需要 1 MiB 的偏移量。通常,当您有代码将 Null 指针解引用为看似有效的结构时,就会发生这种情况。常见的函数是 <code><a href="http://man7.org/linux/man-pages/man3/fprintf.3.html">fprintf(3)</a></code>(或任何其他使用 FILE* 的函数)和 <code><a href="http://man7.org/linux/man-pages/man3/readdir.3.html">readdir(3)</a></code>,因为代码通常无法确认是 <code><a href="http://man7.org/linux/man-pages/man3/fopen.3.html">fopen(3)</a></code> 还是 <code><a href="http://man7.org/linux/man-pages/man3/opendir.3.html">opendir(3)</a></code> 实际首先成功调用。
+<p>在许多情况下,故障地址不会为 0,而是其他一些小数字。两位或三位地址尤其常见,而六位地址几乎肯定不是 Null 指针解引用 - 这需要 1 MiB 的偏移量。通常,当您有代码将 Null 指针解引用为看似有效的结构时,就会发生这种情况。常见的函数是 <code><a href="http://man7.org/linux/man-pages/man3/fprintf.3.html">fprintf(3)</a></code>(或任何其他使用 FILE* 的函数)和 <code><a href="http://man7.org/linux/man-pages/man3/readdir.3.html">readdir(3)</a></code>,因为代码通常无法检查实际上先成功的是 <code><a href="http://man7.org/linux/man-pages/man3/fopen.3.html">fopen(3)</a></code> 还是 <code><a href="http://man7.org/linux/man-pages/man3/opendir.3.html">opendir(3)</a></code> 调用。
+</p>
 
-</p><p>以下是 <code>readdir</code> 的示例:</p>
-<pre class="no-pretty-print">pid: 25405, tid: 25405, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
+<p>以下是 <code>readdir</code> 的示例:</p>
+
+<pre class="devsite-click-to-copy">
+pid: 25405, tid: 25405, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
 signal 11 (<i style="color:Orange">SIGSEGV</i>), code 1 (SEGV_MAPERR), <i style="color:Orange">fault addr 0xc</i>
     r0 0000000c  r1 00000000  r2 00000000  r3 3d5f0000
     r4 00000000  r5 0000000c  r6 00000002  r7 ff8618f0
@@ -114,9 +122,9 @@
     #05 pc 000177a1  /system/lib/libc.so (__libc_init+48)
     #06 pc 00001110  /system/xbin/crasher (_start+96)
 </pre>
-<p>这里,崩溃问题的直接原因是 <code><a href="http://man7.org/linux/man-pages/man3/pthread_mutex_lock.3p.html">pthread_mutex_lock(3)</a></code> 尝试访问地址 0xc(帧 0)。但是 <code>pthread_mutex_lock</code> 执行的第一项操作是解引用指定给它的 <code>pthread_mutex_t*</code> 的 <code>state</code> 元素。如果您查看源代码,则会发现该元素在结构中的偏移量为零,这表示指定给 <code>pthread_mutex_lock</code> 的指针 0xc 无效。从帧 1 可以看出,<code>readdir</code> 将该指针指定给它,这会从指定的 <code>DIR*</code> 中提取 <code>mutex_</code> 字段。通过查看该结构,您会发现 <code>struct DIR</code> 中 <code>mutex_</code> 的偏移量为 <code>sizeof(int) + sizeof(size_t) + sizeof(dirent*)</code>,在 32 位设备上即 4 + 4 + 4 = 12 = 0xc,由此找到错误所在:调用程序向 <code>readdir</code> 传递了一个 Null 指针。此时,您可以将该堆栈粘贴到堆栈工具中,以找出这个问题在 logcat 中的发生位置。<em></em>
+<p>在此示例中,崩溃问题的直接原因是 <code><a href="http://man7.org/linux/man-pages/man3/pthread_mutex_lock.3p.html">pthread_mutex_lock(3)</a></code> 尝试访问地址 0xc(帧 0)。但是 <code>pthread_mutex_lock</code> 执行的第一项操作是解引用指定给它的 <code>pthread_mutex_t*</code> 的 <code>state</code> 元素。如果您查看源代码,则会发现该元素在结构中的偏移量为零,这表示指定给 <code>pthread_mutex_lock</code> 的指针 0xc 无效。从帧 1 可以看出,<code>readdir</code> 将该指针指定给它,这会从指定的 <code>DIR*</code> 中提取 <code>mutex_</code> 字段。通过查看该结构,您会发现 <code>struct DIR</code> 中 <code>mutex_</code> 的偏移量为 <code>sizeof(int) + sizeof(size_t) + sizeof(dirent*)</code>,在 32 位设备上即 4 + 4 + 4 = 12 = 0xc,由此找到错误所在:调用程序向 <code>readdir</code> 传递了一个 Null 指针。此时,您可以将该堆栈粘贴到堆栈工具中,以找出这个问题在 logcat 中的发生位置。<em></em></p>
 
-</p><pre class="no-pretty-print">
+<pre class="prettyprint">
   struct DIR {
     int fd_;
     size_t available_bytes_;
@@ -134,7 +142,8 @@
 <h3 id="fortify">FORTIFY 失败</h3>
 <p>FORTIFY 失败是中止的一种特殊情况,当 C 库检测到可能导致安全漏洞的问题时,就会发生 FORTIFY 失败。很多 C 库函数已得到加强;它们需要一个额外的参数来确定缓冲区的实际大小,并在运行时检查您尝试执行的操作是否真的适合。<em></em>以下示例显示代码尝试 <code>read(fd, buf, 32)</code> 入实际上只有 10 字节长的缓冲区…
 </p>
-<pre class="no-pretty-print">pid: 25579, tid: 25579, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
+<pre class="devsite-click-to-copy">
+pid: 25579, tid: 25579, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
 signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
 Abort message: '<i style="color:Orange">FORTIFY: read: prevented 32-byte write into 10-byte buffer'</i>
     r0 00000000  r1 000063eb  r2 00000006  r3 00000008
@@ -158,7 +167,8 @@
 <h3 id="stackcorruption">-fstack-protector 检测到的堆栈损坏</h3>
 <p>编译器的 <code>-fstack-protector</code> 选项会在具有栈上缓冲区的函数中插入检查机制,以防止缓冲区溢出。默认情况下,此选项会为平台代码而非应用启用。如果启用此选项,编译器会向<a href="https://en.wikipedia.org/wiki/Function_prologue">函数序言</a>添加指令,以在堆栈上写入刚刚超过上一局部值的随机值,并向函数结尾添加指令以进行回读并确认是否发生更改。如果该值已更改,则已被缓冲区溢出覆盖,因此该结尾会调用 <code>__stack_chk_fail</code> 来记录消息和中止。
 </p>
-<pre class="no-pretty-print">pid: 26717, tid: 26717, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
+<pre class="devsite-click-to-copy">
+pid: 26717, tid: 26717, name: crasher  &gt;&gt;&gt; crasher &lt;&lt;&lt;
 signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
 <i style="color:Orange">Abort message: 'stack corruption detected'</i>
     r0 00000000  r1 0000685d  r2 00000006  r3 00000008
@@ -189,7 +199,7 @@
 
 <p>为了介绍崩溃转储中的各个方面,我们来看看以下崩溃转储示例:</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
 Build fingerprint: 'Android/aosp_flounder/flounder:5.1.51/AOSP/enh08201009:eng/test-keys'
 Revision: '0'
@@ -213,59 +223,58 @@
     #08 pc 00016795  /system/lib/libc.so (__libc_init+44)
     #09 pc 00000abc  /system/xbin/crasher
 Tombstone written to: /data/tombstones/tombstone_06
+*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
 </pre>
 
-<pre class="no-pretty-print">*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***</pre>
-
 <p>如果您要搜索原生代码崩溃问题的日志,则带有空格的星号行很有帮助。字符串“*** ***”很少出现在日志中,除了在原生代码崩溃问题开始的时候。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 Build fingerprint:
 'Android/aosp_flounder/flounder:5.1.51/AOSP/enh08201009:eng/test-keys'
 </pre>
 
 <p>您可以通过指纹准确识别崩溃问题发生的版本号。这与 <code>ro.build.fingerprint</code> 系统属性完全相同。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 Revision: '0'
 </pre>
 
 <p>revision 指的是硬件,而不是软件。通常情况下不使用 revision,但使用 revision 有助于您自动忽略由不良硬件导致的已知错误。这与 <code>ro.revision</code> 系统属性完全相同。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 ABI: 'arm'
 </pre>
 
 <p>ABI 是 arm、arm64、mips、mips64、x86 或 x86-64 之一。这对上面提到的 <code>stack</code> 脚本最有用,这样它就知道要使用的工具链。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 pid: 1656, tid: 1656, name: crasher &gt;&gt;&gt; crasher &lt;&lt;&lt;
 </pre>
 
 <p>此行可标识崩溃进程中的特定线程。在这种情况下,它是进程的主线程,因此进程 ID 和线程 ID 一致。第一个名称是线程名称,在 &gt;&gt;&gt; 和 &lt;&lt;&lt; 中间的名称是进程名称。对于应用,进程名称通常是完全限定的文件包名称(如 com.facebook.katana),这在提交错误或尝试在 Google Play 中查找相应应用时很有用。在查找崩溃问题之前的相关日志行方面,pid 和 tid 也很有用。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
 </pre>
 
 <p>您可从该行得知接收的信号 (SIGABRT) 以及有关如何接收该信号的更多信息 (SI_TKILL)。<code>debuggerd</code> 报告的信号是 SIGABRT、SIGBUS、SIGFPE、SIGILL、SIGSEGV 和 SIGTRAP。信号专用的代码因特定信号而异。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 Abort message: 'some_file.c:123: some_function: assertion "false" failed'
 </pre>
 
 <p>并非所有崩溃问题都会有中止消息行,但发生中止时,会出现该消息行。这是从此 pid/tid 的最后一行严重 logcat 输出中自动收集而来的,而在有意中止的情况下,这可以解释该程序自行终止的原因。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 r0 00000000 r1 00000678 r2 00000006 r3 f70b6dc8
 r4 f70b6dd0 r5 f70b6d80 r6 00000002 r7 0000010c
 r8 ffffffed r9 00000000 sl 00000000 fp ff96ae1c
 ip 00000006 sp ff96ad18 lr f700ced5 pc f700dc98 cpsr 400b0010
 </pre>
 
-<p>寄存器转储显示收到信号时 CPU 寄存器的内容。(本区段在各 ABI 之间变化很大。)这些内容的有用程度取决于确切的崩溃问题。</p><p>
+<p>寄存器转储显示收到信号时 CPU 寄存器的内容。(本区段在各 ABI 之间变化很大。)这些内容的有用程度取决于确切的崩溃问题。</p>
 
-</p><pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 backtrace:
     #00 pc 00042c98 /system/lib/libc.so (tgkill+12)
     #01 pc 00041ed1 /system/lib/libc.so (pthread_kill+32)
@@ -283,16 +292,16 @@
 
 <h2 id="tombstones">Tombstone</h2>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 Tombstone written to: /data/tombstones/tombstone_06
 </pre>
 
 <p>您可由此得知 <code>debuggerd</code> 写入额外信息的位置。
 <code>debuggerd</code> 会保留最多 10 个 tombstone,从编号 00 至 09 循环并根据需要覆盖现有 tombstone。</p>
 
-<p>Tombstone 包含与崩溃转储相同的信息,还包含一些其他信息。例如,它包含所有线程的回溯(不仅仅是崩溃线程)、浮点寄存器、寄存器中地址周围的原始堆栈转储和内存转储。<i></i>最有用的是,它还包含完整的内存映射(类似于 <code>/proc/<i>pid</i>/maps</code>)。以下是 32 位 ARM 进程崩溃的注释示例:</p>
+<p>Tombstone 包含与崩溃转储相同的信息,还包含一些其他信息。例如,它包含所有线程(不仅仅是崩溃线程)的回溯、浮点寄存器、原始堆栈转储,以及寄存器中地址周围的内存转储。<i></i>最有用的是,它还包含完整的内存映射(类似于 <code>/proc/<i>pid</i>/maps</code>)。以下是 32 位 ARM 进程崩溃的示例(带注释):</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 memory map: (fault address prefixed with ---&gt;)
 ---&gt;ab15f000-ab162fff r-x 0 4000 /system/xbin/crasher (BuildId:
 b9527db01b5cf8f5402f899f64b9b121)
@@ -308,9 +317,9 @@
 <li>尝试写入代码(如上例所述)。</li>
 </ul>
 
-<p>需要注意的第二点是,可执行文件和共享库文件将在 Android M 和更高版本中显示 BuildId(如果有),因此您可以确切地看到崩溃代码的版本。(从 Android M 开始,平台二进制文件默认包含 BuildId。NDK r12 和更高版本还会自动将 <code>-Wl,--build-id</code> 传递到链接器。)</p><p>
+<p>需要注意的第二点是,可执行文件和共享库文件将在 Android M 和更高版本中显示 BuildId(如果有),因此您可以确切地看到崩溃代码的版本。(从 Android M 开始,平台二进制文件默认包含 BuildId。NDK r12 和更高版本还会自动将 <code>-Wl,--build-id</code> 传递到链接器。)</p>
 
-</p><pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 ab163000-ab163fff r--      3000      1000  /system/xbin/crasher
 ab164000-ab164fff rw-         0      1000
 f6c80000-f6d7ffff rw-         0    100000  [anon:libc_malloc]
@@ -318,7 +327,7 @@
 
 <p>在 Android 上,该堆不一定是单个区域。堆区域将被标记为 <code>[anon:libc_malloc]</code>。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 f6d82000-f6da1fff r--         0     20000  /dev/__properties__/u:object_r:logd_prop:s0
 f6da2000-f6dc1fff r--         0     20000  /dev/__properties__/u:object_r:default_prop:s0
 f6dc2000-f6de1fff r--         0     20000  /dev/__properties__/u:object_r:logd_prop:s0
@@ -346,7 +355,7 @@
 
 <p>通常,共享库会有 3 个相邻条目。一个是可读且可执行条目(代码),一个是只读条目(只读数据),还有一个是读写条目(可变数据)。第一列显示映射的地址范围,第二列显示权限(采用常规 Unix <code>ls(1)</code> 样式),第三列显示到文件的偏移量(十六进制),第四列显示区域大小(十六进制),第五列显示文件(或其他区域名称)。</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 f6f34000-f6f53fff r-x         0     20000  /system/lib/libm.so (BuildId: 76ba45dcd9247e60227200976a02c69b)
 f6f54000-f6f54fff ---         0      1000
 f6f55000-f6f55fff r--     20000      1000  /system/lib/libm.so
@@ -374,17 +383,17 @@
 f6fca000-f6fcafff ---         0      1000  [anon:thread signal stack guard page]
 </pre>
 
-<p>请注意,从 Android 5.0 (Lollipop) 开始,C 库会对其大部分匿名映射区域命名,因此神秘区域越来越少。
+<p>请注意,从 Android 5.0 (Lollipop) 开始,C 库会对其大部分匿名的已映射区域命名,因此神秘区域将会减少。
 </p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 f6fcb000-f6fccfff rw- 0 2000 [stack:5081]
 </pre>
 
 <p>名为 <code>[stack:<i>tid</i>]</code> 的区域是指定线程的堆栈。
 </p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 f6fcd000-f702afff r-x         0     5e000  /system/bin/linker (BuildId: 84f1316198deee0591c8ac7f158f28b7)
 f702b000-f702cfff r--     5d000      2000  /system/bin/linker
 f702d000-f702dfff rw-     5f000      1000  /system/bin/linker
@@ -395,6 +404,6 @@
 ffff0000-ffff0fff r-x         0      1000  [vectors]
 </pre>
 
-<p>您能否看到 <code>[vector]</code> 或 <code>[vdso]</code> 取决于架构。ARM 使用 [vector],而所有其他架构使用 <a href="http://man7.org/linux/man-pages/man7/vdso.7.html">[vdso]</a>。</p>
+<p>您能否看到 <code>[vector]</code> 或 <code>[vdso]</code> 取决于架构。ARM 使用 [vector],而所有其他架构均使用 <a href="http://man7.org/linux/man-pages/man7/vdso.7.html">[vdso]</a>。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/debug/strace.html b/zh-cn/devices/tech/debug/strace.html
index c57d7c4..1d1b1ee 100644
--- a/zh-cn/devices/tech/debug/strace.html
+++ b/zh-cn/devices/tech/debug/strace.html
@@ -24,15 +24,15 @@
 
 <h2 id="build-strace">构建 strace</h2>
 
-<p>要构建 strace,请运行以下命令:</p><pre>
-$ mmma -j6 external/strace
+<p>要构建 strace,请运行以下命令:</p><pre class="devsite-terminal devsite-click-to-copy">
+mmma -j6 external/strace
 </pre>
 
 <h2 id="attach-strace">附加到正在运行的进程</h2>
 
 <p>对于 strace,最简单和最常见的用例即是附加到正在运行的进程,方法是使用下面这行命令:</p>
-<pre>
-$ adb shell strace -f -p PID
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell strace -f -p PID
 </pre>
 <p><code>-f</code> 标记表明 strace 会附加到相应进程中的所有现有线程,以及之后会产生的所有新线程。</p>
 
@@ -40,15 +40,15 @@
 <p>要在应用上使用 strace,请执行以下操作:</p>
 
 <ol>
-<li>为 strace 日志设置一个目录:<pre>
-$ adb shell setenforce 0
-$ adb shell mkdir /data/local/tmp/strace
-$ adb shell chmod 777 /data/local/tmp/strace
+<li>为 strace 日志设置一个目录:<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb shell setenforce 0</code>
+<code class="devsite-terminal">adb shell mkdir /data/local/tmp/strace</code>
+<code class="devsite-terminal">adb shell chmod 777 /data/local/tmp/strace</code>
 </pre>
 </li>
 
-<li>在启动前选择要跟踪的进程:<pre>
-$ adb shell setprop wrap.com.google.android.browser "logwrapper strace -f -o /data/local/tmp/strace/strace.com.google.android.browser.txt"
+<li>在启动前选择要跟踪的进程:<pre class="devsite-terminal devsite-click-to-copy">
+adb shell setprop wrap.com.google.android.browser "logwrapper strace -f -o /data/local/tmp/strace/strace.com.google.android.browser.txt"
 </pre>
 </li>
 <li>正常启动该进程。</li>
@@ -57,9 +57,9 @@
 <h2 id="zygote-systrace">在 zygote 上使用</h2>
 <p>要在 zygote 上使用 strace,请修复相关的 <code>init.rc</code> zygote 行(需要使用 <code>adb shell setenforce 0</code>):</p>
 
-<pre>
-$ cd system/core/
-$ patch -p1 &lt;&lt;EOF
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">cd system/core/</code>
+<code class="devsite-terminal">patch -p1 &lt;&lt;EOF
 --- a/rootdir/init.zygote32.rc
 +++ b/rootdir/init.zygote32.rc
 @@ -1,4 +1,4 @@
@@ -68,7 +68,7 @@
      class main
      socket zygote stream 660 root system
      onrestart write /sys/android_power/request_state wake
-EOF
+EOF</code>
 </pre>
 
 <h2 id="get-logs-boot">获取 Android 启动期间的 strace 日志</h2>
@@ -76,7 +76,7 @@
 <p>要获取 Android 启动期间的 strace 日志,请执行以下更改:</p>
 
 <ul>
-<li>由于进程名称已从 <code>zygote</code> 改为 <code>strace</code>,给定服务可能会因缺少用于 <code>strace</code> 的 SELinux <code>file_context</code> 而无法启动。解决方法:在 <code>system/sepolicy/private/file_contexts</code> 中为 strace 添加一个新行,并将原始文件上下文复制过来。例如:<pre>
+<li>由于进程名称已从 <code>zygote</code> 改为 <code>strace</code>,给定服务可能会因缺少用于 <code>strace</code> 的 SELinux <code>file_context</code> 而无法启动。解决方法:在 <code>system/sepolicy/private/file_contexts</code> 中为 strace 添加一个新行,并将原始文件上下文复制过来。例如:<pre class="devsite-click-to-copy">
 /dev/socket/zygote      u:object_r:zygote_socket:s0
 + /system/xbin/strace u:object_r:zygote_socket:s0
 </pre>
@@ -85,10 +85,11 @@
 <li>添加内核命令,然后在 SELinux 宽容模式下启动相应设备。为此,请将 <code>androidboot.selinux=permissive</code> 添加到 <code>BOARD_KERNEL_CMDLINE</code>。(该变量在 <code>build/core/Makefile</code> 中将会变为仅供读取,但在 <code>/device/*/BoardConfig</code> 下则是始终可用。)
 
 <br />
-<br /><code>/device/google/marlin/sailfish/BoardConfig.mk</code> 中 Pixel (sailfish) 设备的示例:<pre>
+<br /><code>/device/google/marlin/sailfish/BoardConfig.mk</code> 中 Pixel (sailfish) 设备的示例:<pre class="devsite-click-to-copy">
 - BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...
 +BOARD_KERNEL_CMDLINE := ....  androidboot.hardware=sailfish ...  androidboot.selinux=permissive
-</pre>待做出上述更改后,编译并刷写启动映像;这样一来,该设备便会在宽容模式下启动了。
+</pre>
+在完成上述更改之后,编译并刷写启动映像,设备便会以宽容模式启动。
 </li>
 </ul>
 
diff --git a/zh-cn/devices/tech/display/circular-icons.html b/zh-cn/devices/tech/display/circular-icons.html
index 05d9fb6..35da2ab 100644
--- a/zh-cn/devices/tech/display/circular-icons.html
+++ b/zh-cn/devices/tech/display/circular-icons.html
@@ -22,11 +22,12 @@
 
 <p>Android 7.1.1 及更高版本支持使用圆形<a href="https://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html">启动器图标</a>。默认情况下,系统不会启用圆形启动器图标。要在设备实现中使用圆形图标,您必须修改设备上的<a href="/source/add-device.html#use-resource-overlays">资源覆盖层</a>才能予以启用。</p>
 
-<p>您正在使用的覆盖层所处的资源文件位于 <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">frameworks/base/core/res/res/values/config.xml</a></code>
+<p>您使用了叠加层的资源文件位于以下位置:
+<code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">frameworks/base/core/res/res/values/config.xml</a></code>
 
-</p><p>要启用圆形图标,请将覆盖层文件中的 <code>config_useRoundIcon</code> 设置从 <code>false</code> 更改为 <code>true</code>:</p>
+</p><p>要启用圆形图标,请将叠加层文件中的 <code>config_useRoundIcon</code> 设置从 <code>false</code> 更改为 <code>true</code>:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 &lt;!-- Flag indicating whether round icons should be parsed from the application manifest. --&gt;
 &lt;bool name="config_useRoundIcon"&gt;true&lt;/bool&gt;
 </pre>
diff --git a/zh-cn/devices/tech/display/multi-window.html b/zh-cn/devices/tech/display/multi-window.html
index 421527f..6b48eae 100644
--- a/zh-cn/devices/tech/display/multi-window.html
+++ b/zh-cn/devices/tech/display/multi-window.html
@@ -35,7 +35,7 @@
 
 <h2 id="implementation">实现</h2>
 <p>
-Android 7.0 及更高版本中默认启用多窗口模式支持要禁用此功能,请在 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">config.xml</a> 文件中将 <code>config_supportsMultiWindow</code> 标记设置为 false。
+Android 7.0 及更高版本中会默认启用多窗口模式支持。要停用该功能,请在 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">config.xml</a> 文件中将 <code>config_supportsMultiWindow</code> 标记设为 false。
 </p>
 <p>
 对于声明 <code>ActivityManager.isLowRam()</code> 的设备,不论 <code>config_supportsMultiWindow</code> 标记为何值,都会禁用多窗口模式。
@@ -47,26 +47,32 @@
 <p>
 然后,设备制造商可以选择是否要启用“自由窗口”或“画中画”模式。
 </p>
+<p>
+Android 8.0 改进了分屏功能,当用户点按<strong>主屏幕</strong>时,系统会压缩启动器。如需实现方面的详细信息,请参阅<a href="/devices/tech/display/split-screen">分屏交互</a>。
+</p>
 <h3 id="freeform">自由窗口</h3>
 <p>
 通过标记 <code>config_supportsMultiWindow</code> 启用标准多窗口模式后,设备制造商可以选择性允许启用自由窗口。此模式对于较大设备(如平板电脑)的制造商最为有用。
 </p>
 <p>
-要支持自由窗口模式,请启用 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/pm/PackageManager.java">/android/frameworks/base/core/java/android/content/pm/PackageManager.java</a> 中的
-PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT 系统功能,并在 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">config.xml</a> 中将 <code>config_freeformWindowManagement</code> 设置为 true。
+要支持自由窗口模式,请启用 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/pm/PackageManager.java">/android/frameworks/base/core/java/android/content/pm/PackageManager.java</a> 中的 PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
+ 系统功能,并在 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">config.xml</a> 中将 <code>config_freeformWindowManagement</code> 设为 true。
 </p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 &lt;bool name="config_freeformWindowManagement"&gt;true&lt;/bool&gt;
 </pre>
 
 <h3 id="picture-in-picture">画中画</h3>
 <p>
-通过 <code>config_supportsMultiWindow</code> 标记启用标准多窗口模式后,设备制造商可以选择支持<a href="https://developer.android.com/training/tv/playback/picture-in-picture.html">画中画</a>功能,以允许用户在浏览其他活动时继续观看视频。虽然此功能主要针对 Android 电视设备,但其他设备类型也可能支持此功能。
+通过 <code>config_supportsMultiWindow</code> 标记启用标准多窗口模式后,设备制造商可以支持<a href="https://developer.android.com/training/tv/playback/picture-in-picture.html">画中画</a>功能,以允许用户在浏览其他活动时继续观看视频。虽然此功能主要针对 Android 电视设备,但其他设备类型也可能支持此功能。
 </p>
 <p>
 要支持画中画功能,请启用 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/pm/PackageManager.java">/android/frameworks/base/core/java/android/content/pm/PackageManager.java</a> 中的 PackageManager#FEATURE_PICTURE_IN_PICTURE 系统功能。
 </p>
+<p>
+如需针对运行 Android 8.0 及更高版本的设备实现 PIP 的更多详细信息,请参阅<a href="/devices/tech/display/pip">画中画</a>页面。
+</p>
 <h3 id="system-ui">系统界面</h3>
 <p>如 <a href="https://developer.android.com/guide/topics/ui/multi-window.html#testing">https://developer.android.com/guide/topics/ui/multi-window.html#testing</a> 中所述,该功能支持所有标准系统界面。
 </p>
@@ -76,7 +82,7 @@
 </p>
 <h2 id="validation">验证</h2>
 <p>
-要验证多窗口模式的实现情况,设备制造商应运行 <a href="https://android.googlesource.com/platform/cts/+/master/hostsidetests/services/activitymanager/src/android/server/cts">CTS 测试</a>,并按照<a href="https://developer.android.com/guide/topics/ui/multi-window.html#testing">多窗口模式测试说明</a>进行操作。
+要验证多窗口模式的实现,设备制造商应运行 <a href="https://android.googlesource.com/platform/cts/+/master/hostsidetests/services/activitymanager/src/android/server/cts">CTS 测试</a>,并按照<a href="https://developer.android.com/guide/topics/ui/multi-window.html#testing">多窗口模式测试说明</a>进行操作。
 </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/widgets-shortcuts.html b/zh-cn/devices/tech/display/widgets-shortcuts.html
new file mode 100644
index 0000000..e0567a5
--- /dev/null
+++ b/zh-cn/devices/tech/display/widgets-shortcuts.html
@@ -0,0 +1,74 @@
+<html devsite><head>
+    <title>微件/快捷方式</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>
+借助 Android 8.0 中新增的用于添加快捷方式和微件的流程 API,应用开发者可以从应用内添加快捷方式和微件,而不需要依靠微件面板。出于安全考虑,Android 8.0 还弃用了用于添加快捷方式的旧方法(发送广播)。
+    </p>
+    <p>
+启动器需要支持这种新的实现,以便应用开发者可以依靠系统来添加其快捷方式或微件。
+    </p>
+    <h2 id="examples-and-source">示例和来源</h2>
+    <p>
+有关于各种系统类的文档可供参考。参考资料包括:
+    </p>
+    <ul>
+      <li><b><a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html">ShortuctManager.java</a></b><br />
+在标题中发布已固定的快捷方式部分。
+      </li><li><b>Intent.java</b><br />关于 ACTION_CREATE_SHORTCUT 的 Javadoc。</li>
+      <li><b>AppWidgetManager.java</b><br />关于 requestPinAppWidget 的 Javadoc。</li>
+    </ul>
+    <h2 id="implementation">实现</h2>
+    <p>
+设备实现者需要通过 intent 过滤器操作在其启动器中添加一个 Aactivity:
+    </p>
+    <ul>
+      <li><code>android.content.pm.action.CONFIRM_PIN_SHORTCUT</code></li>
+      <li><code>android.content.pm.action.CONFIRM_PIN_APPWIDGET</code></li>
+    </ul>
+    <p>
+如需更多详细信息,请参阅 <a href="https://developer.android.com/reference/android/content/pm/LauncherApps.html">API 文档</a>。
+    </p>
+    <p>
+该 Activity 应向用户显示关于添加<a href="https://developer.android.com/reference/android/content/pm/LauncherApps.html">请求的微件/快捷方式</a>的确认提示,并在用户接受后,在主屏幕上添加相应的微件/快捷方式。
+    </p>
+    <p>
+对于微件,<code>accept()</code> 调用应包含新添加微件的 ID。
+    </p>
+    <h3 id="implementing-a-system-ui">实现系统界面</h3>
+    <p>
+合作伙伴需要参考 Launcher3 实现 (<code>packages/apps/Launcher3</code>) 来更新其启动器应用。
+    </p>
+    <p>
+相关的 Launcher3 更改:
+
+</p>
+    <ul>
+      <li>Change-Id: I664366822fe8088742faff2cce006239ab0771bc
+      </li><li>Change-Id: I905532ba44a8898c9c17476f9f75bc309eeb7b41
+    </li></ul>
+    <h2 id="validation">验证</h2>
+    <p>
+要验证该功能,请尝试从 Chrome 或通讯录应用添加快捷方式,并验证系统是否会显示正确的确认提示。在用户接受提示后,图标应添加到主屏幕上,并且 Chrome 应显示一个提示添加成功的消息框。
+    </p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/ab/ab_faqs.html b/zh-cn/devices/tech/ota/ab/ab_faqs.html
new file mode 100644
index 0000000..cad95d6
--- /dev/null
+++ b/zh-cn/devices/tech/ota/ab/ab_faqs.html
@@ -0,0 +1,251 @@
+<html devsite><head>
+    <title>常见问题解答</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2018 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.
+  -->
+
+      <h3>Google 是不是在所有设备上都采用了 A/B OTA?</h3>
+
+        <p>
+是的。A/B 更新的营销名称是无缝更新<em></em>。从 2016 年 10 月份开始,Pixel 和 Pixel XL 手机在出厂时都具备 A/B 功能,并且所有 Chromebook 都使用相同的 <code>update_engine</code> A/B 实现。必要的平台代码实现在 Android 7.1 及更高版本中是公开的。
+        </p>
+
+      <h3>为什么 A/B OTA 更好?</h3>
+
+      <p>A/B OTA 能够为用户提供更好的更新体验。从每月安全更新数据中获得的指标显示,该功能被证明是成功的:截至 2017 年 5 月,95% 的 Pixel 用户在一个月内采纳最新的安全更新,而 Nexus 用户则为 87%,并且 Pixel 用户执行更新的时间早于 Nexus 用户。如果在 OTA 期间无法成功更新块,将不会再导致设备无法启动;在新系统映像成功启动之前,Android 仍能够回退到上一个可使用的系统映像。</p>
+
+      <h3>A/B 更新对 2016 Pixel 分区大小有什么影响?</h3>
+
+      <p>下表包含已推出的 A/B 配置与经过内部测试的非 A/B 配置之间的对比详细信息:</p>
+
+      <table>
+        <tbody>
+          <tr>
+            <th>Pixel 分区大小</th>
+            <th width="33%">A/B</th>
+            <th width="33%">非 A/B</th>
+          </tr>
+          <tr>
+            <td>引导加载程序</td>
+            <td>50*2</td>
+            <td>50</td>
+          </tr>
+          <tr>
+            <td>启动</td>
+            <td>32*2</td>
+            <td>32</td>
+          </tr>
+          <tr>
+            <td>恢复</td>
+            <td>0</td>
+            <td>32</td>
+          </tr>
+          <tr>
+            <td>缓存</td>
+            <td>0</td>
+            <td>100</td>
+          </tr>
+          <tr>
+            <td>无线通讯</td>
+            <td>70*2</td>
+            <td>70</td>
+          </tr>
+          <tr>
+            <td>供应商</td>
+            <td>300*2</td>
+            <td>300</td>
+          </tr>
+          <tr>
+            <td>系统</td>
+            <td>2048*2</td>
+            <td>4096</td>
+          </tr>
+          <tr>
+            <td><strong>总计</strong></td>
+            <td><strong>5000</strong></td>
+            <td><strong>4680</strong></td>
+          </tr>
+        </tbody>
+      </table>
+
+      <p>要进行 A/B 更新,只需要在闪存中增加 320MiB,而通过移除恢复分区,可节省 32MiB,通过移除缓存分区,又可以节省 100MiB。这将平衡引导加载程序、启动分区和无线通讯分区的 B 分区带来的开销。供应商分区增大了一倍(在增加的大小中占了绝大部分)。Pixel 的 A/B 系统映像大小是原来的非 A/B 系统映像的一半。
+      </p>
+
+      <p>对于经过内部测试的 Pixel A/B 和非 A/B 变体(仅推出了 A/B 变体),所用空间仅差 320MiB。在空间为 32GiB 的设备上,此变体只占用了不到 1% 的空间。对于空间为 16GiB 的设备,此变体占用了不到 2% 的空间,对于空间为 8GiB 的设备,此变体大约占用了 4% 的空间(假设所有三种设备都具有相同的系统映像)。</p>
+
+      <h3>你们为何不使用 SquashFS?</h3>
+
+      <p>我们尝试过 SquashFS,但无法实现高端设备所需的性能。我们不会为手持设备使用 SquashFS,也不推荐这么做。</p>
+
+      <p>更具体地说,使用 SquashFS 时,系统分区上节省了约 50% 的大小,但绝大多数压缩率较高的文件都是预编译的 .odex 文件。这些文件都具有非常高的压缩比(接近 80%),但系统分区其余部分的压缩比要低得多。另外,SquashFS 在 Android 7.0 中引发了以下性能问题:</p>
+
+      <ul>
+        <li>与以往的设备相比,Pixel 具有非常快的闪存,但不具备大量的空闲 CPU 周期,因此虽然从闪存读取的字节数更少,但却需要更多的 CPU 来处理 I/O,这是一个潜在的制约因素。</li>
+        <li>在没有任何负载的系统上,有些 I/O 变化在人为基准条件下不会出现任何问题,但在具有真实负载(如 Nexus 6 上的加密)的实际用例中有时则会出现问题。</li>
+        <li>在某些方面,基准化分析显示回归率达到 85%。</li>
+        </ul>
+
+      <p>随着 SquashFS 日趋成熟并且增添了旨在降低 CPU 影响的功能(例如,将不应压缩且经常访问的文件列入白名单),我们将继续对其进行评估并向设备制造商提供建议。</p>
+
+      <h3>在不使用 SquashFS 的情况下,你们是如何做到将系统分区的大小减半的?</h3>
+
+      <p>应用存储在 .apk 文件中,这些文件实际上是 ZIP 档案。每个 .apk 文件中都有一个或多个包含可移植 Dalvik 字节码的 .dex 文件。.odex 文件(经过优化的 .dex 文件)会与 .apk 文件分开放置,并且可以包含特定于设备的机器代码。如果存在 .odex 文件,Android 将能够以预先编译的速度运行应用,而无需在每次启动应用时等待系统编译代码。.odex 文件并不是绝对必需的:实际上 Android 可以通过解译或即时 (JIT) 编译来直接运行 .dex 代码,但在空间足够的情况下使用 .odex 文件可以实现最佳的启动速度和运行时速度组合。</p>
+
+      <p>示例:对于运行 Android 7.1 且系统映像总大小为 2628MiB(2755792836 字节)的 Nexus 6P 中的 installed-files.txt,在系统映像总大小中占据比重最大的几种文件类型明细如下:
+      </p>
+
+      <table>
+      <tbody>
+      <tr>
+      <td>.odex</td>
+      <td>1391770312 字节</td>
+      <td>50.5%</td>
+      </tr>
+      <tr>
+      <td>.apk</td>
+      <td>846878259 字节</td>
+      <td>30.7%</td>
+      </tr>
+      <tr>
+      <td>.so(原生 C/C++ 代码)</td>
+      <td>202162479 字节</td>
+      <td>7.3%</td>
+      </tr>
+      <tr>
+      <td>.oat 文件/.art 映像</td>
+      <td>163892188 字节</td>
+      <td>5.9%</td>
+      </tr>
+      <tr>
+      <td>字体</td>
+      <td>38952361 字节</td>
+      <td>1.4%</td>
+      </tr>
+      <tr>
+      <td>icu 语言区域数据</td>
+      <td>27468687 字节</td>
+      <td>0.9%</td>
+      </tr>
+      </tbody>
+      </table>
+
+      <p>这些数字在其他设备上是类似的,因此在 Nexus/Pixel 设备上,.odex 文件会占用系统分区大约一半的空间。这意味着,我们可以继续使用 EXT4,但在出厂前会将 .odex 文件写入 B 分区,然后在第一次启动时将它们复制到 <code>/data</code>。用于 EXT4 A/B 的实际存储空间与用于 SquashFS A/B 的相同,因为如果我们使用了 SquashFS,我们会将经过预先优化的 .odex 文件放入 system_a 而非 system_b。</p>
+
+      <h3>将 .odex 文件复制到 /data 难道不是意味着在 /system 上节省的空间会在 /data 上被用掉吗?</h3>
+
+      <p>不完全是。在 Pixel 上,.odex 文件占用的大部分空间会用于应用(通常存在于 <code>/data</code> 上)。这些应用通过 Google Play 更新,因此系统映像上的 .apk 和 .odex 文件在设备生命周期的大部分时间内都不会用到。当用户实际使用每个应用时,这类文件可以被完全排除并替换为由配置文件驱动的小型 .odex 文件(因此,如果用户不使用应用的话,这类文件就不会占用空间)。有关详细信息,请观看 Google I/O 2016 演讲 <a href="https://www.youtube.com/watch?v=fwMM6g7wpQ8">ART 的演变</a>。</p>
+
+      <p>以下是难以进行比较的几个主要原因:</p>
+      <ul>
+      <li>由 Google Play 更新的应用在收到其第一次更新时,一律会尽快将 .odex 文件放在 <code>/data</code> 上。</li>
+      <li>用户不运行的应用根本不需要 .odex 文件。</li>
+      <li>配置文件驱动型编译生成的 odex 文件比预先编译生成的 .odex 文件更小(因为前者仅会优化对性能至关重要的代码)。</li>
+      </ul>
+
+      <p>如需详细了解可供 OEM 使用的调整选项,请参阅<a href="/devices/tech/dalvik/configure.html">配置 ART</a>。</p>
+
+      <h3>.odex 文件在 /data 上不是有两个副本吗?</h3>
+
+      <p>这个问题有点复杂。写入新的系统映像后,系统将针对新的 .dex 文件运行新版本的 dex2oat,以生成新的 .odex 文件。这个过程发生在旧系统仍在运行时,因此旧的和新的 .odex 文件同时位于 <code>/data</code> 上。
+      </p>
+
+      <p>在优化每个软件包之前,OtaDexoptService 中的代码 (<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/OtaDexoptService.java#200" class="external">frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/OtaDexoptService.java#200</a></code>) 都会调用 <code>getAvailableSpace</code>,以避免过度填充 <code>/data</code>。请注意,此处的可用数值仍然是保守估计数值:它指的是在达到通常的系统下限空间阈值之前剩余的空间量(以百分比和字节数计)。<em></em><em></em>所以如果 <code>/data</code> 已满,每个 .odex 文件便不会有两个副本。上述代码还有一个 BULK_DELETE_THRESHOLD:如果设备即将占满可用空间(如上所述),则属于未使用应用的 .odex 文件将会被移除。这是每个 .odex 文件没有两个副本的另一种情况。</p>
+
+      <p>最糟糕的情况是 <code>/data</code> 已被完全填满,更新要一直等到设备重新启动到新系统,而不再需要旧系统的 .odex 文件。PackageManager 可处理这种情况:(<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/PackageManagerService.java#7215" class="external">frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/PackageManagerService.java#7215</a></code>)。在新系统成功启动之后,<code>installd</code> (<code><a href="https://android.googlesource.com/platform/frameworks/native/+/nougat-mr1-release/cmds/installd/commands.cpp#2192" class="external">frameworks/native/+/nougat-mr1-release/cmds/installd/commands.cpp#2192</a></code>) 可以移除旧系统此前使用的 .odex 文件,从而使设备返回到只有一个副本的稳定状态。</p>
+
+      <p>因此,尽管 <code>/data</code> 可能会包含所有 .odex 文件的两个副本,但 (a) 这种情况是暂时的,并且 (b) 只有在 <code>/data</code> 上有足够的可用空间时才会出现这种情况。除非是在更新期间,否则该文件都将只有一个副本。作为 ART 通用健壮性功能的一部分,它永远不会让 <code>/data</code> 中填满 .odex 文件(因为在非 A/B 系统上,这也会是一个问题)。</p>
+
+      <h3>难道这种写入/复制操作不会增加闪存磨损吗?</h3>
+
+      <p>只有一小部分闪存会被重写:完整的 Pixel 系统更新会写入大约 2.3GiB 的数据(应用也会被重新编译,但对于非 A/B 更新而言也是如此)。一直以来,基于块的完整 OTA 都会写入类似数量的数据,因此闪存磨损率应该类似。</p>
+
+      <h3>刷写两个系统分区会增加工厂镜像刷写时间吗?</h3>
+
+      <p>不会。Pixel 的系统映像大小并没有增加(只是将空间划分到了两个分区)。</p>
+
+      <h3>如果将 .odex 文件保留在 B 上,不会导致恢复出厂设置后重新启动速度变慢吗?</h3>
+
+      <p>会。如果您已实际使用了一台设备,进行了 OTA,并且执行了恢复出厂设置,则首次重新启动的速度将会比未进行恢复出厂设置操作时慢(在 Pixel XL上,分别为 1 分 40 秒和 40 秒),因为在进行第一次 OTA 之后,B 中将会失去 .odex 文件,所以这些文件无法复制到 <code>/data</code>。正所谓有得有失。</p>
+
+      <p>与常规启动相比,恢复出厂设置应该是一项极少执行的操作,因此时间的花销这个问题就显得没那么重要了(这并不影响从工厂获取设备的用户或审核者,因为在这种情况下,B 分区是可用的)。使用 JIT 编译器意味着我们不需要重新编译所有内容,因此情况可能不会像您想象的那么糟糕。<em></em>此外,您也可以通过在清单 (<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/packages/SystemUI/AndroidManifest.xml#23" class="external">frameworks/base/+/nougat-mr1-release/packages/SystemUI/AndroidManifest.xml#23</a></code>) 中使用 <code>coreApp="true"</code> 将应用标记为需要预先编译。这是 <code>system_server</code> 当前采用的方式,因为出于安全考虑,不允许此进程进行 JIT 编译。</p>
+
+      <h3>如果将 .odex 文件保留在 /data 而非 /system 上,不会导致 OTA 后重新启动速度变慢吗?</h3>
+
+      <p>不会。如上所述,系统会在旧系统映像仍在运行时运行新的 dex2oat,以生成新系统将会需要的文件。在相关工作完成之前,更新会被视为不可用。</p>
+
+      <h3>我们可以(应该)推出 32GiB、16GiB 或 8GiB 的 A/B 设备吗?</h3>
+
+      <p>32GiB 可以很好地满足需求(正如在 Pixel 上证明的那样),而对于 16GiB,如果占用其中的 320MiB 则意味着总可用空间减少了 2%。同样地,对于 8GiB,占用其中的 320MiB 则意味着总可用空间减少了 4%。很显然,在空间为 4GiB 的设备上,不推荐使用 A/B 更新,因为 320MiB 的开销几乎占到了总可用空间的 10%。</p>
+
+      <h3>AVB2.0 需要 A/B OTA 吗?</h3>
+
+      <p>不需要。Android <a href="/security/verifiedboot/">验证启动</a>一直以来都是需要基于块的更新,但不一定是 A/B 更新。</p>
+
+      <h3>A/B OTA 需要 AVB2.0 吗?</h3>
+
+      <p>不需要。</p>
+
+      <h3>A/B OTA 会破坏 AVB2.0 的回滚保护吗?</h3>
+
+      <p>不会。对于这一点,存在一些混淆,因为如果 A/B 系统无法启动到新的系统映像,那么,重试一定的次数(由引导加载程序确定)后,它将自动恢复到“之前”的系统映像。但关键在于,对于使用 A/B 更新的系统而言,“之前”的系统映像实际上仍然是“当前”的系统映像。设备成功启动新映像后,回滚保护功能就会启动,确保您无法使用以前的系统再启动。但是,在您真正成功启动新映像之前,回滚保护功能不会将其视为当前系统映像。</p>
+
+      <h3>如果在系统运行时安装更新,速度会不会很慢?</h3>
+
+      <p>使用非 A/B 更新时,目标是尽快安装更新,因为用户正在等待,并且在系统应用更新时,用户将无法使用其设备。使用 A/B 更新时,情况则恰恰相反。这是因为用户仍在使用其设备,于是目标就变成了尽可能减少对用户的影响,所以系统会有意缓慢地进行更新。通过 Java 系统更新客户端中的逻辑(对于 Google 来说是 GMSCore - 由 GMS 提供的核心软件包),Android 还会尝试选择用户完全不使用设备的时间进行更新。该平台支持暂停/恢复更新,如果用户开始使用设备,客户端可以使用该功能来暂停更新,并在设备再次进入闲置状态时恢复更新。</p>
+
+      <p>进行 OTA 要经过两个阶段,这两个阶段在界面中的进度条下清楚地显示为“第 1 步(共 2 步)”和“第 2 步(共 2 步)”。<em></em><em></em>第 1 步是写入数据块,第 2 步是预编译 .dex 文件。这两个阶段在对性能的影响方面有很大差异。第一个阶段是简单的 I/O 操作。这只需要占用极少的资源(RAM、CPU、I/O),因为它只是缓慢地复制数据块。</p>
+
+      <p>第二个阶段是运行 dex2oat 来预编译新的系统映像。很显然,这在资源要求上没有明确的界限,因为它会编译实际应用。与编译简单的小应用相比,编译复杂的大应用所涉及的工作量显然要多出许多;而在第 1 阶段,没有任何磁盘块会比其他磁盘块更大或更复杂。</p>
+
+      <p>该过程类似于 Google Play 先在后台安装应用更新,然后显示“已更新 5 个应用”通知(这是多年来一直采用的做法)。<em></em></p>
+
+      <h3>如果用户实际上正在等待更新,将会怎样?</h3>
+
+      <p>GmsCore 中的当前实现并不会区分后台更新和用户发起的更新,但将来可能会加以区分。届时,如果用户明确要求安装更新或正在查看更新进度屏幕,我们将假设他们正在等待系统完成更新,从而优先安排更新工作。</p>
+
+      <h3>如果无法应用更新,将会怎样?</h3>
+
+      <p>对于非 A/B 更新,如果更新无法应用,过去常常会导致用户的设备无法使用。唯一的例外情况是在开始应用更新之前就出现问题(比如说因为软件包验证失败)。对于 A/B 更新,无法应用更新并不会影响当前正在运行的系统。可以稍后重新尝试更新。</p>
+
+      <h3>哪些系统芯片 (SoC) 支持 A/B?</h3>
+
+      <p>截至 2017 年 3 月 15 日,我们提供的信息如下:</p>
+      <table class="style0">
+      <tbody>
+      <tr>
+      <td></td>
+      <td><strong>Android 7.x 版本</strong></td>
+      <td><strong>Android 8.x 版本</strong></td>
+      </tr>
+      <tr>
+      <td><strong>Qualcomm</strong></td>
+      <td>根据 OEM 的请求而定</td>
+      <td>所有芯片组都将受支持</td>
+      </tr>
+      <tr>
+      <td><strong>Mediatek</strong></td>
+      <td>根据 OEM 的请求而定</td>
+      <td>所有芯片组都将受支持</td>
+      </tr>
+      </tbody>
+      </table>
+
+      <p>有关时间表的详细信息,请咨询您的 SoC 联系人。对于上面未列出的 SoC,请直接与您的 SoC 供应商联系。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/ab_updates.html b/zh-cn/devices/tech/ota/ab_updates.html
index 5ae2e83..b524448 100644
--- a/zh-cn/devices/tech/ota/ab_updates.html
+++ b/zh-cn/devices/tech/ota/ab_updates.html
@@ -20,403 +20,400 @@
       limitations under the License.
   -->
 
-<p>A/B 系统更新,也称为无缝更新,用于确保可运行的启动系统在<a href="/devices/tech/ota/index.html">无线 (OTA) 更新</a>期间能够保留在磁盘上。这样可以降低更新之后设备无法启动的可能性,也就是说,用户需要将设备送到维修/保修中心进行更换和刷机的情况将有所减少。
-</p>
+<p>A/B 系统更新(也称为无缝更新)的目标是确保在<a href="/devices/tech/ota/index.html">无线下载 (OTA) 更新</a>期间在磁盘上保留一个可正常启动和使用的系统。采用这种方式可以降低更新之后设备无法启动的可能性,这意味着用户需要将设备送到维修和保修中心进行更换和刷机的情况将会减少。其他某些商业级操作系统(例如 <a href="https://www.chromium.org/chromium-os">ChromeOS</a>)也成功运用了 A/B 更新机制。</p>
 
-<p>用户在 OTA 期间可以继续使用设备。在更新过程中,仅当设备重新启动到更新后的磁盘分区时,会发生一次宕机情况。即使 OTA 失败,设备也仍然可以使用,因为它会启动到 OTA 之前的磁盘分区。您可以再次尝试下载 OTA。建议仅针对新设备通过 OTA 实现 A/B 系统更新。
-</p>
-
-<p>A/B 系统更新将影响:</p>
+<p>A/B 系统更新可带来以下好处:</p>
 
 <ul>
-  <li>与引导加载程序的交互</li>
-  <li>分区选项</li>
-  <li>构建流程</li>
-  <li>OTA 更新软件包的生成</li>
+<li>OTA 更新可以在系统运行期间进行,而不会打断用户(包括在重新启动后进行的应用优化)。这意味着用户可以在 OTA 期间继续使用其设备。在更新期间,唯一的一次宕机发生在设备重新启动到更新后的磁盘分区时。</li>
+<li>如果 OTA 失败,设备会启动到 OTA 之前的磁盘分区,并且仍然可以使用。您可以再次尝试进行 OTA 下载。</li>
+<li>任何错误(例如 I/O 错误)都只会影响<strong>未使用</strong>的分区组,并且用户可以进行重试。由于 I/O 负载被特意控制在较低水平,以免影响用户体验,因此发生此类错误的可能性也会降低。</li>
+<li>更新包可以流式传输到 A/B 设备,因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 <code>/data</code> 或 <code>/cache</code> 上留出足够的可用空间来存储更新包。
+</li><li>缓存分区不再用于存储 OTA 更新包,因此无需调整缓存分区的大小。</li>
+<li><a href="/security/verifiedboot/dm-verity.html">dm-verity</a> 可保证设备使用的启动映像未损坏。如果设备因 OTA 错误或 dm-verity 问题而无法启动,则可以重新启动到旧映像。(Android <a href="/security/verifiedboot/">验证启动</a>不需要 A/B 更新。)</li>
 </ul>
 
-<p>现有的 <a href="/security/verifiedboot/dm-verity.html">dm-verity</a> 功能可确保设备会启动未损坏的映像。如果设备因糟糕的 OTA 或 dm-verity 问题而无法启动,则可以重新启动到原来的映像。
+<h2 id="overview">关于 A/B 系统更新</h2>
+
+<p>A/B 系统更新会影响以下方面:</p>
+
+<ul>
+<li>分区选择(槽位)、<code>update_engine</code> 守护进程,以及引导加载程序交互(如下所述)</li>
+<li>编译过程和 OTA 更新包生成(如<a href="/devices/tech/ota/ab_implement.html">实现 A/B 更新</a>中所述)</li>
+</ul>
+
+<aside class="note"><strong>注意</strong>:只有对于新设备,才建议通过 OTA 实现 A/B 系统更新。</aside>
+
+<h3 id="slots">分区选择(槽位)</h3>
+
+<p>A/B 系统更新使用两组称为槽位(通常是槽位 A 和槽位 B)的分区。<em></em>系统从“当前”槽位运行,但在正常操作期间,运行中的系统不会访问未使用的槽位中的分区。<em></em><em></em>这种方法通过将未使用的槽位保留为后备槽位,来防范更新出现问题:如果在更新期间或更新刚刚完成后出现错误,系统可以回滚到原来的槽位并继续正常运行。为了实现这一目标,当前槽位使用的任何分区(包括只有一个副本的分区)都不应在 OTA 更新期间进行更新。<em></em></p>
+
+<p>每个槽位都有一个“可启动”属性,该属性用于表明相应槽位存储的系统正确无误,设备可从相应槽位启动。<em></em>系统运行时,当前槽位处于可启动状态,但另一个槽位则可能包含旧版本(仍然正确)的系统、包含更新版本的系统,或包含无效的数据。无论当前槽位是哪一个,都有一个槽位是活动槽位(引导加载程序在下次启动时将使用的槽位,也称为首选槽位)。<em></em><em></em><em></em></p>
+
+此外,每个槽位还都有一个由用户空间设置的“成功”属性,仅当相应槽位处于可启动状态时,该属性才具有相关性。<em></em>被标记为成功的槽位应该能够自行启动、运行和更新。未被标记为成功的可启动槽位(多次尝试使用它启动之后)应由引导加载程序标记为不可启动,其中包括将活动槽位更改为另一个可启动的槽位(通常是更改为在尝试启动到新的活动槽位之前正在运行的槽位)。关于相应接口的具体详细信息在 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/boot_control.h" class="external-link">boot_control.h</a></code> 中定义。
+<p></p>
+
+<h3 id="update-engine">更新引擎守护进程</h3>
+
+<p>A/B 系统更新过程会使用名为 <code>update_engine</code> 的后台守护进程来使系统做好准备,以启动到更新后的新版本。该守护进程可以执行以下操作:</p>
+
+<ul>
+<li>按照 OTA 更新包的指示,从当前槽位 A/B 分区读取数据,然后将所有数据写入到未使用槽位 A/B 分区。</li>
+<li>在预定义的工作流程中调用 <code>boot_control</code> 接口。</li>
+<li>按照 OTA 更新包的指示,在将数据写入到所有未使用槽位分区之后,从新分区运行安装后程序。<em></em><em></em>(有关详细信息,请参阅<a href="#post-installation">安装后</a>)。</li>
+</ul>
+
+<p>由于 <code>update_engine</code> 守护进程本身不会参与到启动流程中,因此该守护进程在更新期间可以执行的操作受当前槽位中的 <a href="/security/selinux/">SELinux</a> 政策和功能限制(在系统启动到新版本之前,此类政策和功能无法更新)。<em></em>为了维持一个稳定可靠的系统,更新流程<strong>不应</strong>修改分区表、当前槽位中各个分区的内容,以及无法通过恢复出厂设置擦除的非 A/B 分区的内容。</p>
+
+<p><code>update_engine</code> 来源位于 <code><a href="https://android.googlesource.com/platform/system/update_engine/" class="external">system/update_engine</a></code> 中。A/B OTA dexopt 文件分开放到了 <code>installd</code> 和一个程序包管理器中:</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* 包括安装后脚本、用于 chroot 的二进制文件、负责调用 dex2oat 的已安装克隆、OTA 后 move-artifacts 脚本,以及 move 脚本的 rc 文件。</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>(加上 <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>)是负责为应用准备 dex2oat 命令的程序包管理器。</li>
+</ul>
+
+<p>如需可使用的示例,请参阅 <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>A/B 系统之所以非常强大,是因为任何错误(如 I/O 错误)都只能影响<strong>未使用的</strong>分区集,并且可以进行重试。由于 I/O 负载被特意控制在较低水平,以免影响用户体验,因此此类错误不太可能会发生。
-</p>
+<h3 id="bootloader-interactions">引导加载程序交互</h3>
 
-<p>OTA 更新可以在系统运行时进行,而不会打断用户,更新的内容包括重新启动后进行的应用优化。此外,缓存分区不再用于存储 OTA 更新软件包;无需调整缓存分区的大小。
-</p>
-
-<h2 id="overview">概览</h2>
-
-<p>A/B 系统更新使用称为 <code>update_engine</code> 的后台守护进程以及两组分区。这两组分区称为插槽,通常为插槽 A 和插槽 B。系统从其中一个插槽(“当前插槽”)运行,但运行的系统不会访问“未使用的”插槽中的分区(用于正常操作)。<em></em><em></em><em></em>
-</p>
-
-<p>此功能的目标是将未使用的插槽保留为后备插槽,从而使更新具有抗故障性。如果更新期间或更新后立即出现错误,则系统可以回滚至原来的插槽并继续正常运行。为实现这一目标,“当前”插槽所使用的所有分区(包括只有一个副本的分区)都不应作为 OTA 更新的一部分进行更新。<em></em>
-</p>
-
-<p>每个插槽都有“可启动”属性,该属性会声明相应插槽是否包含设备可以从中启动的正确系统。<em></em>系统运行时,当前插槽肯定可以启动,但是另一个插槽中可能包含旧(仍然正确)版本的系统,也可能包含较新版本或无效的数据。无论当前插槽是哪一个,都有一个插槽是活动插槽或首选插槽。<em></em><em></em>下次启动时,引导加载程序将从活动插槽中启动。最后,每个插槽都有由用户空间设置的“成功”属性,该属性只有在相应插槽也可以启动时才具有相关性。<em></em>
-</p>
-
-<p>成功的插槽应该能够自行启动、运行和更新。未标记为成功的可启动插槽(尝试从其启动几次之后)应由引导加载程序标记为不可启动,包括将活动插槽更改为其他可启动插槽(通常更改为在尝试启动到新的活动插槽之前运行的插槽)。界面的具体详细信息在 <code><a class="external-link" target="_blank" href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/boot_control.h">boot_control.h</a></code> 中进行了定义。
-</p>
-
-<h3 id="bootloader-state-examples">引导加载程序状态示例</h3>
-
-<p><code>update_engine</code>(以及其他可能的守护进程)使用 <code>boot_control</code> HAL 指示引导加载程序从何处启动。以下是常见的示例情景及其相关的状态:</p>
+<p><code>boot_control</code> HAL 供 <code>update_engine</code>(可能还有其他守护进程)用于指示引导加载程序从何处启动。常见的示例情况及其相关状态包括:</p>
 
 <ul>
   <li>
-    <strong>正常情况</strong>:系统正在从其当前插槽(插槽 A 或插槽 B)运行。目前为止尚未应用任何更新。系统的当前插槽是可启动、成功且活动的插槽。
+    <strong>正常情况</strong>:系统正在从其当前槽位(槽位 A 或槽位 B)运行。到目前为止尚未应用任何更新。系统的当前槽位是可启动且被标记为成功的活动槽位。
   </li>
   <li>
-    <strong>正在更新</strong>:系统正在从插槽 B 运行,因此,插槽 B 是可启动、成功且活动的插槽。由于插槽 A 中的内容正在更新,但是尚未完成,因此插槽 A 标记为不可启动。在此状态下,应继续从插槽 B 重新启动。</li>
+    <strong>正在更新</strong>:系统正在从槽位 B 运行,因此,槽位 B 是可启动且被标记为成功的活动槽位。由于槽位 A 中的内容正在更新,但是尚未完成,因此槽位 A 标记为不可启动。在此状态下,应继续从槽位 B 重新启动。</li>
   <li>
-    <strong>已应用更新,正在等待重新启动</strong>:系统正在从插槽 B 运行,插槽 B 的状态为可启动且成功,但是插槽 A 过去标记为活动(因此现在标记为可启动)。插槽 A 尚未被标记为成功,引导加载程序应该尝试从插槽 A 启动几次。
+    <strong>已应用更新,正在等待重新启动</strong>:系统正在从槽位 B 运行,槽位 B 可启动且被标记为成功,但槽位 A 之前被标记为活动槽位(因此现在被标记为可启动)。槽位 A 尚未被标记为成功,引导加载程序应尝试从槽位 A 启动若干次。
   </li>
   <li>
-    <strong>系统重新启动到新的更新</strong>:系统首次从插槽 A 运行,插槽 B 的状态仍为可启动且成功,而插槽 A 仅可启动,且仍然处于活动但不成功的状态。在进行几次检查之后,用户空间守护进程应将插槽 A 标记为成功。
+    <strong>系统已重新启动到新的更新</strong>:系统正在首次从槽位 A 运行,槽位 B 仍可启动且被标记为成功,而槽位 A 仅可启动,且仍是活动槽位,但未被标记为成功。在进行一些检查之后,用户空间守护进程应将槽位 A 标记为成功。
   </li>
 </ul>
 
-<h3 id="update-engine-features">更新引擎功能</h3>
+<h3 id="streaming-updates">流式更新支持</h3>
+<p>用户设备并非在 <code>/data</code> 上总是有足够的空间来下载更新包。由于 OEM 和用户都不想浪费 <code>/cache</code> 分区上的空间,因此有些用户会因为设备上没有空间来存储更新包而不进行更新。为了解决这个问题,Android 8.0 中添加了对流式 A/B 更新(下载数据块后直接将数据块写入 B 分区,而无需将数据块存储在 <code>/data</code> 上)的支持。流式 A/B 更新几乎不需要临时存储空间,并且只需要能够存储大约 100KiB 元数据的存储空间即可。</p>
 
-<p>守护进程 <code>update_engine</code> 在后台运行,并会使系统做好启动到已更新的新版本的准备。守护进程 <code>update_engine</code> 本身不会参与到启动流程中,且更新期间可以执行的操作会受到限制。守护进程 <code>update_engine</code> 可以执行以下操作:</p>
-
+<p>要在 Android 7.1 中实现流式更新,请选择以下补丁程序:</p>
 <ul>
-  <li>根据 OTA 软件包的指示,从当前插槽 A/B 分区读取数据,然后向未使用的插槽 A/B 分区中写入数据</li>
-  <li>在预定义的工作流程中调用 <code>boot_control</code> 界面</li>
-  <li>根据 OTA 软件包的指示,在将数据写入所有未使用的插槽分区之后,从新分区运行安装后的程序<em></em><em></em></li>
+<li>
+<a href="https://android-review.googlesource.com/333624" class="external">允许取消代理解析请求</a></li>
+<li>
+<a href="https://android-review.googlesource.com/333625" class="external">解决在解析代理时终止传输的问题</a></li>
+<li>
+<a href="https://android-review.googlesource.com/333626" class="external">针对范围之间的 TerminateTransfer 添加单元测试</a></li>
+<li>
+<a href="https://android-review.googlesource.com/333627" class="external">清理 RetryTimeoutCallback()</a></li>
 </ul>
 
-<p>下文对安装后的步骤进行了详细介绍。注意,守护进程 <code>update_engine</code> 受 <a href="/security/selinux/">SELinux</a> 策略及当前插槽中的功能限制;在系统启动到新版本之前,这些策略和功能无法更新。<em></em>要实现稳健性目标,更新流程不应执行以下操作:</p>
-
-<ul>
-  <li>修改分区表</li>
-  <li>修改当前插槽中分区的内容</li>
-  <li>修改恢复出厂设置时无法擦除的非 A/B 分区的内容</li>
-</ul>
+<p>无论是使用 <a href="https://www.android.com/gms/">Google 移动服务 (GMS)</a> 还是任何其他更新客户端,都需要安装这些补丁程序,才能在 Android 7.1 中支持流式传输 A/B 更新。</p>
 
 <h2 id="life-of-an-a-b-update">A/B 更新过程</h2>
 
-<p>当 OTA 软件包(在代码中称为有效负荷)可供下载时,更新流程便开始了。<em></em>设备中的策略可能会基于电池电量、用户活动、是否连接到充电器或其他策略延迟有效负荷的下载和应用。不过,由于更新在后台运行,因此用户可能不知道更新正在进行,而且更新流程可能随时会由于策略或意外重新启动而被中断。
-</p>
+<p>当有 OTA 更新包(在代码中称为有效负载)可供下载时,更新流程便开始了。<em></em>设备中的政策可以根据电池电量、用户活动、充电状态或其他政策来延迟下载和应用有效负载。此外,由于更新是在后台运行,因此用户可能并不知道正在进行更新。所有这些都意味着,更新流程可能随时会由于政策、意外重新启动或用户操作而中断。</p>
 
-<p>有效负荷可用后更新流程中的步骤将如下所示:</p>
+<p>OTA 更新包本身所含的元数据可能会指示可进行流式更新,在这种情况下,相应更新包也可采用非流式安装方式。服务器可以利用这些元数据告诉客户端正在进行流式更新,以便客户端正确地将 OTA 移交给 <code>update_engine</code>。如果设备制造商具有自己的服务器和客户端,便可以通过确保以下两项来实现流式更新:确保服务器能够识别出更新是流式更新(或假定所有更新都是流式更新),并确保客户端能够正确调用 <code>update_engine</code> 来进行流式更新。制造商可以根据更新包是流式更新变体这一事实向客户端发送一个标记,以便在进行流式更新时触发向框架端的移交工作。</p>
 
-<p>
-  <strong>第 1 步</strong>:通过 <code>markBootSuccessful()</code> 将当前插槽(或“源插槽”)标记为成功(如果尚未标记)。
-</p>
+<p>有可用的有效负载后,更新流程将遵循如下步骤:</p>
 
-<p>
-  <strong>第 2 步</strong>:通过调用函数 <code>setSlotAsUnbootable()</code> 将未使用的插槽(或“目标插槽”)标记为不可启动。
-</p>
+<table>
+<tbody><tr>
+<th>步骤</th>
+<th>操作</th>
+</tr>
+<tr>
+<td>1</td>
+<td>使用 <code>markBootSuccessful()</code> 将当前槽位(或“源槽位”)标记为成功(如果尚未标记)。</td>
+</tr>
+<tr>
+<td>2</td>
+<td>调用函数 <code>setSlotAsUnbootable()</code>,将未使用的槽位(或“目标槽位”)标记为不可启动。当前槽位始终会在更新开始时被标记为成功,以防止引导加载程序回退到未使用的槽位(该槽位中很快将有无效数据)。如果系统有能力开始应用更新,那么即使其他主要组件出现损坏(例如界面陷入崩溃循环),当前槽位也会被标记为成功,因为可以通过推送新软件来解决这些问题。
+<br /><br />
+更新有效负载是不透明的 Blob,其中包含更新到新版本的指示。更新有效负载由以下部分组成:
+<ul>
+<li>元数据。<em></em>元数据在更新有效负载中所占的比重相对较小,其中包含一系列用于在目标槽位上生成和验证新版本的操作。例如,某项操作可能会解压缩特定 Blob 并将其写入到目标分区中的特定块,或者从源分区读取数据、应用二进制补丁程序,然后写入到目标分区中的特定块。</li>
+<li>额外数据。<em></em>与操作相关的额外数据在更新有效负载中占据了大部分比重,其中包含这些示例中的已压缩 Blob 或二进制补丁程序。</li>
+</ul>
+</td>
+</tr>
+<tr>
+<td>3</td>
+<td>下载有效负载元数据。</td>
+</tr>
+<tr>
+<td>4</td>
+<td>对于元数据中定义的每项操作,都将按顺序发生以下行为:将相关数据(如果有)下载到内存中、应用操作,然后释放关联的内存。</td>
+</tr>
+<tr>
+<td>5</td>
+<td>对照预期的哈希重新读取并验证所有分区。
+</td>
+</tr>
+<tr>
+<td>6</td>
+<td>运行安装后步骤(如果有)。如果在执行任何步骤期间出现错误,则更新失败,系统可能会通过其他有效负载重新尝试更新。如果上述所有步骤均已成功完成,则更新成功,系统会执行最后一个步骤。</td>
+</tr>
+<tr>
+<td>7</td>
+<td>调用 <code>setActiveBootSlot()</code>,将未使用的槽位标记为活动槽位。<em></em>将未使用的槽位标记为活动槽位并不意味着它将完成启动。如果引导加载程序(或系统本身)未读取到“成功”状态,则可以将活动槽位切换回来。</td>
+</tr>
+<tr>
+<td>8</td>
+<td>安装后步骤(如下所述)包括从“新更新”版本中运行仍在旧版本中运行的程序。如果此步骤已在 OTA 更新包中定义,则为<strong>强制性</strong>步骤,且程序必须返回并显示退出代码 <code>0</code>,否则更新失败。</td>
+</tr>
+</tbody></table>
 
-<p>在更新开始时,当前插槽会始终标记为成功,以防引导加载程序回退至未使用的插槽(很快将有无效数据)。如果系统已可以开始应用更新,即使其他主要组件已受损(如崩溃循环中的界面),当前插槽也会标记为成功,因为可以通过推送新软件来修复这些主要问题。
-</p>
+<aside class="note"><strong>注意</strong>:第 3 步和第 4 步占用了大部分更新时间,因为这两个步骤涉及写入和下载大量数据,并且可能会因政策或重新启动等原因而中断。</aside>
 
-<p>更新有效负荷是不透明的 Blob,其中包含更新到新版本的相应指令。更新有效负荷主要由两部分组成:元数据以及与指令相关的额外数据。元数据相对较小,其中包含在目标插槽上生成和验证新版本的操作的列表。例如,某个操作可能会解压缩特定 Blob 并将其写入目标分区中的特定块,或者从源分区读取数据、向其应用二进制补丁程序,然后写入目标分区中的特定块。与操作相关联的额外数据并未包含在元数据中,此类数据在更新有效负荷中所占比重较大,其中将包含这些示例中的已压缩 Blob 或二进制补丁程序。
-</p>
+<h3 id="post-installation">安装后</h3>
 
-<p>
-  <strong>第 3 步</strong>:下载有效负荷元数据。
-</p>
+<p>对于定义了安装后步骤的每个分区,<code>update_engine</code> 都会将新分区装载到特定位置,并执行与装载的分区相关的 OTA 中指定的程序。例如,如果安装后程序被定义为相应系统分区中的 <code>usr/bin/postinstall</code>,则系统会将未使用槽位中的这个分区装载到一个固定位置(例如 <code>/postinstall_mount</code>),然后执行 <code>/postinstall_mount/usr/bin/postinstall</code> 命令。</p>
 
-<p>
-  <strong>第 4 步</strong>:对于元数据中定义的每项操作,将按顺序发生以下行为:关联的数据(如果有)下载到内存中、操作得到应用、关联的内存被舍弃。
-</p>
-
-<p>这两个步骤占用了大部分更新时间,因为它们涉及写入和下载大量数据,并且可能会因策略或重新启动等原因而中断。
-</p>
-
-<p>
-  <strong>第 5 步</strong>:针对预期哈希重新读取并验证整个分区。
-</p>
-
-<p>
-  <strong>第 6 步</strong>:运行安装后步骤(如果有)。
-</p>
-
-<p>如果在执行任一步骤的过程中出现错误,则更新失败,系统可能会通过其他有效负荷重新尝试更新。如果上述所有步骤均成功完成,则更新成功,系统会执行最后一个步骤。
-</p>
-
-<p>
-  <strong>第 7 步</strong>:通过调用 <code>setActiveBootSlot()</code> 将未使用的插槽标记为活动。<em></em>
-</p>
-
-<p>将未使用的插槽标记为活动并不意味着它会完成启动。如果它未读取到成功的状态,引导加载程序或系统本身可以将插槽的活动状态切换回来。
-</p>
-
-<h3 id="post-install-step">安装后的步骤</h3>
-
-<p>安装后的步骤包括从“新更新”版本中运行仍在原来版本中运行的程序。如果此步骤已在 OTA 软件包中定义,则为强制性步骤,且程序必须返回退出代码 <code>0</code>,否则更新失败。
-</p>
-
-<p>对于其中已定义安装后步骤的每个分区,<code>update_engine</code> 会将新分区装载到特定位置,并执行与装载的分区对应的 OTA 中指定的程序。例如,如果安装后程序在相应系统分区中定义为 <code>usr/bin/postinstall</code>,则系统会将此来自未使用插槽的分区装载到一个固定位置(如 <code>/postinstall_mount</code> 中),然后执行 <code>/postinstall_mount/usr/bin/postinstall</code> 命令。注意,要使此步骤生效,需要满足以下条件:</p>
+<p>为确保成功执行安装后步骤,旧内核必须能够:</p>
 
 <ul>
-  <li>旧内核需要能够装载新的文件系统格式。文件系统类型不能更改,除非旧内核中有为其提供的支持(包括使用 SquashFS 等压缩文件系统时所用的压缩算法等详细信息)。
-  </li>
-  <li>旧内核需要了解新分区的安装后程序格式。如果使用的是 ELF 二进制文件,则该文件应该与旧内核兼容(例如,如果弃用 32 位版本架构,并改为使用 64 位版本架构,则 64 位的新程序应该可以在旧版 32 位内核上运行)。此外,库将会从旧系统映像而非新系统映像加载,除非加载程序 (<code>ld</code>) 收到使用其他路径或构建静态二进制文件的指令。
-  </li>
-  <li>新的安装后程序将受到旧系统中定义的 SELinux 策略的限制。
-  </li>
+<li><strong>装载新的文件系统格式</strong>。文件系统类型不能更改(除非旧内核中支持这么做),包括使用的压缩算法(如果使用 SquashFS 等经过压缩的文件系统)等详细信息。</li>
+<li><strong>理解新分区的安装后程序格式</strong>。如果使用可执行且可链接格式 (ELF) 的二进制文件,则该文件应该与旧内核兼容(例如,如果架构从 32 位版本改为使用 64 位版本,则 64 位的新程序应该可以在旧的 32 位内核上运行)。除非加载程序 (<code>ld</code>) 收到使用其他路径或编译静态二进制文件的指令,否则将会从旧系统映像而非新系统映像加载各种库。</li>
 </ul>
 
-<p>一种示例情况是,将 Shell 脚本用作安装后程序(由旧系统中顶部带有 <code>#!</code> 标记的 Shell 二进制文件解析), 然后从新环境设置库路径,用于执行更复杂的二进制安装后程序。
+<p>例如,您可以使用 shell 脚本作为安装后程序(由旧系统中顶部包含 <code>#!</code> 标记的 shell 二进制文件解析), 然后从新环境设置库路径,以便执行更复杂的二进制安装后程序。或者,您可以从专用的较小分区执行安装后步骤,以便主系统分区中的文件系统格式可以得到更新,同时不会产生向后兼容问题或引发 stepping-stone 更新;这样一来,用户便可以从出厂映像直接更新到最新版本。</p>
+
+<p>新的安装后程序将受旧系统中定义的 SELinux 政策限制。因此,安装后步骤适用于在指定设备上执行设计所要求的任务或其他需要尽可能完成的任务(例如,更新支持 A/B 更新的固件或引导加载程序、为新版本准备数据库副本,等等)。安装后步骤<strong>不适用于</strong>重新启动之前的一次性错误修复(此类修复需要无法预见的权限)。</p>
+
+<p>所选的安装后程序在 <code>postinstall</code> SELinux 环境中运行。新装载的分区中的所有文件都将带有 <code>postinstall_file</code> 标记,无论在重新启动到新系统后它们的属性如何,都是如此。对新系统中的 SELinux 属性进行的更改不会影响安装后步骤。如果安装后程序需要额外的权限,则必须将这些权限添加到安装后环境中。</p>
+
+<h2 id="faq">常见问题解答</h2>
+
+<h3>Google 是不是在所有设备上都采用了 A/B OTA?</h3>
+
+<p>是的。A/B 更新的营销名称是无缝更新<em></em>。从 2016 年 10 月份开始,Pixel 和 Pixel XL 手机在出厂时都具备 A/B 功能,并且所有 Chromebook 都使用相同的 <code>update_engine</code> A/B 实现。必要的平台代码实现在 Android 7.1 及更高版本中是公开的。</p>
+
+<h3>为什么 A/B OTA 更好?</h3>
+
+<p>A/B OTA 能够为用户提供更好的更新体验。从每月安全更新数据中获得的指标显示,该功能被证明是成功的:截至 2017 年 5 月,95% 的 Pixel 用户在一个月内采纳最新的安全更新,而 Nexus 用户则为 87%,并且 Pixel 用户执行更新的时间早于 Nexus 用户。如果在 OTA 期间无法成功更新块,将不会再导致设备无法启动;在新系统映像成功启动之前,Android 仍能够回退到上一个可使用的系统映像。</p>
+
+<h3>A/B 更新对 2016 Pixel 分区大小有什么影响?</h3>
+
+<p>下表包含推出的 A/B 配置与经过内部测试的非 A/B 配置的详细信息:</p>
+
+<table>
+  <tbody>
+    <tr>
+      <th>Pixel 分区大小</th>
+      <th width="33%">A/B</th>
+      <th width="33%">非 A/B</th>
+    </tr>
+    <tr>
+      <td>引导加载程序</td>
+      <td>50*2</td>
+      <td>50</td>
+    </tr>
+    <tr>
+      <td>启动</td>
+      <td>32*2</td>
+      <td>32</td>
+    </tr>
+    <tr>
+      <td>恢复</td>
+      <td>0</td>
+      <td>32</td>
+    </tr>
+    <tr>
+      <td>缓存</td>
+      <td>0</td>
+      <td>100</td>
+    </tr>
+    <tr>
+      <td>无线通讯</td>
+      <td>70*2</td>
+      <td>70</td>
+    </tr>
+    <tr>
+      <td>供应商</td>
+      <td>300*2</td>
+      <td>300</td>
+    </tr>
+    <tr>
+      <td>系统</td>
+      <td>2048*2</td>
+      <td>4096</td>
+    </tr>
+    <tr>
+      <td><strong>总计</strong></td>
+      <td><strong>5000</strong></td>
+      <td><strong>4680</strong></td>
+    </tr>
+  </tbody>
+</table>
+
+<p>要进行 A/B 更新,只需要在闪存中增加 320MiB,而通过移除恢复分区,可节省 32MiB,并且通过移除缓存分区,可另外节省 100MiB。这将平衡引导加载程序、启动分区和无线通讯分区的 B 分区带来的开销。供应商分区增大了一倍(在增加的大小中占了绝大部分)。Pixel 的 A/B 系统映像大小是原来的非 A/B 系统映像的一半。
 </p>
 
-<p>另一种示例情况是,从专用的较小分区执行安装后步骤,以便主系统分区中的文件系统格式可以得到更新,同时不会产生向后兼容问题或引发 stepping-stone 更新,这样一来,用户便可以从出厂映像直接更新到最新版本。
-</p>
+<p>对于经过内部测试的 Pixel A/B 和非 A/B 变体(仅推出了 A/B 变体),所用空间仅差 320MiB。在空间为 32GiB 的设备上,这只相当于不到 1%。对于空间为 16GiB 的设备,这相当于不到 2%,对于空间为 8GiB 的设备,这几乎相当于 4%(假设所有三种设备都具有相同的系统映像)。</p>
 
-<p>根据 SELinux 策略,安装后步骤适用于在指定设备上执行设计所需的任务或其他需要尽可能完成的任务:更新支持 A/B 的固件或引导加载程序、为新版本准备部分数据库的副本等等。该步骤不适用于重新启动之前的一次性错误修复(此类修复需要无法预见的权限)。
-</p>
+<h3>你们为何不使用 SquashFS?</h3>
 
-<p>所选的安装后程序在 <code>postinstall</code> SELinux 环境中运行。新装载的分区中的所有文件都将使用 <code>postinstall_file</code> 进行标记,无论它们在重新启动到新系统后的属性如何,都是如此。对新系统中 SELinux 属性实施的更改不会影响安装后步骤。如果安装后的程序需要额外的权限,则必须将这些权限添加到安装后的环境中。
-</p>
+<p>我们尝试了 SquashFS,但无法实现高端设备所需的性能。我们不会为手持设备使用 SquashFS,也不推荐这么做。</p>
 
-<h2 id="implementation">实现</h2>
-
-<p>希望实现该功能的 OEM 和 SoC 供应商必须向其引导加载程序中添加以下支持:</p>
+<p>更具体地说,使用 SquashFS 时,系统分区上节省了约 50% 的大小,但绝大多数压缩率较高的文件都是预编译的 .odex 文件。这些文件都具有非常高的压缩比(接近 80%),但系统分区其余部分的压缩比要低得多。另外,SquashFS 在 Android 7.0 中引起了以下性能问题:</p>
 
 <ul>
-  <li>将<a href="#kernel-command-line-arguments">正确参数</a>传递给内核</li>
-  <li>实现 <code>boot_control</code> HAL (<a class="external-link nowrap" target="_blank" href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/boot_control.h">https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/boot_control.h</a>)</li>
-  <li>实现状态机,如图 1 所示:</li>
-</ul>
+  <li>与以前的设备相比,Pixel 具有非常快的闪存,但并没有大量的备用 CPU 周期,因此虽然从闪存读取的字节数更少,但需要更多的 CPU 来处理 I/O,这是一个潜在的瓶颈。</li>
+  <li>在没有任何负载的系统上,有些 I/O 变化在人为基准条件下不会出现任何问题,但在具有真实负载(如 Nexus 6 上的加密)的实际用例中有时则会出现问题。</li>
+  <li>在某些方面,基准化分析显示回归率达到 85%。</li>
+  </ul>
 
-<img src="images/ab-updates-state-machine.png"/>
+<p>随着 SquashFS 日趋成熟并且增加了旨在降低 CPU 影响的功能(例如,将不应压缩且经常访问的文件列入白名单),我们将继续对其进行评估并向设备制造商提供建议。</p>
 
-<p class="img-caption"><strong>图 1. </strong> 引导加载程序状态机</p>
+<h3>在不使用 SquashFS 的情况下,你们是如何做到将系统分区的大小减半的?</h3>
 
-<p>可使用 <a class="external-link" target="_blank" href="https://android.googlesource.com/platform/system/extras/+/master/bootctl/"><code>bootctl</code></a> 实用工具测试启动控件 HAL。
-</p>
+<p>应用存储在 .apk 文件中,这些文件实际上是 ZIP 档案。每个 .apk 文件中都有一个或多个包含可移植 Dalvik 字节码的 .dex 文件。.odex 文件(经过优化的 .dex 文件)会与 .apk 文件分开放置,并且可以包含特定于设备的机器代码。如果 .odex 文件可用,Android 将能够以预先编译的速度运行应用,而无需在每次启动应用时等待系统编译代码。.odex 文件并不是绝对必需的:实际上 Android 可以通过解译或即时 (JIT) 编译来直接运行 .dex 代码,但使用 .odex 文件可以实现启动速度和运行时速度的最佳组合(如果有足够的空间)。</p>
 
-<p>已针对 Brillo 实施了一些测试:</p>
+<p>示例:对于运行 Android 7.1 且系统映像总大小为 2628MiB(2755792836 字节)的 Nexus 6P 中的 installed-files.txt,在系统映像总大小中占据比重最大的几种文件类型明细如下:</p>
 
+<table>
+<tbody>
+<tr>
+<td>.odex</td>
+<td>1391770312 字节</td>
+<td>50.5%</td>
+</tr>
+<tr>
+<td>.apk</td>
+<td>846878259 字节</td>
+<td>30.7%</td>
+</tr>
+<tr>
+<td>.so(本机 C/C++ 代码)</td>
+<td>202162479 字节</td>
+<td>7.3%</td>
+</tr>
+<tr>
+<td>.oat 文件/.art 映像</td>
+<td>163892188 字节</td>
+<td>5.9%</td>
+</tr>
+<tr>
+<td>字体</td>
+<td>38952361 字节</td>
+<td>1.4%</td>
+</tr>
+<tr>
+<td>icu 语言区域数据</td>
+<td>27468687 字节</td>
+<td>0.9%</td>
+</tr>
+</tbody>
+</table>
+
+<p>这些数字在其他设备上是类似的,因此在 Nexus/Pixel 设备上,.odex 文件会占用系统分区大约一半的空间。这意味着我们可以继续使用 EXT4,但会在未出厂时将 .odex 文件写入 B 分区,然后在第一次启动时将它们复制到 <code>/data</code>。用于 EXT4 A/B 的实际存储空间与用于 SquashFS A/B 的相同,因为如果我们使用了 SquashFS,我们会将经过预先优化的 .odex 文件放入 system_a 而非 system_b。</p>
+
+<h3>将 .odex 文件复制到 /data 难道不是意味着在 /system 上节省的空间会在 /data 上被用掉吗?</h3>
+
+<p>不完全是。在 Pixel 上,.odex 文件占用的大部分空间会用于应用(通常位于 <code>/data</code> 上)。这些应用通过 Google Play 更新,因此系统映像上的 .apk 和 .odex 文件在设备生命周期的大部分时间内都不会用到。当用户实际使用每个应用时,此类文件可以被完全排除并替换为配置文件驱动的小型 .odex 文件(因此,用户不使用的应用不需要空间)。有关详细信息,请观看 Google I/O 2016 演讲 <a href="https://www.youtube.com/watch?v=fwMM6g7wpQ8">ART 的演变</a>。</p>
+
+<p>难以进行比较的几个主要原因:</p>
 <ul>
-  <li>
-    <a class="external-link nowrap" target="_blank" href="https://android.googlesource.com/platform/system/extras/+/refs/heads/master/tests/bootloader/">https://android.googlesource.com/platform/system/extras/+/refs/heads/master/tests/bootloader/</a>
-  </li>
-  <li>
-    <a class="external-link nowrap" target="_blank" href="https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/server/site_tests/brillo_BootLoader/brillo_BootLoader.py">https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/server/site_tests/brillo_BootLoader/brillo_BootLoader.py</a>
-  </li>
+<li>由 Google Play 更新的应用在收到其第一次更新时,始终会将 .odex 文件放在 <code>/data</code> 上。</li>
+<li>用户不运行的应用根本不需要 .odex 文件。</li>
+<li>配置文件驱动型编译会生成比预先编译更小的 .odex 文件(因为前者仅优化对性能至关重要的代码)。</li>
 </ul>
 
-<h3 id="kernel-patches">内核补丁程序</h3>
+<p>如需详细了解可供 OEM 使用的调整选项,请参阅<a href="/devices/tech/dalvik/configure.html">配置 ART</a>。</p>
 
-<ul>
-  <li>
-    <a class="external-link nowrap" target="_blank" href="https://android-review.googlesource.com/#/c/158491/">https://android-review.googlesource.com/#/c/158491/</a>
-  </li>
-  <li>
-    <a class="external-link nowrap" target="_blank" href="https://android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18">https://android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18</a>
-  </li>
-</ul>
+<h3>.odex 文件在 /data 上不是有两个副本吗?</h3>
 
-<h3 id="kernel-command-line-arguments">内核命令行参数</h3>
-
-<p>内核命令行参数<strong>必须</strong>包含以下额外参数:</p>
-
-<pre>skip_initramfs rootwait ro init=/init root="/dev/dm-0 dm=system none ro,0 1 \
-  android-verity &lt;public-key-id&gt; &lt;path-to-system-partition&gt;"
-</pre>
-
-<p>值 <code>&lt;public-key-id&gt;</code> 是用于验证 verity 表签名的公钥 ID(请参阅 <a href="/security/verifiedboot/dm-verity.html">dm-verity</a>)。
+<p>这个问题有点复杂。在新的系统映像被写入后,系统将针对新的 .dex 文件运行新版本的 dex2oat ,以生成新的 .odex 文件。这个过程发生在旧系统仍在运行时,因此旧的和新的 .odex 文件同时位于 <code>/data</code> 上。
 </p>
 
-<h4>要将包含相应公钥的 .X509 证书添加到系统密钥环,请执行以下操作:</h4>
+<p>在优化每个程序包之前,OtaDexoptService 中的代码 (<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/OtaDexoptService.java#200" class="external">frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/OtaDexoptService.java#200</a></code>) 都会调用 <code>getAvailableSpace</code>,以避免过度填充 <code>/data</code>。请注意,此处的可用数值仍然是保守估计:是指在达到通常的系统下限空间阈值之前剩余的空间量(以百分比和字节数计)。<em></em><em></em>所以如果 <code>/data</code> 已满,每个 .odex 文件便不会有两个副本。上述代码还有一个 BULK_DELETE_THRESHOLD:如果设备接近到要填充可用空间(如上所述),则属于未使用应用的 .odex 文件将会被移除。这是每个 .odex 文件没有两个副本的另一种情况。</p>
 
-<ol>
-  <li>将设置为 <code>.der</code> 格式的 .X509 证书复制到 <code>kernel</code> 的根目录。您可以使用以下 <code>openssl</code> 命令将证书格式从 <code>.pem</code> 转换为 <code>.der</code>(如果 .X509 证书采用 <code>.pem</code> 格式):<pre>openssl x509 -in &lt;x509-pem-certificate&gt; -outform der -out &lt;x509-der-certificate&gt;</pre>
-  </li>
-  <li>复制到内核版本根目录后,构建 <code>zImage</code> 以将该证书添加为系统密钥环的一部分。您可以通过以下 <code>procfs</code> 条目(需要启用 <code>KEYS_CONFIG_DEBUG_PROC_KEYS</code>)验证该步骤:<pre>angler:/# cat /proc/keys
+<p>最糟糕的情况是 <code>/data</code> 已被完全填满,更新将等到设备重新启动到新系统,而不再需要旧系统的 .odex 文件时。PackageManager 可处理此情况:(<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/PackageManagerService.java#7215" class="external">frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/PackageManagerService.java#7215</a></code>)。在新系统成功启动之后,<code>installd</code> (<code><a href="https://android.googlesource.com/platform/frameworks/native/+/nougat-mr1-release/cmds/installd/commands.cpp#2192" class="external">frameworks/native/+/nougat-mr1-release/cmds/installd/commands.cpp#2192</a></code>) 可以移除旧系统用过的 .odex 文件,从而使设备返回到只有一个副本的稳定状态。</p>
 
-1c8a217e I------     1 perm 1f010000     0     0 asymmetri
-Android: 7e4333f9bba00adfe0ede979e28ed1920492b40f: X509.RSA 0492b40f []
-2d454e3e I------     1 perm 1f030000     0     0 keyring
-.system_keyring: 1/4</pre>
-  </li>
-</ol>
+<p>因此,尽管 <code>/data</code> 可能会包含所有 .odex 文件的两个副本,但 (a) 这是暂时的,并且 (b) 只有在 <code>/data</code> 上有足够的可用空间时才会发生。除了在更新期间,将始终只有一个副本。作为 ART 的常规强大功能的一部分,它永远不会在 <code>/data</code> 中填充 .odex 文件(因为在非 A/B 系统上,这也会是一个问题)。</p>
 
-<p>如果 .X509 证书添加成功,则表示系统密钥环中存在相应公钥。突出显示部分表示公钥 ID。</p>
+<h3>这种写入/复制操作不会增加闪存磨损吗?</h3>
 
-<p>下一步是将空格替换为“#”,并将其作为 <code>&lt;public-key-id&gt;</code> 在内核命令行中传递。例如,在上述示例中,以下证书在 <code>&lt;public-key-id&gt;</code> 的位置传递:<code>Android:#7e4333f9bba00adfe0ede979e28ed1920492b40f</code>
-</p>
+<p>只有一小部分闪存会被重写:完整 Pixel 系统更新会写入大约 2.3GiB 的数据。(应用也会被重新编译,但非 A/B 更新也是如此。)一直以来,基于块的完整 OTA 会写入类似数量的数据,所以闪存磨损率应该是类似的。</p>
 
-<h3 id="recovery">恢复</h3>
+<h3>刷写两个系统分区会增加出厂刷写时间吗?</h3>
 
-<p>恢复 RAM 磁盘现已包含在 <code>boot.img</code> 文件中。进入恢复模式时,引导加载程序<strong>无法</strong>在内核命令行中添加 <code>skip_initramfs</code> 选项。
-</p>
+<p>不会。Pixel 的系统映像大小没有增加(只是将空间划分到了两个分区)。</p>
 
-<h3 id="build-variables">构建变量</h3>
+<h3>如果将 .odex 文件保留在 B 上,不会导致恢复出厂设置后重新启动速度变慢吗?</h3>
 
-<h5>必须针对 A/B 目标定义以下变量:</h5>
+<p>会。如果您已实际使用了一台设备,进行了 OTA,并且执行了恢复出厂设置,则首次重新启动的速度将会比未进行这些操作时慢(在 Pixel XL上,分别为 1 分 40 秒和 40 秒),因为在进行第一次 OTA 之后,B 中将会失去 .odex 文件,所以该文件无法复制到 <code>/data</code>。这是一种取舍。</p>
 
-<ul>
-  <li><code>AB_OTA_UPDATER := true</code></li>
-  <li>
-    <code>AB_OTA_PARTITIONS := \</code><br />
-    <code>  boot \</code><br />
-    <code>  system \</code><br />
-    <code>  vendor</code><br />以及通过 <code>update_engine</code> 更新的其他分区(无线装置、引导加载程序等)。
-  </li>
-  <li>
-    <code>BOARD_BUILD_SYSTEM_ROOT_IMAGE := true</code>
-  </li>
-  <li><code>TARGET_NO_RECOVERY := true</code></li>
-  <li>
-    <code>BOARD_USES_RECOVERY_AS_BOOT := true</code>
-  </li>
-  <li>
-    <code>PRODUCT_PACKAGES += \</code><br />
-    <code>  update_engine \</code><br />
-    <code>  update_verifier</code>
-  </li>
-</ul>
+<p>与常规启动相比,恢复出厂设置应该是一个极少执行的操作,因此所花费的时间不是很重要。(这不会影响从工厂获取设备的用户或审核者,因为在这种情况下,B 分区可用。)使用 JIT 编译器意味着我们不需要重新编译所有内容,所以情况不会像您想象的那样糟糕。<em></em>而且还可以通过在清单 (<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/packages/SystemUI/AndroidManifest.xml#23" class="external">frameworks/base/+/nougat-mr1-release/packages/SystemUI/AndroidManifest.xml#23</a></code>) 中使用 <code>coreApp="true"</code> 将应用标记为需要预先编译。这是 <code>system_server</code> 当前使用的,因为出于安全考虑,不允许使用 JIT。</p>
 
-<h5>(可选)针对调试版本定义以下变量:</h5>
+<h3>如果将 .odex 文件保留在 /data 而非 /system 上,不会导致 OTA 后重新启动速度变慢吗?</h3>
 
-<ul>
-  <li>
-    <code>PRODUCT_PACKAGES_DEBUG += update_engine_client</code>
-  </li>
-</ul>
+<p>不会。如上所述,系统会在旧系统映像仍在运行时运行新的 dex2oat,以生成新系统将会需要的文件。在相关工作完成之前,更新会被视为不可用。</p>
 
-<h5>无法针对 A/B 目标定义以下变量:</h5>
+<h3>我们可以(应该)推出 32GiB、16GiB 或 8GiB 的 A/B 设备吗?</h3>
 
-<ul>
-  <li><code>BOARD_RECOVERYIMAGE_PARTITION_SIZE</code></li>
-  <li><code>BOARD_CACHEIMAGE_PARTITION_SIZE</code></li>
-  <li><code>BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE</code></li>
-</ul>
+<p>经证明,32GiB 空间在 Pixel 上能够很好地满足需求,而占用 16GiB 中的 320MiB 则意味着空间减少了 2%。同样,占用 8GiB 中的 320MiB 则意味着空间减少了 4%。显然,在空间为 4GiB 的设备上,不推荐使用 A/B,因为 320MiB 的开销几乎占总可用空间的 10%。</p>
 
-<h3 id="partitions">分区</h3>
+<h3>AVB2.0 需要 A/B OTA 吗?</h3>
 
-<ul>
-  <li>A/B 设备不需要恢复分区或缓存分区,因为 Android 已不再使用这些分区。数据分区现在用于存储下载的 OTA 软件包,而恢复映像代码位于启动分区。
-  </li>
-  <li>A/B 化的所有分区应命名如下(插槽始终被命名为 <code>a</code>、<code>b</code> 等):<code>boot_a</code>、<code>boot_b</code>、<code>system_a</code>、<code>system_b</code>、<code>vendor_a</code>、<code>vendor_b</code>。
-  </li>
-</ul>
+<p>不需要。Android <a href="/security/verifiedboot/">验证启动</a>一直以来都是需要基于块的更新,但不一定是 A/B 更新。</p>
 
-<h3 id="fstab">Fstab</h3>
+<h3>A/B OTA 需要 AVB2.0 吗?</h3>
 
-<p>参数 <code>slotselect</code> <strong>必须</strong>位于 A/B 化分区的行中。例如:</p>
+<p>不需要。</p>
 
-<pre>&lt;path-to-block-device&gt;/vendor  /vendor  ext4  ro
-wait,verify=&lt;path-to-block-device&gt;/metadata,slotselect</pre>
+<h3>A/B OTA 会破坏 AVB2.0 的回滚保护吗?</h3>
 
-<p>请注意,不应选择名称为 <code>vendor</code> 的分区,而应选择分区 <code>vendor_a</code> 或 <code>vendor_b</code> 并将其装载到 <code>/vendor</code> 装载点上。
-</p>
+<p>不会。这里存在一些混淆,因为如果 A/B 系统无法启动到新的系统映像,则将自动恢复到“之前”的系统映像(经过引导加载程序确定的重试次数之后)。但关键在于,A/B 意义上的“之前”实际上仍然是“当前”系统映像。一旦设备成功启动新映像,回滚保护就会启动并确保您无法返回。但是,在您实际成功启动新映像之前,回滚保护不会将其视为当前系统映像。</p>
 
-<h3 id="kernel-slot-arguments">内核插槽参数</h3>
+<h3>如果在系统运行时安装更新,速度会不会很慢?</h3>
 
-<p>应通过特定的 DT 节点 (<code>/firmware/android/slot_suffix</code>) 或 <code>androidboot.slot_suffix</code> 命令行参数传递当前插槽后缀。
-</p>
+<p>使用非 A/B 更新时,目标是尽快安装更新,因为用户正在等待,并且在系统应用更新时,用户将无法使用其设备。使用 A/B 更新时,情况则恰恰相反。这是因为用户仍在使用其设备,于是目标便是尽可能减少影响,所以系统会有意缓慢地进行更新。通过 Java 系统更新客户端中的逻辑(对于 Google 来说是 GMSCore - 由 GMS 提供的核心程序包),Android 还会尝试选择用户完全不使用其设备的时间进行更新。该平台支持暂停/恢复更新,如果用户开始使用设备,客户端可以使用该功能来暂停更新,并在设备再次空闲时恢复更新。</p>
 
-<p>或者,如果引导加载程序实现 fastboot,则应支持以下命令和变量:</p>
+<p>在进行 OTA 时分两个阶段,在界面中的进度条下清楚地显示为“第 1 步(共 2 步)”和“第 2 步(共 2 步)”。<em></em><em></em>第 1 步是写入数据块,第 2 步是预编译 .dex 文件。这两个阶段在对性能的影响方面有很大差异。第一个阶段是简单的 I/O。这需要很少的资源(RAM、CPU、I/O),因为它只是缓慢地复制数据块。</p>
 
-<h4>命令</h4>
-<ul>
-  <li>
-    <code>set_active &lt;slot&gt;</code> - 将当前活动插槽设置为指定插槽。此外,还必须清除该插槽的不可启动标记,并将重试计数重置为默认值。
-  </li>
-</ul>
+<p>第二个阶段是运行 dex2oat 来预编译新的系统映像。这显然在相应要求上没有明确的界限,因为它会编译实际应用。与编译小而简单的应用相比,编译大而复杂的应用所涉及的工作量显然要多出许多;而在第一个阶段,没有任何磁盘块会比其他磁盘块更大或更复杂。</p>
 
-<h4>变量</h4>
-<ul>
-  <li>
-    <code>has-slot:&lt;partition-base-name-without-suffix&gt;</code> - 如果指定分区支持插槽,则返回“yes”,否则,返回“no”。
-  </li>
-  <li>
-    <code>current-slot</code> - 返回接下来将从中启动的插槽后缀。
-  </li>
-  <li>
-    <code>slot-count</code> - 返回一个表示可用插槽数量的整数。目前支持两个插槽,因此,该值为 <code>2</code>。
-  </li>
-  <li>
-    <code>slot-successful:&lt;slot-suffix&gt;</code> - 如果指定插槽已标记为成功启动,则返回“yes”,否则,返回“no”。
-  </li>
-  <li>
-    <code>slot-unbootable:&lt;slot-suffix&gt;</code> - 如果指定插槽标记为不可启动,则返回“yes”,否则,返回“no”。
-  </li>
-  <li>
-    <code>slot-retry-count:<slot suffix></slot></code> - 可以尝试启动指定插槽的剩余重试次数。
-  </li>
-  <li>这些变量都应显示在 <code>fastboot getvar all</code> 下
-  </li>
-</ul>
+<p>该过程类似于 Google Play 在后台安装应用更新,然后显示“已更新 5 个应用”通知,而这是多年来一直采用的做法。<em></em></p>
 
-<h3 id="ota-package-generation">生成 OTA 软件包</h3>
+<h3>如果用户实际上正在等待更新,该怎么办?</h3>
 
-<p><a href="/devices/tech/ota/tools.html">OTA 软件包工具</a>遵循与非 A/B 设备一样的命令。<code>target_files.zip</code> 文件必须通过为 A/B 目标定义版本变量生成。OTA 软件包工具会自动识别并生成格式适用于 A/B 更新程序的软件包。
-</p>
+<p>GmsCore 中的当前实现不区分后台更新和用户启动的更新,但将来可能会加以区分。届时,如果用户明确要求安装更新或正在查看更新进度屏幕,我们将假设他们正在等待系统完成更新,从而优先安排更新工作。</p>
 
-<p>例如,使用以下命令生成完整 OTA:</p>
+<h3>如果无法应用更新,会怎样?</h3>
 
-<pre>./build/tools/releasetools/ota_from_target_files \
-  dist_output/tardis-target_files.zip ota_update.zip
-</pre>
+<p>对于非 A/B 更新,如果更新无法应用,过去经常会导致用户的设备无法使用。唯一例外情况是在应用启动之前发生故障(比如因为程序包验证失败)。对于 A/B 更新,无法应用更新不会影响当前正在运行的系统。可以稍后重新尝试更新。</p>
 
-<p>或者生成增量 OTA:</p>
+<h3>GmsCore 起到什么作用?</h3>
 
-<pre>./build/tools/releasetools/ota_from_target_files \
-  -i PREVIOUS-tardis-target_files.zip \
-  dist_output/tardis-target_files.zip incremental_ota_update.zip
-</pre>
+<p>在 Google 的 A/B 实现中,平台 API 和 <code>update_engine</code> 负责提供机制,而 GmsCore 则负责提供政策。也就是说,平台知道如何应用 A/B 更新,并且所有相应代码都位于 AOSP 中(如上所述),而 GmsCore 则负责确定应用哪些内容以及何时应用。<em></em><em></em><em></em></p>
 
-<h2 id="configuration">配置</h2>
+<p>如果不使用 GmsCore,则可以使用相同的平台 API 编写自己的替代项。用于控制 <code>update_engine</code> 的平台 Java API 是 <code>android.os.UpdateEngine</code>:<code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/UpdateEngine.java" class="external-link">frameworks/base/core/java/android/os/UpdateEngine.java</a></code>。调用程序可以提供 <code>UpdateEngineCallback</code>,以便接收有关状态更新的通知:<code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/UpdateEngineCallback.java" class="external-link">frameworks/base/+/master/core/java/android/os/UpdateEngineCallback.java</a></code>。请参阅核心类的参考文件,了解如何使用相应接口。</p>
 
-<h3 id="config-partitions">分区</h3>
+<h3>哪些系统芯片 (SoC) 支持 A/B?</h3>
 
-<p>更新引擎可以更新同一磁盘中定义的任何一对 A/B 分区。
-</p>
+<p>截至 2017 年 3 月 15 日,我们得到的信息如下:</p>
+<table class="style0">
+<tbody>
+<tr>
+<td></td>
+<td><strong>Android 7.x 版本</strong></td>
+<td><strong>Android 8.x 版本</strong></td>
+</tr>
+<tr>
+<td><strong>Qualcomm</strong></td>
+<td>根据 OEM 的请求而定</td>
+<td>所有芯片组都将受支持</td>
+</tr>
+<tr>
+<td><strong>Mediatek</strong></td>
+<td>根据 OEM 的请求而定</td>
+<td>所有芯片组都将受支持</td>
+</tr>
+</tbody>
+</table>
 
-<p>一对分区有一个公共前缀(例如 <code>system</code> 或 <code>boot</code>)及按插槽划分的后缀(例如 <code>_a</code>)。有效负荷生成器为其定义更新的分区列表由 <code>AB_OTA_PARTITIONS</code> make 变量配置。例如,如果磁盘中有一对分区 <code>bootloader_a</code> 和 <code>booloader_b</code>(<code>_a</code> 和 <code>_b</code> 为插槽后缀),则可以通过在产品或单板配置中指定以下变量来更新这些分区:</p>
-
-<pre>AB_OTA_PARTITIONS := \
-  boot \
-  system \
-  bootloader
-</pre>
-
-<p>由更新引擎更新的所有分区不得由系统的其余部分修改。在增量更新期间,来自当前插槽的二进制数据将用于在新插槽中生成数据。<em></em>任何修改都可能导致新插槽数据在更新过程中无法通过验证,从而导致更新失败。
-</p>
-
-<h3 id="post-install">安装后</h3>
-
-<p>对于每个已更新的分区,都可以使用一组键值对配置不同的安装后步骤。
-</p>
-
-<p>要在新映像中运行位于 <code>/system/usr/bin/postinst</code> 的程序,请指定与系统分区中相应文件系统的根目录对应的路径。例如,<code>usr/bin/postinst</code> 的对应路径为 <code>system/usr/bin/postinst</code>(如果未使用 RAM 磁盘)。此外,请指定要传递到 <code>mount(2)</code> 系统调用的文件系统类型。将以下内容添加到产品或设备的 <code>.mk</code> 文件(如果适用):</p>
-
-<pre>AB_OTA_POSTINSTALL_CONFIG += \
-  RUN_POSTINSTALL_system=true \
-  POSTINSTALL_PATH_system=usr/bin/postinst \
-  FILESYSTEM_TYPE_system=ext4
-</pre>
-
-<h3 id="compilation">后台中的应用编译</h3>
-
-<p>要在 A/B 更新的后台编译应用,需要对产品的设备配置(位于产品的 device.mk 中)进行以下两项补充:</p>
-
-<ol>
-  <li>向版本中添加原生组件。这样可以确保编译脚本和二进制文件能够编译并添加到系统映像中。
-  <pre>
-  # A/B OTA dexopt package
-  PRODUCT_PACKAGES += otapreopt_script
-</pre>
-  </li>
-  <li>将编译脚本与 <code>update_engine</code> 相关联,以便它可以作为安装后步骤运行。
-  <pre>
-  # A/B OTA dexopt update_engine hookup
-  AB_OTA_POSTINSTALL_CONFIG += \
-    RUN_POSTINSTALL_system=true \
-    POSTINSTALL_PATH_system=system/bin/otapreopt_script \
-    FILESYSTEM_TYPE_system=ext4 \
-    POSTINSTALL_OPTIONAL_system=true
-  </pre>
-  </li>
-</ol>
-
-<p>请参阅 <a href="/devices/tech/dalvik/configure.html#other_odex">DEX_PREOPT 文件的首次启动安装</a>,以将预选文件安装到未使用的第二个系统分区中。</p>
+<p>有关时间表的详细信息,请咨询您的 SoC 联系人。对于上面未列出的 SoC,请直接与 SoC 联系。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/sign_builds.html b/zh-cn/devices/tech/ota/sign_builds.html
index 148a280..bd0c9a4 100644
--- a/zh-cn/devices/tech/ota/sign_builds.html
+++ b/zh-cn/devices/tech/ota/sign_builds.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>对要发布的版本进行签名</title>
+    <title>对要发布的编译版本进行签名</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
@@ -24,34 +24,34 @@
 <ol>
 <li>映像中的所有 .apk 文件都必须经过签名。Android 软件包管理器通过下列两种方式使用 .apk 签名:<ul>
 <li>更换应用时,必须使用与旧应用相同的密钥对其签名,才能存取旧应用的数据。无论是通过覆盖 .apk 来更新用户应用,还是使用安装在 <code>/data</code> 下的新版本应用来覆盖系统应用,这一点都适用。</li>
-<li>如果两个或多个应用想要共享同一个用户 ID(方便共享数据等),则必须使用相同的密钥对它们进行签名。</li></ul></li>
-<li>必须使用符合系统预期的密钥对 OTA 更新包进行签名,否则在安装过程中 OTA 更新包将被拒绝。</li>
+<li>如果两个或多个应用想要共享同一个用户 ID(方便共享数据等),则必须使用相同的密钥对它们进行签名。</li></ul>
+</li><li>必须使用符合系统预期的密钥对 OTA 更新包进行签名,否则在安装过程中 OTA 更新包将被拒绝。</li>
 </ol>
 
 <h2 id="release-keys">发布密钥</h2>
 
-<p>Android 树的 <code>build/target/product/security</code> 目录中提供了“测试密钥”<i></i>。使用 <code>make</code> 构建 Android OS 映像便可使用这些测试密钥对所有 .apk 文件进行签名。由于这些测试密钥是公开的,任何人都可以使用相同的密钥对他们自己的 .apk 文件签名,这样他们就能够替换或盗用您的操作系统映像中构建的系统应用。因此,您必须使用只有您自己才能访问的特殊“发布密钥”<i></i>集对公开发布或部署的 Android OS 映像进行签名。</p>
+<p>Android 树的 <code>build/target/product/security</code> 目录中提供了测试密钥。<i></i>使用 <code>make</code> 编译 Android OS 映像便可使用这些测试密钥对所有 .apk 文件进行签名。由于这些测试密钥是公开的,任何人都可以使用相同的密钥对他们自己的 .apk 文件签名,这样他们就能够替换或盗用您的操作系统映像中编译的系统应用。因此,您必须使用只有您自己才能访问的特殊“发布密钥”<i></i>集对公开发布或部署的 Android OS 映像进行签名。</p>
 
 <p>要生成您自己的唯一发布密钥集,请在 Android 树的根目录下运行以下命令:</p>
 
-<pre class="no-pretty-print">
-subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]'
-mkdir ~/.android-certs
-for x in releasekey platform shared media; do \
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]'</code>
+<code class="devsite-terminal">mkdir ~/.android-certs</code>
+<code class="devsite-terminal">for x in releasekey platform shared media; do \
     ./development/tools/make_key ~/.android-certs/$x "$subject"; \
-done
+done</code>
 </pre>
 
 <p>您需要对 <code>$subject</code> 进行更改以反映贵组织的信息。您可以使用任何目录,但要注意选择一个已备份且安全的位置。部分供应商会使用强密码加密私钥,并将其存储在源代码控制系统中;其他供应商则将他们的发布密钥完全存储在其他地方,如气隙阻隔的计算机上。</p>
 
 <p>要生成发布映像,请使用以下命令:</p>
 
-<pre class="no-pretty-print">
-make dist
-./build/tools/releasetools/sign_target_files_apks \
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">make dist</code>
+<code class="devsite-terminal">./build/tools/releasetools/sign_target_files_apks \
     -o \    # explained in the next section
     -d ~/.android-certs out/dist/*-target_files-*.zip \
-    signed-target_files.zip
+    signed-target_files.zip</code>
 </pre>
 
 <p><code>sign_target_files_apks</code> 脚本将目标文件 .zip 作为输入文件,并生成一个新的目标文件 .zip,其中所有的 .apk 都已使用新密钥签名。您可以在 <code>signed-target_files.zip</code> 中的 <code>IMAGES/</code> 目录下找到新签名的映像。</p>
@@ -60,26 +60,28 @@
 
 您可以按照以下步骤将已签名的目标文件 zip 转换为已签名的 OTA 更新 zip:
 
-<pre class="no-pretty-print">
-./build/tools/releasetools/ota_from_target_files \
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">./build/tools/releasetools/ota_from_target_files \
     -k ~/.android-certs/releasekey \
     signed-target_files.zip \
-    signed-ota_update.zip
+    signed-ota_update.zip</code>
 </pre>
 
 <h3 id="signatures-sideloading">签名和旁加载</h3>
 <p>旁加载不会绕过 Recovery 流程中的正常软件包签名验证机制。在安装一个软件包之前,Recovery 会验证该软件包是否由与 Recovery 分区中存储的公钥相匹配的私钥进行签名,这与利用无线方式传输的软件包的处理方式一样。
 </p>
 
-<p>从主系统接收的更新包通常要接受两次验证:一次是由主系统使用 Android API 中的 <code><a href="http://developer.android.com/reference/android/os/RecoverySystem.html#verifyPackage">RecoverySystem.verifyPackage()</a></code> 方法进行验证,第二次则是通过 Recovery 进行验证。RecoverySystem API 对照存储在主系统 <code>/system/etc/security/otacerts.zip
+<p>从主系统收到的更新包通常要经过两次验证:一次是由主系统使用 Android API 中的 <code><a href="http://developer.android.com/reference/android/os/RecoverySystem.html#verifyPackage">RecoverySystem.verifyPackage()</a></code> 方法进行验证,另一次是通过 Recovery 进行验证。RecoverySystem API 对照存储在主系统 <code>/system/etc/security/otacerts.zip
 </code> 文件(默认情况下)中的公钥对签名进行检查。Recovery 对照存储在 Recovery 分区 RAM 磁盘中的 <code>/res/keys</code> 文件中的公钥对签名进行检查。</p>
 
 <p>默认情况下,由此版本生成的目标文件 .zip 会将 OTA 证书设置为与测试密钥相匹配。在发布的映像上,必须使用不同的证书,这样设备才能验证更新包的真实性。如前面一部分所示,将 <code>-o</code> 标志传递到 <code>sign_target_files_apks</code> 即可将测试密钥证书替换成您的证书目录中的发布密钥证书。</p>
 
 <p>通常情况下,系统映像和 Recovery 映像存储的是相同的 OTA 公钥集。通过将密钥仅<i></i>添加至 Recovery 密钥集,可对只能通过旁加载安装的 apk 包(假设主系统的更新下载机制正确地对照 otacerts.zip 进行验证)签名。您可以通过在产品定义中设置 PRODUCT_EXTRA_RECOVERY_KEYS 变量来指定其他仅可纳入 Recovery 中的密钥:</p>
 
-<p><code>vendor/yoyodyne/tardis/products/tardis.mk</code></p>
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
+vendor/yoyodyne/tardis/products/tardis.mk
+</pre>
+<pre class="devsite-click-to-copy">
  [...]
 
 PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload
@@ -104,8 +106,10 @@
 
 <p>单个 apk 包通过在其 Android.mk 文件中设置 LOCAL_CERTIFICATE 来指定其中一个密钥。(如果未设置此变量,则使用 testkey。)您还可以通过路径名指定完全不同的密钥,例如:</p>
 
-<p><code>device/yoyodyne/apps/SpecialApp/Android.mk</code></p>
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
+device/yoyodyne/apps/SpecialApp/Android.mk
+</pre>
+<pre class="devsite-click-to-copy">
  [...]
 
 LOCAL_CERTIFICATE := device/yoyodyne/security/special
@@ -115,20 +119,19 @@
 </code> 密钥来对 SpecialApp.apk 进行签名。此版本仅可使用不受<i></i>密码保护的私钥。</p>
 
 <h2 id="advanced-signing-options">高级签名选项</h2>
-<p>当您运行 <code>sign_target_files_apks</code> 脚本时,您必须在命令行中指定此版本中每个密钥的替换密钥。
-<code>-k <i>src_key</i>=<i>
-dest_key</i></code> 标志每次指定一个密钥替换。<code>-d <i>dir</i></code> 标志可指定一个含有四个密钥的目录来替换所有位于 <code>build/target/product/security</code> 中的密钥;这相当于使用 <code>-k</code> 四次来指定映射:</p>
+<p>当您运行 <code>sign_target_files_apks</code> 脚本时,必须在命令行中指定相应编译版本中使用的每个密钥的替换密钥。<code>-k <i>src_key</i>=<i>
+dest_key</i></code> 标记每次只能指定一个替换密钥。<code>-d <i>dir</i></code> 标记可让您指定一个含有四个密钥的目录来替换 <code>build/target/product/security</code> 中的所有密钥;这相当于使用四次 <code>-k</code> 来指定这些映射:</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 build/target/product/security/testkey  = dir/releasekey
 build/target/product/security/platform = dir/platform
 build/target/product/security/shared   = dir/shared
 build/target/product/security/media    = dir/media
 </pre>
 
-<p>对于假定的 tardis 产品,您需要五个受密码保护的密钥:四个用于替换 <code>build/target/product/security</code> 中的四个密钥,其余一个则用于替换在上述示例中提到的 SpecialApp 所需的额外的 <code>keydevice/yoyodyne/security/special</code>。如果密钥位于以下文件中:</p>
+<p>对于假定的 tardis 产品,您需要五个受密码保护的密钥:四个用于替换 <code>build/target/product/security</code> 中的四个密钥,其余一个则用于替换 SpecialApp 所需的另外一个 <code>keydevice/yoyodyne/security/special</code>(请参见上面的示例)。如果密钥位于以下文件中:</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 vendor/yoyodyne/security/tardis/releasekey.x509.pem
 vendor/yoyodyne/security/tardis/releasekey.pk8
 vendor/yoyodyne/security/tardis/platform.x509.pem
@@ -145,12 +148,12 @@
 
 <p>那么您将对所有应用签名,如下所示:</p>
 
-<pre class="no-pretty-print">
-% <b>./build/tools/releasetools/sign_target_files_apks \
-    -d vendor/yoyodyne/security/tardis \
-    -k vendor/yoyodyne/special=vendor/yoyodyne/special-release \
-    -o \
-    tardis-target_files.zip signed-tardis-target_files.zip</b>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">./build/tools/releasetools/sign_target_files_apks -d vendor/yoyodyne/security/tardis -k vendor/yoyodyne/special=vendor/yoyodyne/special-release -o tardis-target_files.zip signed-tardis-target_files.zip</code>
+</pre>
+
+<p>此时会显示以下内容:</p>
+<pre class="devsite-click-to-copy">
 Enter password for vendor/yoyodyne/security/special-release key&gt;
 Enter password for vendor/yoyodyne/security/tardis/media key&gt;
 Enter password for vendor/yoyodyne/security/tardis/platform key&gt;
@@ -180,30 +183,28 @@
 done.
 </pre>
 
-<p>在提示用户所有受密码保护的密钥的密码后,脚本会使用发布密钥对输入目标 .zip 中的 .apk 文件重新签名。在运行该命令之前,您还可以将 ANDROID_PW_FILE 环境变量设置为临时文件名;然后脚本会调用您的编辑器,允许您输入所有密钥的密码(采用该方式输入密码可能较为简便)。</p><p>
+<p>在提示用户输入所有受密码保护的密钥的密码后,脚本会使用发布密钥对输入目标 .zip 中的所有 .apk 文件重新签名。在运行该命令之前,您还可以将 ANDROID_PW_FILE 环境变量设置为临时文件名;然后脚本会调用您的编辑器,允许您输入所有密钥的密码(采用该方式输入密码可能较为简便)。</p><p>
 </p><p><code>sign_target_files_apks</code> 还会在版本属性文件中重写版本描述和指纹,表明这是一个已签名的版本。<code>-t</code> 标志可以控制对指纹所做的编辑。使用 <code>-h</code> 运行脚本来查看所有标志上的文档。</p>
 
 <h2 id="manually-generating-keys">手动生成密钥</h2>
 <p>Android 使用公开指数为 3 的 2048 位 RSA 密钥。您可以使用 <a href="https://www.openssl.org/">openssl.org</a> 提供的 openssl 工具来生成证书/私钥对:</p>
 
-<pre class="no-pretty-print">
+<pre class="devsite-click-to-copy">
 # generate RSA key
-% <b>openssl genrsa -3 -out temp.pem 2048</b>
+<code class="devsite-terminal">openssl genrsa -3 -out temp.pem 2048</code>
 Generating RSA private key, 2048 bit long modulus
 ....+++
 .....................+++
 e is 3 (0x3)
 
 # create a certificate with the public part of the key
-% <b>openssl req -new -x509 -key temp.pem -out releasekey.x509.pem \
-  -days 10000 \
-  -subj '/C=US/ST=California/L=San Narciso/O=Yoyodyne, Inc./OU=Yoyodyne Mobility/CN=Yoyodyne/[email protected]'</b>
+<code class="devsite-terminal">openssl req -new -x509 -key temp.pem -out releasekey.x509.pem -days 10000 -subj '/C=US/ST=California/L=San Narciso/O=Yoyodyne, Inc./OU=Yoyodyne Mobility/CN=Yoyodyne/[email protected]'</code>
 
 # create a PKCS#8-formatted version of the private key
-% <b>openssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt</b>
+<code class="devsite-terminal">openssl pkcs8 -in temp.pem -topk8 -outform DER -out releasekey.pk8 -nocrypt</code>
 
 # securely delete the temp.pem file
-% <b>shred --remove temp.pem</b>
+<code class="devsite-terminal">shred --remove temp.pem</code>
 </pre>
 
 <p>上述 openssl pkcs8 命令可创建一个适用于该版本系统的 .pk8 文件,该文件未<i></i>设置密码。要创建一个带有密码保护的 .pk8 文件(您应当为所有实际的发布密钥执行此步骤),请将 <code>-nocrypt</code> 参数替换为 <code>-passout stdin</code>;这样 openssl 将使用从标准输入中读取的密码来加密私钥。该过程中不会输出任何提示。因此,当系统确实只是在等待您输入密码时,如果 stdin 是终端,程序将会处于挂起状态。可以对 Passout 参数使用其他值,以便从其他位置读取密码;有关详情,请参阅 <a href="http://www.openssl.org/docs/man1.0.1/apps/openssl.html#PASS-PHRASE-ARGUMENTS">openssl 文档</a>。</p>
@@ -214,15 +215,15 @@
 <p>
 一旦您签署了目标文件 .zip,您便需要创建映像,以便将其存放到设备上。要从目标文件中创建已签名的映像,请在 Android 树形结构的根目录下运行以下命令:</p>
 
-<pre>
+<pre class="devsite-terminal devsite-click-to-copy">
 ./build/tools/releasetools/img_from_target_files signed-target-files.zip signed-img.zip
 </pre>
 
 生成的文件 <code>signed-img.zip</code> 中包含所有 .img 文件。
-要将映像加载到设备上,请使用 fastboot,如下
-所示:
 
-<pre>
+要将映像加载到设备上,请使用 fastboot,如下所示:
+
+<pre class="devsite-terminal devsite-click-to-copy">
 fastboot update signed-img.zip
 </pre>
 
diff --git a/zh-cn/devices/tech/perf/index.html b/zh-cn/devices/tech/perf/index.html
new file mode 100644
index 0000000..8c1d317
--- /dev/null
+++ b/zh-cn/devices/tech/perf/index.html
@@ -0,0 +1,25 @@
+<html devsite><head>
+    <title>性能</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>请按照本部分中的说明操作,以确保您的 Android 设备能够最大限度地减少资源使用并优化性能。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/perf/low-ram.html b/zh-cn/devices/tech/perf/low-ram.html
new file mode 100644
index 0000000..872ce00
--- /dev/null
+++ b/zh-cn/devices/tech/perf/low-ram.html
@@ -0,0 +1,282 @@
+<html devsite><head>
+    <title>低内存配置</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="intro">简介</h2>
+
+<p>Android 现支持内存为 512MB 的设备。本文档旨在帮助 OEM 优化和配置 Android 4.4,使其能够在低内存设备上运行。在下文所述的优化措施中,有几项非常通用,甚至也可应用于以前的版本。</p>
+
+<h2 id="optimizations">Android 4.4 平台优化</h2>
+
+<h3 id="opt-mgmt">改善了内存管理</h3>
+<ul>
+<li>验证了可节省内存的内核配置:内核同页合并 (KSM) 和交换到 ZRAM。</li>
+<li>终止那些即将被取消缓存且过大的缓存进程。</li>
+<li>不允许大型服务自行返回至 A 服务(以免导致启动器终止)。</li>
+<li>终止那些处于空闲维护状态中的过大进程(甚至终止当前 IME 等通常不可终止的进程)。</li>
+<li>对后台服务的启动进行序列化。</li>
+<li>微调了低内存设备的内存使用情况:采用更严格的内存不足 (OOM) 调整级别、缩减图形缓存大小,等等。</li>
+</ul>
+
+<h3 id="opt-mem">减少了系统内存</h3>
+<ul>
+<li>删减了 system_server 和 SystemUI 进程(节省了几兆的内存)。</li>
+<li>在 Dalvik 中预加载 dex 缓存(节省了几兆的内存)。</li>
+<li>验证了 JIT-off 选项(每个进程最多可节省 1.5MB 的内存)。</li>
+<li>减少了各进程的字体缓存开销。</li>
+<li>引入了占用内存更小的 ArrayMap/ArraySet,并在框架中广泛地使用其来替代 HashMap/HashSet。</li>
+</ul>
+
+<h3 id="opt-proc">Procstats</h3>
+<p>
+新增了一个开发者选项,以显示内存状态和应用内存使用情况(按照运行频率和所耗内存量排序)。
+</p>
+
+<h3 id="opt-api">API</h3>
+<p>
+新增了 ActivityManager.isLowRamDevice(),使应用不仅能够检测是否是在低内存设备上运行,还能选择停用那些占用内存较大的功能。
+</p>
+
+<h3 id="opt-track">内存跟踪</h3>
+<p>
+新的 memtrack HAL 可以跟踪图形内存分配情况、<code>dumpsys</code> meminfo 中的其他信息,以及 meminfo 中的阐明性总结(例如,所报告的可用内存包括缓存进程的内存,这样 OEM 就不会试图优化错误的对象)。
+</p>
+
+<h2 id="build-time">编译时配置</h2>
+<h3 id="flag">启用低内存设备标志</h3>
+<p>我们引入了一个称为 <code>ActivityManager.isLowRamDevice()</code> 的新 API,以便应用能够确定是否应关闭在低内存设备上表现非常差的特定内存密集型功能。</p>
+<p>对于内存为 512MB 的设备,该 API 应返回 <code>true</code>。可以通过在设备 makefile 中使用以下系统属性来启用该 API:</p>
+<pre class="devsite-click-to-copy">
+PRODUCT_PROPERTY_OVERRIDES += ro.config.low_ram=true
+</pre>
+
+<h3 id="jit">停用 JIT</h3>
+
+  <p>系统级的 JIT 内存使用情况取决于正在运行的应用的数量以及这些应用的代码所占用的空间。JIT 会为编译后代码的缓存设定大小上限,并会根据需要处理其中的页面。在典型的运行系统中,JIT 会占用 3M 到 6M 的内存。<br />
+  <br />
+大型应用往往很快就会达到代码缓存大小上限(默认情况下向来都是 1M)。平均来说,每个应用的 JIT 缓存使用量会介于 100K 和 200K 字节之间。减小缓存的大小上限在某种程度上有助于改进内存使用情况,但如果将这一上限设得过低,则会将 JIT 置于颠簸模式。对于内存确实很低的设备,我们建议完全停用 JIT。</p>
+
+<p>若要完全停用 JIT,请在产品 makefile 中添加下面这行内容:</p>
+<pre class="devsite-click-to-copy">
+PRODUCT_PROPERTY_OVERRIDES += dalvik.vm.jit.codecachesize=0
+</pre>
+<h3 id="launcher">启动器配置</h3>
+
+  <p>请务必确保启动器上的默认壁纸设置<strong>未</strong>使用动态壁纸。低内存设备不应预安装任何动态壁纸。</p>
+
+<h2 id="kernel">内核配置</h2>
+<h3 id="kernel-tuning">微调内核/ActivityManager 以减少直接回收</h3>
+
+  <p>当进程或内核尝试分配(直接分配或因新页面中存在故障而分配)内存页面并且内核已用尽所有可用内存时,就会发生直接回收。在这种情况下,内核便需要阻止分配并释放一个页面,而这通常又需要磁盘 I/O 清理一个有文件支持的脏页或等待 <code>lowmemorykiller</code> 终止一个进程。最终可能会导致任意线程(包括界面线程)中出现额外 I/O。</p>
+
+  <p>为避免出现直接回收,内核已配有可触发 <code>kswapd</code> 或后台回收的水印。此线程会尝试释放页面,以便下次分配的真实线程能够快速顺利启动。</p>
+
+  <p>用于触发后台回收的默认阈值相当低 - 在 2GB 设备上约为 2MB,在 512MB 设备上约为 636KB。而且,内核通过后台回收仅能回收几兆的内存。这即意味着,任何快速分配超过几兆字节的内容的进程都会快速导致直接回收。</p>
+
+<p>在 android-3.4 内核分支中,我们以补丁程序 92189d47f66c67e5fd92eafaa287e153197a454f(“添加额外的可调可用千字节”)的形式添加了对可调新内核的支持。选择将该补丁程序添加到设备内核中,会让 ActivityManager 告知内核尝试保留能容纳 3 个全屏 32 bpp 缓冲区的可用内存空间。</p>
+
+<p>这些阈值可通过框架 config.xml 进行配置</p>
+
+<pre class="devsite-click-to-copy">
+&lt;!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
+in the kernel (if it exists).  A high value will increase the amount of memory
+that the kernel tries to keep free, reducing allocation time and causing the
+lowmemorykiller to kill earlier.  A low value allows more memory to be used by
+processes but may cause more allocations to block waiting on disk I/O or
+lowmemorykiller.  Overrides the default value chosen by ActivityManager based
+on screen size.  0 prevents keeping any extra memory over what the kernel keeps
+by default.  -1 keeps the default. --&gt;
+&lt;integer name="config_extraFreeKbytesAbsolute"&gt;-1&lt;/integer&gt;
+</pre>
+
+<pre class="devsite-click-to-copy">
+&lt;!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
+tunable in the kernel (if it exists).  0 uses the default value chosen by
+ActivityManager.  A positive value  will increase the amount of memory that the
+kernel tries to keep free, reducing allocation time and causing the
+lowmemorykiller to kill earlier.  A negative value allows more memory to be
+used by processes but may cause more allocations to block waiting on disk I/O
+or lowmemorykiller.  Directly added to the default value chosen by
+ActivityManager based on screen size. --&gt;
+&lt;integer name="config_extraFreeKbytesAdjust"&gt;0&lt;/integer&gt;
+</pre>
+
+<h3 id="lowmem">微调 LowMemoryKiller</h3>
+
+<p>ActivityManager 可配置 LowMemoryKiller 的阈值,以匹配它对在每个优先级存储分区中运行进程时所需的文件支持页面(缓存页面)工作集的预期。如果设备对工作集有很高的要求(例如:如果供应商界面需要更多内存,或者如果添加了更多服务),则可增大阈值。</p>
+
+<p>如果为文件支持页面预留了太多内存,则可减小阈值,以便系统能够早在因缓存变得过小而导致磁盘颠簸之前就终止后台进程。</p>
+
+<pre class="devsite-click-to-copy">
+&lt;!-- Device configuration setting the minfree tunable in the lowmemorykiller
+in the kernel.  A high value will cause the lowmemorykiller to fire earlier,
+keeping more memory in the file cache and preventing I/O thrashing, but
+allowing fewer processes to stay in memory.  A low value will keep more
+processes in memory but may cause thrashing if set too low.  Overrides the
+default value chosen by ActivityManager based on screen size and total memory
+for the largest lowmemorykiller bucket, and scaled proportionally to the
+smaller buckets.  -1 keeps the default. --&gt;
+&lt;integer name="config_lowMemoryKillerMinFreeKbytesAbsolute"&gt;-1&lt;/integer&gt;
+</pre>
+
+<pre class="devsite-click-to-copy">
+&lt;!-- Device configuration adjusting the minfree tunable in the
+lowmemorykiller in the kernel.  A high value will cause the lowmemorykiller to
+fire earlier, keeping more memory in the file cache and preventing I/O
+thrashing, but allowing fewer processes to stay in memory.  A low value will
+keep more processes in memory but may cause thrashing if set too low.  Directly
+added to the default value chosen by          ActivityManager based on screen
+size and total memory for the largest lowmemorykiller bucket, and scaled
+proportionally to the smaller buckets. 0 keeps the default. --&gt;
+&lt;integer name="config_lowMemoryKillerMinFreeKbytesAdjust"&gt;0&lt;/integer&gt;
+</pre>
+
+<h3 id="ksm">KSM(内核同页合并)</h3>
+
+<p>KSM 是一个在后台运行的内核线程,可对内存中已由用户空间标为 <code>MADV_MERGEABLE</code> 的页面进行比较。如果发现两个页面相同,KSM 线程即会将它们合并为内存的单个写入时复制页面。</p>
+
+<p>从长远来看,KSM 会为所运行的系统节省内存,但它是以 CPU 功耗为代价来获得重复的内存,这可能会对电池寿命产生不良影响。功耗损失与通过启用 KSM 而节省的内存到底孰重孰轻?您应认真地权衡一下。</p>
+
+<p>为便于测试 KSM,我们建议您查看长时间运行(运行数小时)的设备,并观察 KSM 是否对启动时间和渲染时间起到了明显的改善作用。</p>
+
+<p>要启用 KSM,请先启用内核中的 <code>CONFIG_KSM</code>,然后将下列各行内容添加到 <code>init.&lt;device&gt;.rc</code> 文件中:<br />
+
+</p><pre class="devsite-click-to-copy">
+write /sys/kernel/mm/ksm/pages_to_scan 100
+write /sys/kernel/mm/ksm/sleep_millisecs 500
+write /sys/kernel/mm/ksm/run 1
+</pre>
+
+<p>启用后,有几种实用工具可帮助进行调试,这几种工具分别是:procrank、librank 和 ksminfo。借助这些实用工具,您可以查看 KSM 内存与进程之间的映射关系,以及哪些进程占用的 KSM 内存最多。一旦发现看起来值得探索的内存块,您便可以使用 hat 实用工具进行探索(如果它是 dalvik 堆上的重复对象)。</p>
+
+<h3 id="zram">交换到 zRAM</h3>
+
+<p>zRAM 交换可通过压缩内存页面并将其放入动态分配的内存交换区来增加系统中的可用内存量。</p>
+
+<p>由于这是以牺牲 CPU 时间为代价来增加少量内存,因此您应仔细权衡 zRAM 交换会对您系统的性能造成的负面影响。</p>
+
+<p>Android 会在多个层面上处理 zRAM 交换:</p>
+
+<ul>
+  <li>首先,必须启用以下内核选项,才能有效地使用 zRAM 交换:<ul>
+      <li><code>CONFIG_SWAP</code></li>
+      <li><code>CONFIG_CGROUP_MEM_RES_CTLR</code></li>
+      <li><code>CONFIG_CGROUP_MEM_RES_CTLR_SWAP</code></li>
+      <li><code>CONFIG_ZRAM</code></li>
+    </ul>
+  </li>
+  <li>然后,您应将一行与下列类似的内容添加到 fstab 中:<pre class="devsite-click-to-copy">
+/dev/block/zram0 none swap defaults zramsize=&lt;size in bytes&gt;,swapprio=&lt;swap partition priority&gt;
+</pre>
+  <ul>
+   <li><code>zramsize</code> 是必要内容,表示您希望 zram 区域占用多少未压缩内存。压缩比通常介于 30-50% 之间。</li>
+   <li><code>swapprio</code> 是可选内容;如果您没有多个交换区,则无需使用此项。</li>
+  </ul>
+  <p>您还应确保在特定于设备的 <a href="/security/selinux/implement.html">sepolicy/file_contexts</a> 中将关联的块设备标记为 swap_block_device,以便 SELinux 适当地对其进行处理。</p>
+<pre class="devsite-click-to-copy">
+/dev/block/zram0 u:object_r:swap_block_device:s0
+</pre>
+  </li>
+  <li>默认情况下,Linux 内核每次会换入 8 页内存。当使用 ZRAM 时,由每次读取 1 页而产生的增量成本微乎其微,且可能有助于防止设备承受极端的内存压力。要想每次只读取 1 页,请将以下内容添加到 <code>init.rc</code> 中:<pre class="devsite-click-to-copy">
+write /proc/sys/vm/page-cluster 0
+</pre>
+  </li>
+  <li>在 <code>init.rc</code> 中的 <code>mount_all /fstab.X</code> 行后面,添加以下内容:
+<pre class="devsite-click-to-copy">
+swapon_all /fstab.X
+</pre>
+  </li>
+  <li>如果在内核中启用了此功能,系统便会在启动时自动配置内存 cgroup。</li>
+  <li>如果内存 cgroup 可用,ActivityManager 就会将优先级较低的线程标为比其他线程更易于交换。如果需要内存,Android 内核则会开始将内存页面迁移到 zRAM 交换区,并会优先处理那些已被 ActivityManager 标记的内存页面。</li>
+</ul>
+
+<h3 id="carveouts">Carveout、Ion 和连续内存分配 (CMA)</h3>
+
+<p>对于低内存设备,需要特别注意 carveout,尤其是未必会一直被充分利用的 carveout,例如用于安全地播放视频的 carveout。有几种解决方案可最大限度地减小 carveout 区域的影响,具体取决于硬件的确切要求。</p>
+
+<p>如果硬件允许不连续的内存分配,则 Ion 系统堆可从系统内存中分配内存,这样便无需使用 carveout。它还会尝试进行大量分配以消除外围设备上的 TLB 压力。如果内存区域必须连续或必须限定在某个特定地址范围内,则可以使用连续内存分配器 (CMA)。</p>
+
+<p>以这种方式创建的 carveout 也可供系统用于处理可移动页面。当需要该区域时,可移动页面就会被从中移出,以便系统将一个处于空闲状态的大型 carveout 用于其他目的。您可以直接使用 CMA,也可以借助 Ion(通过使用离子 CMA 堆)更轻松地使用 CMA。</p>
+
+<h2 id="app-opts">应用优化提示</h2>
+<ul>
+   <li>查看<a href="http://developer.android.com/training/articles/memory.html">管理您的应用内存</a>和与同一主题相关的以往博文:<ul>
+    <li><a href="http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html">http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html</a></li>
+    <li><a href="http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html">http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html</a></li>
+    <li><a href="http://android-developers.blogspot.com/2009/02/track-memory-allocations.html">http://android-developers.blogspot.com/2009/02/track-memory-allocations.html</a></li>
+    <li> <a href="http://tools.android.com/recent/lintperformancechecks">http://tools.android.com/recent/lintperformancechecks</a></li>
+    </ul>
+</li>
+  <li>从预安装应用中检查/移除所有未使用的资源 - development/tools/findunused(应该会有助于减小应用所占用的空间)。</li>
+<li>对资源(特别是具有透明区域的资源)使用 PNG 格式</li>
+<li>如果要编写本机代码,请使用 calloc() 而非 malloc/memset</li>
+<li>不要启用会将 Parcel 数据写入磁盘并会在日后读取此数据的代码。</li>
+<li>不要订阅已安装的所有软件包,而应使用 ssp 过滤。请添加如下所示的过滤条件:<pre class="devsite-click-to-copy">
+&lt;data android:scheme="package" android:ssp="com.android.pkg1" /&gt;
+&lt;data android:scheme="package" android:ssp="com.myapp.act1" /&gt;
+</pre>
+</li>
+</ul>
+
+<h3 id="process-states">了解 Android 中的各种进程状态</h3>
+
+  <ul>
+  <li><p>SERVICE - SERVICE_RESTARTING<br />
+因自身原因自动在后台运行的应用。这是频繁在后台运行的应用最常出现的问题。%duration * pss 很可能是一个绝佳的“不良”指标,但该组合的目标过于明确,也许只执行 %duration 就能更好地筛选出我们完全不希望运行的应用。</p></li>
+  <li><p>IMPORTANT_FOREGROUND - RECEIVER<br />
+因任何原因在后台运行的应用(不直接与用户交互)。这些应用都会增加系统的内存负载。在这种情况下,使用 (%duration * pss) 不良值很可能是对这些进程进行排序的最佳方式:许多此类进程都会因合理原因而需要一直运行,因此它们的 pss 大小将会是它们的内存负载的重要组成部分。</p></li>
+  <li><p>PERSISTENT<br />
+持续的系统进程。跟踪 pss 可监视这些进程是否会变得过大。</p></li>
+  <li><p>TOP<br />
+正与用户交互的进程。pss 在此又成为了重要指标,可显示应用在被使用的过程中产生的内存负载。</p></li>
+  <li><p>HOME - CACHED_EMPTY<br />
+所有此类底部进程均是系统保留的备用进程;此类进程可随时终止,并可根据需要重建。这些进程是我们计算内存状态时参照的依据 -“正常”、“中等”、“低”、“严重”均是基于系统可以保留多少个此类进程而定的。pss 亦是这些进程的关键指标;当这些进程处于该状态时,它们应尽量减少自身的内存占用空间,以便系统能够保留尽可能多的进程。一般来说,与在 TOP 状态下相比,运行状况良好的应用在该状态下的 pss 占用空间明显更小。</p></li>
+  <li>
+    <p>比较 TOP 与 CACHED_ACTIVITY-CACHED_ACTIVITY_CLIENT<em><br />
+</em>进程处于 TOP 状态时的 pss 和进程处于上述任一种缓存状态时的 pss 之间会存在差异,而这种差异是表明进程在进入后台运行时的内存释放能力的最佳数据。排除 CACHED_EMPTY 状态可以改善该数据,因为这项操作会排除因某些原因(不仅仅是为了呈现界面)而启动进程的情况,因此无需在与用户交互时处理所有的界面开销。</p></li>
+  </ul>
+
+<h2 id="analysis">分析</h2>
+
+<h3 id="app-startup">分析应用启动时间</h3>
+
+<p>使用带有 <code>-P</code> 或 <code>--start-profiler</code> 选项的 <code>$ adb shell am start</code> 在应用启动时运行分析器。这样一来,当您的进程从 zygote 分岔之后,分析器就会立即启动,虽然此时您的任何代码都还未加载到其中。</p>
+
+<h3 id="bug-reports">使用错误报告进行分析</h3>
+
+<p>现已包含可用于进行调试的各种信息。这些服务包括 <code>batterystats</code>、<code>netstats</code>、<code>procstats</code> 和 <code>usagestats</code>。您可以使用如下所示的各行内容找到它们:</p>
+
+<pre class="devsite-click-to-copy">
+------ CHECKIN BATTERYSTATS (dumpsys batterystats --checkin) ------
+7,0,h,-2558644,97,1946288161,3,2,0,340,4183
+7,0,h,-2553041,97,1946288161,3,2,0,340,4183
+</pre>
+
+<h3 id="persistent">检查是否存在任何持续进程</h3>
+
+<p>重新启动设备并检查进程。<br />
+运行几个小时,然后再次检查进程。不应存在任何长时间运行的进程。</p>
+
+<h3 id="longevity">长时测试</h3>
+
+<p>运行较长时间,并跟踪进程的内存。内存是增加了,还是保持不变?请创建规范的用例,并针对这些情形运行长时测试。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/perf/task-snapshots.html b/zh-cn/devices/tech/perf/task-snapshots.html
new file mode 100644
index 0000000..c77e8ab
--- /dev/null
+++ b/zh-cn/devices/tech/perf/task-snapshots.html
@@ -0,0 +1,82 @@
+<html devsite><head>
+    <title>任务快照</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="introduction">简介</h2>
+
+<p>
+任务快照是在 Android O 中引入的基础架构,可将窗口管理器中的最近任务缩略图和已保存平面这两者的屏幕截图进行合并。<em></em><em></em><em></em>最近任务缩略图用于在“最近”视图中呈现任务的最后状态。
+</p>
+
+<p>
+过去,当有 Activity 进入停止状态时,只要该 Activity 位于任务顶层,窗口管理器就不会销毁该 Activity 的表面。如果该 Activity 必须再次显示,窗口管理器便能够启动相应动画,而无需等待该 Activity 绘制完其第一帧,因为它能够使用这个已保存表面。
+</p>
+<h2 id="architecture">架构</h2>
+
+<p>
+通过任务快照,最近任务缩略图和已保存表面这两个概念合并在了一起。当有任务进入后台时,窗口管理器会将该任务的屏幕截图放入一个图形缓冲区中。只要任务顶层 Activity 的应用保留在内存中,该图形缓冲区就会保留在内存中。现在,当同一个 Activity 再次回到前面时,窗口管理器将会创建一个起始窗口 (TaskSnapshotSurface) 并附加图形缓冲区,而无需将任何内存复制到起始窗口的缓冲区队列。一旦该 Activity 绘制了其第一帧,任务快照起始窗口就会立即像常规启动画面一样平滑淡出。
+</p>
+
+<p>
+系统还会将同一个图形缓冲区通过 Binder 发送到 SystemUI,以用于在“最近”视图中绘制任务的预览状态。由于这只是对缓冲区的引用,因此通过 Binder 发送它只需要多占用很少的资源。当该图形缓冲区到达 SystemUI 时,将会被封装到硬件位图中,然后被绘制到屏幕上,而无需将任何内存上传到图形内存。
+</p>
+
+<h2 id="benefits">优点</h2>
+
+<p>
+这种新架构有以下三个主要优点:
+</p>
+
+<ul>
+<li>如果将任务快照用作起始窗口,则快照和实际内容之间会有一个很好的交叉淡入淡出过程。</li>
+<li>在 SystemUI 中绘制任务快照时,无需进行任何复制操作即可完成。以前则必须将位图复制到 Ashmem 中,然后再复制到图形内存。由于这种方法是将快照直接存储在图形内存中,因此无需进行任何复制操作。</li>
+<li>您在“最近”视图中看到的状态始终会与您在重新打开应用时首先看到的状态一致。拥有相同的缓冲区还能够节省大量内存。这就是“最近”视图现在能够以完整分辨率显示这些图像的原因。以前,系统会将采样减少 64% 以节省内存。</li>
+</ul>
+
+<h2 id="implementation">实现</h2>
+
+<p>
+该功能完全位于 Android 平台中。不需要集成,且不支持自定义。不过,设备制造商可以完全停用任务快照功能。
+</p>
+
+<p>
+要停用该功能,请修改以下函数:
+</p>
+
+<pre class="prettyprint">
+frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
+</pre>
+
+<p>
+请注意,如果该功能被停用,“最近”视图将不会显示任何缩略图。在内存较低的设备上,该功能会被自动停用。
+</p>
+
+<h2 id="examples-and-source">示例和源代码</h2>
+
+<p>
+您可以在位于以下位置的 TaskSnapshot* 文件中找到该功能的其余代码:
+</p>
+
+<pre class="prettyprint">
+frameworks/base/+/master/services/core/java/com/android/server/wm/
+</pre>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/power/device.html b/zh-cn/devices/tech/power/device.html
index 3f96b79..92a1e8e 100644
--- a/zh-cn/devices/tech/power/device.html
+++ b/zh-cn/devices/tech/power/device.html
@@ -30,7 +30,7 @@
 
 <p>要读取耗电量数据,请在测试代码中插入对 API 的调用。</p>
 
-<pre>
+<pre class="prettyprint">
 import android.os.BatteryManager;
 import android.content.Context;
 BatteryManager mBatteryManager =
@@ -44,7 +44,7 @@
 
 <p>Android 支持以下电池电量计属性:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 BATTERY_PROPERTY_CHARGE_COUNTER   Remaining battery capacity in microampere-hours
 BATTERY_PROPERTY_CURRENT_NOW      Instantaneous battery current in microamperes
 BATTERY_PROPERTY_CURRENT_AVERAGE  Average battery current in microamperes
@@ -202,7 +202,7 @@
 CHARGE_COUNTER(累计电流,不可扩展精度)解析度为 625 微安时。<br />
 CHARGE_COUNTER_EXT(内核扩展精度)解析度为 144 纳安时。<br />
 当额定电压为 3.7 伏时,ENERGY_COUNTER 为 CHARGE_COUNTER_EXT。<br />
-全部更新周期为 3.5 秒。</td>
+更新周期均为 3.5 秒。</td>
 </tr>
 </tbody>
 </table>
diff --git a/zh-cn/devices/tech/settings/index.html b/zh-cn/devices/tech/settings/index.html
new file mode 100644
index 0000000..b4bc43a
--- /dev/null
+++ b/zh-cn/devices/tech/settings/index.html
@@ -0,0 +1,25 @@
+<html devsite><head>
+    <title>“设置”菜单</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>本部分的几页中介绍了如何运用 Android 的“设置”菜单中提供的最新功能。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/test_infra/tradefed/full_example.html b/zh-cn/devices/tech/test_infra/tradefed/full_example.html
index 9169656..994dd9b 100644
--- a/zh-cn/devices/tech/test_infra/tradefed/full_example.html
+++ b/zh-cn/devices/tech/test_infra/tradefed/full_example.html
@@ -38,7 +38,8 @@
 
 <h2 id="testclass">创建测试类 (D)</h2>
 <p>我们来创建一个仅将消息转储到 stdout 的 hello world 测试。Tradefed 测试通常会实现 <a href="/reference/com/android/tradefed/testtype/IRemoteTest.html">IRemoteTest</a> 接口。以下为 HelloWorldTest 的实现过程:</p>
-<pre><code>package com.android.tradefed.example;
+<pre class="prettyprint">
+package com.android.tradefed.example;
 
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.result.ITestInvocationListener;
@@ -50,10 +51,12 @@
         System.out.println("Hello, TF World!");
     }
 }
-</code></pre>
+</pre>
 
 <p>请将此示例代码保存到 <code>&lt;tree&gt;/tools/tradefederation/core/prod-tests/src/com/android/tradefed/example/HelloWorldTest.java</code> 并从您的 shell 中重建 tradefed:</p>
-<pre><code>m -jN</code></pre>
+<pre class="devsite-terminal devsite-click-to-copy">
+m -jN
+</pre>
 
 <p>请注意,在实际操作中,上述示例中的 <code>System.out</code> 可能并不直接将输出导向至控制台。虽然这对于此测试示例而言是可接受的,但您应按照<a href="#logging">日志记录(D、I、R)</a>这一部分所述,在 Trade Federation 中建立日志记录。</p>
 
@@ -63,50 +66,57 @@
 <p>Trade Federation 测试可通过创建<strong>配置</strong>来执行。此配置为 XML 文件,告诉 tradefed 在哪个(或哪些)测试上运行以及要执行哪些其他模块并按何种顺序执行。</p>
 
 <p>我们来为 HelloWorldTest 创建一个新的配置(请注意 HelloWorldTest 的完整类名):</p>
-<pre><code>&lt;configuration description="Runs the hello world test"&gt;
+<pre class="prettyprint">
+&lt;configuration description="Runs the hello world test"&gt;
     &lt;test class="com.android.tradefed.example.HelloWorldTest" /&gt;
-&lt;/configuration&gt;</code></pre>
+&lt;/configuration&gt;</pre>
 
-<p>请将此数据保存到位于本地文件系统任意位置的 <code>helloworld.xml</code> 文件上(例如:<code>/tmp/helloworld.xml</code>)。TF 将解析配置 XML 文件(也称为 <b>config</b> 文件)、使用反射加载指定的类、使其实例化、将其转型为 <code>IRemoteTest</code>,并调用其 <code>run</code> 方法。</p>
+<p>请将此数据保存到位于本地文件系统任意位置的 <code>helloworld.xml</code> 文件上(例如:<code>/tmp/helloworld.xml</code>)。TF 将解析配置 XML 文件(也称为 <b>config</b>)、使用反射功能加载指定的类、对其实例化、将其发送到 <code>IRemoteTest</code>,并调用其 <code>run</code> 方法。</p>
 
 <h2 id="runconfig">运行配置文件 (R)</h2>
 <p>从您的 shell 中启动 tradefed 控制台:</p>
-<pre><code>$ tradefed.sh
-</code></pre>
+<pre class="devsite-terminal devsite-click-to-copy">
+tradefed.sh
+</pre>
 
 <p>确保设备已连接至主机,而且对 tradefed 可见:</p>
-<pre><code>tf &gt;list devices
+<pre class="devsite-click-to-copy">
+tf&gt; list devices
 Serial            State      Product   Variant   Build   Battery
 004ad9880810a548  Available  mako      mako      JDQ39   100
-</code></pre>
+</pre>
 
 <p>您可以使用 <code>run &lt;config&gt;</code> 控制台命令执行配置。请尝试输入:</p>
-<pre><code>tf&gt; run /tmp/helloworld.xml
+<pre class="devsite-click-to-copy">
+tf&gt; run /tmp/helloworld.xml
 05-12 13:19:36 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
 Hello, TF World!
-</code></pre>
+</pre>
 <p>您应该可以在终端看到“Hello, TF World!”输出内容。</p>
 
 <h2 id="addconfig">将配置文件添加到类路径(D、I、R)</h2>
 <p>为了方便部署,您还可以将配置文件捆绑到 tradefed JAR 文件自身中。Tradefed 将自动识别类路径下的“config”文件夹中存放的所有配置。<em></em></p>
 
 <p>为进行详细说明,我们将 <code>helloworld.xml</code> 文件移到 tradefed 核心库 (<code>&lt;tree&gt;/tools/tradefederation/core/prod-tests/res/config/example/helloworld.xml</code>) 中。重建 tradefed,重启 tradefed 控制台,然后请求 tradefed 显示类路径中的配置列表:</p>
-<pre><code>tf&gt; list configs
+<pre class="devsite-click-to-copy">
+tf&gt; list configs
 […]
 example/helloworld: Runs the hello world test
-</code></pre>
+</pre>
 
 <p>您现在可以使用以下命令运行 helloworld 配置文件:</p>
-<pre><code>tf &gt;run example/helloworld
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld
 05-12 13:21:21 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
 Hello, TF World!
-</code></pre>
+</pre>
 
 <h2 id="deviceinteract">与设备交互(D、R)</h2>
 <p>到目前为止,我们的 HelloWorldTest 还没有执行任何有趣的操作。Tradefed 专门用于使用 Android 设备运行测试,所以我们向测试中添加一个 Android 设备吧。</p>
 
 <p>测试可以通过实现 <a href="/reference/com/android/tradefed/testtype/IDeviceTest.html">IDeviceTest</a> 接口来获得 Android 设备引用。以下为展示此步骤的实现示例:</p>
-<pre><code>public class HelloWorldTest implements IRemoteTest, IDeviceTest {
+<pre class="prettyprint">
+public class HelloWorldTest implements IRemoteTest, IDeviceTest {
     private ITestDevice mDevice;
     @Override
     public void setDevice(ITestDevice device) {
@@ -119,39 +129,45 @@
     }

 }
-</code></pre>
+</pre>
 
 <p>在调用 <code>IRemoteTest#run</code> 方法之前,Trade Federation 框架将通过 <code>IDeviceTest#setDevice</code> 方法将 <code>ITestDevice</code> 引用注入到测试中。</p>
 
 <p>我们来修改下 HelloWorldTest 输出消息,以显示设备的序列号:</p>
-<pre><code>@Override
+<pre class="prettyprint">
+@Override
 public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
     System.out.println("Hello, TF World! I have device " + getDevice().getSerialNumber());
 }
-</code></pre>
+</pre>
 
 <p>现在重建 tradefed 并检查设备列表:</p>
-<pre><code>$ tradefed.sh
-tf &gt;list devices
+<pre class="devsite-terminal devsite-click-to-copy">
+tradefed.sh
+</pre>
+<pre class="devsite-click-to-copy">
+tf&gt; list devices
 Serial            State      Product   Variant   Build   Battery
 004ad9880810a548  Available  mako      mako      JDQ39   100
-</code></pre>
+</pre>
 
 <p>记下列为 <strong>Available</strong> 的序列号;表示应分配到 HelloWorld 的设备:</p>
-<pre><code>tf &gt;run example/helloworld
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld
 05-12 13:26:18 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
 Hello, TF World! I have device 004ad9880810a548
-</code></pre>
+</pre>
 
 <p>您应该可以看到显示设备序列号的新输出消息。</p>
 
 <h2 id="sendresults">发送测试结果 (D)</h2>
-<p><code>IRemoteTest</code> 通过对提供给 <code>#run</code> 方法的 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html">ITestInvocationListener</a> 实例调用方法来报告结果。TF 框架本身负责报告每个调用的开始之处(通过 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html#invocationStarted(com.android.tradefed.build.IBuildInfo)">ITestInvocationListener#invocationStarted</a>)和结束之处(通过 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html#invocationEnded(long)">ITestInvocationListener#invocationEnded</a>)。</p>
+<p><code>IRemoteTest</code> 会对提供给 <code>#run</code> 方法的 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html">ITestInvocationListener</a> 实例调用相关方法,以便报告结果。TF 框架本身负责报告每个调用的开始之处(通过 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html#invocationStarted(com.android.tradefed.build.IBuildInfo)">ITestInvocationListener#invocationStarted</a>)和结束之处(通过 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html#invocationEnded(long)">ITestInvocationListener#invocationEnded</a>)。</p>
 
 <p><b>测试运行</b>是测试的逻辑集合。要报告测试结果,<code>IRemoteTest</code> 负责报告测试运行的开始之处,每个测试的开始和结束之处以及测试运行的结束之处。</p>
 
 <p>单次测试结果为失败的 HelloWorldTest 实现可能如下所示。</p>
-<pre><code>@Override
+<pre class="prettyprint">
+@Override
 public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
     System.out.println("Hello, TF World! I have device " + getDevice().getSerialNumber());
 
@@ -161,42 +177,49 @@
     listener.testFailed(testId, "oh noes, test failed");
     listener.testEnded(testId, Collections.emptyMap());
     listener.testRunEnded(0, Collections.emptyMap());
-}</code></pre>
+}
+</pre>
 
 <p>TF 包括几个可以重复使用的 <code>IRemoteTest</code> 实现,因而您无需从头开始编写您自己的实现。例如,<a href="/reference/com/android/tradefed/testtype/InstrumentationTest.html">InstrumentationTest</a> 可在 Android 设备上远程运行 Android 应用测试、解析结果,并将这些结果转发到 <code>ITestInvocationListener</code>。有关详情,请参阅<a href="/reference/com/android/tradefed/testtype/package-summary.html">测试类型</a>。</p>
 
 <h2 id="storeresults">存储测试结果 (I)</h2>
 <p>TF 配置的默认测试监听器实现为 <a href="/reference/com/android/tradefed/result/TextResultReporter.html">TextResultReporter</a>,它会将调用结果转储到 stdout。请运行上一节中的 HelloWorldTest 配置文件,以进行详细说明:</p>
-<pre><code>$ ./tradefed.sh
-tf &gt;run example/helloworld
+<pre class="devsite-terminal devsite-click-to-copy">
+./tradefed.sh
+</pre>
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld
 05-16 20:03:15 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
 Hello, TF World! I have device 004ad9880810a548
 05-16 20:03:15 I/InvocationToJUnitResultForwarder: run helloworldrun started: 1 tests
 Test FAILURE: com.example.TestClassName#sampleTest
  stack: oh noes, test failed
 05-16 20:03:15 I/InvocationToJUnitResultForwarder: run ended 0 ms
-</code></pre>
+</pre>
 
 <p>要将调用结果存储在其他位置(如某个文件中),请使用配置中的 <code>result_reporter</code> 标签来指定自定义 <code>ITestInvocationListener</code> 实现。</p>
 
-<p>TF 还包括 <a href="/reference/com/android/tradefed/result/XmlResultReporter.html">XmlResultReporter</a> 监听器,它采用与 ant JUnit XML writer 所使用的格式类似的格式将测试结果写入 XML 文件。<em></em>要在配置中指定 result_reporter,请修改 <code>…/res/config/example/helloworld.xml</code> 配置:</p>
-<pre><code>&lt;configuration description="Runs the hello world test"&gt;
+<p>TF 还包括 <a href="/reference/com/android/tradefed/result/XmlResultReporter.html">XmlResultReporter</a> 监听器,该监听器会将测试结果写入 XML 文件,并且所采用的格式与 ant JUnit XML 写入器所采用的格式类似。<em></em>要在配置中指定 result_reporter,请修改 <code>…/res/config/example/helloworld.xml</code> 配置:</p>
+<pre class="prettyprint">
+&lt;configuration description="Runs the hello world test"&gt;
     &lt;test class="com.android.tradefed.example.HelloWorldTest" /&gt;
     &lt;result_reporter class="com.android.tradefed.result.XmlResultReporter" /&gt;
 &lt;/configuration&gt;
-</code></pre>
+</pre>
 
 <p>现在重建 tradefed 并重新运行 hello world 示例:</p>
-<pre><code>tf &gt;run example/helloworld
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld
 05-16 21:07:07 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
 Hello, TF World! I have device 004ad9880810a548
 05-16 21:07:07 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_2991649128735283633/device_logcat_6999997036887173857.txt
 05-16 21:07:07 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_2991649128735283633/host_log_6307746032218561704.txt
 05-16 21:07:07 I/XmlResultReporter: XML test result file generated at /tmp/0/inv_2991649128735283633/test_result_536358148261684076.xml. Total tests 1, Failed 1, Error 0
-</code></pre>
+</pre>
 
 <p>请留意表明已生成 XML 文件的日志消息;所生成的文件应如下所示:</p>
-<pre><code>&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
+<pre class="prettyprint">
+&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
 &lt;testsuite name="stub" tests="1" failures="1" errors="0" time="9" timestamp="2011-05-17T04:07:07" hostname="localhost"&gt;
   &lt;properties /&gt;
   &lt;testcase name="sampleTest" classname="com.example.TestClassName" time="0"&gt;
@@ -204,7 +227,7 @@
     &lt;/failure&gt;
   &lt;/testcase&gt;
 &lt;/testsuite&gt;
-</code></pre>
+</pre>
 
 <p>您还可以编写您自己的自定义调用监听器 - 它们只需要实现 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html">ITestInvocationListener</a> 接口。</p>
 
@@ -222,41 +245,48 @@
 </p>
 
 <p>系统使用 ddmlib 日志类的 <a href="/reference/com/android/tradefed/log/LogUtil.CLog.html">CLog 封装容器</a>报告主机日志。让我们将 HelloWorldTest 中之前的 <code>System.out.println</code> 调用转换为 <code>CLog</code> 调用:</p>
-<pre><code>@Override
+<pre class="prettyprint">
+@Override
 public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
     CLog.i("Hello, TF World! I have device %s", getDevice().getSerialNumber());
-</code></pre>
+</pre>
 
 <p><code>CLog</code> 直接处理字符串插入,类似于 <code>String.format</code>。当您在重建和重新运行 TF 时,您应该可以在 stdout 上看到此日志消息:</p>
-<pre><code>tf&gt; run example/helloworld
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld

 05-16 21:30:46 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548

-</code></pre>
+</pre>
 
-<p>默认情况下,tradefed <a =""="" android com hre="=" tradefed>会将主机日志消息输出到 stdout</a>。TF 还包括将消息写入文件的日志实现:<a href="/reference/com/android/tradefed/log/FileLogger.html">FileLogger</a>。要添加文件日志记录,请将 <code>logger</code> 标签添加到配置文件中,指定 <code>FileLogger</code> 的完整类名:</p>
-<pre><code>&lt;configuration description="Runs the hello world test"&gt;
+<p>默认情况下,tradefed <a href="/reference/com/android/tradefed/log/StdoutLogger.html">会将主机日志消息输出到 stdout</a>。TF 还包括将消息写入文件的日志实现:<a href="/reference/com/android/tradefed/log/FileLogger.html">FileLogger</a>。要添加文件日志记录,请将 <code>logger</code> 标签添加到配置文件中,指定 <code>FileLogger</code> 的完整类名:</p>
+<pre class="prettyprint">
+&lt;configuration description="Runs the hello world test"&gt;
     &lt;test class="com.android.tradefed.example.HelloWorldTest" /&gt;
     &lt;result_reporter class="com.android.tradefed.result.XmlResultReporter" /&gt;
     &lt;logger class="com.android.tradefed.log.FileLogger" /&gt;
 &lt;/configuration&gt;
-</code></pre>
+</pre>
 
 <p>现在,再次重建并运行 helloworld 示例:</p>
-<pre><code>tf &gt;run example/helloworld
+<pre class="devsite-click-to-copy">
+tf &gt;run example/helloworld

 05-16 21:38:21 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_6390011618174565918/device_logcat_1302097394309452308.txt
 05-16 21:38:21 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt

-</code></pre>
+</pre>
 <p>该日志消息指出了主机日志的路径,当您查看该日志时,其中应当包含您的 HelloWorldTest 日志消息:</p>
-<pre><code>$ more /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt
+<pre class="devsite-terminal devsite-click-to-copy">
+more /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt</pre>
+<p>输出示例:</p>
+<pre class="devsite-click-to-copy">

 05-16 21:38:21 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548
-</code></pre>
+</pre>
 
 <h2 id="optionhandling">处理选项(D、I、R)</h2>
-<p>从 TF 配置中加载的对象(也称为<b>配置对象</b>)亦可通过使用 <code>@Option</code> 注释从命令行参数中接收数据。</p><p>
+<p>从 TF 配置中加载的对象(也称为<b>配置对象</b>)亦可通过使用 <code>@Option</code> 注释接收命令行参数中的数据。</p><p>
 
 </p><p>要参与其中,配置对象类会将 <code>@Option</code> 注释应用于相关成员字段,并为其指定一个唯一的名称。这样您便可以通过命令行选项填充该成员字段值(并自动将该选项添加到配置帮助系统)。</p>
 
@@ -264,36 +294,41 @@
 </p>
 
 <p>我们将 <code>@Option</code> 添加到 HelloWorldTest 中:</p>
-<pre><code>@Option(name="my_option",
+<pre class="prettyprint">
+@Option(name="my_option",
         shortName='m',
         description="this is the option's help text",
         // always display this option in the default help text
         importance=Importance.ALWAYS)
 private String mMyOption = "thisisthedefault";
-</code></pre>
+</pre>
 
 <p>接下来,我们添加一条日志消息来显示 HelloWorldTest 中的选项的值,以便证明已正确接收该值:</p>
-<pre><code>@Override
+<pre class="prettyprint">
+@Override
 public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {

     CLog.logAndDisplay(LogLevel.INFO, "I received option '%s'", mMyOption);
-</code></pre>
+</pre>
 
 <p>最后,重建 TF 并运行 helloworld;您应该会看到一条带有 <code>my_option</code> 默认值的日志消息:</p>
-<pre><code>tf&gt; run example/helloworld
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld

 05-24 18:30:05 I/HelloWorldTest: I received option 'thisisthedefault'
-</code></pre>
+</pre>
 
 <h3 id="passclivalues">从命令行传递值</h3>
 <p>为 <code>my_option</code> 传入值;您应该可以看到使用此值填充的 <code>my_option</code>:</p>
-<pre><code>tf&gt; run example/helloworld --my_option foo
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld --my_option foo

 05-24 18:33:44 I/HelloWorldTest: I received option 'foo'
-</code></pre>
+</pre>
 
 <p>TF 配置还包括帮助系统,该系统会自动显示 <code>@Option</code> 字段的帮助文本。现在试试看吧,您应该可以看到 <code>my_option</code> 的帮助文本:</p>
-<pre><code>tf&gt; run example/helloworld --help
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld --help
 Printing help for only the important options. To see help for all options, use the --help-all flag
 
   cmd_options options:
@@ -306,37 +341,41 @@
 
   'file' logger options:
     --log-level-display  the minimum log level to display on stdout. Must be one of verbose, debug, info, warn, error, assert. Default: error.
-</code></pre>
+</pre>
 
 <p>请注意有关“仅输出重要选项的帮助文本”的消息。为了减少选项帮助的混乱情况,TF 使用 <code>Option#importance</code> 属性来确定是否在指定 <code>--help</code> 时显示特定的 <code>@Option</code> 字段帮助文本。无论字段重要与否,<code>--help-all</code> 始终显示针对所有 <code>@Option</code> 字段的帮助。有关详情,请参阅 <a href="/reference/com/android/tradefed/config/Option.Importance.html">Option.Importance</a>。
 </p>
 
 <h3 id="passconfvalues">从配置传递值</h3>
 <p>您还可以通过添加 <code>&lt;option name="" value=""&gt;</code> 元素在配置文件中指定“选项”值。使用 <code>helloworld.xml</code> 进行测试:</p>
-<pre><code>&lt;test class="com.android.tradefed.example.HelloWorldTest" &gt;
+<pre class="prettyprint">
+&lt;test class="com.android.tradefed.example.HelloWorldTest" &gt;
     &lt;option name="my_option" value="fromxml" /&gt;
 &lt;/test&gt;
-</code></pre>
+</pre>
 
 <p>重建和运行 helloworld 后现在应产生以下输出内容:</p>
-<pre><code>05-24 20:38:25 I/HelloWorldTest: I received option 'fromxml'
-</code></pre>
+<pre class="devsite-click-to-copy">
+05-24 20:38:25 I/HelloWorldTest: I received option 'fromxml'
+</pre>
 
 <p>配置帮助也应经过更新以显示 <code>my_option</code> 的默认值:</p>
-<pre><code>tf&gt; run example/helloworld --help
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld --help
   test options:
     -m, --my_option      this is the option's help text Default: fromxml.
-</code></pre>
+</pre>
 
 <p>helloworld 配置中包含的其他配置对象(如 <code>FileLogger</code>)也接受选项。选项 <code>--log-level-display</code> 比较有意思,因为它会过滤在 stdout 上显示的日志。在本教程前面的部分中,您可能已经注意到:当我们改用 <code>FileLogger</code> 后,stdout 上不再显示“Hello, TF World! I have device ...”这一日志消息。您可以通过传入 <code>--log-level-display</code> 参数提高 stdout 上日志记录的详细程度。</p>
 
 <p>请立即尝试,您应该可以看到“I have device”这一日志消息再次出现在 stdout 上,并被记录到某个文件中:</p>
-<pre><code>tf &gt;run example/helloworld --log-level-display info
+<pre class="devsite-click-to-copy">
+tf&gt; run example/helloworld --log-level-display info

 05-24 18:53:50 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548
-</code></pre>
+</pre>
 
 <h2 id="conclusion">讲解完毕,谢谢大家!</h2>
-<p>在此提醒您,如果您遇到任何问题,可在 <a href="https://android.googlesource.com/platform/tools/tradefederation/+/master">Trade Federation 源代码</a>中找到并未在本文档中公开的大量实用信息。如果所有其他尝试均以失败告终,请尝试在 <a href="/source/community.html">Android 平台</a> Google 网上论坛中咨询(在消息主题中提及“Trade Federation”)。</p>
+<p>在此提醒您,如果您遇到任何问题,可在 <a href="https://android.googlesource.com/platform/tools/tradefederation/+/master">Trade Federation 源代码</a>中找到并未在本文档中公开的大量实用信息。如果所有其他尝试均以失败告终,请尝试在 <a href="/source/community.html">android-platform</a> Google 网上论坛中咨询(在消息主题中提及“Trade Federation”)。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tv/customize-tv-app.html b/zh-cn/devices/tv/customize-tv-app.html
new file mode 100644
index 0000000..5264ca3
--- /dev/null
+++ b/zh-cn/devices/tv/customize-tv-app.html
@@ -0,0 +1,137 @@
+<html devsite><head>
+    <title>对参考电视应用进行自定义</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
+
+          //www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>电视直播是专为 Android 电视设备设计的参考电视应用。不过,设备制造商可能会想要添加更多不在电视直播默认实现范围内的产品专属功能,例如照片调整、游戏模式或 3D 模式。为了支持这些设备专属功能或选项,电视直播支持以下自定义:</p>
+
+<ul>
+  <li>启用时移模式,以允许用户暂停、快进和快退播放。将时移模式配置为使用外部存储空间而非内部存储空间。</li>
+  <li>向电视选项行添加选项。</li>
+  <li>添加自定义行并在其中添加选项。</li>
+</ul>
+
+<p class="note"><strong>注意</strong>:<a href="https://play.google.com/store/apps/details?id=com.google.android.tv">直播频道</a>是 Google 的直播电视实现,用户可以在设备上像使用 Google 服务一样来使用它。对直播频道进行自定义的操作步骤与以下说明相同,但需要将 <code>com.android.tv.*</code> 替换为 <code>com.google.android.tv.*</code>。</p>
+
+<h2 id="customization-package">对直播电视进行自定义</h2>
+<p>要对直播电视进行自定义,目标 Android TV 设备需要安装一个自定义程序包,该程序包必须是经过预编译的系统应用,并且具有 <code>com.android.tv.permission.CUSTOMIZE_TV_APP</code> 权限。</p>
+
+<p>直播电视会搜索具有该权限的系统程序包,检查资源文件,并检测该程序包中带有特定<a href="http://developer.android.com/guide/topics/manifest/category-element.html">类别</a>标记的 <a href="http://developer.android.com/reference/android/app/Activity.html">Activity</a>,以便处理自定义。</p>
+
+<p class="key-point">
+<strong>要点</strong>:只有一个程序包可以自定义直播电视。</p>
+
+<h3 id="timeshift">配置时移模式</h3>
+<p>借助时移(特技播放),Android 电视设备可以暂停、快退和快进播放频道内容。在直播电视实现中,可以通过播放控制界面来使用时移。在直播电视中,时移默认处于启用状态,但用户可以将其停用。<em></em>此外,还可以将时移配置为仅使用外部存储空间。</p>
+
+<p>要配置时移,请添加字符串资源 <code>trickplay_mode</code>,并将其值设为以下选项之一:</p>
+<ul>
+  <li><code>enabled</code>:启用时移。当没有指定任何选项时,此为默认选项。</li>
+  <li><code>disabled</code>:停用时移。</li>
+  <li><code>use_external_storage_only</code>:将时移配置为使用外部存储空间。</li>
+</ul>
+
+<pre class="devsite-click-to-copy">&lt;string name="trickplay_mode"&gt;use_external_storage_only&lt;/string&gt;</pre>
+
+<div>
+<img src="/devices/tv/images/trickplay.png" alt="按控制区中间的按钮后,启用了播放控制界面。" id="figure1"/>
+</div>
+
+<p class="img-caption"><strong>图 1</strong>. 按控制区中间的按钮后,启用了播放控制界面。<em></em></p>
+
+<h3 id="tv-options">对电视选项进行自定义</h3>
+<p>设备制造商可以将直播电视设置对应的自定义选项添加到现有的电视选项菜单中,例如将一个快捷方式添加到“声音图像”设置中。</p>
+
+<p>要指明自定义选项,请声明一个用于在 Activity 中过滤类别 <code>com.android.tv.category.OPTIONS_ROW</code> 的 intent 过滤器。该自定义功能由设备制造商在相应 Activity 中实现。如果点击该选项,则会启动相应 Activity。系统会为该选项使用相应 Activity 的标题和图标。自定义电视选项应与现有界面匹配,以提供最佳的用户体验。</p>
+
+<p class="note"><strong>注意</strong>:一个 Activity 只能处理一个选项,这是因为,由于 Android 限制,直播电视无法区分 Activity 中具有相同类别的 intent 过滤器。请参阅<a href="#multiple-options">在一个 Activity 中处理多个选项</a>,了解解决方法。</p>
+
+<p>通过在 <code>AndroidManifest.xml</code> 中定义 <code>android:priority</code>,设备制造商还可以在现有选项之前或之后放置自定义选项。定义的优先级值低于 100 的选项会显示在现有选项之前,高于 100 的则显示在现有选项之后。如果现有选项之前或之后有多个自定义选项,系统会根据其优先级按升序对其进行排序。如果多个选项具有相同的优先级,则它们之间的顺序是未定义的。</p>
+
+<p>在以下示例中,该选项会显示在电视选项行的最前面。如果点击了该选项,则会启动 PictureSettingsActivity。</p>
+
+<pre class="devsite-click-to-copy">
+&lt;activity android:name=".PictureSettingsActivity"
+    android:label="@string/activity_label_picture_settings"
+          android:theme="@style/Theme.Panel"&gt;
+    &lt;intent-filter
+        android:icon="@drawable/ic_tvoptions_brightness"
+        android:label="@string/option_label_brightness"
+        android:priority="0"&gt;
+        &lt;action android:name="android.intent.action.MAIN" /&gt;
+        &lt;category android:name="com.android.tv.category.OPTIONS_ROW" /&gt;
+    &lt;/intent-filter&gt;
+&lt;/activity&gt;</pre>
+
+<p><img src="/devices/tv/images/tv-options-row.png" alt="自定义电视选项行示例" id="figure2"/></p>
+
+<p class="img-caption"><strong>图 2</strong>. 自定义电视选项行示例(亮度和节能)。</p>
+
+<p><img src="/devices/tv/images/tv-options.png" alt="自定义电视选项示例。" id="figure3"/></p>
+
+<p class="img-caption"><strong>图 3</strong>. 自定义电视选项示例。</p>
+
+<h4 id="multiple-options">在一个 Activity 中处理多个选项</h4>
+<p>选项会映射到 Activity 的 intent 过滤器,反之亦然。由于 Android 不会区分具有相同类别和操作的 intent 过滤器,因此一个 Activity 只能处理一个选项,即使在其中声明了多个 intent 过滤器也是如此。要在一个 Activity 中处理多个选项,请在 <code>AndroidManifest.xml</code> 中使用 <code>&lt;activity-alias&gt;</code>。在 Activity 中,可以使用 <code>getIntent().getComponent()</code> 来标识被点击的选项。</p>
+
+<pre class="devsite-click-to-copy">
+&lt;activity-alias android:name=".AnyUniqueName"
+    android:targetActivity=".PictureSettingsActivity"&gt;
+    &lt;intent-filter
+        android:icon="@drawable/ic_tvoptions_energy_saving"
+        android:label="@string/option_label_energy_saving"
+        android:priority="1"&gt;
+        &lt;action android:name="android.intent.action.MAIN" /&gt;
+        &lt;category android:name="com.android.tv.category.OPTIONS_ROW" /&gt;
+    &lt;/intent-filter&gt;
+&lt;/activity-alias&gt;</pre>
+
+<h3 id="custom-row">创建自定义行</h3>
+<p>设备制造商可以在电视选项行上方添加一个行并对其进行自定义。该自定义行是可选的。</p>
+
+<h4 id="row-title">行标题</h4>
+<p>在 <code>res/values/strings.xml</code> 中定义一个 <code>partner_row_title</code> 字符串。该字符串的值会用作自定义行的标题。</p>
+
+<pre class="devsite-click-to-copy">&lt;string name="partner_row_title"&gt;Partner Row&lt;/string&gt;</pre>
+
+<h4 id="custom-options">自定义选项</h4>
+<p>要将自定义选项添加到自定义行,请按照将选项添加到电视选项菜单的步骤进行操作,但需要将类别名称更改为 <code>com.android.tv.category.PARTNER_ROW</code>。</p>
+
+<pre class="devsite-click-to-copy">&lt;activity android:name=".ThreeDimensionalSettingDialogActivity"
+    android:label="@string/activity_label_3d"
+    android:theme="@android:style/Theme.Material.Light.Dialog"&gt;
+    &lt;intent-filter
+        android:icon="@drawable/ic_tvoptions_3d"
+        android:priority="0"&gt;
+        &lt;action android:name="android.intent.action.MAIN" /&gt;
+        &lt;category android:name="com.android.tv.category.PARTNER_ROW" /&gt;
+    &lt;/intent-filter&gt;
+&lt;/activity&gt;
+</pre>
+
+<p><img src="/devices/tv/images/partner-row.png" alt="可选自定义行示例。" id="figure4"/></p>
+
+<p class="img-caption"><strong>图 4</strong>. 可选自定义行示例。</p>
+
+<p><img src="/devices/tv/images/custom-dialog.png" alt="自定义选项对话框示例。" id="figure5"/></p>
+
+<p class="img-caption"><strong>图 5</strong>. 自定义选项对话框示例。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tv/hdmi-cec.html b/zh-cn/devices/tv/hdmi-cec.html
index 8f7ab2e..6b61d37 100644
--- a/zh-cn/devices/tv/hdmi-cec.html
+++ b/zh-cn/devices/tv/hdmi-cec.html
@@ -43,7 +43,7 @@
 
 <p>以下示意图描绘了从自定义 CEC 控制器到更简单的 HDMI-CEC 硬件抽象层 (HAL) 实现的转换。</p>
 
-<img src="images/HDMI_Control_Service.png" alt="展示 HDMI-CEC 在 Android 5.0 之前和之后的版本中的实现方式的示意图"/>
+<img src="/devices/tv/images/HDMI_Control_Service.png" alt="HDMI-CEC 在 Android 5.0 之前和之后版本中的实现方式示意图"/>
 
 <p class="img-caption"><strong>图 1.</strong>  HDMI 控制服务替换</p>
 
@@ -51,7 +51,7 @@
 
 <p>请参阅以下示意图,详细了解 HDMI 控制服务。</p>
 
-<img src="images/HDMI_Control_Service_Flow.png" alt="展示 HDMI 控制服务详情的图片"/>
+<img src="/devices/tv/images/HDMI_Control_Service_Flow.png" alt="HDMI 控制服务详情图片"/>
 
 <p class="img-caption"><strong>图 2.</strong>  HDMI 控制服务详情</p>
 
@@ -65,7 +65,7 @@
 
 <p class="note"><strong>注意</strong>:设备制造商应将以下行添加到 <code>device.mk</code> 中的 <code>PRODUCT_COPY_FILES</code> 内。</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 PRODUCT_COPY_FILES += \
 frameworks/native/data/etc/android.hardware.hdmi.cec.xml:system/etc/permissions/android.hardware.hdmi.cec.xml
 </pre>
@@ -74,15 +74,14 @@
 
 <p>对于机顶盒 (OTT) 等 HDMI 源设备,请采用如下设置:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=<strong>4</strong>
 </pre>
 
 <p>对于平板电视等 HDMI 接收设备,请采用如下设置:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=<strong>0</strong></pre>
-<p></p>
 
 <ul>
   <li>设备制造商提供的专有 CEC 控制器不能与 <code>HdmiControlService</code> 同时使用。必须将其停用或移除。在需要处理特定于制造商的命令时通常会用到此类控制器。应通过对该服务进行扩展/修改,将特定于制造商的命令处理程序合并到该服务中。上述工作由设备制造商负责,且并非由 Android 指定。请注意,针对特定于制造商的命令对该服务做出的任何更改均不得干扰标准命令的处理方式,否则将导致设备与 Android 不兼容。</li>
@@ -125,7 +124,7 @@
 
 <p>以下是关于 API 的 HDMI-CEC HAL 定义的摘录:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 #ifndef ANDROID_INCLUDE_HARDWARE_HDMI_CEC_H
 #define ANDROID_INCLUDE_HARDWARE_HDMI_CEC_H
 
diff --git a/zh-cn/google26d1c2238d4959e3.html b/zh-cn/google26d1c2238d4959e3.html
new file mode 100644
index 0000000..007742a
--- /dev/null
+++ b/zh-cn/google26d1c2238d4959e3.html
@@ -0,0 +1 @@
+google-site-verification: google26d1c2238d4959e3.html
\ No newline at end of file
diff --git a/zh-cn/security/bulletin/2017-03-01.html b/zh-cn/security/bulletin/2017-03-01.html
index 898d74e..4c49bff 100644
--- a/zh-cn/security/bulletin/2017-03-01.html
+++ b/zh-cn/security/bulletin/2017-03-01.html
@@ -49,20 +49,11 @@
 </li><li>阿里巴巴移动安全团队的 Baozeng Ding、Chengming Yang、Peng Xiao 和 Yang Song:CVE-2017-0506
 </li><li>阿里巴巴移动安全团队的 Baozeng Ding、Ning You、Chengming Yang、Peng Xiao 和 Yang Song:CVE-2017-0463
 </li><li>Android 安全团队的 Billy Lau:CVE-2017-0335、CVE-2017-0336、CVE-2017-0338、CVE-2017-0460
-</li><li><a href="mailto:[email protected]">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>):CVE-2016-8413、CVE-2016-8477、CVE-2017-0531
-</li><li><a href="mailto:[email protected]">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>) 和 <a href="mailto:[email protected]">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0521
-</li><li>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>):CVE-2017-0334、CVE-2017-0456、CVE-2017-0457、CVE-2017-0525
-</li><li><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>) 和 Bo Liu:CVE-2017-0490
-</li><li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2017-0500、CVE-2017-0501、CVE-2017-0502、CVE-2017-0503、CVE-2017-0509、CVE-2017-0524、CVE-2017-0529、CVE-2017-0536
-</li><li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen 和 Guang Gong:CVE-2017-0453、CVE-2017-0461、CVE-2017-0464
+</li><li><a href="mailto:[email protected]">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>):CVE-2016-8413、CVE-2016-8477、CVE-2017-0531</li><li><a href="mailto:[email protected]">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>) 和 <a href="mailto:[email protected]">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0521</li><li>腾讯科恩实验室 (<a href="https://twitter.com/returnsme">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/keen_lab">@returnsme</a>):CVE-2017-0334、CVE-2017-0456、CVE-2017-0457、CVE-2017-0525</li><li><a href="https://twitter.com/heeeeen4x">MS509Team</a> 的 En He (<a href="http://www.ms509.com">@heeeeen4x</a>) 和 Bo Liu:CVE-2017-0490</li><li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2017-0500、CVE-2017-0501、CVE-2017-0502、CVE-2017-0503、CVE-2017-0509、CVE-2017-0524、CVE-2017-0529、CVE-2017-0536</li><li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen 和 Guang Gong:CVE-2017-0453、CVE-2017-0461、CVE-2017-0464
 </li><li>索尼移动通信股份有限公司的 Hiroki Yamamoto 和 Fang Chen:CVE-2017-0481
 </li><li>IBM X-Force 安全研究员 Sagi Kedmi 和 Roee Hay:CVE-2017-0510
-</li><li><a href="https://skyeye.360safe.com">奇虎 360 天眼实验室</a>的 Jianjun Dai (<a href="https://twitter.com/Jioun_dai">@Jioun_dai</a>):CVE-2017-0478
-</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-8416、CVE-2016-8478、CVE-2017-0458、CVE-2017-0459、CVE-2017-0518、CVE-2017-0519、CVE-2017-0533、CVE-2017-0534
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Lubo Zhang</a>、<a href="mailto:[email protected]">Tong Lin</a>、<a href="mailto:[email protected]">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2016-8479
-</li><li>Google 的 Makoto Onuki:CVE-2017-0491
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)、<a href="mailto:[email protected]">Hanxiang Wen</a> 和 Xuxian Jiang:CVE-2017-0479、CVE-2017-0480
-</li><li>Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0535
+</li><li><a href="https://twitter.com/Jioun_dai">奇虎 360 天眼实验室</a>的 Jianjun Dai (<a href="https://skyeye.360safe.com">@Jioun_dai</a>):CVE-2017-0478</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-8416、CVE-2016-8478、CVE-2017-0458、CVE-2017-0459、CVE-2017-0518、CVE-2017-0519、CVE-2017-0533、CVE-2017-0534</li><li><a href="mailto:[email protected]">C0RE 团队</a>的 <a href="mailto:[email protected]">Lubo Zhang</a>、<a href="mailto:[email protected]">Tong Lin</a>、<a href="http://c0reteam.org">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2016-8479</li><li>Google 的 Makoto Onuki:CVE-2017-0491
+</li><li><a href="https://twitter.com/Mingjian_Zhou">C0RE 团队</a>的 Mingjian Zhou (<a href="mailto:[email protected]">@Mingjian_Zhou</a>)、<a href="http://c0reteam.org">Hanxiang Wen</a> 和 Xuxian Jiang:CVE-2017-0479、CVE-2017-0480</li><li>Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0535
 </li><li>特斯拉汽车公司产品安全团队的 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0306
 </li><li>百度安全实验室的丁鹏飞、包沉浮和韦韬:CVE-2016-8417
 </li><li>腾讯科恩实验室的何淇丹 (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>):CVE-2017-0337、CVE-2017-0476
@@ -70,18 +61,13 @@
 </li><li>蚂蚁金服巴斯光年安全实验室的 Quhe 和 wanchouchou:CVE-2017-0522
 </li><li>DarkMatter 安全通信部门的 <a href="mailto:[email protected]">Sahara</a>:CVE-2017-0528
 </li><li>加利福尼亚大学圣巴巴拉分校 Shellphish Grill 团队的 salls (<a href="https://twitter.com/chris_salls">@chris_salls</a>):CVE-2017-0505
-</li><li><a href="mailto:[email protected]">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0504、CVE-2017-0516
-</li><li>Sean Beaupre (beaups):CVE-2017-0455
+</li><li><a href="mailto:[email protected]">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0504、CVE-2017-0516</li><li>Sean Beaupre (beaups):CVE-2017-0455
 </li><li>趋势科技的 Seven Shen (<a href="https://twitter.com/lingtongshen">@lingtongshen</a>):CVE-2017-0452
 </li><li>富士通的 Shinichi Matsumoto:CVE-2017-0498
-</li><li><a href="http://www.byterev.com">ByteRev</a> 的 <a href="mailto:[email protected]">Stéphane Marques</a>:CVE-2017-0489
-</li><li>Google 的 Svetoslav Ganov:CVE-2017-0492
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Tong Lin</a>、<a href="mailto:[email protected]">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0333
-</li><li><a href="http://www.trendmicro.com">趋势科技</a><a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>):CVE-2017-0466、CVE-2017-0467、CVE-2017-0468、CVE-2017-0469、CVE-2017-0470、CVE-2017-0471、CVE-2017-0472、CVE-2017-0473、CVE-2017-0482、CVE-2017-0484、CVE-2017-0485、CVE-2017-0486、CVE-2017-0487、CVE-2017-0494、CVE-2017-0495
-</li><li>蚂蚁金服巴斯光年安全实验室的吴潍浠 (<a href="https://twitter.com/wish_wu">@wish_wu</a>):CVE-2017-0477
+</li><li><a href="mailto:[email protected]">ByteRev</a> 的 <a href="http://www.byterev.com">Stéphane Marques</a>:CVE-2017-0489</li><li>Google 的 Svetoslav Ganov:CVE-2017-0492
+</li><li><a href="mailto:[email protected]">C0RE 团队</a>的 <a href="mailto:[email protected]">Tong Lin</a>、<a href="http://c0reteam.org">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0333</li><li><a href="https://twitter.com/vysea">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="http://www.trendmicro.com">@VYSEa</a>):CVE-2017-0466、CVE-2017-0467、CVE-2017-0468、CVE-2017-0469、CVE-2017-0470、CVE-2017-0471、CVE-2017-0472、CVE-2017-0473、CVE-2017-0482、CVE-2017-0484、CVE-2017-0485、CVE-2017-0486、CVE-2017-0487、CVE-2017-0494、CVE-2017-0495</li><li>蚂蚁金服巴斯光年安全实验室的吴潍浠 (<a href="https://twitter.com/wish_wu">@wish_wu</a>):CVE-2017-0477
 </li><li>奇虎 360 科技有限公司 Vulpecker 团队的 Yu Pan:CVE-2017-0517、CVE-2017-0532
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0526、CVE-2017-0527
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 Yuqi Lu (<a href="https://twitter.com/nikos233__">@nikos233</a>)、<a href="mailto:[email protected]">Wenke Dou</a>、<a href="mailto:[email protected]">Dacheng Shao</a>、Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang:CVE-2017-0483</li>
+</li><li><a href="mailto:[email protected]">C0RE 团队</a>的 <a href="http://c0reteam.org">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0526、CVE-2017-0527</li><li><a href="https://twitter.com/nikos233__">C0RE 团队</a>的 Yuqi Lu (<a href="mailto:[email protected]">@nikos233</a>)、<a href="mailto:[email protected]">Wenke Dou</a>、<a href="https://twitter.com/Mingjian_Zhou">Dacheng Shao</a>、Mingjian Zhou (<a href="http://c0reteam.org">@Mingjian_Zhou</a>) 和 Xuxian Jiang:CVE-2017-0483</li>
 <li>奇虎 360 科技有限公司成都安全响应中心的 Zinuo Han (<a href="https://weibo.com/ele7enxxh">weibo.com/ele7enxxh</a>):CVE-2017-0475、CVE-2017-0497
 </li></ul>
 
@@ -2026,7 +2012,7 @@
 </tbody></table>
 <p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 <h2 id="common-questions-and-answers">常见问题和解答</h2>
-<p>本部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
+<p>这一部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
 <p><strong>1. 如何确定我的设备是否已更新到解决了这些问题的版本?
 </strong></p>
 <p>要了解如何检查设备的安全补丁程序级别,请阅读 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>中的说明。</p>
diff --git a/zh-cn/security/bulletin/2017-06-01.html b/zh-cn/security/bulletin/2017-06-01.html
index f47e9be..08cb8ed 100644
--- a/zh-cn/security/bulletin/2017-06-01.html
+++ b/zh-cn/security/bulletin/2017-06-01.html
@@ -31,7 +31,7 @@
 
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 
-<p class="note"><strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
+<p class="note"><strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载 (OTA) 更新和固件映像相关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
 
 <h2 id="announcements">公告</h2>
 <ul>
@@ -1055,7 +1055,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0645、CVE-2017-0639</td>
-   <td><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>) 和 Bo Liu</td>
+   <td><a href="https://twitter.com/heeeeen4x">MS509Team</a> 的 En He (<a href="http://www.ms509.com">@heeeeen4x</a>) 和 Bo Liu</td>
   </tr>
   <tr>
    <td>CVE-2017-0649</td>
@@ -1075,7 +1075,7 @@
   </tr>
   <tr>
    <td>CVE-2017-7368</td>
-   <td><a href="http://c0reteam.org">C0RE 团队</a>的 Lubo Zhang (<a href="mailto:[email protected]">[email protected]</a>)、Yuan-Tsung Lo (<a href="mailto:[email protected]">[email protected]</a>) 和 Xuxian Jiang</td>
+   <td><a href="mailto:[email protected]">C0RE 团队</a>的 Lubo Zhang (<a href="mailto:[email protected]">[email protected]</a>)、Yuan-Tsung Lo (<a href="http://c0reteam.org">[email protected]</a>) 和 Xuxian Jiang</td>
   </tr>
   <tr>
    <td>CVE-2017-8242</td>
@@ -1087,7 +1087,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0648</td>
-   <td>HCL 科技公司 <a href="https://alephsecurity.com/">Aleph 研究团队</a>的 Roee Hay (<a href="https://twitter.com/roeehay">@roeehay</a>)</td>
+   <td>HCL 科技公司 <a href="https://twitter.com/roeehay">Aleph 研究团队</a>的 Roee Hay (<a href="https://alephsecurity.com/">@roeehay</a>)</td>
   </tr>
   <tr>
    <td>CVE-2017-7369、CVE-2017-6249、CVE-2017-6247、CVE-2017-6248</td>
@@ -1099,7 +1099,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0640</td>
-   <td><a href="http://www.trendmicro.com">趋势科技</a><a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>)</td>
+   <td><a href="https://twitter.com/vysea">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的 V.E.O (<a href="http://www.trendmicro.com">@VYSEa</a>)</td>
   </tr>
   <tr>
    <td>CVE-2017-8236</td>
@@ -1115,7 +1115,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0651</td>
-   <td><a href="http://c0reteam.org">C0RE 团队</a>的 Yuan-Tsung Lo (<a href="mailto:[email protected]">[email protected]</a>) 和 Xuxian Jiang</td>
+   <td><a href="mailto:[email protected]">C0RE 团队</a>的 Yuan-Tsung Lo (<a href="http://c0reteam.org">[email protected]</a>) 和 Xuxian Jiang</td>
   </tr>
   <tr>
    <td>CVE-2017-8241</td>
@@ -1123,7 +1123,7 @@
   </tr>
 </tbody></table>
 <h2 id="common-questions-and-answers">常见问题和解答</h2>
-<p>本部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
+<p>这一部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
 
 <p><strong>1. 如何确定我的设备是否已更新到解决了这些问题的版本?
 </strong></p>
@@ -1176,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>
 
@@ -1208,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>
 
diff --git a/zh-cn/security/keystore/tags.html b/zh-cn/security/keystore/tags.html
index f96024c..f40a544 100644
--- a/zh-cn/security/keystore/tags.html
+++ b/zh-cn/security/keystore/tags.html
@@ -206,14 +206,14 @@
 
 <p>用于指定授权在多长时间内使用相应密钥(以秒数计,从通过身份验证开始算起)。如果 <a href="#user_secure_id">Tag::USER_SECURE_ID</a> 存在而此标记不存在,那么每次使用相应密钥时都需要通过身份验证(要详细了解各项操作的身份验证流程,请参阅 <a href="/security/keystore/implementer-ref#begin">begin</a>)。</p>
 
-<p>此标记的值是一个 32 位的整数,用于指定可在多长时间内使用相应密钥(以秒数计,从使用通过 <a href="#user_secure_id">Tag::USER_AUTH_TYPE</a> 指定的身份验证方法对通过 <a href="#mac_length">Tag::USER_SECURE_ID</a> 指定的用户成功进行身份验证开始算起)。</p>
+<p>此标记的值是一个 32 位的整数,用于指定可在多长时间内使用相应密钥(以秒数计,从使用通过 <a href="#mac_length">Tag::USER_AUTH_TYPE</a> 指定的身份验证方法对通过 <a href="#user_secure_id">Tag::USER_SECURE_ID</a> 指定的用户成功进行身份验证开始算起)。</p>
 
 <h2 id="auth_token">Tag::AUTH_TOKEN</h2>
 
 <p><strong>版本</strong>:1、2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>用于向 <a href="/security/keystore/authentication/#authentication_token_format">begin</a>、<a href="/security/keystore/implementer-ref#begin">update</a> 或 <a href="/security/keystore/implementer-ref#update">finish</a> 提供<a href="/security/keystore/implementer-ref#finish">身份验证令牌</a>,以便向要求用户通过身份验证的密钥操作(密钥带有 <a href="#user_secure_id">Tag::USER_SECURE_ID</a>)证明相应用户已通过身份验证。</p>
+<p>用于向 <a href="/security/keystore/implementer-ref#begin">begin</a>、<a href="/security/keystore/implementer-ref#update">update</a> 或 <a href="/security/keystore/implementer-ref#finish">finish</a> 提供<a href="/security/keystore/authentication/#authentication_token_format">身份验证令牌</a>,以便向要求用户通过身份验证的密钥操作(密钥带有 <a href="#user_secure_id">Tag::USER_SECURE_ID</a>)证明相应用户已通过身份验证。</p>
 
 <p>此标记的值是一个包含 <code>hw_auth_token_t</code> 结构的 Blob。</p>
 
@@ -275,7 +275,7 @@
 } keymaster_block_mode_t;
 </pre>
 
-<p>此标记可重复使用;对于 AES 密钥操作,要在 <a href="/security/keystore/implementer-ref#begin">begin</a> 的 <code>additionalParams</code> 参数中指定模式。
+<p>此标记可重复使用;对于 AES 密钥操作,要在 <a href="/security/keystore/implementer-ref#begin">bigin</a> 的 <code>additionalParams</code> 参数中指定模式。
 如果指定的模式不在相应密钥的关联模式之列,操作会失败并显示 <code>ErrorCode::INCOMPATIBLE_BLOCK_MODE</code>。</p>
 
 <h2 id="bootloader_only">Tag::BOOTLOADER_ONLY</h2>
@@ -455,7 +455,7 @@
 <p><strong>版本</strong>:1、2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>用于提供或返回进行 AES GCM、CBC 或 CTR 加密/解密时使用的随机数或初始化矢量 (IV)。在加密和解密操作期间,可以将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a>。仅当相应密钥带有 <a href="/security/keystore/implementer-ref#begin">Tag::CALLER_NONCE</a> 时,才将此标记提供给 <a href="#caller_nonce">begin</a>。如果调用程序未提供此标记,Keymaster 将随机生成适当的随机数或 IV 并通过 begin 将其返回。</p>
+<p>用于提供或返回进行 AES GCM、CBC 或 CTR 加密/解密时使用的随机数或初始化矢量 (IV)。在加密和解密操作期间,可以将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a>。仅当相应密钥带有 <a href="#caller_nonce">Tag::CALLER_NONCE</a> 时,才将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a>。如果调用程序未提供此标记,Keymaster 将随机生成适当的随机数或 IV 并通过 begin 将其返回。</p>
 
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。所允许的长度取决于模式:GCM 随机数的长度为 12 个字节;CBC IV 和 CTR IV 的长度为 16 个字节。</p>
 
@@ -694,7 +694,7 @@
 
 <p>用于指定只能在某个安全的用户身份验证状态下使用相应密钥。此标记与 <a href="#no_auth_required">Tag::NO_AUTH_REQUIRED</a> 互斥。</p>
 
-<p>此标记的值是一个 64 位的整数,用于指定在通过 <a href="/security/keystore/implementer-ref#begin">Tag::AUTH_TOKEN</a> 向 <a href="#auth_token">begin</a> 提供的身份验证令牌中必须存在哪个身份验证政策状态值,身份验证程序才会授权使用相应密钥。如果在调用 <a href="/security/keystore/implementer-ref#begin">begin</a> 时未提供身份验证令牌,或提供的身份验证令牌没有匹配的政策状态值,但所用密钥带有此标记,则该调用失败。</p>
+<p>此标记的值是一个 64 位的整数,用于指定在通过 <a href="#auth_token">Tag::AUTH_TOKEN</a> 向 <a href="/security/keystore/implementer-ref#begin">begin</a> 提供的身份验证令牌中必须存在哪个身份验证政策状态值,身份验证程序才会授权使用相应密钥。如果在调用 <a href="/security/keystore/implementer-ref#begin">begin</a> 时未提供身份验证令牌,或提供的身份验证令牌没有匹配的政策状态值,但所用密钥带有此标记,则该调用失败。</p>
 
 <p>此标记可重复使用。如果提供的值中有任何一个与身份验证令牌中的任何政策状态值一致,身份验证程序即会授权使用相应密钥。否则,操作会失败并显示 <code>ErrorCode::KEY_USER_NOT_AUTHENTICATED</code>。</p>
 
diff --git a/zh-cn/security/overview/acknowledgements.html b/zh-cn/security/overview/acknowledgements.html
index fd01332..2835480 100644
--- a/zh-cn/security/overview/acknowledgements.html
+++ b/zh-cn/security/overview/acknowledgements.html
@@ -22,7 +22,116 @@
 
 <p>Android 安全团队非常感谢以下个人和团队帮助提高 Android 安全性。他们或发现安全漏洞,并负责地通过 AOSP 错误跟踪工具<a href="https://www.google.com/appserve/security-bugs/m2/new">安全错误报告</a>模板向我们报告,或提交对 Android 安全性具有积极影响的代码(包括符合<a href="https://www.google.com/about/appsecurity/patch-rewards/">补丁程序奖励</a>计划条件的代码),帮助提高了 Android 安全性。</p>
 
-<h2 id="2017">2017 年</h2>
+<h2 id="2018">2018</h2>
+<p>2018 年的安全致谢信息将按月列出。过去几年的致谢信息是列在一起的。</p>
+<h4 id="january-2018">1 月</h4>
+
+<table>
+  <colgroup><col width="70%" />
+  <col width="30%" />
+  </colgroup><tbody><tr>
+   <th>研究人员</th>
+   <th>CVE</th>
+  </tr>
+  <tr>
+   <td><a href="mailto:[email protected]">Adong Zhang</a> (张阿东)、<a href="mailto:[email protected]">Chao Liu</a> (刘超) 和 <a href="mailto:[email protected]">Jinguang Dong</a> (董金光)</td>
+   <td>CVE-2017-13215</td>
+  </tr>
+  <tr>
+   <td><a href="https://labs.mwrinfosecurity.com/">MWR 实验室</a>的 <a href="https://twitter.com/amarekano">Amar Menezes</a></td>
+   <td>CVE-2017-13212</td>
+  </tr>
+  <tr>
+   <td><a href="http://www.e2e-assure.com ">e2e-assure</a> 的 Andy Tyler (<a href="https://twitter.com/ticarpi">@ticarpi</a>)</td>
+   <td>CVE-2017-0846</td>
+  </tr>
+  <tr>
+   <td>阿里巴巴安全团队 Pandora 实验室的 Baozeng Ding (<a href="https://twitter.com/sploving1">@sploving</a>)、Chengming Yang 和 Yang Song</td>
+   <td>CVE-2017-13222、CVE-2017-13220</td>
+  </tr>
+  <tr>
+   <td>Google 的 Billy Lau</td>
+   <td>CVE-2017-14879</td>
+  </tr>
+  <tr>
+   <td>Cameron Gutman</td>
+   <td>CVE-2017-13214</td>
+  </tr>
+  <tr>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Chi Zhang</a> 和 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
+   <td>CVE-2017-13178、CVE-2017-13179</td>
+  </tr>
+  <tr>
+   <td>Google 的 Gal Beniamini</td>
+   <td>CVE-2017-13209</td>
+  </tr>
+  <tr>
+   <td>Haosheng Wang (<a href="https://twitter.com/gnehsoah">@gnehsoah</a>)</td>
+   <td>CVE-2017-13198</td>
+  </tr>
+  <tr>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的 Hongli Han (<a href="https://twitter.com/HexB1n">@HexB1n</a>) 和 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
+   <td>CVE-2017-13183、CVE-2017-13180</td>
+  </tr>
+  <tr>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的 Hongli Han (<a href="https://twitter.com/HexB1n">@HexB1n</a>)、<a href="mailto:[email protected]">Dacheng Shao</a> 和 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
+   <td>CVE-2017-13194</td>
+  </tr>
+  <tr>
+   <td>Google 的 Max Moroz</td>
+   <td>CVE-2017-13224</td>
+  </tr>
+  <tr>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (周明建) (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
+   <td>CVE-2017-13184、CVE-2017-13201</td>
+  </tr>
+  <tr>
+   <td><a href="mailto:[email protected]">Niky1235</a> (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>)</td>
+   <td>CVE-2017-0855、CVE-2017-13195、CVE-2017-13181</td>
+  </tr>
+  <tr>
+   <td><a href="http://github.com/tintinweb">tintinweb</a></td>
+   <td>CVE-2017-13208</td>
+  </tr>
+  <tr>
+   <td>北京大学的 Tongxin Li 和 Xinhui Han;印第安纳大学布卢明顿分校的 Luyi Xing、Nan Zhang、Xueqiang Wang 和 XiaoFeng Wang;清华大学的 Xiaolong Bai 以及中国科学研究院 IIE 的 Kai Chen</td>
+   <td>CVE-2017-13176</td>
+  </tr>
+  <tr>
+   <td><a href="http://www.trendmicro.com">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>)</td>
+   <td>CVE-2017-13196、CVE-2017-13186</td>
+  </tr>
+  <tr>
+   <td>腾讯安全平台部门的付敬贵</td>
+   <td>CVE-2017-13219、CVE-2017-13207</td>
+  </tr>
+  <tr>
+   <td>Google 的 Xuan Xing</td>
+   <td>CVE-2017-13217</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 Qex 团队的 Yangkang (<a href="https://twitter.com/dnpushme">@dnpushme</a>)</td>
+   <td>CVE-2017-13200</td>
+  </tr>
+  <tr>
+   <td><a href="http://xlab.tencent.com">腾讯玄武实验室</a>的 Yongke Wang (<a href="https://twitter.com/Rudykewang">@Rudykewang</a>) 和 Yuebin Sun</td>
+   <td>CVE-2017-13202</td>
+  </tr>
+  <tr>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Yuan-Tsung Lo</a></td>
+   <td>CVE-2017-13213、CVE-2017-13221</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司 Vulpecker 团队的 <a href="http://weibo.com/panyu6325">Yu Pan</a> 和 <a href="mailto:[email protected]">Yang Dai</a></td>
+   <td>CVE-2017-0869</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司成都安全响应中心的 <a href="http://weibo.com/ele7enxxh">Zinuo Han</a></td>
+   <td>CVE-2017-13206、CVE-2017-13188、CVE-2017-13185</td>
+  </tr>
+</tbody></table>
+
+<h2 id="2017">2017</h2>
 
 <table>
   <colgroup><col width="50%" />
@@ -1172,7 +1281,9 @@
 
 <p><a href="http://www.search-lab.hu/">Search-Lab Ltd.</a> 的 Imre Rad</p>
 
-<p><a href="http://thejh.net/">Jann Horn</a> <a href="https://android-review.googlesource.com/#/c/98197/"><img style="vertical-align:middle;" src="../images/tiny-robot.png" alt="绿色机器人补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://thejh.net/">Jann Horn</a> <a href="https://android-review.googlesource.com/#/c/98197/">
+<img style="vertical-align:middle;" src="../images/tiny-robot.png" alt="绿色机器人补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/>
+</a></p>
 
 <p><a href="http://www.bluebox.com/">Bluebox Security</a> 的 Jeff Forristal</p>
 
@@ -1192,7 +1303,9 @@
 
 <p>犹他大学的 <a href="http://www.cs.utah.edu/~rsas/">Raimondas Sasnauskas</a></p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig <a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p><a href="http://www.samsung.com">三星移动</a></p>
 
@@ -1207,7 +1320,9 @@
 <p><a href="https://www.sit.fraunhofer.de/">Fraunhofer SIT</a> 移动安全测试实验室的 Stephan Huber (<a href="mailto:[email protected]">[email protected]</a>)
 </p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley <a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>EC SPRIDE 达姆施塔特工业大学<a href="http://sseblog.ec-spride.de/">安全软件工程团队</a>的 Steven Arzt (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
@@ -1227,7 +1342,10 @@
 
 <p><a href="https://www.facebook.com">Facebook</a> 的 <a href="http://www.shackleton.io/">Will Shackleton</a></p>
 
-<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>) <a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://www.linkedin.com/in/billcroberts">
+William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>印第安纳大学布卢明顿分校的 <a href="http://www.informatics.indiana.edu/xw7/">Xiaofeng Wang</a> (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
@@ -1251,7 +1369,9 @@
 
 <p><a href="http://appliedcybersecurity.com/">Applied Cybersecurity LLC</a> 的 Jon Sawyer (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
-<p><a href="http://www.accuvant.com/">Accuvant LABS</a> 的 Joshua J. Drake (<a href="https://twitter.com/jduck">@jduck</a>) <a href="https://android-review.googlesource.com/#/q/change:72228+OR+change:72229"><img style="vertical-align:middle" src="../images/patchreward.png" alt="补丁程序奖励符号" title="此人符合参加补丁程序奖励计划的条件!"/></a></p>
+<p><a href="http://www.accuvant.com/">Accuvant LABS</a> 的 Joshua J. Drake (<a href="https://twitter.com/jduck">@jduck</a>)
+<a href="https://android-review.googlesource.com/#/q/change:72228+OR+change:72229">
+<img style="vertical-align:middle" src="../images/patchreward.png" alt="补丁程序奖励符号" title="此人符合参加补丁程序奖励计划的条件!"/></a></p>
 
 <p>Kan Yuan</p>
 
@@ -1269,13 +1389,20 @@
 
 <p><a href="https://securityresear.ch/">Roee Hay</a>(<a href="https://twitter.com/roeehay">@roeehay</a>、<a href="mailto:[email protected]">[email protected]</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig <a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>IOActive 的 Ruben Santamarta (<a href="https://twitter.com/reversemode">@reversemode</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley <a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
-<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>) <a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://www.linkedin.com/in/billcroberts">
+William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>印第安纳大学布卢明顿分校的 Xiaorui Pan (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
@@ -1293,17 +1420,24 @@
 
 <p>柏林工业大学的 Ravishankar Borgaonkari (<a href="https://twitter.com/raviborgaonkar">@raviborgaonkar</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig <a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p><a href="https://securityresear.ch/">Roee Hay</a>(<a href="https://twitter.com/roeehay">@roeehay</a>、<a href="mailto:[email protected]">[email protected]</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley <a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
-<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>) <a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://www.linkedin.com/in/billcroberts">
+William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 </div>
 
-<h2 id="2011">2011 年</h2>
+<h2 id="2011">2011</h2>
 
 <div style="LINE-HEIGHT:25px;">
 
diff --git a/zh-cn/setup/64-bit-builds.html b/zh-cn/setup/64-bit-builds.html
new file mode 100644
index 0000000..2d10e38
--- /dev/null
+++ b/zh-cn/setup/64-bit-builds.html
@@ -0,0 +1,156 @@
+<html devsite><head>
+    <title>了解 64 位版本</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="overview">概览</h2>
+
+<p>从编译系统的角度来看,最显著的变化是现在支持在同一次编译中为两种目标 CPU 架构(64 位和 32 位)编译二进制文件。这也称为“多库编译”。<em></em></p>
+
+<p>对于本机静态库和共享库,编译系统设置了为两种架构编译二进制文件的规则。产品配置 (<code>PRODUCT_PACKAGES</code>) 与依赖关系图共同决定了编译哪些二进制文件并安装到系统映像中。</p>
+
+<p>对于可执行文件和应用,编译系统默认仅编译 64 位版本,但您可以使用一个全局 <code>BoardConfig.mk</code> 变量或针对特定模块的变量来替换此设置。</p>
+
+<p class="caution"><strong>注意</strong>:如果某个应用提供了一个可供其他应用(可以是 32 位,也可以是 64 位)使用的 API,那么在该应用的清单中,<code>android:multiarch</code> 属性的值必须设为 <code>true</code>,以避免可能出现的错误。</p>
+
+<h2 id="product_configuration">产品配置</h2>
+
+<p>在 <code>BoardConfig.mk</code> 中,我们添加了以下变量来配置第二个 CPU 架构和 ABI:</p>
+
+<pre>
+TARGET_2ND_ARCH
+TARGET_2ND_ARCH_VARIANT
+TARGET_2ND_CPU_VARIANT
+TARGET_2ND_CPU_ABI
+TARGET_2ND_CPU_ABI2
+</pre>
+
+<p>您可以在 <code>build/target/board/generic_arm64/BoardConfig.mk</code> 中查看示例。</p>
+
+<p>如果您希望编译系统默认编译 32 位可执行文件和应用,请设置以下变量:</p>
+
+<pre class="devsite-click-to-copy">
+TARGET_PREFER_32_BIT := true
+</pre>
+
+<p>不过,您可以在 <code>Android.mk</code> 中使用针对特定模块的变量来替换此设置。</p>
+
+<p>在多库编译中,<code>PRODUCT_PACKAGES</code> 中的模块名称同时涵盖了 32 位和 64 位二进制文件,只要这些名称是由编译系统定义的。对于通过依赖关系提取而来的库,只有在另一个 32 位库或可执行文件要求使用时,系统才会安装 32 位库。64 位库也遵循同样的规则。</p>
+
+<p>不过,<code>make</code> 命令行中的模块名称仅涵盖 64 位版本。例如,在运行 <code>lunch
+aosp_arm64-eng</code> 之后,<code>make libc</code> 仅编译 64 位库。要编译 32 位库,您需要运行 <code>make libc_32</code>。</p>
+
+<h2 id="module_definition_in_android_mk">Android.mk 中的模块定义</h2>
+
+<p>您可以使用 <code>LOCAL_MULTILIB</code> 变量来配置您是要编译 32 位还是 64 位架构,或是同时编译二者,并可以替换全局 <code>TARGET_PREFER_32_BIT</code> 变量。</p>
+
+<p>将 <code>LOCAL_MULTILIB</code> 设为以下其中一项值:</p>
+
+<ul>
+  <li>“both”(二者):同时编译 32 位和 64 位架构。</li>
+  <li>“32”:仅编译 32 位架构。</li>
+  <li>“64”:仅编译 64 位架构。</li>
+  <li>“first”(第一个):仅编译第一个架构(在 32 位设备中编译 32 位架构,在 64 位设备中编译 64 位架构)。</li>
+  <li>“”:默认值;编译系统根据模块类和其他 <code>LOCAL_</code> 变量(如 <code>LOCAL_MODULE_TARGET_ARCH</code>、<code>LOCAL_32_BIT_ONLY</code> 等)决定要编译哪种架构。</li>
+</ul>
+
+<p>在多库编译中,<code>ifeq $(TARGET_ARCH)</code> 等条件不再起作用。</p>
+
+<p>如果您想为某些特定架构编译模块,以下变量可为您提供帮助:</p>
+
+<ul>
+  <li><code>LOCAL_MODULE_TARGET_ARCH</code><br />该变量可设为一个架构列表,类似于“arm x86 arm64”。只有正在编译的架构位于该列表中,编译系统才会添加当前模块。</li>
+
+  <li><code>LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH</code><br /><code>LOCAL_MODULE_TARGET_ARCH</code> 的相反变量。只有正在编译的架构不在相应列表中,编译系统才会添加当前模块。</li>
+</ul>
+
+<p>上述两个变量有两个小变体:</p>
+
+<ul>
+  <li><code>LOCAL_MODULE_TARGET_ARCH_WARN</code></li>
+  <li><code>LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH_WARN</code></li>
+</ul>
+
+<p>如果当前模块由于架构受到这两个变量的限制而被跳过,编译系统将发出警告。</p>
+
+<p>要设置针对特定架构的编译标记,请使用针对特定架构的 <code>LOCAL_</code> 变量。针对特定架构的 <code>LOCAL_</code> 变量由普通 <code>LOCAL_</code> 变量加架构后缀构成,例如:</p>
+
+<ul>
+  <li> <code>LOCAL_SRC_FILES_arm, LOCAL_SRC_FILES_x86,</code>
+  </li><li> <code>LOCAL_CFLAGS_arm, LOCAL_CFLAGS_arm64,</code>
+  </li><li> <code>LOCAL_LDFLAGS_arm, LOCAL_LDFLAGS_arm64,</code>
+</li></ul>
+
+<p>只有当前正在为相应架构编译二进制文件时,才能使用这些变量。</p>
+
+<p>有时,根据当前正在为 32 位还是 64 位架构编译二进制文件来设置标记会更方便。在这种情况下,您可以使用带有 <code>_32</code> 或 <code>_64</code> 后缀的 <code>LOCAL_</code> 变量,例如:</p>
+
+<ul>
+  <li> <code>LOCAL_SRC_FILES_32, LOCAL_SRC_FILES_64,</code>
+  </li><li> <code>LOCAL_CFLAGS_32, LOCAL_CFLAGS_64,</code>
+  </li><li> <code>LOCAL_LDFLAGS_32, LOCAL_LDFLAGS_64,</code>
+</li></ul>
+
+<p>请注意,并非所有 <code>LOCAL_</code> 变量都支持针对特定架构的变体。
+如需了解此类变量的最新列表,请参阅 <code>build/core/clear_vars.mk</code>。</p>
+
+<h2 id="install_path">安装路径</h2>
+
+<p>在过去,您可以使用 <code>LOCAL_MODULE_PATH</code> 将库安装到默认位置以外的位置。例如:<code>LOCAL_MODULE_PATH :=
+$(TARGET_OUT_SHARED_LIBRARIES)/hw</code>。</p>
+
+<p>在多库编译中,请改用 <code>LOCAL_MODULE_RELATIVE_PATH</code>:</p>
+
+<pre class="devsite-click-to-copy">
+LOCAL_MODULE_RELATIVE_PATH := hw
+</pre>
+
+<p>这样就可以将 64 位和 32 位库安装到正确的位置。</p>
+
+<p>如果您要将某个可执行文件编译为同时适用于 32 位和 64 位架构,则需要使用以下变量之一来区分安装路径:</p>
+
+<ul>
+  <li><code>LOCAL_MODULE_STEM_32, LOCAL_MODULE_STEM_64</code><br />指定已安装文件的名称。
+  </li><li><code>LOCAL_MODULE_PATH_32, LOCAL_MODULE_PATH_64</code><br />指定安装路径。
+</li></ul>
+
+<h2 id="generated_sources">生成的源代码</h2>
+
+<p>在多库编译中,在 <code>$(local-intermediates-dir)</code>(或通过明确的变量在 <code>$(intermediates-dir-for)
+</code> 中生成)中生成源代码文件这种方法会变得不再可靠。这是因为 32 位和 64 位版本都需要用到中间目录中生成的源代码,而 <code>$(local-intermediates-dir)</code> 仅指向两个中间目录中的一个。</p>
+
+<p>值得高兴的是,编译系统现在提供了一个适合多库编译的、用于生成源代码的专用中间目录。您可以调用 <code>
+$(local-generated-sources-dir)</code> 或 <code>$(generated-sources-dir-for)</code> 来获取该目录的路径。它们的用法与 <code>$(local-intermediates-dir)</code> 和 <code>$(intermediates-dir-for)</code> 类似。</p>
+
+<p>如果源代码文件在新的专用目录中生成并由 <code>LOCAL_GENERATED_SOURCES</code> 调用,那么就意味着它在多库编译中是同时为 32 位和 64 位架构编译的。</p>
+
+<h2 id="prebuilts">预编译</h2>
+
+<p>在多库编译中,您无法使用 <code>TARGET_ARCH</code>(或加上 <code>TARGET_2ND_ARCH</code>)来告知编译系统,预编译的二进制文件是以哪种架构为目标。请改用上述 <code>LOCAL_</code> 变量 <code>LOCAL_MODULE_TARGET_ARCH</code> 或 <code>LOCAL_MODULE_UNSUPPORTED_TARGET_ARCH</code>。</p>
+
+<p>利用这些变量,即使编译系统目前正在进行 64 位多库编译,也可以选择对应的 32 位预编译二进制文件。</p>
+
+<p>如果您想使用所选的架构来计算预编译二进制文件的源路径,则可以调用 <code> $(get-prebuilt-src-arch)</code>。</p>
+
+<h2 id="dex-preopt">Dex-preopt</h2>
+
+<p>对于 64 位设备,我们会默认为启动映像及任何 Java 库同时生成 32 位和 64 位 odex 文件。对于 APK,我们默认仅为主要的 64 位架构生成 odex。如果某个应用将同时在 32 位和 64 位进程中启动,请使用 <code>LOCAL_MULTILIB := both</code> 确保同时生成 32 位和 64 位 odex 文件。该标记还会指示编译系统同时添加 32 位和 64 位 JNI 库(如果应用中包含任何此类库)。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/add-device.html b/zh-cn/setup/add-device.html
new file mode 100644
index 0000000..d8b24cb
--- /dev/null
+++ b/zh-cn/setup/add-device.html
@@ -0,0 +1,317 @@
+<html devsite><head>
+    <title>添加新设备</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>您可以参考本页中的信息为自己的设备和产品创建 Makefile。请注意,与本部分中的其他页面不同,本页中的内容仅适合在创建全新的设备类型时参考,而且仅适合公司编译和产品团队参考。</p>
+
+<h2 id="build-layers">了解编译层</h2>
+
+<p>编译层次结构包括与设备的物理结构对应的抽象层。下表中介绍了这些层。每个层都与上一层存在一对多的关系。例如,一个架构可以有多个板,一个板可以有多个产品。您可以将指定层中的某个元素定义为同一层中某个元素的特化元素,从而免去复制操作并简化维护工作。</p>
+
+<table>
+ <tbody><tr>
+  <th>层</th>
+  <th>示例</th>
+  <th>说明</th>
+ </tr>
+  <tr>
+    <td>产品</td>
+    <td>myProduct、myProduct_eu、myProduct_eu_fr、j2、sdk</td>
+    <td>产品层用于定义所开发产品的功能规范,例如要编译的模块、支持的语言区域,以及针对各语言区域的配置。也就是说,这是总体产品的名称。产品特定变量在产品定义 Makefile 中进行定义。一个产品可以沿用其他产品的定义,这有助于简化维护工作。一种常用的方法是:先创建一个基础产品,其中包含会应用到所有产品的功能,然后再基于这个基础产品创建产品变体。例如,如果有两个产品只是使用的无线技术不同(分别使用 CDMA 和 GSM),那么您可以让这两个产品沿用未定义无线技术的同一个基础产品的定义。
+</td>
+
+  </tr>
+ <tr>
+    <td>板/设备</td>
+    <td>sardine、trout、goldfish</td>
+    <td>设备/板层代表设备上由可塑材料组成的物理层(即设备的工业设计)。例如,在北美销售的设备可能包括 QWERTY 键盘,而在法国销售的设备则可能包括 AZERTY 键盘。该层还用于展现产品的基本架构图。这些架构图包括板上的外围设备及其配置。所使用的名称只不过是代表不同主板/设备配置的代码。</td>
+  </tr>
+<tr>
+    <td>架构</td>
+    <td>arm、x86、mips、arm64、x86_64、mips64</td>
+    <td>架构层用于描述主板上运行的处理器配置和 ABI(应用二进制接口)。</td>
+  </tr>
+</tbody></table>
+
+<h2 id="build-variants">使用编译类型</h2>
+
+<p>在针对特定产品进行编译时,如果能在最终发布版本的基础上进行细微修改,通常会非常有用。在模块定义中,模块可以通过 <code>LOCAL_MODULE_TAGS</code> 指定标记,这些标记可以是以下一个或多个值:<code>optional</code>(默认)、<code>debug</code>、<code>eng</code>。</p>
+
+<p>如果某个模块没有通过 <code>LOCAL_MODULE_TAGS</code> 指定标记,则其标记默认为 <code>optional</code>。仅当 <code>PRODUCT_PACKAGES</code> 的产品配置需要可选模块时,系统才会安装可选模块。</p><p>以下是当前已定义的编译类型:</p>
+
+<table border="1">
+<tbody><tr>
+    <td>
+        <code>eng</code>
+    </td>
+    <td>这是默认的编译类型。
+<ul>
+<li>安装带有 <code>eng</code> 和/或 <code>debug</code> 标记的模块。</li>
+<li>除了带有标记的模块之外,还会根据产品定义文件安装相应模块。</li>
+<li><code>ro.secure=0</code></li>
+<li><code>ro.debuggable=1</code></li>
+<li><code>ro.kernel.android.checkjni=1</code></li>
+<li><code>adb</code> 默认处于启用状态。</li>
+</ul>
+    </td>
+</tr>
+<tr>
+    <td>
+        <code>user</code>
+    </td>
+    <td>这是旨在用作最终版本配置步骤的编译类型。
+<ul>
+<li>安装带有 <code>user</code> 标记的模块。</li>
+<li>除了带有标记的模块之外,还会根据产品定义文件安装相应模块。</li>
+<li><code>ro.secure=1</code> </li>
+<li><code>ro.debuggable=0</code> </li>
+<li><code>adb</code> 默认处于停用状态。</li>
+</ul>
+    </td>
+</tr>
+<tr>
+    <td>
+        <code>userdebug</code>
+    </td>
+    <td>
+        除了以下几点之外,其余均与 <code>user</code> 相同:
+<ul>
+<li>还会安装带有 <code>debug</code> 标记的模块。</li>
+<li><code>ro.debuggable=1</code></li>
+<li><code>adb</code> 默认处于启用状态。</li>
+</ul>
+    </td>
+</tr>
+</tbody></table>
+
+<h2 id="use-resource-overlays">利用资源叠加层定制版本</h2>
+
+<p>Android 编译系统会在编译时利用资源叠加层定制产品。资源叠加层用于指定在默认文件之上应用的资源文件。要使用资源叠加层,请修改项目编译文件,将 <code>PRODUCT_PACKAGE_OVERLAYS</code> 设为相对于顶级目录的路径。当编译系统搜索资源时,该路径将成为影子根目录,系统除了在当前根目录中进行搜索外,还会一并在该路径中搜索。</p>
+
+<p><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">frameworks/base/core/res/res/config.xml</a> 文件中包含用户最常自定义的设置。</p>
+
+<p>要在此文件上设置资源叠加层,请将叠加层目录添加到项目编译文件中,如下所示:</p>
+
+<pre class="devsite-click-to-copy">
+PRODUCT_PACKAGE_OVERLAYS := device/<var>DEVICE_IMPLEMENTER</var>/<var>DEVICE_NAME</var>/overlay
+</pre>
+
+<p>或</p>
+
+<pre class="devsite-click-to-copy">
+PRODUCT_PACKAGE_OVERLAYS := vendor/<var>VENDOR_NAME</var>/overlay
+</pre>
+
+<p>然后,将一个叠加层文件添加到该目录下,例如:</p>
+
+<pre class="devsite-click-to-copy">
+vendor/foobar/overlay/frameworks/base/core/res/res/config.xml
+</pre>
+
+<p>在叠加层 <code>config.xml</code> 文件中找到的所有字符串或字符串数组都将会替换在原始文件中找到的对应字符串或字符串数组。</p>
+
+<h2 id="build-a-product">编译产品</h2>
+
+<p>您可以通过多种方式组织设备的源文件。我们将以 Nexus 6 为例,简要介绍是如何组织其实施文件的,不过您可以按照自己认为合适的方式组织源文件并进行编译。
+</p>
+<p>
+为 Nexus 6 实施了一个名为 <code>shamu</code> 的主设备配置。根据此设备配置创建了一个产品以及一个产品定义 Makefile,该 Makefile 用于声明关于设备的产品特定信息,例如名称和型号。您可以查看 <code>device/moto/shamu</code> 目录,了解所有相关配置的具体设置方式。
+</p>
+<h3 id="makefiles">编写 Makefile</h3>
+<p>以下步骤介绍了如何采用与设置 Nexus 6 产品线类似的方式设置产品 Makefile:</p>
+<ol>
+  <li>为您的产品创建 <code>device/&lt;company_name&gt;/&lt;device_name&gt;</code> 目录,例如 <code>device/moto/shamu</code>。该目录中将包含您设备的源代码以及编译这些代码所需的 Makefile。
+  </li>
+
+  <li>创建一个用于声明设备所需文件和模块的 <code>device.mk</code> Makefile。有关示例,请参阅 <code>device/moto/shamu/device.mk</code>。
+  </li>
+
+  <li>创建一个产品定义 Makefile,以便基于设备创建具体产品。以下示例 Makefile 来自于 <code>device/moto/shamu/aosp_shamu.mk</code>。
+请注意,该产品会通过 Makefile 沿用 <code>device/moto/shamu/device.mk</code> 和 <code>vendor/moto/shamu/device-vendor.mk</code> 文件中的内容,同时还会声明产品特定信息,例如名称、品牌和型号。
+
+<pre class="devsite-click-to-copy">
+# Inherit from the common Open Source product configuration
+$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
+
+PRODUCT_NAME := aosp_shamu
+PRODUCT_DEVICE := shamu
+PRODUCT_BRAND := Android
+PRODUCT_MODEL := AOSP on Shamu
+PRODUCT_MANUFACTURER := motorola
+PRODUCT_RESTRICT_VENDOR_FILES := true
+
+$(call inherit-product, device/moto/shamu/device.mk)
+$(call inherit-product-if-exists, vendor/moto/shamu/device-vendor.mk)
+
+PRODUCT_NAME := aosp_shamu
+
+PRODUCT_PACKAGES += \
+    Launcher3
+</pre>
+
+    <p>
+要查看可添加到 Makefile 的其他产品特定变量,请参阅<a href="#prod-def">产品定义变量</a>。
+    </p>
+  </li>
+
+  <li>创建一个指向产品的 Makefile 的 <code>AndroidProducts.mk</code> 文件。在此示例中,仅需要产品定义 Makefile。以下示例来自于 <code>device/moto/shamu/AndroidProducts.mk</code>:
+<pre class="devsite-click-to-copy">
+#
+# This file should set PRODUCT_MAKEFILES to a list of product makefiles
+# to expose to the build system.  LOCAL_DIR will already be set to
+# the directory containing this file.
+#
+# This file may not rely on the value of any variable other than
+# LOCAL_DIR; do not use any conditionals, and do not look up the
+# value of any variable that isn't set in this file or in a file that
+# it includes.
+#
+
+PRODUCT_MAKEFILES := \
+    $(LOCAL_DIR)/aosp_shamu.mk
+</pre>
+  </li>
+
+  <li>创建一个包含主板特定配置的 <code>BoardConfig.mk</code> Makefile。
+有关示例,请参阅 <code>device/moto/shamu/BoardConfig.mk</code>。
+  </li>
+
+  <li>创建一个 <code>vendorsetup.sh</code> 文件,以便将您的产品(“午餐套餐”)与<a href="#build-variants">编译变体</a>(使用短划线将两者分隔开)一起添加到细分版本中。例如:<pre class="devsite-click-to-copy">
+add_lunch_combo <var>&lt;PRODUCT_NAME&gt;</var>-userdebug
+</pre>
+  </li>
+
+  <li>这时,您就可以基于同一设备创建更多产品变体了。
+  </li>
+
+</ol>
+<h3 id="prod-def">设置产品定义变量</h3>
+<p>产品特定变量在产品的 Makefile 中定义。在产品定义文件中维护的变量包括:</p>
+<table>
+  <tbody>
+    <tr>
+      <th>参数</th>
+      <th>说明</th>
+      <th>示例</th>
+    </tr>
+    <tr>
+      <td>PRODUCT_AAPT_CONFIG</td>
+      <td>
+        创建程序包时使用的 <code>aapt</code> 配置
+      </td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>PRODUCT_BRAND</td>
+      <td>对软件进行自定义所针对的品牌(如果有),例如运营商</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>PRODUCT_CHARACTERISTICS</td>
+      <td>
+        <code>aapt</code> 特性,用于允许向程序包添加变体特定资源。
+      </td>
+      <td>tablet、nosdcard</td>
+    </tr>
+    <tr>
+      <td>PRODUCT_COPY_FILES</td>
+      <td>
+字词列表,例如 <code>source_path:destination_path</code>。在编译相应产品时,应将源路径下的文件复制到目标路径。config/Makefile 中定义了针对复制步骤的规则</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>PRODUCT_DEVICE</td>
+      <td>工业设计的名称。这也是板名称,编译系统会使用该名称查找 <code>BoardConfig.mk.</code>
+      </td>
+      <td>
+        <code>tuna</code>
+      </td>
+    </tr>
+    <tr>
+      <td>PRODUCT_LOCALES</td>
+      <td>以空格分隔的列表,用于列出由双字母语言代码和双字母国家/地区代码组成的代码对,以便说明针对用户的一些设置,例如界面语言和时间、日期以及货币格式。PRODUCT_LOCALES 中列出的第一个语言区域会被用作产品的默认语言区域。
+      </td>
+      <td>
+        <code>en_GB de_DE es_ES fr_CA</code>
+      </td>
+    </tr>
+    <tr>
+      <td>PRODUCT_MANUFACTURER</td>
+      <td>制造商的名称</td>
+      <td>
+        <code>acme</code>
+      </td>
+    </tr>
+    <tr>
+      <td>PRODUCT_MODEL</td>
+      <td>最终产品的最终用户可见名称</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>PRODUCT_NAME</td>
+      <td>总体产品的最终用户可见名称,将显示在“设置”&gt;“关于”屏幕中。
+      </td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>PRODUCT_OTA_PUBLIC_KEYS</td>
+      <td>产品的无线下载 (OTA) 公钥列表</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>PRODUCT_PACKAGES</td>
+      <td>列出要安装的 APK 和模块。
+      </td>
+      <td>
+        <code>Calendar Contacts</code>
+      </td>
+    </tr>
+    <tr>
+      <td>PRODUCT_PACKAGE_OVERLAYS</td>
+      <td>指明是使用默认资源还是添加任何产品特定叠加层</td>
+      <td>
+        <code>vendor/acme/overlay</code>
+      </td>
+    </tr>
+    <tr>
+      <td>PRODUCT_PROPERTY_OVERRIDES</td>
+      <td>系统属性分配(采用“key=value”格式)列表</td>
+      <td></td>
+    </tr>
+  </tbody>
+</table>
+
+<h3 id="ANDROID_VENDOR_KEYS">设置 ANDROID_VENDOR_KEYS 以通过 USB 进行连接</h3>
+
+<p>借助 <code>ANDROID_VENDOR_KEYS</code> 环境变量,设备制造商可以通过 <code>adb</code> 访问正式版。为每个版本生成每台设备都可以接受的密钥并将其存储在内部(如存储在 <code>vendor/oem-name/security/adb/</code>),然后通过 <code>ANDROID_VENDOR_KEYS</code> 让 <code>adb</code> 使用这些规范密钥,而不是随机密钥。</p>
+
+<p>使用 <code>ANDROID_VENDOR_KEYS</code> 环境变量指向生成的加密用 <code>adb</code> 公钥和私钥所在的目录。私钥存储在文件中。公钥存储在 file.pub 中。<code>ANDROID_VENDOR_KEYS</code> 环境变量指向存储生成的密钥对的文件或目录。</p>
+
+<p>该变量被设为一个文件或目录,其中包含使用 <code>adb keygen</code> 文件命令生成的 2048 位 RSA 身份验证密钥对。
+这些密钥对是对 ADB 服务器生成的 RSA 密钥对的补充。首次使用 <code>adb</code> 通过 USB 进行连接时,需要使用 RSA 密钥对。</p>
+
+<p>您必须接受主机的 RSA 密钥,才能显式授予 <code>adb</code> 对设备的访问权限。默认情况下,ADB 服务器生成的密钥对以 <code>adbkey</code>(私钥)和 <code>adbkey.pub</code>(公钥)的形式存储在以下密钥存储库目录中:</p>
+
+<p>在 MacOS 上,文件位置可能为:<code>$HOME/.android</code>。在 Windows 和 Linux 上,文件位置为:<code>%USERPOFILE%\.android</code>。在 Windows 上,RSA 身份验证密钥在某些情况下也可能存储在 <code>C:\Windows\System32\config\systemprofile\.android</code> 中。当 ADB 服务器需要密钥时,它会先搜索 ADB 服务器密钥存储库目录。如果找不到任何密钥,它会接着检查 <code>ANDROID_VENDOR_KEYS</code> 环境变量。如果还是找不到任何密钥,本地 ADB 服务器会生成一个新密钥对,并将其保存在 ADB 服务器密钥存储库目录中。</p>
+
+<p class="note"><strong>注意</strong>:您可以通过设置 <code>ANDROID_SDK_HOME</code> 环境变量来替换 ADB 服务器存储 RSA 密钥的默认目录。在设备上,密钥存储在 <code>/data/misc/adb/adb_keys/</code> 文件中,新的经过授权的密钥会在您接受它们后附加到同一个文件中。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/brands.html b/zh-cn/setup/brands.html
new file mode 100644
index 0000000..9f1c248
--- /dev/null
+++ b/zh-cn/setup/brands.html
@@ -0,0 +1,104 @@
+<html devsite><head>
+    <title>品牌指南</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>“Android”名称、<img src="/setup/assets/images/sac_logo.png" alt="Android" style="margin:0;padding:0 2px;vertical-align:baseline"/> 徽标、“Google Play”品牌以及其他商标均为 Google Inc. 的资产,不是通过 Android 开源项目提供的资源的一部分。</p>
+
+<p>如果您希望使用这些品牌,以表明它们与您的设备之间存在关联,请遵循本页中的准则。这些准则与 <a href="https://developer.android.com/distribute/tools/promote/brand.html">Android 应用开发者品牌指南</a>和 <a href="https://www.google.com/permissions/">Google 品牌权限</a>是相辅相成的关系。</p>
+
+<h2 id="brand-android">Android</h2>
+
+<p>以下是关于 Android 品牌和相关资产的制造商使用准则。</p>
+
+<h3 id="text-android" style="clear:right">在文本中使用 Android</h3>
+<ul>
+  <li>Android™ 首次出现在创意素材中时应标注商标符号。</li>
+  <li>“Android”应始终采用首字母大写形式,且一律不得使用复数或所有格形式。
+  </li>
+  <li>若要在设备的硬件、包装或营销材料中使用“Android”,则只有<a href="/compatibility/index.html">与 Android 兼容</a>的设备才能这样做。</li>
+  <li>不得在产品名称中使用“Android”,也不得将其用作包装或设备上的主要或明显的标记。</li>
+  <li>“Android”一词只能用于指明您设备的操作系统。如果您不确定自己的用法是否符合我们的使用准则,请通过以下简单的测试来加以验证:如果您可以将“Android”替换为“Android 平台”且文本内容仍然有意义,那么您可以使用“Android”一词。
+  <ul>
+    <li><span style="color:red">不正确</span>:“Android XBrand 手机”</li>
+    <li><span style="color:green">正确</span>:“采用 Android 的 XBrand 手机”</li>
+  </ul>
+  </li>
+  <li>您可以将“with Android”(搭载 Android)(以纯黑色文本显示)与您的徽标一起使用。如果与您的徽标一起使用,则“with Android”(搭载 Android)不应超过徽标大小的 90%。首次或着重以这种形式使用时,后面应标注 ™ 符号。</li>
+  <li>只有后跟一个合适的通称时,Android 才可用作描述词。<em></em>不得将“Android”用作您设备的产品名称或品牌的一部分。
+  <ul>
+    <li><span style="color:red">不正确</span>:“Android XBrand 手机”</li>
+    <li><span style="color:green">正确</span>:“Android 移动设备”</li>
+  </ul>
+  <p><strong>无论在任何情况下使用 Android 名称,都必须在您的资料中包含以下归属信息</strong>:</p>
+  <blockquote><em>Android 是 Google Inc. 的商标。</em></blockquote><p></p>
+  </li>
+</ul>
+
+<h4>可接受的使用情形示例</h4>
+<img src="images/JB-TM-example.png" alt="Jelly Bean 商标示例"/>
+<img src="images/8100-TM-example.png" alt="8100 系列商标示例"/>
+
+<h4>不可接受的使用情形示例</h4>
+<img src="images/XBrand-TM-example.jpg" alt="XBrand 商标示例"/>
+
+<h3 id="logo-android">Android 徽标</h3>
+<p>除非经 Google 书面协议明确授权,否则任何人都不得使用 Android 徽标及其专用字体(无论是否包含 Android 机器人)。</p>
+<img alt="无徽标" src="images/android_logo_new_crossed_out.png"/>
+<img alt="无徽标" src="https://developer.android.com/images/brand/android_logo_no.png"/>
+
+<h3 id="robot-android">Android 机器人</h3>
+
+<div class="wrap">
+<div class="col-4">
+  <img alt="android-robot" style="float:left;margin-right:10px" src="/setup/images/Android_Robot_100.png"/>
+  <p style="padding-top:20px">
+  <a href="https://developer.android.com/images/brand/Android_Robot_100.png">100x118</a><br />
+  <a href="https://developer.android.com/images/brand/Android_Robot_200.png">200x237</a><br />
+  <a href="https://developer.android.com/downloads/brand/Android_Robot_outlined.ai">Illustrator</a>
+  </p>
+</div>
+<div class="col-8">
+<p style="padding-top:20px">在注明适当归属信息的情况下,您可以在营销资料中自由使用、重制和修改 Android 机器人。如需了解详情,请参阅<a href="https://developer.android.com/distribute/tools/promote/brand.html">应用开发者品牌指南</a>和 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons 许可</a>。</p>
+</div>
+</div>
+
+<div class="wrap" style="padding-top:20px">
+<div class="col-4" style="align:center">
+<img alt="no-peace-robot" style="width:30%;height:30%" src="images/No_PeaceBot_200.jpg"/>
+</div>
+<div class="col-8">
+<p style="padding-top:20px">合作伙伴的营销材料中不得使用 Android Peace 机器人或其任何变体形式(例如带 Peace 标记的 Android 机器人)。</p>
+</div>
+</div>
+
+<div style="clear:both"></div>
+<h2 id="brand-google_play">Google Play</h2>
+
+<p>设备只有在<a href="/setup/faqs.html#if-my-device-is-compatible-does-it-automatically-have-access-to-google-play-and-branding">获得使用 Google Play 的许可</a>的情况下,才能在硬件包装、硬件的营销材料或硬件本身上使用“Google Play”名称和 Google Play 商店图标。如需查看获得使用 Google Play 的许可的设备列表,请参阅<a href="https://support.google.com/googleplay/answer/1727131">支持的设备</a>。</p>
+
+<h2>其他品牌</h2>
+<p><a href="https://www.android.com/auto/">Android Auto</a>、<a href="https://www.android.com/tv/">Android TV</a> 和 <a href="https://www.android.com/wear/">Android Wear</a> 是归 Google 所有的品牌。这些品牌要求使用 Google 专有软件,此类软件在 Android 平台上运行且只能在获得 Google 授予的许可后使用。要了解如何申请许可,请参阅<a href="/compatibility/contact-us.html">与我们联系</a>。
+
+</p><h2 id="Questions">问题</h2>
+
+<p>如需了解更多品牌使用信息,请通过提交<a href="https://support.google.com/googleplay/contact/brand_developer">合作伙伴品牌咨询表单</a>与 Android 合作伙伴营销团队联系。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/build-numbers.html b/zh-cn/setup/build-numbers.html
new file mode 100644
index 0000000..4235363
--- /dev/null
+++ b/zh-cn/setup/build-numbers.html
@@ -0,0 +1,2246 @@
+<html devsite><head>
+    <title>代号、标记和细分版本号</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>简要来说,Android 的开发是围绕着版本系列进行的,这些版本使用美味的点心名字(按字母顺序)作为代号。</p>
+
+<h2 id="platform-code-names-versions-api-levels-and-ndk-releases">平台代号、版本、API 级别和 NDK 版本</h2>
+<p>为方便起见,代号与以下版本号、API 级别和 NDK 版本相对应:</p>
+<table>
+<thead>
+<tr>
+<th>代号</th>
+<th>版本</th>
+<th>API 级别</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>Oreo</td>
+<td>8.0.0</td>
+<td>API 级别 26</td>
+</tr>
+<tr>
+<td>Nougat</td>
+<td>7.1</td>
+<td>API 级别 25</td>
+</tr>
+<tr>
+<td>Nougat</td>
+<td>7.0</td>
+<td>API 级别 24</td>
+</tr>
+<tr>
+<td>Marshmallow</td>
+<td>6.0</td>
+<td>API 级别 23</td>
+</tr>
+<tr>
+<td>Lollipop</td>
+<td>5.1</td>
+<td>API 级别 22</td>
+</tr>
+<tr>
+<td>Lollipop</td>
+<td>5.0</td>
+<td>API 级别 21</td>
+</tr>
+<tr>
+<td>KitKat</td>
+<td>4.4-4.4.4</td>
+<td>API 级别 19</td>
+</tr>
+<tr>
+<td>Jelly Bean</td>
+<td>4.3.x</td>
+<td>API 级别 18</td>
+</tr>
+<tr>
+<td>Jelly Bean</td>
+<td>4.2.x</td>
+<td>API 级别 17</td>
+</tr>
+<tr>
+<td>Jelly Bean</td>
+<td>4.1.x</td>
+<td>API 级别 16</td>
+</tr>
+<tr>
+<td>Ice Cream Sandwich</td>
+<td>4.0.3-4.0.4</td>
+<td>API 级别 15,NDK 8</td>
+</tr>
+<tr>
+<td>Ice Cream Sandwich</td>
+<td>4.0.1-4.0.2</td>
+<td>API 级别 14,NDK 7</td>
+</tr>
+<tr>
+<td>Honeycomb</td>
+<td>3.2.x</td>
+<td>API 级别 13</td>
+</tr>
+<tr>
+<td>Honeycomb</td>
+<td>3.1</td>
+<td>API 级别 12,NDK 6</td>
+</tr>
+<tr>
+<td>Honeycomb</td>
+<td>3.0</td>
+<td>API 级别 11</td>
+</tr>
+<tr>
+<td>Gingerbread</td>
+<td>2.3.3-2.3.7</td>
+<td>API 级别 10</td>
+</tr>
+<tr>
+<td>Gingerbread</td>
+<td>2.3-2.3.2</td>
+<td>API 级别 9,NDK 5</td>
+</tr>
+<tr>
+<td>Froyo</td>
+<td>2.2.x</td>
+<td>API 级别 8,NDK 4</td>
+</tr>
+<tr>
+<td>Eclair</td>
+<td>2.1</td>
+<td>API 级别 7,NDK 3</td>
+</tr>
+<tr>
+<td>Eclair</td>
+<td>2.0.1</td>
+<td>API 级别 6</td>
+</tr>
+<tr>
+<td>Eclair</td>
+<td>2.0</td>
+<td>API 级别 5</td>
+</tr>
+<tr>
+<td>Donut</td>
+<td>1.6</td>
+<td>API 级别 4,NDK 2</td>
+</tr>
+<tr>
+<td>Cupcake</td>
+<td>1.5</td>
+<td>API 级别 3,NDK 1</td>
+</tr>
+<tr>
+<td>(无代号)</td>
+<td>1.1</td>
+<td>API 级别 2</td>
+</tr>
+<tr>
+<td>(无代号)</td>
+<td>1.0</td>
+<td>API 级别 1</td>
+</tr>
+</tbody>
+</table>
+<p>从 Oreo 开始,每个细分版本均采用新的细分版本号格式,即 PVBB.YYMMDD.bbb。</p>
+<p>P 部分表示平台版本代号的第一个字母,例如 O 表示 Oreo。</p>
+<p>V 部分表示支持的行业。按照惯例,“P”表示主要平台分支。</p>
+<p>BB 部分表示由字母和数字组成的代码,Google 可通过该代码识别相应细分版本所属的确切代码分支。</p>
+<p>YYMMDD 部分表示相应版本从开发分支细分出来或与开发分支同步的日期。它并不一定是细分版本的确切构建日期,Google 常常会在现有细分版本中增加细微的更改,并在新细分版本中重复使用与现有细分版本相同的日期代码。</p>
+<p>bbb 部分表示具有相同日期代码的不同版本,从 001 开始。</p>
+<p>从 Cupcake 到 Nougat 的较早 Android 版本所用的细分版本号格式有所不同。这些 Android 细分版本均有一个简短的细分版本代码,以作区分,例如 FRF85B。
+</p>
+<p>第一个字母代表相应版本系列的代号,例如 F 表示 Froyo。</p>
+<p>第二个字母是分支代码,Google 用它来表示细分版本所属的确切代号分支。按照惯例,R 表示主要版本分支。</p>
+<p>接下来的字母和两个数字是日期代码。字母表示季度,其中 A 表示 2009 年第 1 季度。因此,F 表示 2010 年第 2 季度。两个数字表示相应季度内的第某天,因此 F85 表示 2010 年 6 月 24 日。</p>
+<p>最后,末尾字母表示具有相同日期代码的不同版本,从 A 开始;但 A 实际上并不会显示,通常会为了简洁而省略。</p>
+<p>日期代码并不一定是某个细分版本的确切构建日期,Google 常常会在现有细分版本中增加细微的更改,并在新细分版本中重复使用与现有细分版本相同的日期代码。</p>
+
+<h2 id="source-code-tags-and-builds">源代码标记和细分版本</h2>
+<p>下表完整列出了从 Donut 开始的细分版本和标记。您可以从 Android 开发者网站下载 Nexus 和 Pixel 设备的出厂映像、二进制文件以及完整的 OTA 映像:</p>
+<p><a href="https://developers.google.com/android/images">映像</a></p>
+<p><a href="https://developers.google.com/android/drivers">驱动程序</a></p>
+<p><a href="https://developers.google.com/android/ota">OTA</a></p>
+<table>
+  <thead>
+    <tr>
+      <th>细分版本</th>
+      <th>分支</th>
+      <th>版本</th>
+      <th>支持的设备</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td>OPD3.170816.023</td>
+      <td>android-8.0.0_r34</td>
+      <td>Oreo</td>
+      <td>Pixel 2 XL、Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPD1.170816.025</td>
+      <td>android-8.0.0_r33</td>
+      <td>Oreo</td>
+      <td>Pixel 2 XL、Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPR6.170623.023</td>
+      <td>android-8.0.0_r32</td>
+      <td>Oreo</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>OPR5.170623.011</td>
+      <td>android-8.0.0_r31</td>
+      <td>Oreo</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>OPR3.170623.013</td>
+      <td>android-8.0.0_r30</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>OPR2.170623.027</td>
+      <td>android-8.0.0_r29</td>
+      <td>Oreo</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>OPR1.170623.032</td>
+      <td>android-8.0.0_r28</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel、Pixel C</td>
+    </tr>
+    <tr>
+      <td>OPD3.170816.016</td>
+      <td>android-8.0.0_r27</td>
+      <td>Oreo</td>
+      <td>Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPD2.170816.015</td>
+      <td>android-8.0.0_r26</td>
+      <td>Oreo</td>
+      <td>Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPD1.170816.018</td>
+      <td>android-8.0.0_r25</td>
+      <td>Oreo</td>
+      <td>Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPD3.170816.012</td>
+      <td>android-8.0.0_r24</td>
+      <td>Oreo</td>
+      <td>Pixel 2 XL、Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPD1.170816.012</td>
+      <td>android-8.0.0_r23</td>
+      <td>Oreo</td>
+      <td>Pixel 2 XL、Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPD1.170816.011</td>
+      <td>android-8.0.0_r22</td>
+      <td>Oreo</td>
+      <td>Pixel 2 XL、Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPD1.170816.010</td>
+      <td>android-8.0.0_r21</td>
+      <td>Oreo</td>
+      <td>Pixel 2 XL、Pixel 2</td>
+    </tr>
+    <tr>
+      <td>OPR5.170623.007</td>
+      <td>android-8.0.0_r17</td>
+      <td>Oreo</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>OPR4.170623.009</td>
+      <td>android-8.0.0_r16</td>
+      <td>Oreo</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>OPR3.170623.008</td>
+      <td>android-8.0.0_r15</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>OPR1.170623.027</td>
+      <td>android-8.0.0_r13</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel、Pixel C</td>
+    </tr>
+    <tr>
+      <td>OPR6.170623.021</td>
+      <td>android-8.0.0_r12</td>
+      <td>Oreo</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>OPR6.170623.019</td>
+      <td>android-8.0.0_r11</td>
+      <td>Oreo</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>OPR4.170623.006</td>
+      <td>android-8.0.0_r10</td>
+      <td>Oreo</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>OPR3.170623.007</td>
+      <td>android-8.0.0_r9</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>OPR1.170623.026</td>
+      <td>android-8.0.0_r7</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel、Pixel C</td>
+    </tr>
+    <tr>
+      <td>OPR6.170623.013</td>
+      <td>android-8.0.0_r4</td>
+      <td>Oreo</td>
+      <td>Nexus 5X、Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>OPR6.170623.012</td>
+      <td>android-8.0.0_r3</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>OPR6.170623.011</td>
+      <td>android-8.0.0_r2</td>
+      <td>Oreo</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>OPR6.170623.010</td>
+      <td>android-8.0.0_r1</td>
+      <td>Oreo</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>NZH54D</td>
+      <td>android-7.1.2_r33</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NKG47S</td>
+      <td>android-7.1.2_r32</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NHG47Q</td>
+      <td>android-7.1.2_r30</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NJH47F</td>
+      <td>android-7.1.2_r29</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G48C</td>
+      <td>android-7.1.2_r28</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P、Nexus Player、Pixel C</td>
+    </tr>
+    <tr>
+      <td>NZH54B</td>
+      <td>android-7.1.2_r27</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+    </tr><tr>
+      <td>NKG47M</td>
+      <td>android-7.1.2_r25</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NJH47D</td>
+      <td>android-7.1.2_r24</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NHG47O</td>
+      <td>android-7.1.2_r23</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G48B</td>
+      <td>android-7.1.2_r19</td>
+      <td>Nougat</td>
+      <td>Nexus 6P、Nexus Player、Pixel C</td>
+    </tr>
+    <tr>
+      <td>N2G47Z</td>
+      <td>android-7.1.2_r18</td>
+      <td>Nougat</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>NJH47B</td>
+      <td>android-7.1.2_r17</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NJH34C</td>
+      <td>android-7.1.2_r16</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NKG47L</td>
+      <td>android-7.1.2_r15</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NHG47N</td>
+      <td>android-7.1.2_r14</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G47X</td>
+      <td>android-7.1.2_r13</td>
+      <td>Nougat</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>N2G47W</td>
+      <td>android-7.1.2_r12</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P、Pixel C</td>
+    </tr>
+    <tr>
+      <td>NHG47L</td>
+      <td>android-7.1.2_r11</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G47T</td>
+      <td>android-7.1.2_r10</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G47R</td>
+      <td>android-7.1.2_r9</td>
+      <td>Nougat</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>N2G47O</td>
+      <td>android-7.1.2_r8</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P、Pixel XL、Pixel、Pixel C</td>
+    </tr>
+    <tr>
+      <td>NHG47K</td>
+      <td>android-7.1.2_r6</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G47J</td>
+      <td>android-7.1.2_r5</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G47H</td>
+      <td>android-7.1.2_r4</td>
+      <td>Nougat</td>
+      <td>Nexus 6P、Nexus Player</td>
+    </tr>
+    <tr>
+      <td>N2G47F</td>
+      <td>android-7.1.2_r3</td>
+      <td>Nougat</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>N2G47E</td>
+      <td>android-7.1.2_r2</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N2G47D</td>
+      <td>android-7.1.2_r1</td>
+      <td>Nougat</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>N9F27M</td>
+      <td>android-7.1.1_r58</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis)</td>
+    </tr>
+    <tr>
+      <td>NGI77B</td>
+      <td>android-7.1.1_r57</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N6F27M</td>
+      <td>android-7.1.1_r55</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N4F27P</td>
+      <td>android-7.1.1_r54</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantisg)</td>
+    </tr>
+    <tr>
+      <td>N9F27L</td>
+      <td>android-7.1.1_r53</td>
+      <td>Nougat</td>
+      <td>Nexus 9</td>
+    </tr>
+    <tr>
+      <td>NGI55D</td>
+      <td>android-7.1.1_r52</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N4F27O</td>
+      <td>android-7.1.1_r51</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantisg)</td>
+    </tr>
+    <tr>
+      <td>N8I11B</td>
+      <td>android-7.1.1_r50</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N9F27H</td>
+      <td>android-7.1.1_r49</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis)</td>
+    </tr>
+    <tr>
+      <td>N6F27I</td>
+      <td>android-7.1.1_r48</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N4F27K</td>
+      <td>android-7.1.1_r47</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantisg)</td>
+    </tr>
+    <tr>
+      <td>N9F27F</td>
+      <td>android-7.1.1_r46</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis)</td>
+    </tr>
+    <tr>
+      <td>N6F27H</td>
+      <td>android-7.1.1_r45</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N4F27I</td>
+      <td>android-7.1.1_r44</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantisg)</td>
+    </tr>
+    <tr>
+      <td>N9F27C</td>
+      <td>android-7.1.1_r43</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis)</td>
+    </tr>
+    <tr>
+      <td>N6F27E</td>
+      <td>android-7.1.1_r42</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N4F27E</td>
+      <td>android-7.1.1_r41</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantisg)</td>
+    </tr>
+    <tr>
+      <td>N6F27C</td>
+      <td>android-7.1.1_r40</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N4F27B</td>
+      <td>android-7.1.1_r39</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis/volantisg)</td>
+    </tr>
+    <tr>
+      <td>N6F26Y</td>
+      <td>android-7.1.1_r38</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NOF27D</td>
+      <td>android-7.1.1_r35</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N4F26X</td>
+      <td>android-7.1.1_r33</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis/volantisg)</td>
+    </tr>
+    <tr>
+      <td>N4F26U</td>
+      <td>android-7.1.1_r31</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>N6F26U</td>
+      <td>android-7.1.1_r28</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NUF26N</td>
+      <td>android-7.1.1_r27</td>
+      <td>Nougat</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>NOF27C</td>
+      <td>android-7.1.1_r26</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NOF27B</td>
+      <td>android-7.1.1_r25</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N4F26T</td>
+      <td>android-7.1.1_r24</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P、Nexus 9 (volantis/volantisg)、Pixel C</td>
+    </tr>
+    <tr>
+      <td>NMF27D</td>
+      <td>android-7.1.1_r23</td>
+      <td>Nougat</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>NMF26X</td>
+      <td>android-7.1.1_r22</td>
+      <td>Nougat</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>NOF26W</td>
+      <td>android-7.1.1_r21</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NOF26V</td>
+      <td>android-7.1.1_r20</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>N6F26R</td>
+      <td>android-7.1.1_r17</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NUF26K</td>
+      <td>android-7.1.1_r16</td>
+      <td>Nougat</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>N4F26Q</td>
+      <td>android-7.1.1_r15</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis/volantisg)</td>
+    </tr>
+    <tr>
+      <td>N4F26O</td>
+      <td>android-7.1.1_r14</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P、Pixel C</td>
+    </tr>
+    <tr>
+      <td>N6F26Q</td>
+      <td>android-7.1.1_r13</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N4F26M</td>
+      <td>android-7.1.1_r12</td>
+      <td>Nougat</td>
+      <td>Nexus 9 (volantis)</td>
+    </tr>
+    <tr>
+      <td>N4F26J</td>
+      <td>android-7.1.1_r11</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>N4F26I</td>
+      <td>android-7.1.1_r10</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P、Pixel C</td>
+    </tr>
+    <tr>
+      <td>NMF26V</td>
+      <td>android-7.1.1_r9</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NMF26U</td>
+      <td>android-7.1.1_r8</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel </td>
+    </tr>
+    <tr>
+      <td>NMF26R</td>
+      <td>android-7.1.1_r7</td>
+      <td>Nougat</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>NMF26Q</td>
+      <td>android-7.1.1_r6</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NMF26O</td>
+      <td>android-7.1.1_r4</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NMF26J</td>
+      <td>android-7.1.1_r3</td>
+      <td>Nougat</td>
+      <td>Nexus Player</td>
+    </tr>
+    <tr>
+      <td>NMF26H</td>
+      <td>android-7.1.1_r2</td>
+      <td>Nougat</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>NMF26F</td>
+      <td>android-7.1.1_r1</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 6P、Nexus 9 (volantis/volantisg)</td>
+    </tr>
+    <tr>
+      <td>NDE63X</td>
+      <td>android-7.1.0_r7</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NDE63V</td>
+      <td>android-7.1.0_r6</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NDE63U</td>
+      <td>android-7.1.0_r5</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NDE63P</td>
+      <td>android-7.1.0_r4</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NDE63L</td>
+      <td>android-7.1.0_r2</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NDE63H</td>
+      <td>android-7.1.0_r1</td>
+      <td>Nougat</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
+      <td>NBD92N</td>
+      <td>android-7.0.0_r34</td>
+      <td>Nougat</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>NBD92G</td>
+      <td>android-7.0.0_r33</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD92F</td>
+      <td>android-7.0.0_r32</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD92E</td>
+      <td>android-7.0.0_r31</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD92D</td>
+      <td>android-7.0.0_r30</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD91Z</td>
+      <td>android-7.0.0_r29</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD91Y</td>
+      <td>android-7.0.0_r28</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD91X</td>
+      <td>android-7.0.0_r27</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD91U</td>
+      <td>android-7.0.0_r24</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>N5D91L</td>
+      <td>android-7.0.0_r21</td>
+      <td>Nougat</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>NBD91P</td>
+      <td>android-7.0.0_r19</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NRD91K</td>
+      <td>android-7.0.0_r17</td>
+      <td>Nougat</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>NRD91N</td>
+      <td>android-7.0.0_r15</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Pixel C、Nexus Player、Nexus 9 (volantis/volantisg)</td>
+    </tr>
+    <tr>
+      <td>NBD90Z</td>
+      <td>android-7.0.0_r14</td>
+      <td>Nougat</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>NBD90X</td>
+      <td>android-7.0.0_r13</td>
+      <td>Nougat</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>NBD90W</td>
+      <td>android-7.0.0_r12</td>
+      <td>Nougat</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>NRD91D</td>
+      <td>android-7.0.0_r7</td>
+      <td>Nougat</td>
+      <td>Pixel C、Nexus Player、Nexus 9 (WLAN)</td>
+    </tr>
+    <tr>
+      <td>NRD90U</td>
+      <td>android-7.0.0_r6</td>
+      <td>Nougat</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>NRD90T</td>
+      <td>android-7.0.0_r5</td>
+      <td>Nougat</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>NRD90S</td>
+      <td>android-7.0.0_r4</td>
+      <td>Nougat</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>NRD90R</td>
+      <td>android-7.0.0_r3</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 9 (volantis)、Nexus Player、Pixel C</td>
+    </tr>
+    <tr>
+      <td>NRD90M</td>
+      <td>android-7.0.0_r1</td>
+      <td>Nougat</td>
+      <td>Nexus 5X、Nexus 9 (volantis)、Nexus Player、Pixel C</td>
+    </tr>
+    <tr>
+      <td>MOI10E</td>
+      <td>android-6.0.1_r81</td>
+      <td>Marshmallow</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>MOB31Z</td>
+      <td>android-6.0.1_r80</td>
+      <td>Marshmallow</td>
+      <td></td>
+    </tr>
+    <tr>
+      <td>MOB31T</td>
+      <td>android-6.0.1_r79</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MOB31S</td>
+      <td>android-6.0.1_r78</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>M4B30Z</td>
+      <td>android-6.0.1_r77</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5</td>
+    </tr>
+    <tr>
+      <td>MOB31K</td>
+      <td>android-6.0.1_r74</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MMB31C</td>
+      <td>android-6.0.1_r73</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>M4B30X</td>
+      <td>android-6.0.1_r72</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5</td>
+    </tr>
+    <tr>
+      <td>MOB31H</td>
+      <td>android-6.0.1_r70</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MMB30Y</td>
+      <td>android-6.0.1_r69</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MTC20K</td>
+      <td>android-6.0.1_r67</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>MOB31E</td>
+      <td>android-6.0.1_r66</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5、Nexus 6、Nexus 9 (volantis)</td>
+    </tr>
+    <tr>
+      <td>MMB30W</td>
+      <td>android-6.0.1_r65</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MXC89L</td>
+      <td>android-6.0.1_r63</td>
+      <td>Marshmallow</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>MTC20F</td>
+      <td>android-6.0.1_r62</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5X、Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>MOB30Y</td>
+      <td>android-6.0.1_r60</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5</td>
+    </tr>
+    <tr>
+      <td>MOB30X</td>
+      <td>android-6.0.1_r59</td>
+      <td>Marshmallow</td>
+      <td>Nexus 7 (flo/deb)</td>
+    </tr>
+    <tr>
+      <td>MOB30W</td>
+      <td>android-6.0.1_r58</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+    </tr>
+    <tr>
+      <td>MMB30S</td>
+      <td>android-6.0.1_r57</td>
+      <td>Marshmallow</td>
+      <td>Nexus 7 (deb)</td>
+    </tr>
+    <tr>
+      <td>MMB30R</td>
+      <td>android-6.0.1_r56</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MXC89K</td>
+      <td>android-6.0.1_r55</td>
+      <td>Marshmallow</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>MTC19Z</td>
+      <td>android-6.0.1_r54</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5X</td>
+    </tr>
+    <tr>
+      <td>MTC19X</td>
+      <td>android-6.0.1_r53</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>MOB30P</td>
+      <td>android-6.0.1_r50</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+    </tr>
+    <tr>
+      <td>MOB30O</td>
+      <td>android-6.0.1_r49</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MMB30M</td>
+      <td>android-6.0.1_r48</td>
+      <td>Marshmallow</td>
+      <td>Nexus 7 (deb)</td>
+    </tr>
+    <tr>
+      <td>MMB30K</td>
+      <td>android-6.0.1_r47</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MOB30M</td>
+      <td>android-6.0.1_r46</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+    </tr>
+    <tr>
+      <td>MTC19V</td>
+      <td>android-6.0.1_r45</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5X、Nexus 6P</td>
+    </tr>
+    <tr>
+      <td>MOB30J</td>
+      <td>android-6.0.1_r43</td>
+      <td>Marshmallow</td>
+      <td>Nexus 7 (flo/deb)</td>
+    </tr>
+    <tr>
+      <td>MOB30I</td>
+      <td>android-6.0.1_r42</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6</td>
+    </tr>
+    <tr>
+      <td>MOB30H</td>
+      <td>android-6.0.1_r41</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5</td>
+    </tr>
+    <tr>
+      <td>MOB30G</td>
+      <td>android-6.0.1_r40</td>
+      <td>Marshmallow</td>
+      <td>Nexus 9 (volantis/volantisg)、Nexus Player</td>
+    </tr>
+    <tr>
+      <td>MXC89H</td>
+      <td>android-6.0.1_r33</td>
+      <td>Marshmallow</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>MXC89F</td>
+      <td>android-6.0.1_r32</td>
+      <td>Marshmallow</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>MMB30J</td>
+      <td>android-6.0.1_r28</td>
+      <td>Marshmallow</td>
+      <td>Nexus 6、Nexus 7 (deb)</td>
+    </tr>
+    <tr>
+      <td>MTC19T</td>
+      <td>android-6.0.1_r25</td>
+      <td>Marshmallow</td>
+      <td>Nexus 5X、Nexus 6P</td>
+    </tr>
+<tr>
+  <td>M5C14J</td>
+  <td>android-6.0.1_r31</td>
+  <td>Marshmallow</td>
+  <td>Pixel C</td>
+</tr>
+<tr>
+  <td>MOB30D</td>
+  <td>android-6.0.1_r30</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+</tr>
+<tr>
+  <td>MHC19Q</td>
+  <td>android-6.0.1_r24</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+  <td>MHC19J</td>
+  <td>android-6.0.1_r22</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5X</td>
+</tr>
+<tr>
+  <td>MHC19I</td>
+  <td>android-6.0.1_r21</td>
+  <td>Marshmallow</td>
+  <td>Nexus 6P</td>
+</tr>
+<tr>
+  <td>MMB29X</td>
+  <td>android-6.0.1_r20</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 6、Nexus 7 (deb)、Nexus 9 (volantisg)</td>
+</tr>
+<tr>
+  <td>MXC14G</td>
+  <td>android-6.0.1_r18</td>
+  <td>Marshmallow</td>
+  <td>Pixel C</td>
+</tr>
+<tr>
+  <td>MMB29V</td>
+  <td>android-6.0.1_r17</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 5X、Nexus 6、Nexus 6P、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+  <td>MXB48T</td>
+  <td>android-6.0.1_r16</td>
+  <td>Marshmallow</td>
+  <td>Pixel C</td>
+</tr>
+<tr>
+  <td>MMB29U</td>
+  <td>android-6.0.1_r13</td>
+  <td>Marshmallow</td>
+  <td>Nexus Player</td>
+</tr>
+<tr>
+  <td>MMB29R</td>
+  <td>android-6.0.1_r12</td>
+  <td>Marshmallow</td>
+  <td>Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+  <td>MMB29Q</td>
+  <td>android-6.0.1_r11</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 5X、Nexus 6、Nexus 6P、Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+  <td>MMB29T</td>
+  <td>android-6.0.1_r10</td>
+  <td>Marshmallow</td>
+  <td>Nexus Player</td>
+</tr>
+<tr>
+  <td>MMB29S</td>
+  <td>android-6.0.1_r9</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 6、Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+  <td>MMB29P</td>
+  <td>android-6.0.1_r8</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+  <td>MMB29O</td>
+  <td>android-6.0.1_r7</td>
+  <td>Marshmallow</td>
+  <td>Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+  <td>MXB48K</td>
+  <td>android-6.0.1_r5</td>
+  <td>Marshmallow</td>
+  <td>Pixel C</td>
+</tr>
+<tr>
+  <td>MXB48J</td>
+  <td>android-6.0.1_r4</td>
+  <td>Marshmallow</td>
+  <td>Pixel C</td>
+</tr>
+<tr>
+  <td>MMB29M</td>
+  <td>android-6.0.1_r3</td>
+  <td>Marshmallow</td>
+  <td>Nexus 6P、Nexus Player</td>
+</tr>
+<tr>
+  <td>MMB29K</td>
+  <td>android-6.0.1_r1</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 5X、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+  <td>MMB29N</td>
+  <td>android-6.0.0_r41</td>
+  <td>Marshmallow</td>
+  <td>Nexus 6P</td>
+</tr>
+<tr>
+  <td>MDB08M</td>
+  <td>android-6.0.0_r26</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+  <td>MDB08L</td>
+  <td>android-6.0.0_r25</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5X、Nexus 6P</td>
+</tr>
+<tr>
+  <td>MDB08K</td>
+  <td>android-6.0.0_r24</td>
+  <td>Marshmallow</td>
+  <td>Nexus 6P</td>
+</tr>
+<tr>
+  <td>MDB08I</td>
+  <td>android-6.0.0_r23</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5X</td>
+</tr>
+<tr>
+  <td>MDA89E</td>
+  <td>android-6.0.0_r12</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5X</td>
+</tr>
+<tr>
+  <td>MDA89D</td>
+  <td>android-6.0.0_r11</td>
+  <td>Marshmallow</td>
+  <td>Nexus 6P</td>
+</tr>
+<tr>
+  <td>MRA59B</td>
+  <td>android-6.0.0_r7</td>
+  <td>Marshmallow</td>
+  <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+  <td>MRA58X</td>
+  <td>android-6.0.0_r6</td>
+  <td>Marshmallow</td>
+  <td>Nexus 6</td>
+</tr>
+<tr>
+  <td>MRA58V</td>
+  <td>android-6.0.0_r5</td>
+  <td>Marshmallow</td>
+  <td>Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+  <td>MRA58U</td>
+  <td>android-6.0.0_r4</td>
+  <td>Marshmallow</td>
+  <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+  <td>MRA58N</td>
+  <td>android-6.0.0_r2</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+</tr>
+<tr>
+  <td>MRA58K</td>
+  <td>android-6.0.0_r1</td>
+  <td>Marshmallow</td>
+  <td>Nexus 5、Nexus 6、Nexus 7 (flo/deb)、Nexus 9 (volantis/volantisg)、Nexus Player</td>
+</tr>
+<tr>
+  <td>LMY49M</td>
+  <td>android-5.1.1_r38</td>
+  <td>Lollipop</td>
+  <td>Nexus 10</td>
+</tr>
+<tr>
+  <td>LMY49J</td>
+  <td>android-5.1.1_r37</td>
+  <td>Lollipop</td>
+  <td>Nexus 10</td>
+</tr>
+<tr>
+  <td>LMY49I</td>
+  <td>android-5.1.1_r36</td>
+  <td>Lollipop</td>
+  <td>Nexus 10</td>
+</tr>
+<tr>
+  <td>LMY49H</td>
+  <td>android-5.1.1_r35</td>
+  <td>Lollipop</td>
+  <td>Nexus 10</td>
+</tr>
+<tr>
+  <td>LMY49G</td>
+  <td>android-5.1.1_r34</td>
+  <td>Lollipop</td>
+  <td>Nexus 10</td>
+</tr>
+<tr>
+  <td>LMY49F</td>
+  <td>android-5.1.1_r33</td>
+  <td>Lollipop</td>
+  <td>Nexus 9 (volantisg)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LMY48Z</td>
+  <td>android-5.1.1_r30</td>
+  <td>Lollipop</td>
+  <td>Nexus 6、Nexus 7 (deb)、Nexus 9 (volantisg)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LYZ28N</td>
+  <td>android-5.1.1_r28</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+  <td>LMY48Y</td>
+  <td>android-5.1.1_r26</td>
+  <td>Lollipop</td>
+  <td>Nexus 6</td>
+</tr>
+<tr>
+  <td>LMY48X</td>
+  <td>android-5.1.1_r25</td>
+  <td>Lollipop</td>
+  <td>Nexus 6、Nexus 7 (deb)、Nexus 9 (volantisg)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LMY48W</td>
+  <td>android-5.1.1_r24</td>
+  <td>Lollipop</td>
+  <td>Nexus 6</td>
+</tr>
+<tr>
+  <td>LVY48H</td>
+  <td>android-5.1.1_r23</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+  <td>LYZ28M</td>
+  <td>android-5.1.1_r22</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+  <td>LMY48U</td>
+  <td>android-5.1.1_r20</td>
+  <td>Lollipop</td>
+  <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+  <td>LMY48T</td>
+  <td>android-5.1.1_r19</td>
+  <td>Lollipop</td>
+  <td>Nexus 4、Nexus 6、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LVY48F</td>
+  <td>android-5.1.1_r18</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+  <td>LYZ28K</td>
+  <td>android-5.1.1_r17</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+  <td>LMY48P</td>
+  <td>android-5.1.1_r16</td>
+  <td>Lollipop</td>
+  <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+  <td>LMY48N</td>
+  <td>android-5.1.1_r15</td>
+  <td>Lollipop</td>
+  <td>Nexus Player</td>
+</tr>
+<tr>
+  <td>LMY48M</td>
+  <td>android-5.1.1_r14</td>
+  <td>Lollipop</td>
+  <td>Nexus 4、Nexus 5、Nexus 6、Nexus 7 (flo)、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LVY48E</td>
+  <td>android-5.1.1_r13</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+  <td>LYZ28J</td>
+  <td>android-5.1.1_r12</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+  <td>LMY48J</td>
+  <td>android-5.1.1_r10</td>
+  <td>Lollipop</td>
+  <td>Nexus Player</td>
+</tr>
+<tr>
+  <td>LMY48I</td>
+  <td>android-5.1.1_r9</td>
+  <td>Lollipop</td>
+  <td>Nexus 4、Nexus 5、Nexus 6、Nexus 7 (flo)、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LVY48C</td>
+  <td>android-5.1.1_r8</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 Project Fi)</td>
+</tr>
+<tr>
+  <td>LMY48G</td>
+  <td>android-5.1.1_r6</td>
+  <td>Lollipop</td>
+  <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+  <td>LYZ28E</td>
+  <td>android-5.1.1_r5</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+  <td>LMY47Z</td>
+  <td>android-5.1.1_r4</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(面向除 T-Mobile(美国)之外的所有运营商)</td>
+</tr>
+<tr>
+  <td>LMY48B</td>
+  <td>android-5.1.1_r3</td>
+  <td>Lollipop</td>
+  <td>Nexus 5</td>
+</tr>
+<tr>
+  <td>LMY47X</td>
+  <td>android-5.1.1_r2</td>
+  <td>Lollipop</td>
+  <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+  <td>LMY47V</td>
+  <td>android-5.1.1_r1</td>
+  <td>Lollipop</td>
+  <td>Nexus 7 (flo/grouper)、Nexus 10、Nexus Player</td>
+</tr>
+<tr>
+  <td>LMY47O</td>
+  <td>android-5.1.0_r5</td>
+  <td>Lollipop</td>
+  <td>Nexus 4、Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+  <td>LMY47M</td>
+  <td>android-5.1.0_r4</td>
+  <td>Lollipop</td>
+  <td>Nexus 6(仅面向 T-Mobile)</td>
+</tr>
+<tr>
+  <td>LMY47I</td>
+  <td>android-5.1.0_r3</td>
+  <td>Lollipop</td>
+  <td>Nexus 5、Nexus 6</td>
+</tr>
+<tr>
+  <td>LMY47E</td>
+  <td>android-5.1.0_r2</td>
+  <td>Lollipop</td>
+  <td>Nexus 6</td>
+</tr>
+<tr>
+  <td>LMY47D</td>
+  <td>android-5.1.0_r1</td>
+  <td>Lollipop</td>
+  <td>Nexus 5、Nexus 6、Nexus 7 (grouper/tilapia)、Nexus 10、Nexus Player</td>
+</tr>
+<tr>
+  <td>LRX22L</td>
+  <td>android-5.0.2_r3</td>
+  <td>Lollipop</td>
+  <td>Nexus 9 (volantis/volantisg)</td>
+</tr>
+<tr>
+  <td>LRX22G</td>
+  <td>android-5.0.2_r1</td>
+  <td>Lollipop</td>
+  <td>Nexus 7 (flo/deb/grouper/tilapia)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LRX22C</td>
+  <td>android-5.0.1_r1</td>
+  <td>Lollipop</td>
+  <td>Nexus 4、Nexus 5、Nexus 6 (shamu)、Nexus 7 (flo)、Nexus 9 (volantis/volantisg)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LRX21V</td>
+  <td>android-5.0.0_r7.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus Player (fugu)</td>
+</tr>
+<tr>
+  <td>LRX21T</td>
+  <td>android-5.0.0_r6.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus 4</td>
+</tr>
+<tr>
+  <td>LRX21R</td>
+  <td>android-5.0.0_r5.1.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+  <td>LRX21Q</td>
+  <td>android-5.0.0_r5.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+  <td>LRX21P</td>
+  <td>android-5.0.0_r4.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus 7 (flo/grouper)、Nexus 10</td>
+</tr>
+<tr>
+  <td>LRX21O</td>
+  <td>android-5.0.0_r3.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus 5 (hammerhead)、Nexus 6 (shamu)</td>
+</tr>
+<tr>
+  <td>LRX21M</td>
+  <td>android-5.0.0_r2.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus Player (fugu)</td>
+</tr>
+<tr>
+  <td>LRX21L</td>
+  <td>android-5.0.0_r1.0.1</td>
+  <td>Lollipop</td>
+  <td>Nexus 9 (volantis)</td>
+</tr>
+<tr>
+  <td>KTU84Q</td>
+  <td>android-4.4.4_r2</td>
+  <td>KitKat</td>
+  <td>Nexus 5 (hammerhead)(仅面向新西兰的 2Degrees、澳大利亚的 Telstra 和印度)</td>
+</tr>
+<tr>
+  <td>KTU84P</td>
+  <td>android-4.4.4_r1</td>
+  <td>KitKat</td>
+  <td>Nexus 5、Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>KTU84M</td>
+  <td>android-4.4.3_r1.1</td>
+  <td>KitKat</td>
+  <td>Nexus 5 (hammerhead)</td>
+</tr>
+<tr>
+  <td>KTU84L</td>
+  <td>android-4.4.3_r1</td>
+  <td>KitKat</td>
+  <td>Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 1</td>
+</tr>
+<tr>
+  <td>KVT49L</td>
+  <td>android-4.4.2_r2</td>
+  <td>KitKat</td>
+  <td>Nexus 7 (deb Verizon)</td>
+</tr>
+<tr>
+  <td>KOT49H</td>
+  <td>android-4.4.2_r1</td>
+  <td>KitKat</td>
+  <td>Nexus 5、Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>KOT49E</td>
+  <td>android-4.4.1_r1</td>
+  <td>KitKat</td>
+  <td>Nexus 5、Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>KRT16S</td>
+  <td>android-4.4_r1.2</td>
+  <td>KitKat</td>
+  <td>Nexus 7 (flo/deb/grouper/tilapia)、Nexus 4、Nexus 1</td>
+</tr>
+<tr>
+  <td>KRT16M</td>
+  <td>android-4.4_r1</td>
+  <td>KitKat</td>
+  <td>Nexus 5 (hammerhead)</td>
+</tr>
+<tr>
+  <td>JLS36I</td>
+  <td>android-4.3.1_r1</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+  <td>JLS36C</td>
+  <td>android-4.3_r3</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+  <td>JSS15R</td>
+  <td>android-4.3_r2.3</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+  <td>JSS15Q</td>
+  <td>android-4.3_r2.2</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7 (flo)</td>
+</tr>
+<tr>
+  <td>JSS15J</td>
+  <td>android-4.3_r2.1</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7 (flo/deb)</td>
+</tr>
+<tr>
+  <td>JSR78D</td>
+  <td>android-4.3_r2</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7 (deb)</td>
+</tr>
+<tr>
+  <td>JWR66Y</td>
+  <td>android-4.3_r1.1</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus、Nexus 7 (grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>JWR66V</td>
+  <td>android-4.3_r1</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus、Nexus 7 (grouper/tilapia)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>JWR66N</td>
+  <td>android-4.3_r0.9.1</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus、Nexus 7 (grouper/tilapia/flo)、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>JWR66L</td>
+  <td>android-4.3_r0.9</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7</td>
+</tr>
+<tr>
+  <td>JDQ39E</td>
+  <td>android-4.2.2_r1.2</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 4</td>
+</tr>
+<tr>
+  <td>JDQ39B</td>
+  <td>android-4.2.2_r1.1</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7</td>
+</tr>
+<tr>
+  <td>JDQ39</td>
+  <td>android-4.2.2_r1</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus、Nexus 7、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>JOP40G</td>
+  <td>android-4.2.1_r1.2</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 4</td>
+</tr>
+<tr>
+  <td>JOP40F</td>
+  <td>android-4.2.1_r1.1</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 10</td>
+</tr>
+<tr>
+  <td>JOP40D</td>
+  <td>android-4.2.1_r1</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus、Nexus 7、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>JOP40C</td>
+  <td>android-4.2_r1</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus、Nexus 7、Nexus 4、Nexus 10</td>
+</tr>
+<tr>
+  <td>JZO54M</td>
+  <td>android-4.1.2_r2.1</td>
+  <td>Jelly Bean</td>
+  <td></td>
+</tr>
+<tr>
+  <td>JZO54L</td>
+  <td>android-4.1.2_r2</td>
+  <td>Jelly Bean</td>
+  <td></td>
+</tr>
+<tr>
+  <td>JZO54K</td>
+  <td>android-4.1.2_r1</td>
+  <td>Jelly Bean</td>
+  <td>Nexus S、Galaxy Nexus、Nexus 7</td>
+</tr>
+<tr>
+  <td>JRO03S</td>
+  <td>android-4.1.1_r6.1</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7</td>
+</tr>
+<tr>
+  <td>JRO03R</td>
+  <td>android-4.1.1_r6</td>
+  <td>Jelly Bean</td>
+  <td>Nexus S 4G</td>
+</tr>
+<tr>
+  <td>JRO03O</td>
+  <td>android-4.1.1_r5</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>JRO03L</td>
+  <td>android-4.1.1_r4</td>
+  <td>Jelly Bean</td>
+  <td>Nexus S</td>
+</tr>
+<tr>
+  <td>JRO03H</td>
+  <td>android-4.1.1_r3</td>
+  <td>Jelly Bean</td>
+  <td></td>
+</tr>
+<tr>
+  <td>JRO03E</td>
+  <td>android-4.1.1_r2</td>
+  <td>Jelly Bean</td>
+  <td>Nexus S</td>
+</tr>
+<tr>
+  <td>JRO03D</td>
+  <td>android-4.1.1_r1.1</td>
+  <td>Jelly Bean</td>
+  <td>Nexus 7</td>
+</tr>
+<tr>
+  <td>JRO03C</td>
+  <td>android-4.1.1_r1</td>
+  <td>Jelly Bean</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>IMM76L</td>
+  <td>android-4.0.4_r2.1</td>
+  <td>Ice Cream Sandwich</td>
+  <td> </td>
+</tr>
+<tr>
+  <td>IMM76K</td>
+  <td>android-4.0.4_r2</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>IMM76I</td>
+  <td>android-4.0.4_r1.2</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>IMM76D</td>
+  <td>android-4.0.4_r1.1</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Nexus S、Nexus S 4G、Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>IMM76</td>
+  <td>android-4.0.4_r1</td>
+  <td>Ice Cream Sandwich</td>
+  <td></td>
+</tr>
+<tr>
+  <td>IML77</td>
+  <td>android-4.0.3_r1.1</td>
+  <td>Ice Cream Sandwich</td>
+  <td></td>
+</tr>
+<tr>
+  <td>IML74K</td>
+  <td>android-4.0.3_r1</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Nexus S</td>
+</tr>
+<tr>
+  <td>ICL53F</td>
+  <td>android-4.0.2_r1</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>ITL41F</td>
+  <td>android-4.0.1_r1.2</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>ITL41D</td>
+  <td>android-4.0.1_r1.1</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>ITL41D</td>
+  <td>android-4.0.1_r1</td>
+  <td>Ice Cream Sandwich</td>
+  <td>Galaxy Nexus</td>
+</tr>
+<tr>
+  <td>GWK74</td>
+  <td>android-2.3.7_r1</td>
+  <td>Gingerbread</td>
+  <td>Nexus S 4G</td>
+</tr>
+<tr>
+  <td>GRK39F</td>
+  <td>android-2.3.6_r1</td>
+  <td>Gingerbread</td>
+  <td>Nexus One、Nexus S</td>
+</tr>
+<tr>
+  <td>GRK39C</td>
+  <td>android-2.3.6_r0.9</td>
+  <td>Gingerbread</td>
+  <td>Nexus S</td>
+</tr>
+<tr>
+  <td>GRJ90</td>
+  <td>android-2.3.5_r1</td>
+  <td>Gingerbread</td>
+  <td>Nexus S 4G</td>
+</tr>
+<tr>
+  <td>GRJ22</td>
+  <td>android-2.3.4_r1</td>
+  <td>Gingerbread</td>
+  <td>Nexus One、Nexus S、Nexus S 4G</td>
+</tr>
+<tr>
+  <td>GRJ06D</td>
+  <td>android-2.3.4_r0.9</td>
+  <td>Gingerbread</td>
+  <td>Nexus S 4G</td>
+</tr>
+<tr>
+  <td>GRI54</td>
+  <td>android-2.3.3_r1.1</td>
+  <td>Gingerbread</td>
+  <td>Nexus S</td>
+</tr>
+<tr>
+  <td>GRI40</td>
+  <td>android-2.3.3_r1</td>
+  <td>Gingerbread</td>
+  <td>Nexus One、Nexus S</td>
+</tr>
+<tr>
+  <td>GRH78C</td>
+  <td>android-2.3.2_r1</td>
+  <td>Gingerbread</td>
+  <td>Nexus S</td>
+</tr>
+<tr>
+  <td>GRH78</td>
+  <td>android-2.3.1_r1</td>
+  <td>Gingerbread</td>
+  <td>Nexus S</td>
+</tr>
+<tr>
+  <td>GRH55</td>
+  <td>android-2.3_r1</td>
+  <td>Gingerbread</td>
+  <td>使用 Gingerbread 最早期版本的设备、Nexus S</td>
+</tr>
+<tr>
+  <td>FRK76C</td>
+  <td>android-2.2.3_r2</td>
+  <td>Froyo</td>
+  <td> </td>
+</tr>
+<tr>
+  <td>FRK76</td>
+  <td>android-2.2.3_r1</td>
+  <td>Froyo</td>
+  <td></td>
+</tr>
+<tr>
+  <td>FRG83G</td>
+  <td>android-2.2.2_r1</td>
+  <td>Froyo</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>FRG83D</td>
+  <td>android-2.2.1_r2</td>
+  <td>Froyo</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>FRG83</td>
+  <td>android-2.2.1_r1</td>
+  <td>Froyo</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>FRG22D</td>
+  <td>android-2.2_r1.3</td>
+  <td>Froyo</td>
+  <td></td>
+</tr>
+<tr>
+  <td>FRG01B</td>
+  <td>android-2.2_r1.2</td>
+  <td>Froyo</td>
+  <td></td>
+</tr>
+<tr>
+  <td>FRF91</td>
+  <td>android-2.2_r1.1</td>
+  <td>Froyo</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>FRF85B</td>
+  <td>android-2.2_r1</td>
+  <td>Froyo</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>EPF21B</td>
+  <td>android-2.1_r2.1p2</td>
+  <td>Eclair</td>
+  <td> </td>
+</tr>
+<tr>
+  <td>ESE81</td>
+  <td>android-2.1_r2.1s</td>
+  <td>Eclair</td>
+  <td></td>
+</tr>
+<tr>
+  <td>EPE54B</td>
+  <td>android-2.1_r2.1p</td>
+  <td>Eclair</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>ERE27</td>
+  <td>android-2.1_r2</td>
+  <td>Eclair</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>ERD79</td>
+  <td>android-2.1_r1</td>
+  <td>Eclair</td>
+  <td>Nexus One</td>
+</tr>
+<tr>
+  <td>ESD56</td>
+  <td>android-2.0.1_r1</td>
+  <td>Eclair</td>
+  <td></td>
+</tr>
+<tr>
+  <td>ESD20</td>
+  <td>android-2.0_r1</td>
+  <td>Eclair</td>
+  <td> </td>
+</tr>
+<tr>
+  <td>DMD64</td>
+  <td>android-1.6_r1.5</td>
+  <td>Donut</td>
+  <td> </td>
+</tr>
+<tr>
+  <td>DRD20</td>
+  <td>android-1.6_r1.4</td>
+  <td></td>
+  <td></td>
+</tr>
+<tr>
+  <td>DRD08</td>
+  <td>android-1.6_r1.3</td>
+  <td></td>
+  <td></td>
+</tr>
+<tr>
+  <td>DRC92</td>
+  <td>android-1.6_r1.2</td>
+  <td></td>
+  <td></td>
+</tr>
+</tbody>
+</table>
+<p>froyo、gingerbread、ics-mr0、ics-mr1、jb-dev、jb-mr1-dev、jb-mr1.1-dev、jb-mr2-dev 和 kitkat-dev 等分支代表与经过 Google 测试的配置不完全一致的开发分支。除官方命名的版本之外,它们可能还包含尚未经过全面测试的各种更改。</p>
+
+<p>要区分各个版本,您可以发出以下命令并指定两个分支标记,以获取与每个项目相关联的更改列表:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">repo forall -pc 'git log --no-merges --oneline branch-1..branch-2'</pre>
+
+<p>例如:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">repo forall -pc 'git log --no-merges --oneline android-4.4.2_r2..android-4.4.2_r1'</pre>
+
+<p>要输出到文本文件,请运行以下命令:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">repo forall -pc 'git log --no-merges --oneline android-4.4.2_r2..android-4.4.2_r1' &gt; /tmp/android-4.4.2_r2-android-4.4.2_r1-diff.txt</pre>
+
+<h2 id="honeycomb-gpl-modules">Honeycomb GPL 模块</h2>
+<p>Honeycomb 的整个平台源代码未对外公开。不过,遵循 GPL 和 LGPL 许可的某些 Honeycomb 模块已对外公开,对应于如下的标记:</p>
+
+<table>
+<thead>
+<tr>
+<th>细分版本</th>
+<th>标记</th>
+<th>备注</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>HRI39</td>
+<td>android-3.0_r1</td>
+<td>Honeycomb 最早期版本</td>
+</tr>
+<tr>
+<td>HRI66</td>
+<td>android-3.0_r1.1</td>
+<td></td>
+</tr>
+<tr>
+<td>HWI69</td>
+<td>android-3.0_r1.2</td>
+<td></td>
+</tr>
+<tr>
+<td>HRI83</td>
+<td>android-3.0_r1.3</td>
+<td></td>
+</tr>
+<tr>
+<td>HMJ37</td>
+<td>android-3.1_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HTJ85B</td>
+<td>android-3.2_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HTK55D</td>
+<td>android-3.2.1_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HTK75D</td>
+<td>android-3.2.1_r2</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75C</td>
+<td>android-3.2.2_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75D</td>
+<td>android-3.2.2_r2</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75F</td>
+<td>android-3.2.4_r1</td>
+<td></td>
+</tr>
+<tr>
+<td>HLK75H</td>
+<td>android-3.2.6_r1</td>
+<td>Honeycomb 的最新版本</td>
+</tr>
+</tbody>
+</table>
+<p>请注意,我们未提供刚好包含以上模块的清单。不过,我们提供的有些清单允许构建这些组件。以下命令适用于 3.0_r1.1,您可以通过切换 git checkout 参数来使用其他版本,还可以在必要时使用 repo init 中的 -m 参数。对于非 GPL 项目,git checkout 命令会返回错误,因为它找不到相应的标记。</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">repo init -b master -m base-for-3.0-gpl.xml</code>
+<code class="devsite-terminal">repo sync</code>
+<code class="devsite-terminal">repo forall -c git checkout android-3.0_r1.1</code>
+</pre>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/building-kernels.html b/zh-cn/setup/building-kernels.html
new file mode 100644
index 0000000..a7fe8e6
--- /dev/null
+++ b/zh-cn/setup/building-kernels.html
@@ -0,0 +1,247 @@
+<html devsite><head>
+    <title>编译内核</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>本页详细介绍了如何仅编译内核。以下说明假设您尚未下载整个 AOSP;如果您已完成下载,则可以跳过 <code>git clone</code> 对应的步骤,但下载内核源代码的步骤除外。</p>
+
+<p>本部分中的所有示例均使用 <a href="/setup/devices.html#hikey-boards">hikey</a> 内核。</p>
+
+<h2 id="figuring-out-which-kernel-to-build">选择内核</h2>
+<p>此表列出了内核源代码和二进制文件的名称及所在位置:<table>
+  <tbody><tr>
+    <th>设备</th>
+    <th>二进制文件所在的位置</th>
+    <th>源代码所在的位置</th>
+    <th>编译配置</th>
+  </tr>
+  <tr>
+    <td>marlin</td>
+    <td>device/google/marlin-kernel</td>
+    <td>kernel/msm</td>
+    <td>marlin_defconfig</td>
+  </tr>
+  <tr>
+    <td>sailfish</td>
+    <td>device/google/marlin-kernel</td>
+    <td>kernel/msm</td>
+    <td>marlin_defconfig</td>
+  </tr>
+  <tr>
+    <td>hikey</td>
+    <td>device/linaro/hikey-kernel</td>
+    <td>kernel/hikey-linaro</td>
+    <td>hikey_defconfig</td>
+  </tr>
+  <tr>
+    <td>angler</td>
+    <td>device/huawei/angler-kernel</td>
+    <td>kernel/msm</td>
+    <td>angler_defconfig</td>
+  </tr>
+  <tr>
+    <td>bullhead</td>
+    <td>device/lge/bullhead-kernel</td>
+    <td>kernel/msm</td>
+    <td>bullhead_defconfig</td>
+  </tr>
+  <tr>
+    <td>shamu</td>
+    <td>device/moto/shamu-kernel</td>
+    <td>kernel/msm</td>
+    <td>shamu_defconfig</td>
+  </tr>
+  <tr>
+    <td>fugu</td>
+    <td>device/asus/fugu-kernel</td>
+    <td>kernel/x86_64</td>
+    <td>fugu_defconfig</td>
+  </tr>
+  <tr>
+    <td>volantis</td>
+    <td>device/htc/flounder-kernel</td>
+    <td>kernel/tegra</td>
+    <td>flounder_defconfig</td>
+  </tr>
+  <tr>
+    <td>hammerhead</td>
+    <td>device/lge/hammerhead-kernel</td>
+    <td>kernel/msm</td>
+    <td>hammerhead_defconfig</td>
+  </tr>
+  <tr>
+    <td>flo</td>
+    <td>device/asus/flo-kernel/kernel</td>
+    <td>kernel/msm</td>
+    <td>flo_defconfig</td>
+  </tr>
+  <tr>
+    <td>deb</td>
+    <td>device/asus/flo-kernel/kernel</td>
+    <td>kernel/msm</td>
+    <td>flo_defconfig</td>
+  </tr>
+  <tr>
+    <td>manta</td>
+    <td>device/samsung/manta/kernel</td>
+    <td>kernel/exynos</td>
+    <td>manta_defconfig</td>
+  </tr>
+  <tr>
+    <td>mako</td>
+    <td>device/lge/mako-kernel/kernel</td>
+    <td>kernel/msm</td>
+    <td>mako_defconfig</td>
+  </tr>
+  <tr>
+    <td>grouper</td>
+    <td>device/asus/grouper/kernel</td>
+    <td>kernel/tegra</td>
+    <td>tegra3_android_defconfig</td>
+  </tr>
+  <tr>
+    <td>tilapia</td>
+    <td>device/asus/grouper/kernel</td>
+    <td>kernel/tegra</td>
+    <td>tegra3_android_defconfig</td>
+  </tr>
+  <tr>
+    <td>maguro</td>
+    <td>device/samsung/tuna/kernel</td>
+    <td>kernel/omap</td>
+    <td>tuna_defconfig</td>
+  </tr>
+  <tr>
+    <td>toro</td>
+    <td>device/samsung/tuna/kernel</td>
+    <td>kernel/omap</td>
+    <td>tuna_defconfig</td>
+  </tr>
+  <tr>
+    <td>panda</td>
+    <td>device/ti/panda/kernel</td>
+    <td>kernel/omap</td>
+    <td>panda_defconfig</td>
+  </tr>
+  <tr>
+    <td>stingray</td>
+    <td>device/moto/wingray/kernel</td>
+    <td>kernel/tegra</td>
+    <td>stingray_defconfig</td>
+  </tr>
+  <tr>
+    <td>wingray</td>
+    <td>device/moto/wingray/kernel</td>
+    <td>kernel/tegra</td>
+    <td>stingray_defconfig</td>
+  </tr>
+  <tr>
+    <td>crespo</td>
+    <td>device/samsung/crespo/kernel</td>
+    <td>kernel/samsung</td>
+    <td>herring_defconfig</td>
+  </tr>
+  <tr>
+    <td>crespo4g</td>
+    <td>device/samsung/crespo/kernel</td>
+    <td>kernel/samsung</td>
+    <td>herring_defconfig</td>
+  </tr>
+</tbody></table>
+
+</p><p>确定要使用的设备项目之后,请查看内核二进制文件的 Git 日志。设备项目采用 <code>device/<var>VENDOR</var>/<var>NAME</var></code> 形式。</p>
+
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">git clone https://android.googlesource.com/kernel/hikey-linaro</code>
+<code class="devsite-terminal">cd hikey-linaro</code>
+<code class="devsite-terminal">git log --max-count=1 kernel</code>
+</pre>
+
+<p>内核二进制文件的提交消息中包含用于编译二进制文件的内核源代码的部分 Git 日志。该日志中的第一个条目是最新内容(也即用于编译内核的条目)。请记下提交消息,因为您在后续步骤中会用到该消息。</p>
+
+<h2 id="id-version">确定内核版本</h2>
+
+<p>要确定系统映像中使用的内核版本,请对内核文件运行以下命令:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+dd if=kernel bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel | cut -d ':' -f 1) | zgrep -a 'Linux version'
+</pre>
+
+<p>对于 Nexus 5 (hammerhead),请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+dd if=zImage-dtb bs=1 skip=$(LC_ALL=C od -Ad -x -w2 zImage-dtb | grep 8b1f | cut -d ' ' -f1 | head -1) | zgrep -a 'Linux version'
+</pre>
+
+<h2 id="downloading-sources">下载源代码</h2>
+<p>使用适当的 <code>git clone</code> 命令,下载您要编译的内核的源代码。例如,以下命令会克隆 <code>common</code> 内核(一种可自定义的通用内核):</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+git clone https://android.googlesource.com/kernel/common
+</pre>
+
+<p>内核项目的完整列表在 <a href="https://android.googlesource.com/kernel">Kernel</a> 目录下。以下是一些常用内核及其各自的 <code>git clone</code> 命令。</p>
+
+<p><code>exynos</code> 项目包含适用于 Nexus 10 的内核源代码,可用作在 Samsung Exynos 芯片组上开展相关工作的着手点。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/exynos</pre>
+
+<p><code>goldfish</code> 项目包含适用于模拟平台的内核源代码。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/goldfish</pre>
+
+<p><code>hikey-linaro</code> 项目用于 HiKey 参考板,可用作在 HiSilicon 620 芯片组上开展相关工作的着手点。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/hikey-linaro</pre>
+
+<p><code>msm</code> 项目包含适用于 ADP1、ADP2、Nexus One、Nexus 4、Nexus 5、Nexus 6、Nexus 5X、Nexus 6P、Nexus 7 (2013)、Pixel 和 Pixel XL 的源代码,可用作在 Qualcomm MSM 芯片组上开展相关工作的着手点。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/msm</pre>
+
+<p><code>omap</code> 项目用于 PandaBoard 和 Galaxy Nexus,可用作在 TI OMAP 芯片组上开展相关工作的着手点。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/omap</pre>
+
+<p><code>samsung</code> 项目用于 Nexus S,可用作在 Samsung Hummingbird 芯片组上开展相关工作的着手点。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/samsung</pre>
+
+<p><code>tegra</code> 项目用于 Xoom、Nexus 7 (2012)、Nexus 9,可用作在 NVIDIA Tegra 芯片组上开展相关工作的着手点。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/tegra</pre>
+
+<p><code>x86_64</code> 项目包含适用于 Nexus Player 的内核源代码,可用作在 Intel x86_64 芯片组上开展相关工作的着手点。</p>
+<pre class="devsite-terminal devsite-click-to-copy">git clone https://android.googlesource.com/kernel/x86_64</pre>
+
+<h2 id="building">编译内核</h2>
+<p>当您了解了内核的最后一条提交消息并已成功下载内核源代码和预编译的 gcc 后,就可以编译内核了。以下编译命令使用了 hikey 内核:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">export ARCH=arm64</code>
+<code class="devsite-terminal">export CROSS_COMPILE=aarch64-linux-android-</code>
+<code class="devsite-terminal">cd hikey-linaro</code>
+<code class="devsite-terminal">git checkout -b android-hikey-linaro-4.1 origin/android-hikey-linaro-4.1</code>
+<code class="devsite-terminal">make hikey_defconfig</code>
+<code class="devsite-terminal">make</code>
+</pre>
+
+<p>要编译不同的内核,只需将 <code>hikey-linaro</code> 替换为您要编译的内核的名称即可。</p>
+
+<p>映像会输出到 <code>arch/arm64/boot/Image</code> 目录;内核二进制文件会输出到 <code>arch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb</code> 文件。请将 <code>Image</code> 目录和 <code>hi6220-hikey.dtb</code> 文件复制到 <code>hikey-kernel</code> 目录。</p>
+
+<p>或者,您可以在使用 <code>make bootimage</code>(或编译启动映像的任何其他 <code>make</code> 命令行)时添加 <code>TARGET_PREBUILT_KERNEL</code> 变量。所有设备均支持该变量,因为它是通过 <code>device/common/populate-new-device.sh</code> 进行设置的。例如:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+export TARGET_PREBUILT_KERNEL=$your_kernel_path/arch/arm/boot/zImage-dtb
+</pre>
+
+<p class="note"><strong>注意</strong>:内核名称因设备而异。要找到内核的正确文件名,请参阅内核源代码中的 <code>device/<var>VENDOR</var>/<var>NAME</var></code>。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/building.html b/zh-cn/setup/building.html
new file mode 100644
index 0000000..019c5d7
--- /dev/null
+++ b/zh-cn/setup/building.html
@@ -0,0 +1,168 @@
+<html devsite><head>
+    <title>编译准备工作</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>以下关于编译 Android 源代码树的说明适用于所有分支,包括 <code>master</code>。编译命令的基本顺序如下:</p>
+
+<h2 id="obtaining-proprietary-binaries">下载专有二进制文件</h2>
+
+<p>您不能只通过纯源代码来使用 AOSP,还需要运行与硬件相关的其他专有库(例如用于硬件图形加速的专有库)。如需其他资源的下载链接和<a href="requirements.html#binaries">设备二进制文件</a>,请参阅以下各部分。</p>
+
+<p class="note">部分设备会将这些专有二进制文件打包到其 <code>/vendor</code> 分区。</p>
+
+<h3 id="downloading-proprietary-binaries">下载专有二进制文件</h3>
+
+<p>对于运行带标记的 AOSP 版本分支的受支持设备,您可以从 <a href="https://developers.google.com/android/drivers">Google 的驱动程序</a>下载相关的官方二进制文件。有了这些二进制文件,您将有权使用那些采用非开源代码的其他硬件功能。要编译 AOSP 的 master 分支,请使用<a href="https://developers.google.com/android/blobs-preview">二进制文件预览</a>。在针对某种设备编译 master 分支时,请使用适用于<a href="/setup/build-numbers.html">最新编号版本</a>的二进制文件或具有最新日期的二进制文件。</p>
+
+<h3 id="extracting-proprietary-binaries">解压专有二进制文件</h3>
+
+<p>每组二进制文件都是压缩包中的一个自解压脚本。解压每个压缩包,从源代码树的根目录运行附带的自解压脚本,然后确认您同意附带的许可协议的条款。二进制文件及其对应的 Makefile 将会安装在源代码树的 <code>vendor/</code> 层次结构中。</p>
+
+<h3 id="cleaning-up">清理</h3>
+
+<p>为了确保新安装的二进制文件在解压后会被适当考虑在内,请使用以下命令删除所有以前编译操作的已有输出:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+make clobber
+</pre>
+
+<h2 id="initialize">设置环境</h2>
+<p>使用 <code>envsetup.sh</code> 脚本初始化环境。请注意,将 <code>source</code> 替换成 <code>.</code>(一个点)可以省去一些字符,这种简写形式在文档中更为常用。</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+source build/envsetup.sh
+</pre>
+<p>或</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+. build/envsetup.sh
+</pre>
+
+<h2 id="choose-a-target">选择目标</h2>
+<p>使用 <code>lunch</code> 选择要编译的目标。确切的配置可作为参数进行传递。例如以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+lunch aosp_arm-eng
+</pre>
+<p>该命令表示针对模拟器进行完整编译,并且所有调试功能均处于启用状态。</p>
+<p>如果您没有提供任何参数就运行命令,<code>lunch</code> 将提示您从菜单中选择一个目标。</p>
+<p>所有编译目标都采用 <code>BUILD-BUILDTYPE</code> 形式,其中 <code>BUILD</code> 是表示特定功能组合的代号。</p>
+
+<p>BUILDTYPE 是以下类型之一:</p>
+<table>
+<thead>
+<tr>
+<th>编译类型</th>
+<th>使用情况</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>user</td>
+<td>权限受限;适用于生产环境</td>
+</tr>
+<tr>
+<td>userdebug</td>
+<td>与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型</td>
+</tr>
+<tr>
+<td>eng</td>
+<td>具有额外调试工具的开发配置</td>
+</tr>
+</tbody>
+</table>
+<p>要详细了解如何针对实际硬件进行编译以及如何在实际硬件上运行编译系统,请参阅<a href="running.html">运行编译系统</a>。</p>
+
+<h2 id="build-the-code">编译代码</h2>
+
+<p>请注意,本部分只是一个摘要,用于确保设置已完成。如需关于编译 Android 的详细说明,请参阅<a href="running.html">运行编译系统</a>。</p>
+
+<p>您可以使用 <code>make</code> 编译任何代码。GNU Make 可以借助 <code>-jN</code> 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 <code>make -j16</code> 到 <code>make -j32</code> 之间的命令。</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+make -j4
+</pre>
+
+<h2 id="run-it">开始运行!</h2>
+
+<p>您可以在模拟器上运行自己的版本,也可以将其刷到设备上。请注意,因为您之前已使用 <code>lunch</code> 选择编译目标,因此很可能无法在编译目标之外的目标上运行您的编译系统。</p>
+
+<p class="note"><strong>注意</strong>:请记得<a href="#obtaining-proprietary-binaries">下载专有二进制文件</a>,否则您的编译系统将无法在目标硬件上成功启动。如果您在此时下载二进制 Blob,则需要将其解压、<code>make clobber</code> 并重新编译。</p>
+
+<h3 id="flash-a-device">使用 fastboot 刷机</h3>
+
+<p>要对设备进行刷机,您需要使用 <code>fastboot</code>(编译成功后,它应该会包含在您的路径中)。如需相关说明,请参阅<a href="running.html#flashing-a-device">对设备进行刷机</a>。</p>
+
+<h3 id="emulate-an-android-device">模拟 Android 设备</h3>
+
+<p>编译流程会自动将模拟器添加到您的路径中。要运行模拟器,请输入以下命令:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+emulator
+</pre>
+
+<h2 id="troubleshooting-common-build-errors">排查常见编译错误</h2>
+
+<h3 id="wrong-java-version">Java 版本不正确</h3>
+
+<p>如果您尝试编译的 Android 版本与您的 Java 版本不一致,<code>make</code> 将会终止并显示诸如以下消息:</p>
+<pre>
+************************************************************
+You are attempting to build with the incorrect version
+of java.
+
+Your version is: WRONG_VERSION.
+The correct version is: RIGHT_VERSION.
+
+Please follow the machine setup instructions at
+    https://source.android.com/source/initializing.html
+************************************************************
+</pre>
+
+<p>这可能是由以下原因引起的:</p>
+
+<ul>
+<li>未能安装 <a href="requirements.html#jdk">JDK 要求</a>中指定的正确 JDK。</li>
+<li>之前安装的另一个 JDK 出现在您的路径中。将正确的 JDK 附加到路径开头,或者移除有问题的 JDK。</li>
+</ul>
+
+<h3 id="python-version-3">Python 版本 3</h3>
+
+<p>Repo 是基于 Python 2.x 中的特定功能构建的,但遗憾的是与 Python 3 不兼容。要使用 Repo,请安装 Python 2.x:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+apt-get install python
+</pre>
+
+<h3 id="case-insensitive-filesystem">不区分大小写的文件系统</h3>
+
+<p>您在 Mac OS 中的 HFS 文件系统上进行编译时,可能会遇到诸如以下错误:</p>
+<pre>
+************************************************************
+You are building on a case-insensitive filesystem.
+Please move your source tree to a case-sensitive filesystem.
+************************************************************
+</pre>
+<p>请按照<a href="initializing.html">初始化编译环境</a>中的相关说明创建区分大小写的磁盘映像。</p>
+
+<h3 id="no-usb-permission">没有 USB 权限</h3>
+
+<p>在大多数 Linux 系统中,无特权的用户默认情况下无法使用 USB 端口。如果您看到权限遭拒错误,请按照<a href="initializing.html">初始化编译环境</a>中的相关说明配置 USB 使用权限。</p>
+
+<p>如果 adb 已在运行,并且在这些规则设置完成后无法连接到设备,您可以使用 <code>adb kill-server</code> 将其终止。这将使 adb 采用新的配置重启。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/code-lines.html b/zh-cn/setup/code-lines.html
new file mode 100644
index 0000000..693ba4d
--- /dev/null
+++ b/zh-cn/setup/code-lines.html
@@ -0,0 +1,111 @@
+<html devsite><head>
+    <title>代码流水线、分支和版本</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+Android 开放源代码项目 (AOSP) 维护着一个全面的软件堆栈,原始设备制造商 (OEM) 和其他设备实现者可移植并在自己的硬件上运行该堆栈。为了维持 Android 项目的质量,Google 分派了全职工程师、产品经理、界面设计师、质量保证测试人员以及更多相关人员(将新型设备推向市场所需的所有其他角色)来负责相关工作。
+</p>
+
+<p>
+相应地,我们还维护着多个“代码流水线”,以便明确区分当前稳定版 Android 与不稳定的实验性版本。我们将 Android 代码流水线的开放源代码管理和维护工作纳入到了更大的产品开发周期中。
+</p>
+
+<p>
+下图从概念层面显示了 AOSP 如何管理代码和版本。我们将它们称为“代码流水线”而不是“分支”,只是因为在任何特定时刻,特定“代码流水线”都可能有多个分支。例如,当某个版本定型时,它可能会(也可能不会)根据当前需要变为新的分支。
+</p>
+<ol>
+  <li>
+	<p>在任何特定时刻,Android 平台都有一个当前最新版本。该版本通常作为树中的一个分支。
+	</p>
+  </li>
+  <li>
+	<p>设备制造商和贡献者会以当前最新版本为基础来修复错误、发布新设备、试验新功能等。
+	</p>
+  </li>
+  <li>
+	<p>与此同时,Google 会根据产品的需求和目标,在内部开发下一版 Android 平台和框架。开发下一版 Android 时,我们会与设备合作伙伴协作,在旗舰设备上推出新版 Android,旗舰设备的规格经过深思熟虑,旨在推动 Android 朝着我们希望的方向发展。
+	</p>
+  </li>
+  <li>
+	<p>当第“n+1”版准备就绪时,它就会发布到公开源代码树,并成为新的最新版本。
+	</p>
+  </li>
+</ol>
+  <img src="/images/code-lines.png" alt="代码流水线示意图" id="figure1"/>
+<p class="img-caption">
+  <strong>图 1.</strong> AOSP 代码和版本</p>
+<h2 id="terms-and-caveats">条款和注意事项</h2>
+<ul>
+  <li>
+	<p>
+	  一个版本对应一个正式版 Android 平台,如 1.5、2.1 等等。<em></em>一般来说,一个平台版本对应于 AndroidManifest.xml 文件 <code>SdkVersion</code> 字段中的版本(如源代码树的 <code>frameworks/base/api</code> 中所定义)。
+	</p>
+  </li>
+  <li>
+	<p>
+	  上游项目是指 Android 堆栈从中提取代码的开源项目。<em></em>这包括一些著名的项目,如 Linux 内核和 WebKit。随着发展,我们也在引入一些半自主性 Android 项目(如 ART、Android SDK 工具、Bionic 等)作为“上游”项目进行开发。一般情况下,这些项目完全是在公开树中开发的。对于某些上游项目,开发是通过直接为上游项目本身做贡献来完成的。如需了解详情,请参阅<a href="submit-patches.html#upstream-projects">上游项目</a>。在这两种情况下,快照会定期纳入版本中。
+	</p>
+  </li>
+  <li>
+	<p>在任何时候,版本代码流水线(实际上可能由 Git 中的多个真实存在的分支组成)都被视为给定 Android 平台版本的唯一规范源代码。原始设备制造商 (OEM) 和开发设备的其他组织应该仅从版本分支中获取源代码。
+	</p>
+  </li>
+  <li>
+	<p>“实验性”代码流水线是为了收集社区带来的更改,从而在保持稳定性的基础上反复进行改进。
+	</p>
+  </li>
+  <li>
+	<p>被认定为稳定的更改最终会提取到版本分支中。请注意,这仅适用于错误修复、应用改进和不影响平台 API 的其他更改。
+	</p>
+  </li>
+  <li>
+	<p>在必要时,更改将从上游项目(包括 Android“上游”项目)提取到版本分支中。
+	</p>
+  </li>
+  <li>
+	<p>第“n+1”版(即框架和平台 API 的下一个重大版本)将由 Google 在内部开发。如需了解详情,请参阅<a href="#about-private-code-lines">不公开代码流水线简介</a>。
+	</p>
+  </li>
+  <li>
+	<p>在必要时,更改将从上游、版本和实验性分支提取到 Google 的私密分支。
+	</p>
+  </li>
+  <li>
+	<p>当下一版本的平台 API 已经稳定并经过全面测试后,Google 会针对下一版平台定型一个版本。(具体来说,这指的是一个新的 <code>SdkVersion</code>。)这个版本也将对应于作为公开版本分支的内部代码流水线和新的当前平台代码流水线。
+	</p>
+  </li>
+  <li>
+	<p>当某个新的平台版本定型时,Google 会同时创建相应的实验性代码流水线。
+	</p>
+  </li>
+</ul>
+
+<h2 id="about-private-code-lines">不公开代码流水线简介</h2>
+<p>上述源代码管理策略谈到了 Google 会维护一个不公开的代码流水线。这样做是为了将注意力集中在 Android 的当前公开版本上。
+</p>
+<p>原始设备制造商 (OEM) 和其他设备制造商自然希望发布搭载最新版 Android 的设备。同样,如非必要,应用开发者也不希望处理更多个平台版本。与此同时,Google 要负责把握 Android 作为平台和产品的战略方向。我们的方法侧重于在少量旗舰设备上推进功能的演化,同时确保与 Android 相关的知识产权得到妥善保护。
+</p>
+<p>如此一来,Google 经常掌握有来自第三方的机密信息。在确保采取适当的保护措施之前,我们必须避免泄露敏感功能。此外,同时存在太多平台版本会给平台带来真正的风险。考虑到这些因素,我们构建了开放源代码项目(包含第三方贡献的内容),以专注于目前公开的稳定版 Android。下一版平台的“深度开发”将会私下进行,直到一切就绪,最终成为正式版本。
+</p>
+<p>我们意识到,许多贡献者不同意这种做法。我们尊重其他人可能有不同的观点;但这是我们认为的最佳方式,我们也选择这种方法来进行实现。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/code-style.html b/zh-cn/setup/code-style.html
new file mode 100644
index 0000000..b50304e
--- /dev/null
+++ b/zh-cn/setup/code-style.html
@@ -0,0 +1,463 @@
+<html devsite><head>
+    <title>面向贡献者的 AOSP 代码样式指南</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>以下代码样式是向 Android 开源项目 (AOSP) 贡献 Java 代码时必须严格遵守的规则。如果向 Android 平台贡献的代码没有遵守这些规则,则通常不会被接受。<em></em>我们知道,并非所有现有的代码都遵守这些规则,但我们希望所有新代码都遵守这些规则。</p>
+
+<p class="note"><strong>注意</strong>:这些规则针对的是 Android 平台,Android 应用开发者可以不遵守这些规则。应用开发者可以遵守他们选择的标准,如 <a href="https://google.github.io/styleguide/javaguide.html">Google Java 样式指南</a>。</p>
+
+<h2 id="java-language-rules">Java 语言规则</h2>
+<p>Android 遵循标准 Java 编码规范以及下文所述的其他规则。</p>
+
+<h3 id="dont-ignore-exceptions">请勿忽略异常</h3>
+<p>开发者可能会倾向于编写完全忽略异常的代码,例如:</p>
+<pre><code>void setServerPort(String value) {
+    try {
+        serverPort = Integer.parseInt(value);
+    } catch (NumberFormatException e) { }
+}
+</code></pre>
+<p>千万不要这样做。虽然您可能认为自己的代码永远不会遇到这种错误,或者无需费心处理这种错误,但像上例那样忽略异常会在您的代码中埋下隐患,这种错误总有一天会被他人触发。您必须有原则地处理代码中的每个异常;具体处理方式因情况而异。</p>
+<p><em>无论何时,只要遇到空的 catch 子句,就应该保持警惕。当然,在某些时候,空的 catch 语句确实没什么问题,但至少你得想一想。</em>在 Java 中,无论怎么小心都不为过。- <a href="http://www.artima.com/intv/solid4.html">James Gosling</a></p>
+<p>可接受的替代方案(按优先顺序排列)包括:</p>
+<ul>
+<li>将异常抛给方法调用者。
+<pre><code>void setServerPort(String value) throws NumberFormatException {
+    serverPort = Integer.parseInt(value);
+}
+</code></pre>
+</li>
+<li>抛出一个适合您的抽象级别的新异常。
+<pre><code>void setServerPort(String value) throws ConfigurationException {
+    try {
+        serverPort = Integer.parseInt(value);
+    } catch (NumberFormatException e) {
+        throw new ConfigurationException("Port " + value + " is not valid.");
+    }
+}
+</code></pre>
+</li>
+<li>妥善处理错误,并替换 catch {} 块中的相应值。
+<pre><code>/** Set port. If value is not a valid number, 80 is substituted. */
+
+void setServerPort(String value) {
+    try {
+        serverPort = Integer.parseInt(value);
+    } catch (NumberFormatException e) {
+        serverPort = 80;  // default port for server
+    }
+}
+</code></pre>
+</li>
+<li>捕获异常并抛出一个新的 <code>RuntimeException</code>。这样做比较危险,因此请仅在下述情况下采用这种方案:您确定,如果发生此错误,最适当的处理方式就是让应用崩溃。
+<pre><code>/** Set port. If value is not a valid number, die. */
+
+void setServerPort(String value) {
+    try {
+        serverPort = Integer.parseInt(value);
+    } catch (NumberFormatException e) {
+        throw new RuntimeException("port " + value " is invalid, ", e);
+    }
+}
+</code></pre>
+<p class="note"><strong>注意</strong>:原始异常会传递到 RuntimeException 的构造函数。如果您的代码必须采用 Java 1.3 进行编译,则必须忽略表示原因的异常。</p>
+</li>
+<li>最后一种方案:如果您确信忽略异常是合适的处理方式,那么您可以忽略异常,但您必须添加备注以充分说明理由:<pre><code>/** If value is not a valid number, original port number is used. */
+void setServerPort(String value) {
+    try {
+        serverPort = Integer.parseInt(value);
+    } catch (NumberFormatException e) {
+        // Method is documented to just ignore invalid user input.
+        // serverPort will just be unchanged.
+    }
+}
+</code></pre>
+</li>
+</ul>
+
+<h3 id="dont-catch-generic-exception">请勿捕获常规异常</h3>
+<p>在捕获异常时,开发者可能会为了偷懒而倾向于采用以下处理方式:</p>
+<pre><code>try {
+    someComplicatedIOFunction();        // may throw IOException
+    someComplicatedParsingFunction();   // may throw ParsingException
+    someComplicatedSecurityFunction();  // may throw SecurityException
+    // phew, made it all the way
+} catch (Exception e) {                 // I'll just catch all exceptions
+    handleError();                      // with one generic handler!
+}
+</code></pre>
+<p>千万不要这样做。几乎所有情况下都不适合捕获常规异常或 Throwable(最好不要捕获 Throwable,因为它包含 Error 异常)。这样做非常危险,因为这意味着系统会在处理应用级错误期间捕获到您从未预料到的异常(包括 ClassCastException 之类的 RuntimeException)。它掩盖了代码的故障处理属性,也就是说,如果有人在您所调用的代码中添加了一种新类型的异常,编译器不会帮助您意识到您需要采取不同的方式来处理该错误。在大多数情况下,您不应以相同的方式处理不同类型的异常。</p>
+<p>这条规则的特例是:在测试代码和顶级代码中,您希望捕获所有类型的错误(以防它们显示在界面中或者以便一直进行批处理作业)。在这些情况下,您可以捕获常规异常(或 Throwable)并适当地处理错误。但在这样做之前,请务必三思,然后添加备注以说明为何在此处执行这类操作是安全之举。</p>
+<p>捕获常规异常的替代方案:</p>
+<ul>
+<li>
+<p>在单个 try 之后将每个异常作为单独的 catch 块分别进行捕获。这样做可能显得比较笨拙,但仍比捕获所有异常更可取。请注意,不要在 catch 块中过多地重复使用代码。</p></li><p></p>
+
+<li>
+<p>通过多个 try 块重构您的代码,使得错误处理过程更精细。从解析中分离出 IO,然后分别处理每种情况下的错误。</p>
+</li>
+<li>
+<p>重新抛出异常。很多时候,您无需在该级别捕获异常,只需让相应方法抛出异常即可。</p>
+</li>
+</ul>
+<p>请谨记:异常是您的朋友!当编译器抱怨您没有捕获异常时,别闷闷不乐!您应该微笑:因为编译器让您能够更加轻松地捕获代码中的运行时错误。</p>
+<h3 id="dont-use-finalizers">请勿使用终结器</h3>
+<p>终结器可以在对象被垃圾回收器回收时执行一段代码。虽然终结器非常便于进行资源清理(尤其是外部资源),但并不能保证终结器何时被调用(甚至根本不会被调用)。</p>
+<p>Android 不使用终结器。在大多数情况下,您可以通过良好的异常处理流程实现终结器功能。如果您的确需要终结器,请定义一个 close() 方法(或类似方法),并注明需要调用该方法的确切时间(有关示例,请参阅 InputStream)。这种情况下,可以(但并非必须)在终结器中输出简短的日志消息,前提是不会输出大量日志消息。</p>
+
+<h3 id="fully-qualify-imports">完全合格的导入</h3>
+<p>当您想要使用 foo 包中的 Bar 类时,可以使用以下两种方式导入:</p>
+<ul>
+<li><code>import foo.*;</code>
+<p>可能会减少 import 语句的数量。</p></li>
+<li><code>import foo.Bar;</code>
+<p>明确指出实际使用了哪些类,而且代码对于维护者来说更易读。</p></li></ul>
+<p>使用 <code>import foo.Bar;</code> 导入所有 Android 代码。对于 Java 标准库(<code>java.util.*</code>、<code>java.io.*</code> 等)和单元测试代码 (<code>junit.framework.*</code>),确定了一种明确例外情况。</p>
+
+<h2 id="java-library-rules">Java 库规则</h2>
+<p>使用 Android 的 Java 库和工具需要遵守相关规范。在某些情况下,具体规范发生了一些重大变化,旧代码可能使用的是已弃用的模式或库。使用此类代码时,可以继续遵循现有样式。不过,在创建新组件时,请不要再使用已弃用的库。</p>
+
+<h2 id="java-style-rules">Java 样式规则</h2>
+
+<h3 id="use-javadoc-standard-comments">使用 Javadoc 标准备注</h3>
+<p>每个文件都应该在顶部放置版权声明,其后是 package 和 import 语句(各个块之间用空行分隔),最后是类或接口声明。在 Javadoc 备注中说明类或接口的作用。</p>
+<pre><code>/*
+ * Copyright (C) 2015 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.
+ */
+
+package com.android.internal.foo;
+
+import android.os.Blah;
+import android.view.Yada;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * Does X and Y and provides an abstraction for Z.
+ */
+
+public class Foo {
+    ...
+}
+</code></pre>
+<p>您编写的每个类和重要的公开方法都必须包含 Javadoc 备注,至少用一句话说明类或方法的用途。<em></em>句式应以第三人称描述性动词开头。</p>
+<p>示例:</p>
+<pre><code>/** Returns the correctly rounded positive square root of a double value. */
+static double sqrt(double a) {
+    ...
+}
+</code></pre>
+<p>或</p>
+<pre><code>/**
+ * Constructs a new String by converting the specified array of
+ * bytes using the platform's default character encoding.
+ */
+public String(byte[] bytes) {
+    ...
+}
+</code></pre>
+<p>对于普通的 get 和 set 方法(如 <code>setFoo()</code>),您无需编写 Javadoc,要写也不过是“设置 Foo”。如果该方法执行更复杂的操作(例如强制实施约束条件或具有重大副作用),那么您必须添加备注。如果属性“Foo”的意思不明确,您也应该添加备注。
+</p><p>您所编写的每一种方法(无论是公开方法还是其他方法)都将受益于 Javadoc。公开方法是 API 的一部分,因此需要 Javadoc。Android 目前并不强制要求采用特定样式来编写 Javadoc 备注,但建议您参照<a href="http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html">如何为 Javadoc 工具编写文档备注</a>中的说明。</p>
+
+<h3 id="write-short-methods">编写简短方法</h3>
+<p>在可行的情况下,尽量编写短小精炼的方法。我们了解,有些情况下较长的方法是恰当的,因此对方法的代码长度没有做出硬性限制。如果某个方法的代码超出 40 行,请考虑是否可以在不破坏程序结构的前提下对其拆解。</p>
+
+<h3 id="define-fields-in-standard-places">在标准位置定义字段</h3>
+<p>在文件的顶部或者在使用它们的方法之前定义字段。</p>
+
+<h3 id="limit-variable-scope">限制变量的作用域</h3>
+<p>尽可能缩小局部变量的作用域。这样做有助于提高代码的可读性和可维护性,并降低出错的可能性。每个变量应该在包含变量所有使用场合的最内层的块中进行声明。</p>
+<p>局部变量应该在首次使用时声明。几乎每个局部变量声明都应该包含一个初始化程序。如果您还没有足够的信息来合理地初始化某个变量,请推迟到信息充足时再进行声明。</p>
+<p>try-catch 语句是例外情况。如果通过一个会抛出受检异常的方法的返回值来初始化变量,则必须在 try 块中进行初始化。如果该值必须在 try 块之外使用,那么您必须在 try 块之前对其进行声明,因为它在 try 块中尚无法合理地初始化:</p>
+<pre><code>// Instantiate class cl, which represents some sort of Set
+Set s = null;
+try {
+    s = (Set) cl.newInstance();
+} catch(IllegalAccessException e) {
+    throw new IllegalArgumentException(cl + " not accessible");
+} catch(InstantiationException e) {
+    throw new IllegalArgumentException(cl + " not instantiable");
+}
+
+// Exercise the set
+s.addAll(Arrays.asList(args));
+</code></pre>
+<p>不过,即使是这种情况,也可以通过将 try-catch 块封装在某个方法中来避免:</p>
+<pre><code>Set createSet(Class cl) {
+    // Instantiate class cl, which represents some sort of Set
+    try {
+        return (Set) cl.newInstance();
+    } catch(IllegalAccessException e) {
+        throw new IllegalArgumentException(cl + " not accessible");
+    } catch(InstantiationException e) {
+        throw new IllegalArgumentException(cl + " not instantiable");
+    }
+}
+
+...
+
+// Exercise the set
+Set s = createSet(cl);
+s.addAll(Arrays.asList(args));
+</code></pre>
+<p>循环变量应该在 for 语句本身中进行声明,除非有令人信服的理由不这么做:</p>
+<pre><code>for (int i = 0; i &lt; n; i++) {
+    doSomething(i);
+}
+</code></pre>
+<p>和</p>
+<pre><code>for (Iterator i = c.iterator(); i.hasNext(); ) {
+    doSomethingElse(i.next());
+}
+</code></pre>
+
+<h3 id="order-import-statements">为 import 语句排序</h3>
+<p>import 语句的顺序为:</p>
+<ol>
+<li>
+<p>导入 Android 包</p>
+</li>
+<li>
+<p>导入第三方包(<code>com</code>、<code>junit</code>、<code>net</code>、<code>org</code>)</p>
+</li>
+<li>
+<p><code>java</code> 和 <code>javax</code></p>
+</li>
+</ol>
+<p>要完全符合 IDE 设置,导入顺序应为:</p>
+<ul>
+<li>
+<p>每个分组内按字母顺序排序,其中大写字母开头的语句位于小写字母开头的语句前面(例如 Z 在 a 前面)。</p>
+</li>
+<li>
+<p>每个主要分组(<code>android</code>、<code>com</code>、<code>junit</code>、<code>net</code>、<code>org</code>、<code>java</code>、<code>javax</code>)之间用空行隔开。</p>
+</li>
+</ul>
+<p>最初对于语句顺序并没有样式要求,这意味着 IDE 经常会改变顺序,或者 IDE 开发者必须停用自动导入管理功能并手动维护导入语句。这样相当不方便。当提及 Java 样式时,开发者们喜欢的样式五花八门,最终针对 Android 简单归结为“选择一种兼容一致的排序方式”。因此我们选择了一种样式,更新了样式指南,并让 IDE 遵循该指南。我们希望 IDE 用户在编写代码时,系统对所有软件包的导入都符合此模式,无需再进行额外的工程处理。</p>
+<p>这种样式是按以下原则选取的:</p>
+<ul>
+<li>
+<p>用户希望先看到的导入往往位于顶部 (<code>android</code>)。</p>
+</li>
+<li>
+<p>用户最不希望看到的导入往往位于底部 (<code>java</code>)。</p>
+</li>
+<li>
+<p>用户可以轻松遵循的样式。</p>
+</li>
+<li>
+<p>IDE 可以遵循的样式。</p>
+</li>
+</ul>
+<p>静态导入的使用和位置一直都存在争议。有些人希望静态导入穿插在其他导入语句之间,而有些人更希望其位于其他所有导入语句的上方或下方。此外,我们还没有确定如何让所有 IDE 都使用同一种顺序。由于许多人认为这个问题不太重要,因此您只需在保持一致的前提下自行决定即可。</p>
+
+<h3 id="use-spaces-for-indentation">使用空格缩进</h3>
+<p>我们使用四 (4) 个空格来缩进块,而不要使用制表符。如果您有疑问,请与周围的代码保持一致。</p>
+<p>我们使用八 (8) 个空格来缩进自动换行,包括函数调用和赋值。正确示例如下:</p>
+<pre><code>Instrument i =
+        someLongExpression(that, wouldNotFit, on, one, line);
+</code></pre>
+<p>错误示例如下:</p>
+<pre><code>Instrument i =
+    someLongExpression(that, wouldNotFit, on, one, line);
+</code></pre>
+
+<h3 id="follow-field-naming-conventions">遵循字段命名规范</h3>
+<ul>
+<li>
+<p>非公开且非静态字段的名称以 m 开头。</p>
+</li>
+<li>
+<p>静态字段的名称以 s 开头。</p>
+</li>
+<li>
+<p>其他字段以小写字母开头。</p>
+</li>
+<li>
+<p>公开静态 final 字段(常量)为全部大写并用下划线连接 (ALL_CAPS_WITH_UNDERSCORES)。</p>
+</li>
+</ul>
+<p>例如:</p>
+<pre><code>public class MyClass {
+    public static final int SOME_CONSTANT = 42;
+    public int publicField;
+    private static MyClass sSingleton;
+    int mPackagePrivate;
+    private int mPrivate;
+    protected int mProtected;
+}
+</code></pre>
+<h3 id="use-standard-brace-style">使用标准大括号样式</h3>
+<p>左大括号不单独占一行,与其前面的代码位于同一行:</p>
+<pre><code>class MyClass {
+    int func() {
+        if (something) {
+            // ...
+        } else if (somethingElse) {
+            // ...
+        } else {
+            // ...
+        }
+    }
+}
+</code></pre>
+<p>我们需要在条件语句周围添加大括号。例外情况:如果整个条件语句(条件和主体)适合放在同一行,那么您可以(但不是必须)将其全部放在一行上。例如,我们接受以下样式:</p>
+<pre><code>if (condition) {
+    body();
+}
+</code></pre>
+<p>同样也接受以下样式:</p>
+<pre><code>if (condition) body();
+</code></pre>
+<p>但不接受以下样式:</p>
+<pre><code>if (condition)
+    body();  // bad!
+</code></pre>
+
+<h3 id="limit-line-length">限制代码行长度</h3>
+<p>您的代码中每一行文本的长度都应该不超过 100 个字符。虽然关于此规则存在很多争论,但最终决定仍是以 100 个字符为上限,不过存在以下例外情况:<em></em></p>
+<ul>
+<li>如果备注行包含长度超过 100 个字符的示例命令或文字网址,那么为了便于剪切和粘贴,该行可以超过 100 个字符。</li>
+<li>导入语句行可以超出此限制,因为用户很少会看到它们(这也简化了工具编写流程)。</li>
+</ul>
+
+<h3 id="use-standard-java-annotations">使用标准 Java 注释</h3>
+<p>注释应该位于同一语言元素的其他修饰符之前。简单的标记注释(例如 @Override)可以与语言元素列在同一行。如果有多个注释或参数化注释,则应各占一行并按字母顺序排列。</p>
+<p>Java 中 3 个预定义注释的 Android 标准做法如下:</p>
+<ul>
+<li><code>@Deprecated</code>:在不建议使用注释元素时,必须使用 @Deprecated 注释。如果您使用 @Deprecated 注释,则还必须为其添加 @deprecated Javadoc 标记,并且该标记应该指定一个替代实现方案。另外请注意,@Deprecated 方法应该仍然可以使用。<em></em>如果您看到带有 @deprecated Javadoc 标记的旧代码,请添加 @Deprecated 注释。
+</li>
+<li><code>@Override</code>:当某个方法替换了超类中的声明或实现时,必须使用 @Override 注释。例如,如果您使用 @inheritdocs Javadoc 标记,并且派生于某个类(而非接口),则必须再为方法添加 @Override 注释,说明该方法替换了父类的方法。</li>
+<li><code>@SuppressWarnings</code>:@SuppressWarnings 注释应该仅在无法消除警告的情况下使用。如果某个警告通过了“无法消除”测试,则必须使用 @SuppressWarnings 注释,以确保所有警告都会反映出代码中的实际问题。<em></em>
+<p>当需要 @SuppressWarnings 注释时,必须在前面添加一个 TODO 备注,用于说明“无法消除”情况。这通常会标识出是哪个违规类使用了糟糕的接口。例如:</p>
+<pre><code>// TODO: The third-party class com.third.useful.Utility.rotate() needs generics
+@SuppressWarnings("generic-cast")
+List&lt;String&gt; blix = Utility.rotate(blax);
+</code></pre>
+<p>当需要 @SuppressWarnings 注释时,您应该重构代码以分离出需要使用该注释的软件元素。</p>
+</li>
+</ul>
+
+<h3 id="treat-acronyms-as-words">将首字母缩写词视为字词</h3>
+<p>在为变量、方法和类命名时,请将首字母缩写词和缩写形式视为字词,使名称更具可读性:</p>
+<table>
+<thead>
+<tr>
+<th>良好</th>
+<th>不佳</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>XmlHttpRequest</td>
+<td>XMLHTTPRequest</td>
+</tr>
+<tr>
+<td>getCustomerId</td>
+<td>getCustomerID</td>
+</tr>
+<tr>
+<td>class Html</td>
+<td>class HTML</td>
+</tr>
+<tr>
+<td>String url</td>
+<td>String URL</td>
+</tr>
+<tr>
+<td>long id</td>
+<td>long ID</td>
+</tr>
+</tbody>
+</table>
+<p>由于 JDK 和 Android 代码库在首字母缩写词上非常不一致,几乎也不可能与周围的代码保持一致。因此,请务必将首字母缩写词视为字词。</p>
+
+<h3 id="use-todo-comments">使用 TODO 备注</h3>
+<p>为代码使用 TODO 备注是短期的临时解决方案,或者说足够好但并不完美。TODO 备注应该以全部大写的字符串 TODO 开头,后跟一个冒号:</p>
+<pre><code>// TODO: Remove this code after the UrlTable2 has been checked in.
+</code></pre>
+<p>和</p>
+<pre><code>// TODO: Change this to use a flag instead of a constant.
+</code></pre>
+<p>如果您的 TODO 采用“在未来的某个日期做某事”的形式,请确保在其中包含一个非常具体的日期(“在 2005 年 11 月前修复”)或者一个非常具体的事件(“在所有生产环境合成器都可处理 V7 协议后移除此代码”)。</p>
+
+<h3 id="log-sparingly">谨慎使用日志记录</h3>
+<p>虽然日志记录非常有必要,但对性能却有明显的负面影响,如果不能保持一定程度的简洁性,就会迅速失去其实用性。日志记录工具提供以下 5 种不同级别的日志记录:</p>
+<ul>
+<li><code>ERROR</code>:在出现极其严重的情况时使用。例如,某些事件会导致用户可见的后果,如果不明确删除某些数据、卸载应用、清除数据分区或重写整个设备(或更糟),则无法恢复。系统一直会记录此级别的日志。一般情况下,最好向统计信息收集服务器报告能够说明 ERROR 级别的一些日志记录情况的问题。</li>
+<li><code>WARNING</code>:在出现比较严重和意外的情况时使用。例如,某些事件会导致用户可见的后果,但是通过执行某些明确的操作(从等待或重启应用,一直到重新下载新版应用或重新启动设备)可在不丢失数据的情况下恢复。系统一直会记录此级别的日志。可以考虑向统计信息收集服务器报告能够说明 WARNING 级别的一些日志记录情况的问题。</li>
+<li><code>INFORMATIVE:</code>用于记录大多数人感兴趣的信息。例如,当检测到某种情况会造成广泛的影响时,尽管不一定是错误,系统也会记录下来。这种情况应该仅由一个被视为该领域最具权威性的模块来记录(避免由非权威组件重复记录)。系统一直会记录此级别的日志。
+</li>
+<li><code>DEBUG</code>:用于进一步记录设备上发生的可能与调查和调试意外行为相关的情况。您应该只记录收集有关组件的足够信息所需的信息。如果您的调试日志是主要日志,那么您可能应采用 VERBOSE 级别的日志记录。
+<p>系统会记录此级别的日志(即使在发布版本中),并且周围要有 <code>if (LOCAL_LOG)</code> 或 <code>if (LOCAL_LOGD)</code> 块,其中 <code>LOCAL_LOG[D]</code> 在您的类或子组件中定义。这样一来,系统有可能停用所有此类日志记录。因此,<code>if (LOCAL_LOG)</code> 块中不得包含有效逻辑。为日志编译的所有字符串也需要放在 <code>if
+(LOCAL_LOG)</code> 块中。如果日志记录调用会导致字符串编译在 <code>if (LOCAL_LOG)</code> 块之外发生,则不应将其重构为方法调用。</p>
+<p>有些代码仍然在使用 <code>if (localLOGV)</code>。虽然名称并不规范,但也可接受。</p>
+</li>
+<li><code>VERBOSE</code>:用于记录其他所有信息。系统仅针对调试版本记录此级别的日志,并且周围要有 <code>if (LOCAL_LOGV)</code> 块(或同类块),以便能够默认编译。所有字符串编译都将从发布版本中删除,并且需要在 <code>if (LOCAL_LOGV)</code> 块中显示。
+</li>
+</ul>
+<p><em>注意事项:</em> </p>
+<ul>
+<li>在指定模块中,除了 VERBOSE 级别之外,一个错误应该只报告一次(如果可能的话)。在模块内的单个函数调用链中,只有最内层的函数应当返回错误,同一模块中的调用者只能添加一些明显有助于隔离问题的日志记录。</li>
+<li>在一个模块链中,除了 VERBOSE 级别之外,当较低级别的模块检测到来自较高级别模块的无效数据时,低级模块应该只在 DEBUG 日志中记录该情况,并且仅当该日志提供的信息对调用者来说无法获取时进行记录。具体来说,当抛出异常(异常中应该会包含所有相关信息)或者所记录的所有信息都包含在错误代码中时,则不需要记录此类情况。这在框架和应用之间的交互中尤为重要,而且由第三方应用造成的情况经过框架妥善处理后,不应该触发高于 DEBUG 级别的日志记录。应该触发 INFORMATIVE 级别或更高级别日志记录的唯一情况是,模块或应用在其自身级别或更低级别检测到错误。</li>
+<li>当事实证明某些日志记录可能会发生多次时,最好实施一种频率限制机制来防止出现具有相同(或非常相似)信息的大量重复日志副本。</li>
+<li>失去网络连接属于完全在预期之内的常见情况,没必要记录下来。如果失去网络连接后导致在应用内出现某种后果,则应该记录为 DEBUG 或 VERBOSE 级别(具体取决于后果是否足够严重以及足够意外,足以记录在发布版本中)。</li>
+<li>如果在第三方应用可访问或代表第三方应用的文件系统上拥有完整的文件系统,则不应该记录高于 INFORMATIVE 级别的日志。</li>
+<li>来自任何不受信任来源(包括共享存储空间中的任何文件或通过任何网络连接获取的数据)的无效数据被视为符合预期,在被检测到无效时不应触发高于 DEBUG 级别的任何日志记录(甚至应该尽可能地限制日志记录)。</li>
+<li>请注意,在对 String 使用 <code>+</code> 运算符时,它会隐式创建一个具有默认缓冲区(大小为 16 个字符)的 <code>StringBuilder</code>,还可能会创建其他临时 String 对象。例如,显式创建 StringBuilder 并不比依赖默认的“+”运算符成本更高(实际上可能更高效)。请注意,即使没有读取日志信息,调用 <code>Log.v()</code> 的代码也会在发布版本中进行编译和执行,包括编译字符串。</li>
+<li>任何供其他人阅读并且在发布版本中提供的日志记录都应当简洁明了、合理易懂。这包括一直到 DEBUG 级别的所有日志记录。</li>
+<li>在内容有意义的情况下尽可能使日志记录在一行之内。一行长度在 80 到 100 个字符内是完全可以接受的,应当尽可能避免长度超过 130 或 160 个字符(包括标记的长度)。</li>
+<li>绝不能使用高于 VERBOSE 级别的日志记录报告成功事件。</li>
+<li>用于诊断难以重现的问题的临时日志记录应采用 DEBUG 或 VERBOSE 级别,并且应当包裹在 if 块中,以便在编译期间将其完全停用。</li>
+<li>请务必谨慎,避免在日志中泄露安全方面的信息。应避免提供个人信息,且必须避免提供有关受保护内容的信息。这在编写框架代码时尤为重要,因为事先无法轻易得知哪些是个人信息或受保护的内容,哪些不是。</li>
+<li>请勿使用 <code>System.out.println()</code>(或针对原生代码使用 <code>printf()</code>)。System.out 和 System.err 会重定向到 /dev/null,因此您的 print 语句不会产生可见效果。不过,为这些调用编译的所有字符串仍会得以执行。</li>
+<li><em>日志记录的黄金法则是,您的日志不一定要将其他日志排挤出缓冲区,正如其他日志不会这样对您的日志一样。</em></li>
+</ul>
+
+<h3 id="be-consistent">保持一致</h3>
+<p>总而言之:保持一致。如果您正在修改代码,请花几分钟时间看一下周围的代码并确定其样式。如果该代码在 if 语句周围使用空格,那么您也应该这样做。如果代码备注的周围是用星号组成的小方框,您也应该将备注放在这样的小方框内。</p>
+<p>制定样式规范的目的是整理出通用的编码词汇表,以便人们可以专注于您所说的内容,而不是您表达的方式。我们在此提出整体样式规则,让用户都知道这一词汇表,但局部样式也很重要。如果您添加到文件的代码看起来与其周围的现有代码明显不同,那么当读者读到此处时,这些代码会打乱他们的节奏。请尽量避免这种情况。</p>
+
+<h2 id="javatests-style-rules">Javatests 样式规则</h2>
+<p>请遵循测试方法的命名规范,并使用下划线将被测试的内容与被测试的具体情况区分开来。这种样式可让您更容易看出正在测试的情况。例如:</p>
+<pre><code>testMethod_specificCase1 testMethod_specificCase2
+
+void testIsDistinguishable_protanopia() {
+    ColorMatcher colorMatcher = new ColorMatcher(PROTANOPIA)
+    assertFalse(colorMatcher.isDistinguishable(Color.RED, Color.BLACK))
+    assertTrue(colorMatcher.isDistinguishable(Color.X, Color.Y))
+}
+</code></pre>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/community.html b/zh-cn/setup/community.html
new file mode 100644
index 0000000..0f5af38
--- /dev/null
+++ b/zh-cn/setup/community.html
@@ -0,0 +1,236 @@
+<html devsite><head>
+    <title>Android 社区</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>欢迎加入 Android 社区!</p>
+
+<p>任何社区取得成功的关键都是良好的沟通。和大多数项目一样,Android 项目也是通过邮件列表/论坛进行沟通。由于 Android 是一个非常大的项目,包含很多组件,因此我们开设了许多论坛,而且每个论坛所侧重的主题都各不相同。您可以查看我们开设的<a href="#open-source-project-discussions">网上论坛</a>,并可以加入任何您感兴趣的论坛。您还可以在 <a href="#android-on-irc">IRC</a> 上讨论 Android。</p>
+
+<p>如果您需要 Android 界面或 Android 设备方面的帮助,想要详细了解 Android 更新或安全问题,或想要了解如何打造适用于 Android 平台的应用,请参阅下文中列出的<a href="#resources">资源</a>。</p>
+
+<h2 id="resources">资源</h2>
+
+<p>本网站介绍了如何构建自定义 Android 堆栈、如何为设备和配件移植 Android,以及如何满足兼容性要求。Android 操作系统是一个包含众多文件的 Git 代码库,而不是可供下载的单个文件(.zip、.tar、.exe 等)。您可以按照<a href="downloading.html">下载源代码</a>页面中的说明着手进行 Android 源代码工作。如需 Android 的其他相关信息,请参阅以下资源。</p>
+
+<table class="columns">
+
+<tbody><tr><td>
+<h4>使用 Android</h4>
+
+<h5>帮助中心</h5>
+<a href="https://support.google.com/android/">概述</a><br />
+<a href="https://support.google.com/pixelphone/">Pixel 手机</a><br />
+<a href="https://support.google.com/nexus/">Nexus 手机/平板电脑</a><br />
+<a href="https://support.google.com/playedition">Google Play 版设备</a><br />
+<a href="https://support.google.com/androidauto/">Android Auto</a><br />
+<a href="https://support.google.com/androidtv/">Android TV</a><br />
+<a href="https://support.google.com/androidwear/">Android Wear</a><br />
+<a href="https://support.google.com/android/answer/3123680">应用</a>
+<p></p>
+
+<h5>社区</h5>
+<a href="#open-source-project-discussions">AOSP 社区</a><br />
+<a href="http://developer.android.com/support.html">开发者社区</a>
+<p></p>
+
+<h5>发送反馈</h5>
+<a href="/setup/report-bugs.html">报告 AOSP 错误</a><br />
+<p></p>
+
+</td>
+<td>
+
+<h4>更新和安全</h4>
+
+<h5>Android 版本</h5>
+<a href="https://www.android.com/history/#/marshmallow">Android 发展历程</a><br />
+<a href="https://www.android.com/versions/nougat-7-0/">当前版本</a>
+<p></p>
+
+<h5>设备映像</h5>
+<a href="https://developers.google.com/android/images">Nexus 和 Pixel 设备</a><br />
+<a href="https://support.google.com/android/answer/3094742">其他设备</a>
+<p></p>
+
+<h5>安全方面的帮助</h5>
+<a href="https://www.google.com/safetycenter/everyone/start/">Google 安全中心</a><br />
+<a href="https://support.google.com/android/answer/6215472">面向用户的提示</a><br />
+<a href="http://developer.android.com/training/articles/security-tips.html">面向开发者的提示</a><br />
+<a href="/security/index.html">平台安全</a>
+<p></p>
+
+<h5>安全公告</h5>
+<a href="/security/enhancements/index.html">版本增强功能</a><br />
+<a href="/security/bulletin/index.html">公告</a>
+<p></p>
+
+</td>
+<td>
+
+<h4>参与其中</h4>
+
+<h5>开发者资源</h5>
+<a href="http://developer.android.com/">Developer.android.com</a><br />
+<a href="http://developer.android.com/support.html">开发者支持</a><br />
+<a href="http://android-developers.blogspot.com/">Android 开发者博客</a><br />
+<a href="https://developers.google.com/groups/">Google Developer Groups (GDG)</a><br />
+<a href="https://www.android.com/gms/">Google 移动服务 (GMS)</a>
+<p></p>
+
+<h5>培训</h5>
+<a href="https://developer.android.com/training/index.html">Google</a><br />
+<a href="https://www.udacity.com/google">Udacity</a>
+
+</td></tr><tr>
+</tr></tbody></table>
+
+<h2 id="open-source-project-discussions">开源项目论坛</h2>
+<ul>
+<li>
+<p>android-platform:此论坛用于围绕 Android 开源项目或平台技术进行一般讨论。<em></em></p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-platform">android-platform</a></li>
+<li>通过电子邮件订阅:<a href="mailto:[email protected]">android-platform</a>
+</li>
+</ul>
+</li>
+<li>
+<p>android-building:订阅此论坛后,您可以参与 Android 源代码编译以及 Android 编译系统方面的讨论,并提供或获取相关帮助。<em></em>如果您刚刚校验了源代码,并对如何将其转换为二进制文件有疑问,那就从这里开始吧!</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-building">android-building</a></li>
+<li>通过电子邮件订阅:<a href="mailto:[email protected]">android-building</a>
+</li>
+</ul>
+</li>
+<li>
+<p><em></em>android-porting:此论坛适合希望将 Android 移植到新设备的开发者。如果您想知道如何将 Android 源代码与硬件结合起来,该论坛非常适合您。您可以在此处讨论将 Android 移植到各种设备的细节,例如获取工具链、合并内核驱动程序、根据您的具体配置来设置或修改应用,等等。</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-porting">android-porting</a></li>
+<li>通过电子邮件订阅:<a href="mailto:[email protected]">android-porting</a>
+</li>
+</ul>
+</li>
+<li>
+<p>android-contrib:此论坛适合想要为 Android 贡献代码的开发者。<em></em>这是一个工作论坛,不适合进行一般讨论。要进行一般讨论,请使用 android-platform(有关为 Android 内核做贡献方面的讨论,请使用 android-kernel)。</p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-contrib">android-contrib</a></li>
+<li>通过电子邮件订阅:<a href="mailto:[email protected]">android-contrib</a>
+</li>
+</ul>
+</li>
+<li>
+<p>android-kernel:此论坛适合想要为 Android 设备使用的 Linux 内核做贡献的开发者。<em></em>如果您已下载内核代码,知道如何对其进行编译,并希望编写内核代码来支持 Android,这里非常适合您。此论坛不适合讨论用户空间方面的主题(请使用 android-platform);如果您在这里询问用户空间方面的问题,其他人将会制止您,让您不要再“捣乱”。<em></em></p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-kernel">android-kernel</a></li>
+<li>通过电子邮件订阅:<a href="mailto:[email protected]">android-kernel</a>
+</li>
+</ul>
+</li><li>
+<p>android-ota:此论坛适合研究 Android OTA 系统(生成 OTA 的恢复映像和脚本)的开发者。<em></em></p>
+<ul>
+<li>通过 Google 网上论坛订阅:<a href="https://groups.google.com/forum/?fromgroups#!forum/android-ota">android-ota</a></li>
+<li>通过电子邮件订阅:<a href="mailto:[email protected]">android-ota</a></li>
+</ul>
+</li>
+</ul>
+
+<h3 id="audience">受众群体</h3>
+<p>这些论坛适合使用 Android 平台的开发者。我们欢迎每个人加入论坛,但前提是要遵守下述社区政策。我们的用户会互相帮助,包括“开放手机联盟”(Open Handset Alliance) 成员在内的很多专家也会在这些论坛中发帖。</p>
+<p>只要主题在某种程度上与 Android 相关,我们都不会加以限制。不过,由于这些论坛非常繁忙,因此在发帖提问之前请先在归档内容中搜索一下,您也许会发现自己的问题已经有人解答过了。</p>
+
+<h3 id="getting-the-most-from-our-lists">充分利用我们的论坛</h3>
+<p>在我们的论坛中发帖之前,请注意以下事项:</p>
+<ul>
+<li>
+<p><em>阅读<a href="#mailing">我们的论坛章程</a>。</em> 该章程阐述了我们社区为数不多的规则和指南。</p>
+</li>
+<li>
+<p><em>在论坛归档内容中搜索一下,看看您的问题是不是已经讨论过了。</em> 这有助于避免耗时的重复讨论。</p>
+</li>
+<li>
+<p><em>使用明确、相关的内容主题。</em> 这对每个人都会有所帮助,包括那些尝试回答您问题的人,以及可能在日后查找相关信息的人。</p>
+</li>
+<li>
+<p><em>在您的帖子中提供充足的详细信息。</em> 提供代码或日志片段、屏幕截图标注以及类似的详细信息有助于获得更理想的结果,并能促成更有效的讨论。如需在提问时如何措辞方面的实用指导,请参阅<a href="http://www.catb.org/%7Eesr/faqs/smart-questions.html">提问的智慧</a>。</p>
+</li>
+</ul>
+
+<h3 id="mailing">论坛规则</h3>
+<p>我们喜欢简单,讨厌各种限制,因此我们的政策极其简要。以下规则说明了我们对 Android 论坛订阅者的要求。
+
+</p><ul>
+<li>请保持友善的态度:对他人保持礼貌和尊重是 Android 文化的重要组成部分,我们希望参与 Android 社区的每个人都和我们一样毫无保留地接受这一点。<em></em>保持礼貌并不意味着我们彼此之间不能以具有建设性的方式表达异议,但我们在表达异议时必须要有礼貌。无论出于任何原因,都不能敌视或轻视任何人;如果您认为自己有这种情绪,那么在发帖之前请三思。移动开发是一项非常严肃的业务,但也有很多乐趣。让我们保持这种状态,努力打造最友善的开放源代码社区之一。
+</li>
+<li>允许讨论的主题:我们的大多数论坛都用于讨论与 Android 相关的技术话题或方便用户互相帮助。<em></em>一般情况下,我们不会对在论坛中讨论的主题进行严格限制:只要主题在某种程度上与 Android 相关,都可以在我们的论坛中进行讨论。我们欢迎大家公布和讨论与 Android 相关的产品、库、出版物和其他有趣的新闻,但请不要同时在多个论坛中发帖。请仅在与您的内容最相关的论坛中发帖。我们甚至欢迎讨论批判 Android 的文章和想法(但请保持礼貌!)- 毕竟,如果我们不听取意见,就无法改进。
+</li>
+<li>工作论坛:我们的某些论坛被视为“工作论坛”(旨在为特定任务提供支持)。<em></em>在这些论坛中,我们不欢迎与主题无关的讨论。如果您要进行一般讨论,我们通常会要求您使用其他论坛。由于人们会利用这些论坛来完成相关工作,因此我们会采取积极的举措来减少无关的内容。我们希望您能够尊重贡献者们的宝贵时间,并使用适当的论坛进行一般讨论。
+</li>
+<li>垃圾内容:我们非常讨厌垃圾内容,这种心情正如我们崇尚礼貌和尊重一样强烈,因此我们保留限制垃圾讨论内容的权利。<em></em>如果有人发布纯属垃圾的内容,我们会立即并永久禁止发布者使用相应论坛。
+</li>
+</ul>
+<p>友善是最重要的规则。请谨记:在任何情况下,我们的社区都不欢迎不尊重他人和粗鲁的行为。我们没有制定正式的政策来对付捣乱者,也希望永远都不需要制定这样的政策。也就是说,我们承诺会尽最大努力保证公平,并且我们始终会先尝试警告对方,警告无果后再禁止其使用相应论坛。</p>
+
+<h3 id="contacting">与管理员联系</h3>
+<p>如果您发现有人言行粗鲁,请制止他们。您也是相应论坛的一份子,因此您不必因为他人的无礼行为不是针对您而予以容忍。切记要有礼有节!请勿火上浇油。</p>
+<p>不过,如果您发现难以容忍的违规行为,想要举报垃圾内容,有强烈意见或想与管理员交流,请随时与论坛所有者联系。这是我们的职责所在!</p>
+
+<h3 id="using-email-with-google-groups">通过电子邮件参与 Google 网上论坛</h3>
+<p>您可以使用任意电子邮件客户端参与论坛交流,而不必使用 <a href="https://groups.google.com/">Google 网上论坛</a>网站。要在不使用 Google 网上论坛网站的情况下订阅某个论坛,请使用上文列表中“通过电子邮件订阅”后的链接。</p>
+<p>要设置如何通过电子邮件接收论坛帖子,请执行以下操作:</p>
+<ol>
+<li>
+<p>通过 Google 网上论坛网站登录到相应论坛。例如,对于 android-platform 论坛,请使用 <a href="https://groups.google.com/forum/?fromgroups#!forum/android-platform">https://groups.google.com/forum/?fromgroups#!forum/android-platform</a>。</p>
+</li>
+<li>
+<p>点击右侧的“我的成员资格”。</p>
+</li>
+<li>
+<p>在“您想如何阅读该论坛”下选择一个电子邮件选项。</p>
+</li>
+</ol>
+<h2 id="android-on-irc">在 IRC 上讨论 Android</h2>
+<p>Android 在 <a href="http://freenode.net/">freenode</a> 上有 IRC 频道。我们在 <a href="irc://irc.freenode.net/">irc.freenode.net</a> 上维护着两个官方 IRC 频道(通过该网站的 <a href="http://webchat.freenode.net/">freenode webchat</a> 访问)</p>
+<ul>
+<li>
+<p><a href="irc://irc.freenode.net/android">#android</a> - 用于讨论一般性 Android 问题和移植问题</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-dev">#android-dev</a> - 用于讨论编写 Android 应用方面的问题</p>
+</li>
+</ul>
+<p>该社区还有几个不受正式管理的非官方频道。<em></em>“开放手机联盟”不为非官方频道背书,并且我们不提供任何明示或暗示的保证,因此使用这些频道时您要自行承担风险。下面列出了几个非官方频道(可能还有更多):</p>
+
+<ul>
+<li>
+<p><a href="irc://irc.freenode.net/android-firehose">#android-firehose</a> - 实时显示提交到 Android 开源项目的内容</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-fr">#android-fr</a> - pour discuter d'Android en français</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-offtopic">#android-offtopic</a> - 用于题外话讨论</p>
+</li>
+<li>
+<p><a href="irc://irc.freenode.net/android-root">#android-root</a> - 用于讨论与硬件非正规用法有关的问题</p>
+</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/contributing.html b/zh-cn/setup/contributing.html
new file mode 100644
index 0000000..d572c13
--- /dev/null
+++ b/zh-cn/setup/contributing.html
@@ -0,0 +1,40 @@
+<html devsite><head>
+    <title>做出贡献</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>感谢您对 Android 的关注!您可以通过以下几种方式进入 Android 的世界并帮助我们改进 Android。如需了解 Android 项目的背景和我们的目标,请查看<a href="/setup/index.html">概览</a>页面。</p>
+<h2 id="report-bugs">报告错误</h2>
+
+<p>您可以帮助我们改进 Android 的最简单和最有效的方式之一是提交错误。如需了解详情,请访问<a href="report-bugs.html">报告错误</a>页面。</p>
+<p>请注意,我们无法保证会在任何特定版本中修复任何特定错误。要了解在您报告错误之后它们会经历些什么,请阅读<a href="life-of-a-bug.html">错误的生命周期</a>。</p>
+
+<h2 id="develop-apps">开发应用</h2>
+<p>我们构建 Android 的一个目标就是方便所有开发者通过一个开放的平台向用户分发应用。您可以帮助 Android 的最佳方式之一就是编写用户喜欢的超酷应用!</p>
+
+<p>要开始开发应用,请访问 <a href="https://developer.android.com">developer.android.com</a>。该网站为您提供了使用 SDK 编写适用于 Android 兼容设备的应用所需的信息和工具。</p>
+
+<h2 id="contribute-to-the-code">贡献代码</h2>
+<p>代码是一切的基础。我们很乐意审核您提交的任何更改,因此请检查我们的源代码,找出错误或功能方面的可改进之处,然后开始编码。请注意,您提交的补丁程序越小、越有针对性,就越方便我们进行审核。</p>
+
+<p>要开始帮助改进 Android,您可以通过左侧的链接了解<a href="life-of-a-patch.html">补丁程序的生命周期</a>、<code>git</code>、<code>repo</code> 以及其他工具。您还可以在我们的 <a href="https://android-review.googlesource.com/">Gerrit 服务器</a>上查看所有贡献的动态。
+如果您在此过程中需要帮助,可以加入我们的<a href="/setup/community.html">论坛</a>。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/developing.html b/zh-cn/setup/developing.html
new file mode 100644
index 0000000..e20804e
--- /dev/null
+++ b/zh-cn/setup/developing.html
@@ -0,0 +1,174 @@
+<html devsite><head>
+    <title>开发</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>要处理 Android 代码,您需要同时使用 Git 和 Repo。在大多数情况下,您可以仅使用 Git(不必使用 Repo),或结合使用 Repo 和 Git 命令以组成复杂的命令。不过,使用 Repo 执行基本的跨网络操作可大大简化您的工作。</p>
+<p><strong>Git</strong> 是一个开放源代码的版本控制系统,专用于处理分布在多个代码库上的大型项目。在 Android 环境中,我们会使用 Git 执行本地操作,例如建立本地分支、提交、查看更改、修改。打造 Android 项目所面临的挑战之一就是确定如何最好地支持外部社区 - 从业余爱好者社区到生产大众消费类设备的大型原始设备制造商 (OEM)。我们希望组件可以替换,并希望有趣的组件能够在 Android 之外自行发展。我们最初决定使用一种分布式修订版本控制系统,经过筛选,最后选中了 Git。</p>
+<p><strong>Repo</strong> 是我们以 Git 为基础构建的代码库管理工具。Repo 可以在必要时整合多个 Git 代码库,将相关内容上传到我们的<a href="https://android-review.googlesource.com/">修订版本控制系统</a>,并自动执行 Android 开发工作流程的部分环节。Repo 并非用来取代 Git,只是为了让您在 Android 环境中更轻松地使用 Git。Repo 命令是一段可执行的 Python 脚本,您可以将其放在路径中的任何位置。使用 Android 源代码文件时,您可以使用 Repo 执行跨网络操作。例如,您可以借助单个 Repo 命令,将文件从多个代码库下载到本地工作目录。</p>
+<p><strong>Gerrit</strong> 是一个基于网页的代码审核系统,适用于使用 Git 的项目。Gerrit 允许所有授权用户提交更改(如果通过代码审核,这些更改会自动纳入项目中),以此鼓励他们更集中地使用 Git。此外,Gerrit 可以在浏览器中并排显示更改,并支持代码内注释,使得审核工作变得更轻松。</p>
+<p><strong>Android Studio</strong> 是用于开发 Android 应用的官方集成开发环境 (IDE)。如需了解详情,请参阅 <a href="http://developer.android.com/tools/studio/index.html">Android Studio 概览</a>。
+
+</p><h2 id="basic-workflow">基本工作流程</h2>
+<div class="attempt-right" style="width:200px">
+  <img src="/images/submit-patches-0.png" alt="基本工作流程示意图" height="153px"/>
+  <p class="img-caption">
+    <strong>图 1.</strong> Android 基本工作流程</p>
+</div>
+
+<p>与代码库进行交互的基本模式如下:</p>
+<ol>
+<li>
+<p>使用 <code>repo start</code> 新建一个主题分支。</p>
+</li>
+<li>
+<p>修改文件。</p>
+</li>
+<li>
+<p>使用 <code>git add</code> 暂存更改。</p>
+</li>
+<li>
+<p>使用 <code>git commit</code> 提交更改。</p>
+</li>
+<li>
+<p>使用 <code>repo upload</code> 将更改上传到审核服务器。</p>
+</li>
+</ol>
+<h2 id="task-reference">任务参考</h2>
+<p>以下任务列表简要总结了如何执行常见的 Repo 和 Git 任务。
+要了解如何使用 Repo 下载源代码,请参阅<a href="/setup/downloading.html">下载源代码</a>和<a href="/setup/using-repo.html">使用 Repo</a>。</p>
+<h2 id="synchronizing-your-client">同步客户端</h2>
+<p>要同步所有可用项目的文件,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo sync
+</pre>
+<p>要同步所选项目的文件,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo sync <var>PROJECT0 PROJECT1 ... PROJECTN</var>
+</pre>
+<h2 id="creating-topic-branches">创建主题分支</h2>
+<p>当您开始进行更改(例如当您开始处理错误或使用新功能)时,请在本地工作环境中新建一个主题分支。主题分支不是原始文件的副本;它代表着特定提交。这样一来,您可以轻松创建本地分支并在这些分支之间切换。通过使用分支,您可以将工作的某个方面与其他方面分隔开来。请参阅<a href="http://www.kernel.org/pub/software/scm/git/docs/howto/separating-topic-branches.txt">分隔主题分支</a>(一篇有关使用主题分支的趣味文章)。</p>
+<p>要使用 Repo 新建一个主题分支,请转到要修改的项目并运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo start <var>BRANCH_NAME</var> .
+</pre>
+<p>请注意,句点代表当前工作目录中的项目。要验证您的新分支是否已创建,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo status .
+</pre>
+<h2 id="using-topic-branches">使用主题分支</h2>
+<p>要将分支分配给特定项目,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo start <var>BRANCH_NAME PROJECT_NAME</var>
+</pre>
+<p>要查看所有项目的列表,请访问 <a href="https://android.googlesource.com/">android.googlesource.com</a>。再次提醒,如果您已转到特定的项目目录,可以简单地使用一个句点来表示当前项目。</p>
+
+<p>要切换到您已在本地工作环境中创建的另一个分支,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+git checkout <var>BRANCH_NAME</var>
+</pre>
+<p>要查看现有分支的列表,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+git branch
+</pre>
+<p>或</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo branches
+</pre>
+<p>当前分支的名称前面将标注星号。</p>
+<p class="note"><strong>注意</strong>:如果存在错误,可能会导致 <code>repo sync</code> 重置本地主题分支。
+如果在您运行 <code>repo sync</code> 之后,<code>git branch</code> 显示 *(无分支),请再次运行 <code>git checkout</code>。</p>
+<h2 id="staging-files">暂存文件</h2>
+<p>默认情况下,Git 会检测到您在项目中所做的更改,但不会跟踪这些更改。要让 Git 保存您的更改,您必须将更改标记为包含在提交中。这也称为“暂存”。</p>
+<p>您可以通过运行以下命令来暂存更改:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+git add
+</pre>
+<p>对于此命令,项目目录中的任何文件或目录都可作为参数。<code>git add</code> 并不像其名称表示的这样只是简单地将文件添加到 Git 代码库,它还可以用于暂存文件的修改和删除的内容。</p>
+<h2 id="viewing-client-status">查看客户端状态</h2>
+<p>要列出文件的状态,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo status
+</pre>
+<p>要查看未提交的修改,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo diff
+</pre>
+<p>如果您准备立即提交,运行 <code>repo diff</code> 命令可让系统显示您所做的不会被提交的每一项本地修改。<em></em>如果您准备立即提交,要查看将被提交的每一项修改,则需要运行 Git 命令 <code>git diff</code>。在运行该命令之前,请确保您已转到项目目录下:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">cd <var>~/WORKING_DIRECTORY/PROJECT</var></code>
+<code class="devsite-terminal">git diff --cached</code>
+</pre>
+<h2 id="committing-changes">提交更改</h2>
+<p>在 Git 中,提交是修订版本控制的基本单位,包含目录结构的快照以及整个项目的文件内容。在 Git 中创建提交很简单,只需输入以下命令即可:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+git commit
+</pre>
+<p>系统会提示您使用惯用的编辑器提供一条提交消息;请为您提交到 AOSP 的所有更改都提供一条会有帮助作用的消息。如果您没有添加日志消息,提交将会终止。</p>
+<h2 id="uploading-changes-to-gerrit">将更改上传到 Gerrit</h2>
+<p>上传之前,请先更新为最新修订版本:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo sync
+</pre>
+<p>然后运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo upload
+</pre>
+<p>运行此命令后,系统会随即列出您已提交的更改,并提示您选择要上传到审核服务器的分支。如果只有一个分支,您会看到一个简单的 <code>y/n</code> 提示符。</p>
+<h2 id="recovering-sync-conflicts">恢复同步冲突</h2>
+<p>如果 <code>repo sync</code> 显示同步冲突,请执行以下操作:</p>
+<ul>
+  <li>查看未合并的文件(状态代码 = U)。</li>
+  <li>根据需要修改存在冲突的地方。</li>
+  <li><p>在相关项目目录中进行更改,为相关文件运行 <code>git add</code> 和 <code>git commit</code>,然后对这些更改执行“衍合”(rebase) 命令。例如:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">git add .</code>
+<code class="devsite-terminal">git commit</code>
+<code class="devsite-terminal">git rebase --continue</code>
+</pre>
+  </li>
+  <li><p>当衍合完成后,再一次开始整个同步过程:</p>
+<pre class="devsite-terminal devsite-click-to-copy">repo sync <var>PROJECT0 PROJECT1 ... PROJECTN</var></pre>
+  </li>
+</ul>
+
+<h2 id="cleaning-up-your-client-files">清理您的客户端文件</h2>
+<p>要在更改合并到 Gerrit 中后更新您的本地工作目录,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo sync
+</pre>
+<p>要安全移除已过时的主题分支,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo prune
+</pre>
+
+<h2 id="deleting-a-client">删除客户端</h2>
+<p>由于所有状态信息都会存储在客户端中,您只需从文件系统中删除相应目录即可:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+rm -rf <var>WORKING_DIRECTORY</var>
+</pre>
+<p>删除客户端将永久删除您尚未上传以供审核的任何更改。<em></em></p>
+<h2 id="git-and-repo-cheatsheet">Git 和 Repo 快速参考表</h2>
+<img src="/images/git-repo-1.png" alt="基本 Git 和 Repo 命令列表" id="figure2"/>
+<p class="img-caption">
+  <strong>图 2.</strong> 基本 Git 和 Repo 命令
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/devices.html b/zh-cn/setup/devices.html
new file mode 100644
index 0000000..13d4117
--- /dev/null
+++ b/zh-cn/setup/devices.html
@@ -0,0 +1,301 @@
+<html devsite><head>
+    <title>使用参考开发板</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>您可以使用 Android 开源项目 (AOSP) 细分版本和针对特定硬件的相关二进制文件来开发适用于 Nexus 设备的细分版本。要查看可用的 Android 细分版本和针对的设备,请参阅<a href="/setup/build-numbers.html#source-code-tags-and-builds">源代码、标记和细分版本</a>。</p>
+
+<p>您也可以开发适用于 <a href="https://android.googlesource.com/device/linaro/hikey/" class="external">HiKey</a> Android 参考开发板的细分版本,此类参考开发板旨在协助非 Nexus 组件供应商开发驱动程序并将其移植到各 Android 版本。使用参考开发板可以简化升级工作,缩短将新 Android 设备推向市场所需的时间,降低设备成本(因为使用参考开发板时,原始设计制造商 (ODM)/原始设备制造商 (OEM) 可以从更多兼容组件中进行选择),并加快组件供应商的创新速度。</p>
+
+<p>Google 支持使用经 <a href="#960hikey">HiKey960</a> 和 <a href="#620hikey">HiKey</a> 认证的 <a href="https://www.96boards.org/products/ce/" class="external">96Boards</a> 作为 Android 参考开发板。AOSP 可为 HiKey 提供内核源代码和开发板支持,这样开发者就能够以更低的原始设备制造商 (OEM) 费用轻松开发和调试新的及现有的外围设备驱动程序、进行内核开发,以及执行其他任务。要开发采用新传感器或 LED 的新 ContextHub 功能,您还可以使用连接到 HiKey 或 HiKey960 开发板的 <a href="#neonkey">Neonkey SensorHub</a>。</p>
+
+<h2 id="960hikey">HiKey960 开发板</h2>
+
+<p>HiKey960 开发板由 LeMaker(通过 <a href="https://www.amazon.com/dp/B071RD3V34" class="external">Amazon.com</a>)和 <a href="http://www.lenovator.com/product/80.html" class="external">Lenovator</a><a> 提供,采用 3GB RAM 配置。
+</a></p><a>
+
+<img src="images/hikey960.png" alt="HiKey960 开发板图片"/>
+<figcaption><strong>图 1.</strong> Lenovator 提供的 HiKey960 开发板</figcaption>
+
+<p>其他资源:</p>
+</a><ul><a>
+</a><li><a>
+</a><a href="https://github.com/96boards/documentation/blob/master/ConsumerEdition/HiKey960/HardwareDocs/HiKey960_Schematics.pdf" class="external">HiKey960 示意图</a></li>
+<li>
+<a href="http://www.96boards.org/documentation/ConsumerEdition/HiKey960/HardwareDocs/HardwareUserManual.md/" class="external">HiKey960 用户指南</a></li>
+<li>
+<a href="https://github.com/96boards/documentation/wiki/" class="external">96boards Wiki</a></li>
+</ul>
+
+<p>您可以使用以下命令下载、编译 Android 并在 HiKey960 开发板上运行 Android。</p>
+
+<h3 id="960userspace">编译用户空间</h3>
+<ol>
+  <li>下载 Android 源代码树:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">repo init -u <a href="https://android.googlesource.com/platform/manifest">https://android.googlesource.com/platform/manifest</a> -b master</code>
+<code class="devsite-terminal">repo sync -j24</code>
+</pre>
+  </li>
+  <li>下载二进制文件,并将其解压到 Android 源代码树中:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">wget https://dl.google.com/dl/android/aosp/arm-hikey960-OPR-cf4e0c80.tgz</code>
+<code class="devsite-terminal">tar xzf arm-hikey960-OPR-cf4e0c80.tgz</code>
+<code class="devsite-terimnal">./extract-arm-hikey960.sh</code>
+</pre>
+  </li>
+  <li>编译:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">. ./build/envsetup.sh</code>
+<code class="devsite-terminal">lunch hikey960-userdebug</code>
+<code class="devsite-terminal">make -j32</code>
+</pre>
+  </li>
+</ol>
+
+<h3 id="960fastboot">安装初始映像</h3>
+<ol>
+  <li>打开开关 1 和 3,从而选择 fastboot 模式(有关详情,请参阅 HiKey960 用户指南)。</li>
+  <li>为开发板接通电源。</li>
+  <li>将初始映像刷到设备上:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">cd device/linaro/hikey/installer/hikey960</code>
+<code class="devsite-terminal">./flash-all.sh</code>
+</pre>
+  </li>
+  <li>关闭开关 3,然后重启开发板。</li>
+</ol>
+
+<h3 id="960images">将映像刷到设备上</h3>
+<ol>
+  <li>打开开关 1 和 3,从而进入 fastboot 模式。</li>
+  <li>通过运行以下命令将映像刷到设备上:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">fastboot flash boot out/target/product/hikey960/boot.img</code>
+<code class="devsite-terminal">fastboot flash dts out/target/product/hikey960/dt.img</code>
+<code class="devsite-terminal">fastboot flash system out/target/product/hikey960/system.img</code>
+<code class="devsite-terminal">fastboot flash cache out/target/product/hikey960/cache.img</code>
+<code class="devsite-terminal">fastboot flash userdata out/target/product/hikey960/userdata.img</code>
+</pre>
+  </li>
+  <li>关闭开关 3,然后重启开发板。</li>
+</ol>
+
+<h3 id="960kernel">编译内核</h3>
+<ol>
+  <li>运行以下命令:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">git clone <a href="https://android.googlesource.com/kernel/hikey-linaro">https://android.googlesource.com/kernel/hikey-linaro</a></code>
+<code class="devsite-terminal">cd hikey-linaro</code>
+<code class="devsite-terminal">git checkout -b android-hikey-linaro-4.9 origin/android-hikey-linaro-4.9</code>
+<code class="devsite-terminal">make ARCH=arm64 hikey960_defconfig</code>
+<code class="devsite-terminal">make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- -j24</code>
+</pre>
+  </li>
+  <li>更新启动映像中的内核。
+    <ul>
+      <li>将 <code>hi3660-hikey960.dtb</code> (<code>arch/arm64/boot/dts/hisilicon/hi3660-hikey960.dtb</code>) 复制到 <code>hikey-kernel</code> 目录,并将其重命名为 <code>hi3660-hikey960.dtb-4.9</code></li>
+      <li>将映像文件 <code>(arch/arm64/boot/Image.gz</code>) 复制到 <code>hikey-kernel</code> 目录,并将其重命名为 <code>Image.gz-hikey960-4.9</code></li>
+    </ul>
+  </li><li>制作启动映像:
+<pre class="devsite-terminal devsite-click-to-copy">
+make bootimage -j24
+</pre>
+  </li>
+</ol>
+
+<h3 id="960serial">设置序列号</h3>
+<p>要设置随机序列号,请运行以下命令:
+</p><pre class="devsite-terminal devsite-click-to-copy">
+fastboot getvar nve:SN@<var>16_DIGIT_NUMBER</var>
+</pre>
+<p>引导加载程序通过 <code>androidboot.serialno=</code> 将生成的序列号导出到内核。
+
+</p><h3 id="960resolution">设置显示器分辨率</h3>
+<p>修改 <code>device/linaro/hikey/hikey960/BoardConfig.mk</code> 参数 <code>BOARD_KERNEL_CMDLINE</code>,并配置 <code>video</code> 设置。
+以下是针对 24 英寸显示器的示例设置:<code>video=HDMI-A-1:1280x800@60</code>。
+</p>
+
+<h2 id="620hikey">HiKey 开发板</h2>
+
+<p>HiKey 开发板(也称为 HiKey620)由 <a href="http://www.lenovator.com" class="external">Lenovator</a> 提供,有 <a href="http://www.lenovator.com/product/86.html" class="external">1GB RAM</a> 和 <a href="http://www.lenovator.com/product/90.html" class="external">2GB RAM</a> 配置可供选择:
+</p>
+
+<img src="images/hikey620.png" alt="HiKey620 开发板图片"/>
+<figcaption><strong>图 2.</strong> Lenovator 提供的 HiKey 开发板</figcaption>
+
+<p>其他资源:</p>
+<ul>
+<li>
+<a href="https://github.com/96boards/documentation/blob/master/ConsumerEdition/HiKey/HardwareDocs/HiKey_schematics_LeMaker_version_Rev_A1.pdf" class="external">HiKey 示意图</a></li>
+<li>
+<a href="https://www.96boards.org/wp-content/uploads/2015/02/HiKey_User_Guide_Rev0.2.pdf" class="external">HiKey 用户指南</a></li>
+<li><a href="https://github.com/96boards/documentation/wiki/" class="external">96boards Wiki</a></li>
+</ul>
+
+<p>您可以使用以下命令下载、编译 Android 并在 HiKey 开发板上运行 Android。</p>
+
+<h3 id="620userspace">编译用户空间</h3>
+<ol>
+  <li>下载 Android 源代码树:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">repo init -u <a href="https://android.googlesource.com/platform/manifest">https://android.googlesource.com/platform/manifest</a> -b master</code>
+<code class="devsite-terminal">repo sync -j24</code>
+</pre>
+  </li>
+  <li>下载 HDMI 二进制文件,并将其解压到 Android 源代码树中:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">wget <a href="https://dl.google.com/dl/android/aosp/linaro-hikey-20170523-4b9ebaff.tgz">https://dl.google.com/dl/android/aosp/linaro-hikey-20170523-4b9ebaff.tgz</a></code>
+<code class="devsite-terminal">tar xzf linaro-hikey-20170523-4b9ebaff.tgz</code>
+<code class="devsite-terminal">./extract-linaro-hikey.sh</code>
+</pre>
+  </li>
+  <li>安装 mcopy 实用工具:
+<pre class="devsite-terminal devsite-click-to-copy">
+apt-get install mtools
+</pre>
+  </li>
+  <li>编译:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">. ./build/envsetup.sh</code>
+<code class="devsite-terminal">lunch hikey-userdebug</code>
+<code class="devsite-terminal">make -j32</code>
+</pre>
+  </li>
+</ol>
+
+<p class="note"><strong>注意</strong>:如果是 4GB eMMC,请不要使用 <code>$ make -j32</code>,而是要使用 <code>$ make -j32 TARGET_USERDATAIMAGE_4GB=true</code>。</p>
+
+<h3 id="620fastboot">安装初始 fastboot 和 ptable</h3>
+<ol>
+  <li>连接 J15 1-2 和 3-4 引脚,从而选择特殊的引导加载程序模式(有关详情,请参阅 <a href="https://www.96boards.org/wp-content/uploads/2015/02/HiKey_User_Guide_Rev0.2.pdf" class="external">HiKey 用户指南</a>)。</li>
+  <li>将 USB 连接到 PC,以获取 ttyUSB 设备(例如:<code>/dev/ttyUSB1</code>)。</li>
+  <li>为开发板接通电源:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">cd device/linaro/hikey/installer/hikey</code>
+<code class="devsite-terminal">./flash-all.sh /dev/ttyUSB1 [4g]</code>
+</pre>
+  </li>
+  <li>取下跳线 3-4,并为开发板接通电源。</li>
+</ol>
+
+<h3 id="620images">将映像刷到设备上</h3>
+<ol>
+  <li>连接 J15 1-2 和 5-6 引脚,从而进入 fastboot 模式。</li>
+  <li>运行以下命令:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">fastboot flash boot out/target/product/hikey/boot.img</code>
+<code class="devsite-terminal">fastboot flash -w system out/target/product/hikey/system.img</code>
+</pre>
+  </li>
+  <li>取下跳线 5-6,并为开发板接通电源。</li>
+</ol>
+
+<h3 id="620kernel">编译内核</h3>
+<ol>
+  <li>运行以下命令:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">git clone <a href="https://android.googlesource.com/kernel/hikey-linaro">https://android.googlesource.com/kernel/hikey-linaro</a></code>
+<code class="devsite-terminal">cd hikey-linaro</code>
+<code class="devsite-terminal">git checkout -b android-hikey-linaro-4.9 origin/android-hikey-linaro-4.9</code>
+<code class="devsite-terminal">make ARCH=arm64 hikey_defconfig</code>
+<code class="devsite-terminal">make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- -j24</code>
+</pre>
+  </li>
+  <li>将输出复制到 HiKey 内核目录 (<code>/kernel/hikey-linaro</code>):
+    <ul>
+      <li>将 hi6220-hikey.dtb (<code>arch/arm64/boot/dts/hisilicon/hi6220-hikey.dtb</code>) 复制到 HiKey 内核目录,并将其重命名为 hi6220-hikey.dtb-4.9。</li>
+  <li>将映像文件 <code>(arch/arm64/boot/Image-dtb</code>) 复制到 HiKey 内核目录,并将其重命名为 Image-dtb-4.9。</li>
+    </ul>
+  </li><li>制作启动映像:
+<pre class="devsite-terminal devsite-click-to-copy">
+make bootimage -j24
+</pre>
+  </li>
+</ol>
+
+<h3 id="620resolution">设置显示器分辨率</h3>
+<p>修改 <code>device/linaro/hikey/hikey/BoardConfig.mk</code> 参数 <code>BOARD_KERNEL_CMDLINE</code>,并配置 <code>video</code> 设置。
+以下是 24 英寸显示器的示例设置:<code>video=HDMI-A-1:1280x800@60</code>。</p>
+
+<h3 id="620serial">配置内核串行输出 (uart3)</h3>
+<p>将 J2 低速扩展连接器设为 1 - Gnd、11 - Rx、13 - Tx。有关详情,请参阅 <a href="https://www.96boards.org/wp-content/uploads/2015/02/HiKey_User_Guide_Rev0.2.pdf" class="external">HiKey 用户指南</a>。</p>
+
+<h2 id="neonkey">Neonkey SensorHub</h2>
+<p>要开发采用新传感器或 LED 的新 ContextHub 功能,您可以使用连接到 HiKey 或 Hikey960 开发板的 <a href="http://www.96boards.org/product/neonkey/" class="external">Neonkey SensorHub</a>。</p>
+
+<img src="images/neonkey-sensorhub.png" alt="Neonkey Sensorhub 图片"/>
+<figcaption><strong>图 3.</strong> Neonkey SensorHub</figcaption>
+
+<p>Neonkey 是 STM32F411CE 上经认证的 <a href="http://www.96boards.org/" class="external">96Boards</a> 夹层基础,具有以下组件:</p>
+
+<ul>
+<li>压力传感器:BMP280</li>
+<li>ALS/近程传感器:RPR-0521RS</li>
+<li>ARM 霍尔效应传感器:MRMS501A</li>
+<li>可支持 15 个 LED 的 LED 驱动程序:LP3943</li>
+<li>加速度计/陀螺仪 + 地磁传感器:BMI160 + BMM150</li>
+<li>温度/湿度传感器:SI7034-A10</li>
+<li>4 个 GPIO 驱动的 LED、I2C 扩展、GPIO(2 条线)扩展、JTAG 连接器</li>
+<li>NOR 闪存:512KB</li>
+<li>SRAM:128 KB,96boards LS 扩展连接器</li>
+</ul>
+
+<p>AOSP 可提供内核源代码和 ContextHub 开发板支持,以协助开发者以较低的 OEM 费用开发和调试新传感器、进行新的 HAL 和内核更改,等等。</p>
+
+<p>要编译、启用并上传 Neonkey,请执行以下操作:</p>
+
+<ol>
+<li>提取 AOSP 源代码:
+<pre class="devsite-terminal">
+repo init -u https://android.googlesource.com/platform/manifest -b master &amp; repo sync -j24
+</pre>
+</li>
+<li>编译:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">. ./build/envsetup.sh</code>
+<code class="devsite-terminal">lunch hikey-userdebug</code>
+<code class="devsite-terminal">. device/google/contexthub/firmware/toolchain-setup.sh</code>
+<code class="devsite-terminal">make -C device/google/contexthub/firmware/variant/neonkey</code>
+<code class="devsite-terminal">adb push device/google/contexthub/firmware/out/nanohub/neonkey/full.bin /data/local/tmp</code>
+</pre>
+</li>
+<li>要启用 Neonkey,请通过以下方法进入启动模式:
+<ol>
+<li>将 BOOT0 连接到 1V8(连接 JTAG P4 1-5 引脚)</li>
+<li>按住 USR 按钮</li>
+<li>按 RST 按钮</li>
+</ol>
+</li>
+<li>要上传固件,请运行以下命令:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb root</code>
+<code class="devsite-terminal">adb shell stm32_flash -u -d /dev/ttyAMA2 -e 0xffff -w /data/local/tmp/full.bin</code>
+</pre>
+</li>
+<li>要编译用户空间 HAL,请运行以下命令:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">make TARGET_SENSOR_MEZZANINE=neonkey -j24</code>
+<code class="devsite-terminal">fastboot flashall</code>
+</pre>
+</li>
+</ol>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/downloading.html b/zh-cn/setup/downloading.html
new file mode 100644
index 0000000..d2086ac
--- /dev/null
+++ b/zh-cn/setup/downloading.html
@@ -0,0 +1,194 @@
+<html devsite><head>
+    <title>下载源代码</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>Android 源代码树位于由 Google 托管的 Git 代码库中。Git 代码库中包含 Android 源代码的元数据,其中包括与对源代码进行的更改以及更改日期相关的元数据。本文档介绍了如何下载特定 Android 代码流水线的源代码树。
+</p>
+<p>
+要从特定设备的出厂映像开始,请参阅<a href="running.html#selecting-device-build">选择设备版本</a>。
+</p>
+<h2 id="installing-repo">安装 Repo</h2>
+<p>Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git。要详细了解 Repo,请参阅<a href="developing.html">开发</a>部分。
+</p>
+<p>要安装 Repo,请执行以下操作:</p>
+<ol>
+  <li>
+    <p>确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">mkdir ~/bin</code>
+<code class="devsite-terminal">PATH=~/bin:$PATH</code>
+</pre>
+  </li>
+  <li>
+    <p>下载 Repo 工具,并确保它可执行:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">curl https://storage.googleapis.com/git-repo-downloads/repo &gt; ~/bin/repo</code>
+<code class="devsite-terminal">chmod a+x ~/bin/repo</code>
+</pre>
+  </li>
+</ol>
+<p>对于 1.21 版,Repo 的 SHA-1 校验和为 b8bd1804f432ecf1bab730949c82b93b0fc5fede</p>
+<p>对于 1.22 版,Repo 的 SHA-1 校验和为 da0514e484f74648a890c0467d61ca415379f791</p>
+<p>对于 1.23 版,Repo 的 SHA-256 校验和为 e147f0392686c40cfd7d5e6f332c6ee74c4eab4d24e2694b3b0a0c037bf51dc5</p>
+<h2 id="initializing-a-repo-client">初始化 Repo 客户端</h2>
+<p>安装 Repo 后,设置您的客户端以访问 Android 源代码代码库:</p>
+<ol>
+  <li>
+    <p>创建一个空目录来存放您的工作文件。如果您使用的是 MacOS,必须在区分大小写的文件系统中创建该目录。为其指定一个您喜欢的任意名称:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">mkdir WORKING_DIRECTORY</code>
+<code class="devsite-terminal">cd WORKING_DIRECTORY</code>
+</pre>
+  </li>
+  <li>
+    <p>使用您的真实姓名和电子邮件地址配置 Git。要使用 Gerrit 代码审核工具,您需要一个与<a href="https://www.google.com/accounts">已注册的 Google 帐号</a>关联的电子邮件地址。确保这是您可以接收邮件的有效地址。您在此处提供的姓名将显示在您提交的代码的提供方信息中。
+    </p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">git config --global user.name "Your Name"</code>
+<code class="devsite-terminal">git config --global user.email "[email protected]"</code>
+</pre>
+  </li>
+  <li>
+    <p>
+运行 <code>repo init</code> 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。
+    </p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo init -u https://android.googlesource.com/platform/manifest
+</pre>
+    <p>
+要对“master”以外的分支进行校验,请使用 <code>-b</code> 来指定相应分支。要查看分支列表,请参阅<a href="build-numbers.html#source-code-tags-and-builds">源代码标记和版本</a>。
+    </p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
+</pre>
+  </li>
+</ol>
+<p>初始化成功后,系统将显示一条消息,告诉您 Repo 已在工作目录中完成初始化。客户端目录中现在应包含一个 <code>.repo</code> 目录,清单等文件将保存在该目录下。
+</p>
+<h2 id="getting-the-files">下载 Android 源代码树</h2>
+<p>要将 Android 源代码树从默认清单中指定的代码库下载到工作目录,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">repo sync</pre>
+<p>Android 源代码文件将位于工作目录中对应的项目名称下。初始同步操作将需要 1 个小时或更长时间才能完成。要详细了解 <code>repo
+  sync</code> 和其他 Repo 命令,请参阅<a href="developing.html">开发</a>部分。
+</p>
+<h2 id="using-authentication">使用身份验证</h2>
+<p>默认情况下,访问 Android 源代码均为匿名操作。为了防止服务器被过度使用,每个 IP 地址都有一个相关联的配额。
+</p>
+<p>当与其他用户共用一个 IP 地址时(例如,在越过 NAT 防火墙访问源代码代码库时),系统甚至会针对常规使用模式(例如,许多用户在短时间内从同一个 IP 地址同步新客户端)触发配额。
+</p>
+<p>在这种情况下,可以使用进行身份验证的访问方式,此类访问方式会对每位用户使用单独的配额,而不考虑 IP 地址。
+</p>
+<p>
+第一步是使用<a href="https://android.googlesource.com/new-password">密码生成器</a>生成密码,然后按照密码生成器页面中的说明进行操作。
+</p>
+<p>
+第二步是通过使用以下清单 URI,强制使用进行身份验证的访问方式:<code>https://android.googlesource.com/a/platform/manifest</code>。请注意 <code>/a/</code> 目录前缀如何触发强制性身份验证。您可以通过以下命令将现有客户端转换为使用强制性身份验证:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo init -u https://android.googlesource.com/a/platform/manifest
+</pre>
+<h2 id="troubleshooting-network-issues">排查网络问题</h2>
+<p>在使用代理的情况下下载内容(在一些企业环境中很常见)时,您可能需要明确指定 Repo 随后使用的代理:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">export HTTP_PROXY=http://&lt;proxy_user_id&gt;:&lt;proxy_password&gt;@&lt;proxy_server&gt;:&lt;proxy_port&gt;</code>
+<code class="devsite-terminal">export HTTPS_PROXY=http://&lt;proxy_user_id&gt;:&lt;proxy_password&gt;@&lt;proxy_server&gt;:&lt;proxy_port&gt;</code>
+</pre>
+<p>一种比较少见的情况是,Linux 客户端遇到连接问题,在下载期间(通常是在“正在接收对象”期间)被卡住。有人曾报告称,调整 TCP/IP 堆栈的设置并使用非并行命令可以改善这种情况。您需要拥有 root 权限才能修改 TCP 设置:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">sudo sysctl -w net.ipv4.tcp_window_scaling=0</code>
+<code class="devsite-terminal">repo sync -j1</code>
+</pre>
+<h2 id="using-a-local-mirror">使用本地镜像</h2>
+<p>当您使用多个客户端时(尤其是在带宽不足的情况下),最好为所有服务器内容创建一个本地镜像,并从该镜像同步客户端(不需要访问网络)。一个完整镜像的下载文件比两个客户端的下载文件要小一些,而且包含更多信息。
+</p>
+<p>
+以下说明假定在 <code>/usr/local/aosp/mirror</code> 中创建镜像。第一步是创建并同步镜像本身。请注意 <code>--mirror</code> 标记,该标记只能在创建新客户端时指定:
+</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">mkdir -p /usr/local/aosp/mirror</code>
+<code class="devsite-terminal">cd /usr/local/aosp/mirror</code>
+<code class="devsite-terminal">repo init -u https://android.googlesource.com/mirror/manifest --mirror</code>
+<code class="devsite-terminal">repo sync</code>
+</pre>
+<p>同步镜像后,您就可以从镜像创建新客户端了。请注意,务必要指定一个绝对路径:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">mkdir -p /usr/local/aosp/master</code>
+<code class="devsite-terminal">cd /usr/local/aosp/master</code>
+<code class="devsite-terminal">repo init -u /usr/local/aosp/mirror/platform/manifest.git</code>
+<code class="devsite-terminal">repo sync</code>
+</pre>
+<p>最后,要将客户端与服务器同步,您需要将镜像与服务器同步,然后再将客户端与镜像同步:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">cd /usr/local/aosp/mirror</code>
+<code class="devsite-terminal">repo sync</code>
+<code class="devsite-terminal">cd /usr/local/aosp/master</code>
+<code class="devsite-terminal">repo sync</code>
+</pre>
+<p>您可以将镜像存储在 LAN 服务器上,然后通过 NFS、SSH 或 Git 访问它。您还可以将其存储在移动存储盘上,并在用户之间或计算机之间传用该存储盘。
+</p>
+<h2 id="verifying-git-tags">验证 Git 标记</h2>
+<p>将以下公钥加载到您的 GnuPG 密钥数据库中。该密钥用于签署代表各版本的带注释标记。
+</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+gpg --import
+</pre>
+<p>复制并粘贴以下密钥,然后输入 EOF (Ctrl-D) 以结束输入并处理密钥。
+</p>
+<pre class="devsite-click-to-copy">
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2.2 (GNU/Linux)
+
+mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
+lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
+8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
+u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
+wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
+/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
+jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
+MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
+b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
+aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
+cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
+gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
+2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
+QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
+hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
+C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
+LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
+OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
+pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
+KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
+N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
+vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
+G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
+hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
+EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
+=Wi5D
+-----END PGP PUBLIC KEY BLOCK-----
+</pre>
+<p>导入密钥后,您可以通过以下命令验证任何标记:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+git tag -v TAG_NAME
+</pre>
+<p>
+如果您尚未<a href="initializing.html#ccache">设置 ccache</a>,现在是设置它的一个好时机。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/faqs.html b/zh-cn/setup/faqs.html
new file mode 100644
index 0000000..caaa87b
--- /dev/null
+++ b/zh-cn/setup/faqs.html
@@ -0,0 +1,126 @@
+<html devsite><head>
+    <title>常见问题解答</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.
+  -->
+
+<a name="top"></a>
+<p>要查看关于其他常见问题的解答,请参阅 developer.android.com 上的 <a href="http://developer.android.com/guide/faq/index.html">Android 常见问题解答</a>。
+
+</p><h2 id="open-source">开放源代码</h2>
+<h3 id="what-is-the-android-open-source-project">Android 开放源代码项目是什么?</h3>
+<p>我们使用“Android 开放源代码项目”或“AOSP”来表示 Android 涉及的人员、流程和源代码。</p>
+<p>人员负责监督该项目并开发实际的源代码。流程指我们为了管理该软件的开发而使用的工具和程序。该项目的最终结果是您可以用来打造手机和其他设备的源代码。</p>
+<h3 id="why-did-we-open-the-android-source-code">我们为什么开放了 Android 源代码?</h3>
+<p>根据我们自己在开发移动应用方面的经验,Google 启动了 Android 项目。我们希望确保始终有开放的平台可供运营商、原始设备制造商 (OEM) 和开发者使用,以便他们将创新的想法变为现实。我们还希望确保不存在任何集中瓶颈,这样的话,就没有任何行业参与者可以一手限制或控制任何其他参与者开展创新。Android 开放源代码项目 (AOSP) 有一个最重要的目标,就是确保尽可能广泛、尽可能兼容地实施 Android 开放源代码软件,使每个人都能从中受益。</p>
+<h3 id="what-kind-of-open-source-project-is-android">Android 是哪种开放源代码项目?</h3>
+<p>Google 负责监督 Android 开放源代码平台核心部分的开发工作,并致力于打造卓越的开发者和用户社区。在大多数情况下,Android 源代码都是根据宽松的 Apache Software License 2.0(而非“Copyleft”许可)授权用户使用。这主要是因为我们最重要的目标是让用户广泛采用该软件,而我们认为 ASL2.0 许可有助于最好地实现这一目标。</p>
+<p>您可以在我们的<a href="/setup/licenses.html">许可</a>页面中找到关于此主题的更多信息。</p>
+<h3 id="why-is-google-in-charge-of-android">为什么由 Google 主管 Android 项目?</h3>
+<p>开发软件平台是一项非常复杂的工作。开放性对于平台的长远成功至关重要,这是因为要吸引开发者投入到其中并确保公平的竞争环境,开放性必不可少。不过,平台本身也必须是对用户极具吸引力的产品。</p>
+<p>正是因为这个原因,Google 调配了必需的专业工程资源,以确保 Android 是具备充分竞争力的软件平台。Google 将 Android 项目视为一个全方位的产品开发运营项目,并致力于达成必要的业务交易,以确保运行 Android 的卓越设备能够确确实实地将其推向市场。</p>
+<p>通过确保 Android 在用户那里获得成功,我们可以帮助确保 Android 作为平台和开放源代码项目的活力。毕竟,谁不希望 Android 源代码成为一款成功的产品呢?</p>
+<p>Google 的目标是确保围绕 Android 打造一个成功的生态系统。当然,没有哪个人必须参与其中。我们开放了 Android 源代码,以便任何人都可以修改和分发该软件来满足自己的需求。</p>
+<h3 id="what-is-googles-overall-strategy-for-android-product-development">Google 在 Android 产品开发方面的总体策略是什么?</h3>
+<p>我们致力于向竞争激烈的市场推出卓越的设备。有鉴于此,我们会将开发的创新技术和增强功能纳入到下一版本的核心平台中。</p>
+<p>在实践中,这意味着 Android 工程团队通常只侧重于少数“旗舰”设备,并负责开发下一版 Android 软件来为这些产品的发布提供支持。这些旗舰设备可以消化很多产品风险,并为广泛的原始设备制造商 (OEM) 社区开辟新的道路,让他们接下来能够推出更多充分利用新功能的设备。通过这种方式,我们可以确保 Android 平台能够根据现实设备的实际需求不断发展完善。</p>
+<h3 id="how-is-the-android-software-developed">Android 软件的开发方式是怎样的?</h3>
+<p>Android 的每个平台版本(例如 1.5、1.6 等)在开放源代码树中都有对应的分支。在任何指定的时刻,最新的此类分支将被视为“当前稳定”的分支版本。这个当前稳定的分支是制造商移植到其设备的分支。该分支会始终保持适合发布的状态。</p>
+<p>同时,每个版本还有一个“当前实验性”分支,开发者可以在其中开发实验性贡献内容,例如大型的下一代功能。在适当情况下,实验性分支中的错误更正内容和其他贡献内容可以纳入到当前稳定分支中。</p>
+<p>最后,Google 会在开发旗舰设备的同时致力于开发下一版 Android 平台。在适当情况下,该分支将纳入实验性分支和稳定分支中的更改。</p>
+<p>您可以在我们的<a href="/setup/code-lines.html">代码流水线、分支和版本</a>页面中找到关于此主题的更多信息。</p>
+<h3 id="why-are-parts-of-android-developed-in-private">为什么 Android 的部分内容是在私下开发的?</h3>
+<p>将一款设备推向市场通常需要超过一年的时间。设备制造商无疑希望植入他们可以植入的最新 Android 软件。与此同时,开发者也不希望在编写应用时还要不断追用该平台的新版本。制造商和开发者都会面临及时推出自家产品与追用最新版本难以两全的状况。</p>
+<p>为了解决这个问题,下一版 Android 的部分内容(包括核心平台 API)会在私有分支中进行开发。这些 API 将纳入到下一版 Android 中。我们的目标是,在我们开发下一版平台的同时,让其他人将注意力放在当前稳定版 Android 源代码上。这样一来,开发者和原始设备制造商 (OEM) 便可以使用单个版本,而无需为了跟上 Android 开发步伐而追用尚不完善的未来版本。不过,Android 系统中与应用兼容性无关的其他部分是在开放环境中开发的。我们打算逐渐将其中更多的部分转移到开放的开发环境中。</p>
+<h3 id="when-are-source-code-releases-made">何时发布源代码?</h3>
+<p>当源代码准备就绪时发布。发布源代码是一个相当复杂的过程。Android 的某些部分是在开放环境中开发的,因此相应的源代码始终可用。还有一些部分最初是在私有树中开发的,并且相应的源代码会在下一个平台版本准备就绪时发布。</p>
+<p>对于某些版本,核心平台 API 会提前足够长的时间准备就绪。这种情况下,我们就可以在设备发布之前推出源代码,以便提前了解反馈情况。不过,对于另外一些版本,我们无法做到这一点。在所有情况下,当我们认为相应版本已足够稳定并且开发流程允许时,我们就会发布平台源代码。</p>
+<h3 id="what-is-involved-in-releasing-the-source-code-for-a-new-android-version">发布新版 Android 的源代码涉及哪些流程?</h3>
+<p>发布新版 Android 平台的源代码是一个非常重要的过程。首先,该软件要移植到设备的系统映像中,并通过各种形式的认证,包括手机销售区域的政府监管机构认证。另外,该软件还需要通过运营商测试。这是发布过程的一个重要阶段,因为这项测试有助于发现大量的软件错误。</p><p></p>
+<p>在发布事宜得到监管机构和运营商的批准后,制造商将开始大批量生产设备,并且我们将着手发布源代码。</p>
+<p>在制造商大批量生产设备的同时,Google 团队将开始为发布开放源代码做一些准备工作。这些准备工作包括进行最终的 API 更改、更新文档(例如,反映在合格性测试期间进行的任何修改)、为新版本准备 SDK,以及发布平台兼容性信息。</p>
+<p>此外,准备工作还包括一项最终法定签核程序,以同意将代码发布到开放源代码中。正如开放源代码贡献者需要签署《贡献者许可协议》来证明其拥有所贡献内容的知识产权一样,Google 也必须证明自己在做贡献。</p>
+<p>从制造商开始大批量生产设备算起,软件发布过程通常需要大约一个月的时间。这样一来,源代码的发布时间与设备到达用户手中的时间通常差不多。</p>
+<h3 id="how-does-the-aosp-relate-to-the-android-compatibility-program">AOSP 与 Android 兼容性计划有何关联?</h3>
+<p>Android 开放源代码项目旨在维护 Android 软件以及开发新版本。由于是开放源代码,因此该软件可用于任何用途,包括开发与基于同一源代码的其他设备不兼容的设备。</p>
+<p>Android 兼容性计划旨在为 Android 制定与开发者编写的第三方应用兼容的基准实现方式。“与 Android 兼容”的设备可以参与 Android 生态系统,包括 Google Play;不符合兼容性要求的设备将无法参与该生态系统。</p>
+<p>也就是说,Android 兼容性计划规定了我们如何区分“与 Android 兼容的设备”与只是运行 Android 源代码衍生品的设备。我们欢迎各种 Android 源代码使用方式,但只有与 Android 兼容的设备(符合 Android 兼容性计划的定义并通过该计划的测试)才可以参与 Android 生态系统。</p>
+<h3 id="how-can-i-contribute-to-android">如何为 Android 做贡献?</h3>
+<p>您可以通过多种方式为 Android 做贡献。您可以报告错误、编写适用于 Android 平台的应用,或者为 Android 开放源代码项目贡献源代码。</p>
+<p>关于我们愿意或能够接受哪些类型的代码贡献内容,有一些限制。例如,有人可能想要贡献备选应用 API,比如完全基于 C++ 的环境。我们会拒绝这种贡献内容,因为 Android 鼓励开发在 ART 运行时中运行的应用。同样,我们也不会接受与我们的许可目标不符的贡献内容(例如 GPL 或 LGPL 库)。</p>
+<p>如果您有意贡献源代码,我们建议您在开始任何相关工作前先通过 <a href="/setup/community.html">Android 社区</a>页面中列出的方式与我们联系。您可以在<a href="/setup/contributing.html">贡献</a>页面中找到关于此主题的更多信息。</p>
+<h3 id="how-do-i-become-an-android-committer">如何成为 Android 代码提交者?</h3>
+<p>Android 开放源代码项目其实并没有“提交者”这一概念。所有贡献内容(包括由 Google 员工创作的内容)都是通过一个称为“Gerrit”的基于网页的系统提交的,该系统是 Android 工程流程的一部分。该系统与 Git 源代码管理系统协同工作,以便明晰地管理源代码贡献内容。</p>
+<p>提交之后,相应更改需要获得指定审批者的批准。审批者通常是 Google 员工,但这些审批者还要负责所有提交内容,不论其来源为何。</p>
+<p>您可以在<a href="submit-patches.html">提交补丁程序</a>页面中找到关于此主题的更多信息。</p>
+<a href="#top">返回页首</a>
+<h2 id="compatibility">兼容性</h2>
+<h3 id="what-does-compatibility-mean">“兼容性”是什么意思?</h3>
+<p>我们将“与 Android 兼容的设备”定义为可以运行由第三方开发者使用 Android SDK 和 NDK 编写的任何应用的设备。我们将此作为过滤条件来区分可以参与和无法参与 Android 应用生态系统的设备。与 Android 妥善兼容的设备可以申请使用 Android 商标。不兼容的设备只不过是 Android 源代码的衍生产品,不能使用 Android 商标。</p>
+<p>也就是说,兼容性是参与 Android 应用生态系统的前提条件。我们欢迎任何人使用 Android 源代码。但如果设备与 Android 不兼容,则不会被视为 Android 生态系统的一部分。</p>
+<h3 id="what-is-the-role-of-google-play-in-compatibility">Google Play 在兼容性方面发挥什么作用?</h3>
+<p>与 Android 兼容的设备可以申请 Google Play 客户端软件使用许可。获得该许可后,这些设备便成为了 Android 应用生态系统的一部分,其用户将能够从所有与 Android 兼容的设备共享的目录中下载开发者的应用。与 Android 不兼容的设备无法获得该许可。</p>
+<h3 id="what-kinds-of-devices-can-be-android-compatible">哪些类型的设备可与 Android 兼容?</h3>
+<p>Android 软件可以移植到许多不同类型的设备上,包括第三方应用无法在其中正常运行的某些设备。<a href="/compatibility/index.html">Android 兼容性定义文档</a> (CDD) 中详细说明了将被视为与 Android 兼容的具体设备配置。</p>
+<p>例如,虽然可以将 Android 源代码移植到没有摄像头的手机上,但兼容性定义文档要求所有手机都要有摄像头。该要求使得开发者在编写应用时可以采用一系列一致的功能。</p>
+<p>兼容性定义文档将会不时进行修订,以反映市场实际情况。例如,1.6 版兼容性定义文档仅支持手机。但 2.1 版兼容性定义文档允许设备不包含电话硬件,这使得平板式音乐播放器等非手机设备也可以是兼容的设备。在修订兼容性定义文档的同时,我们还将改进 Google Play,以便开发者可以控制在哪些地区提供其应用。让我们继续以电话为例,某个用于管理短信的应用在媒体播放器上并没有什么用处,因此 Google Play 允许开发者将该应用限制为专用于手机设备。</p>
+<h3 id="if-my-device-is-compatible-does-it-automatically-have-access-to-google-play-and-branding">如果我的设备与 Android 兼容,它是否会自动获得 Google Play 和品牌标识的使用权限?</h3>
+<p>Google Play 是由 Google 运营的服务。实现兼容性是获得 Google Play 软件和品牌标识使用权限的前提条件。设备制造商应填写<a href="/compatibility/contact-us#for-business-inquiries">申请 Google 移动服务许可</a>中提供的联系表单,以获得 Google Play 使用权限。如果我们可以为您提供帮助,将会与您联系。</p>
+<h3 id="if-i-am-not-a-manufacturer-how-can-i-get-google-play">如果我不是制造商,如何获得 Google Play 使用权限?</h3>
+<p>我们只会向在设备中植入 Android 的手机制造商授予 Google Play 使用许可。如有关于具体情况方面的问题,请发送电子邮件至 <a href="mailto:[email protected]">[email protected]</a> 与我们联系。</p>
+<h3 id="how-can-i-get-access-to-the-google-apps-for-android-such-as-maps">如何获得 Android 版 Google 应用(例如 Google 地图)使用权限?</h3>
+<p>Android 版 Google 应用(例如 YouTube、Google 地图、Gmail 等)属于 Google 产品和服务,并不是 Android 的一部分,需要单独授予许可。如有关于这些应用方面的问题,请发送电子邮件至 <a href="mailto:[email protected]">[email protected]</a> 与我们联系。</p>
+<h3 id="is-compatibility-mandatory">兼容性是否为强制要求?</h3>
+<p>不是,您可以自行选择是否参与 Android 兼容性计划。由于 Android 源代码是开放源代码,因此任何人都可以使用它来打造任何类型的设备。不过,如果制造商希望在其产品中使用 Android 名称,或希望获得 Google Play 使用权限,则必须要先证明其设备与 Android 兼容。</p>
+<h3 id="how-much-does-compatibility-certification-cost">兼容性认证的费用是多少?</h3>
+<p>设备的 Android 兼容性认证无需任何费用。兼容性测试套件为开放源代码,可供任何人用于设备测试。</p>
+<h3 id="how-long-does-compatibility-take">兼容性认证需要多长时间?</h3>
+<p>该过程是自动进行的。兼容性测试套件会生成一份报告,您可以将该报告提供给 Google 来证明兼容性。我们计划将来提供一些用于将这些报告上传到公共数据库的自助服务工具。</p>
+<h3 id="who-determines-what-will-be-part-of-the-compatibility-definition">谁负责决定兼容性定义的内容?</h3>
+<p>由于 Google 负责把握 Android 作为平台和产品的总体发展方向,因此 Google 会为每个版本维护兼容性定义文档。在为 Android 新版本起草兼容性定义文档时,我们会咨询各种原始设备制造商 (OEM),他们将为该文档的内容提供建议。</p>
+<h3 id="how-long-will-each-android-version-be-supported-for-new-devices">各 Android 版本可用于开发新设备的时间有多长?</h3>
+<p>由于 Android 的代码为开放源代码,因此我们无法阻止任何人使用旧版本来推出设备。不过,Google 将不会授予在被视为已过时的版本上使用 Google Play 客户端软件的许可。这样一来,虽然任何人都可以继续植入旧版 Android,但这些设备将不能使用 Android 名称,并且无法参与 Android 应用生态系统,这同设备与 Android 不兼容的情况类似。</p>
+<h3 id="can-a-device-have-a-different-user-interface-and-still-be-compatible">设备是否可以采用不同的界面但仍保持与 Android 兼容?</h3>
+<p>Android 兼容性计划旨在决定某种设备是否可以运行第三方应用。设备附带的界面组件(例如主屏幕、拨号器、配色方案等)一般对第三方应用的影响不大。因此,设备制造商可以根据自己的喜好随意定制界面。兼容性定义文档确实规定了原始设备制造商 (OEM) 可在多大程度内更改系统界面中会影响第三方应用的区域。</p>
+<h3 id="when-are-compatibility-definitions-released-for-new-android-versions">何时发布 Android 新版本的兼容性定义?</h3>
+<p>我们的目标是,一旦相应的 Android 平台版本已足够成型,允许发布新版 Android 兼容性定义文档,我们就会进行发布。虽然我们无法在植入相应 Android 软件的首款旗舰设备之前发布该软件版本的兼容性定义文档终稿,但我们一定会在这一首款设备之后发布兼容性定义文档终稿。不过,无论实际情况如何,我们都将提供兼容性定义文档的草稿版本。</p>
+<h3 id="how-are-device-manufacturers-compatibility-claims-validated">如何验证设备制造商的兼容性声明?</h3>
+<p>我们并没有针对 Android 设备兼容性的验证流程。不过,如果相应设备要添加 Google Play,Google 通常会先验证设备的兼容性,设备通过验证后,才会同意为其授予 Google Play 客户端软件使用许可。</p>
+<h3 id="what-happens-if-a-device-that-claims-compatibility-is-later-found-to-have-compatibility-problems">如果之后发现声称兼容的设备存在兼容性问题,会怎样?</h3>
+<p>通常情况下,Google 与 Google Play 被许可人之间保持着良好的关系,这使得我们可以要求他们发布经过更新的系统映像以解决相关问题。</p>
+<a href="#top">返回页首</a>
+<h2 id="compatibility-test-suite">兼容性测试套件</h2>
+<h3 id="what-is-the-purpose-of-the-cts">兼容性测试套件的用途是什么?</h3>
+<p>兼容性测试套件是一种工具,设备制造商可以借助该工具来确保其设备与 Android 兼容,以及报告测试结果供 Google 验证。原始设备制造商 (OEM) 应在整个工程流程中频繁运行兼容性测试套件,以便尽早发现兼容性问题。</p>
+<h3 id="what-kinds-of-things-does-the-cts-test">兼容性测试套件会测试哪些类型的项目?</h3>
+<p>目前,兼容性测试套件会测试所有受支持的 Android 强类型 API 是否存在以及行为是否正常。此外,它还会测试其他非 API 系统行为,例如应用生命周期和性能。我们计划在未来的兼容性测试套件版本中扩大支持范围,以便同时测试 Intent 等“软”API。</p>
+<h3 id="will-the-cts-reports-be-made-public">兼容性测试套件报告会公开吗?</h3>
+<p>会。虽然目前尚未实现,但 Google 打算为原始设备制造商 (OEM) 提供基于网络的自助服务工具来发布兼容性测试套件报告,以供任何人查看。制造商可在任意范围内分享兼容性测试套件报告。</p>
+<h3 id="how-is-the-cts-licensed">兼容性测试套件采用哪种许可方式?</h3>
+<p>兼容性测试套件是根据大部分 Android 代码使用的 Apache Software License 2.0 授权用户使用。</p>
+<h3 id="does-the-cts-accept-contributions">兼容性测试套件接受贡献内容吗?</h3>
+<p>接受,而且非常欢迎!Android 开放源代码项目接受贡献内容,以便采用与任何其他组件相同的方式来改进兼容性测试套件。事实上,提高兼容性测试套件测试案例的覆盖范围和质量是协助 Android 的最佳方式之一。</p>
+<h3 id="can-anyone-use-the-cts-on-existing-devices">任何人都可以在现有设备上使用兼容性测试套件吗?</h3>
+<p>兼容性定义文档要求与 Android 兼容的设备实现“adb”调试实用工具。这意味着,任何与 Android 兼容的设备(包括零售的设备)都必须能够运行兼容性测试套件测试。</p>
+<h3 id="are-codecs-verified">编解码器需要通过兼容性测试套件验证吗?</h3>
+<p>需要。所有必需的编解码器都要通过兼容性测试套件验证。</p>
+
+<a href="#top">返回页首</a>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/git-resources.html b/zh-cn/setup/git-resources.html
new file mode 100644
index 0000000..c69a5ca
--- /dev/null
+++ b/zh-cn/setup/git-resources.html
@@ -0,0 +1,42 @@
+<html devsite><head>
+    <title>了解 Git</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>如需关于 Git 的更多信息,请参阅以下非常实用的站外资源:</p>
+<ul>
+<li>
+<p><a href="https://training.github.com/">GitHub 培训</a></p>
+</li>
+<li>
+<p><a href="http://book.git-scm.com">Git Community Book</a>(由 Scott Chacon 维护)</p>
+</li>
+<li>
+<p><a href="http://git.or.cz/gitwiki/FrontPage">Git Wiki</a></p>
+</li>
+<li>
+<p><a href="http://www.kernel.org/pub/software/scm/git/docs">Git 手册页面</a> </p>
+</li>
+<li>
+<p><a href="https://www.youtube.com/playlist?list=PLttwD7NyH3omQLyVtan0CFOX_UWItX_yG">GitCasts</a>(Git 教程视频)</p>
+</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/index.html b/zh-cn/setup/index.html
new file mode 100644
index 0000000..821bf28
--- /dev/null
+++ b/zh-cn/setup/index.html
@@ -0,0 +1,45 @@
+<html devsite><head>
+    <title>Android 源代码</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>Android 是一个针对多种不同设备类型打造的开放源代码软件堆栈。Android 的主要目的是为运营商、原始设备制造商 (OEM) 和开发者创造一个开放的软件平台,使他们能够将创新理念变为现实,并推出能够卓有成效地改善用户移动体验的真实产品。
+</p>
+
+<p>此外,我们还希望确保 Android 平台不存在一个集中瓶颈(意即没有任何行业参与者可一手限制或控制其他参与者的创新)。这样,我们不但可以打造功能完善的高品质消费类产品,而且可以完全开放源代码,供第三方自由定制和移植。
+</p>
+
+<div style="width:700px">
+  <img src="/images/android_framework_details.png" alt="Android 框架详情" height="483px"/>
+  <p class="img-caption">
+    <strong>图 1.</strong> Android 堆栈</p>
+</div>
+
+<h2 id="governance-philosophy">管理理念</h2>
+<p>Android 源自于 Google 牵头并联合众多企业成立的“开放手机联盟”(Open Handset Alliance,以下简称 OHA)。如今,许多企业(包括 OHA 的创始成员以及其他企业)都在 Android 上投入了大量资金和人力。这些企业投入了大量工程资源来改进 Android,使用户能够享用搭载 Android 的出色设备。
+</p>
+<p>出于对 Android 本身的认同,这些企业才投入了资金和人力,因为我们都相信有必要打造一个开放的平台。我们的用意是将 Android 打造成一个开放源代码(而非免费软件)平台,显然,Android 也确实做到了这一点;众多志同道合的组织投入了大量的资源,携手打造了一个共用的平台。Android 的首要理念是务实。目标是打造一个每个贡献者都可以调整和定制的共用产品。</p>
+
+<p>不受约束的定制必然会导致不兼容。为了避免这种情况,Android 开源项目还推出了 <a href="/compatibility/index.html">Android 兼容性计划</a>,该计划制定了有关“Android 兼容性”的规范以及设备制造商实现兼容性需要满足的要求。
+任何人都能够(并且会)将 Android 源代码用于任何用途,我们欢迎一切合法的使用。不过,要参与我们正在围绕 Android 构建的共通应用生态系统,设备制造商必须加入 Android 兼容性计划。</p>
+
+<p>作为 Android 开放源代码项目的主导者,Google 负责着 Android 的维护和后续开发工作。虽然 Android 由多个子项目组成,但严格意义上,这只是出于项目管理的需要。我们将 Android 整体视为一个软件产品(而不是可更换部件的“发行版”、规范或集合),并依此原则进行管理。我们希望设备制造商要做的只是将 Android 移植到其设备上,而无需实现一个规范或构建一个“发行版”。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/initializing.html b/zh-cn/setup/initializing.html
new file mode 100644
index 0000000..d559dba
--- /dev/null
+++ b/zh-cn/setup/initializing.html
@@ -0,0 +1,347 @@
+<html devsite><head>
+    <title>搭建编译环境</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>本部分介绍了如何设置本地工作环境来编译 Android 源文件。您需要使用 Linux 或 Mac OS。目前不支持在 Windows 环境下进行编译。</p>
+<p>要简要了解整个代码审核和代码更新流程,请参阅<a href="life-of-a-patch.html">补丁程序的生命周期</a>。</p>
+<p class="note"><strong>注意</strong>:本网站中所有命令的前面都带有美元符号 ($),以便与文件中的输出或条目区分开来。
+您可以使用每个命令框右上角的“点击复制”功能来复制所有行(不包括美元符号),也可以三击每个行来分别复制各行(不包括美元符号)。<em></em></p>
+<h2 id="choosing-a-branch">选择分支</h2>
+<p>针对编译环境的某些要求是由您打算编译的源代码的版本决定的。要查看您可以选择的分支的完整列表,请参阅<a href="build-numbers.html">版本号</a>。您还可以选择下载并编译最新的源代码(称为 <code>master</code>)。如果您选择这么做,请在初始化存储库时直接忽略分支规范。</p>
+<p>选择分支后,请按照下面的相应说明来设置编译环境。</p>
+<h2 id="setting-up-a-linux-build-environment">设置 Linux 编译环境</h2>
+<p>以下说明适用于所有分支(包括 <code>master</code>)。</p>
+<p>我们会定期在最近推出的一些 Ubuntu LTS (14.04) 版本中对 Android 编译过程进行内部测试,但大多数 Ubuntu 分发版本都应该有所需的编译工具。欢迎向我们报告在其他分发版本中的测试结果(无论结果是成功还是失败)。</p>
+<p>如果是 Gingerbread (2.3.x) 及更高版本(包括 <code>master</code> 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。</p>
+<p class="note"><strong>注意</strong>:要查看完整的硬件和软件要求列表,请参阅<a href="requirements.html">要求</a>。然后,请按照下方适用于 Ubuntu 和 Mac OS 的详细说明进行操作。</p>
+
+<h3 id="installing-the-jdk">安装 JDK</h3>
+<p><a href="https://android.googlesource.com/">Android 开源项目 (AOSP)</a> 中 Android 的 <code>master</code> 分支在 <code>platform/prebuilts/jdk/jdk8</code> 中有预编译版本的 OpenJDK。因此,无需再额外安装。</p>
+
+<p>较低版本的 Android 需要另行安装 JDK。在 Ubuntu 上,请使用 <a href="http://openjdk.java.net/install/">OpenJDK</a>。要了解确切的版本,请参阅 <a href="requirements.html#jdk">JDK 要求</a>;要了解相关说明,请参阅以下各个部分。</p>
+
+<h4 id="for-ubuntu-15-04">如果 Ubuntu &gt;= 15.04</h4>
+<p>请运行以下命令:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">sudo apt-get update</code>
+<code class="devsite-terminal">sudo apt-get install openjdk-8-jdk</code>
+</pre>
+
+<h4 id="for-ubuntu-14-04">如果是 Ubuntu LTS 14.04</h4>
+<p>目前没有适用于 Ubuntu 14.04 的受支持 OpenJDK 8 程序包。<strong>Ubuntu 15.04 OpenJDK 8</strong> 软件包能够在 Ubuntu 14.04 中顺利使用。<em>我们发现,按照以下说明操作时,更高的程序包版本(例如适合 15.10、16.04 的版本)在 Ubuntu 14.04 中无法正常工作。</em></p>
+<ol>
+<li>
+<p>从 <a href="http://archive.ubuntu.com/ubuntu/pool/universe/o/openjdk-8/">archive.ubuntu.com</a> 下载适用于 64 位架构的 <code>.deb</code> 软件包:</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>(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>(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>(SHA256:<code>6e47215cf6205aa829e6a0a64985075bd29d1f428a4006a80c9db371c2fc3c4c</code>)</li>
+</ul>
+</li>
+<li>
+<p>(可选)对照随以上每个程序包列出的 SHA256 字符串,确认已下载文件的校验和。</p>
+<p>例如,使用 <code>sha256sum</code> 工具:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+sha256sum {downloaded.deb file}
+</pre>
+</li>
+<li>
+<p>安装程序包:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo apt-get update
+</pre>
+<p>为下载的每个 .deb 文件运行 <code>dpkg</code>。运行过程中可能会因缺少依赖项而出现错误:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo dpkg -i {downloaded.deb file}
+</pre>
+<p>解决缺少依赖项的问题:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo apt-get -f install
+</pre>
+</li>
+</ol>
+
+<h4 id="default-java-version">更新默认的 Java 版本 - 可选</h4>
+
+<p>(可选)对于以上 Ubuntu 版本,您可以通过运行以下命令来更新默认的 Java 版本:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">sudo update-alternatives --config java</code>
+<code class="devsite-terminal">sudo update-alternatives --config javac</code>
+</pre>
+
+<p>在编译过程中,如果您遇到 Java 版本错误,请按照<a href="building.html#wrong-java-version">错误的 Java 版本</a>部分中的说明设置其路径。</p>
+
+<h3 id="installing-required-packages-ubuntu-1404">安装所需的程序包 (Ubuntu 14.04)</h3>
+
+<p>您将需要 64 位版本的 Ubuntu。建议您使用 Ubuntu 14.04。</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
+</pre>
+
+<p class="note"><strong>注意</strong>:要使用 SELinux 工具进行政策分析,您还需要安装 <code>python-networkx</code> 软件包。</p>
+
+<p class="note"><strong>注意</strong>:如果您使用 LDAP 并且希望运行 ART 主机测试,则还需要安装 <code>libnss-sss:i386</code> 软件包。</p>
+
+<h3 id="installing-required-packages-ubuntu-1204">安装所需的程序包 (Ubuntu 12.04)</h3>
+
+<p>您可以使用 Ubuntu 12.04 来编译较低版本的 Android。master 或最近推出的一些版本不支持 Ubuntu 12.04。</p>
+
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386</code>
+<code class="devsite-terminal">sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so</code>
+</pre>
+
+<h3 id="installing-required-packages-ubuntu-1004-1110">安装所需的程序包 (Ubuntu 10.04 - 11.10)</h3>
+<p>不再支持在 Ubuntu 10.04-11.10 中进行编译,但它们仍可用来编译较低版本的 AOSP。</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo apt-get install git gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc
+</pre>
+
+<p>在 Ubuntu 10.10 中,请运行以下命令:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so
+</pre>
+
+<p>在 Ubuntu 11.10 中,请运行以下命令:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo apt-get install libx11-dev:i386
+</pre>
+
+<h3 id="configuring-usb-access">配置 USB 使用权限</h3>
+
+<p>按照说明<a href="https://developer.android.com/studio/run/device.html#setting-up" class="external">设置用于开发的设备</a>,以安装适用于所有 Android 设备且由社区维护的默认 <code>udev</code> 规则集。
+
+</p><h3 id="using-a-separate-output-directory">使用单独的输出目录</h3>
+
+<p>默认情况下,每次编译的输出都会存储在相应源代码树的 <code>out/</code> 子目录下。</p>
+
+<p>在一些拥有多个存储设备的计算机上,如果将源文件和输出存储在单独的存储卷中,编译速度会更快。若要进一步提高编译速度,可以将输出存储在已针对速度(而非崩溃稳定性)进行优化的文件系统中,这是因为在文件系统损坏时可以重新生成所有文件。</p>
+
+<p>要进行这项设置,请导出 <code>OUT_DIR_COMMON_BASE</code> 变量,使其指向将存储输出目录的位置。</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+export OUT_DIR_COMMON_BASE=&lt;path-to-your-out-directory&gt;
+</pre>
+
+<p>对于每个单独的源代码树,其输出目录都将以其存放目录命名。</p>
+
+<p>例如,如果您有源代码树 <code>/source/master1</code> 和 <code>/source/master2</code>,并且 <code>OUT_DIR_COMMON_BASE</code> 设为了 <code>/output</code>,那么输出目录将为 <code>/output/master1</code> 和 <code>/output/master2</code>。</p>
+
+<p>在这种情况下,切勿将多个源代码树存储在具有相同名称的目录下,否则会导致输出目录共享终止,并且会出现不可预知的结果。</p>
+
+<p>只有 Jelly Bean (4.1) 及更高版本(包括 <code>master</code> 分支)支持这种做法。</p>
+
+<h2 id="setting-up-a-mac-os-x-build-environment">设置 Mac OS 编译环境</h2>
+
+<p>在默认安装过程中,Mac OS 会在一个保留大小写但不区分大小写的文件系统中运行。Git 并不支持此类文件系统,而且此类文件系统会导致某些 Git 命令(例如 <code>git status</code>)的行为出现异常。因此,我们建议您始终在区分大小写的文件系统中对 AOSP 源文件进行操作。使用下文中介绍的磁盘映像可以非常轻松地做到这一点。</p>
+
+<p>有了适当的文件系统,在新型 Mac OS 环境中编译 <code>master</code> 分支就会变得非常简单。要编译较低版本的分支,则需要一些额外的工具和 SDK。</p>
+
+<h3 id="creating-a-case-sensitive-disk-image">创建区分大小写的磁盘映像</h3>
+
+<p>您可以使用磁盘映像在现有的 Mac OS 环境中创建区分大小写的文件系统。要创建磁盘映像,请启动磁盘工具,然后选择“新建映像”。完成编译至少需要 25GB 空间;更大的空间能够更好地满足未来的需求。使用稀疏映像有助于节省空间,而且以后可以随着需求的增加进行扩展。请务必选择“Case sensitive, Journaled”存储卷格式。</p>
+
+<p>您也可以通过 shell 使用以下命令创建磁盘映像:</p>
+<pre class="devsite-click-to-copy">
+<span class="no-select"># </span>hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
+</pre>
+
+<p>这将创建一个 <code>.dmg</code>(也可能是 <code>.dmg.sparseimage</code>)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。</p>
+
+<p>如果您以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:</p>
+
+<pre class="devsite-click-to-copy">
+<span class="no-select"># </span>hdiutil resize -size &lt;new-size-you-want&gt;g ~/android.dmg.sparseimage
+</pre>
+
+<p>对于存储在主目录下的名为 <code>android.dmg</code> 的磁盘映像,您可以向 <code>~/.bash_profile</code> 中添加辅助函数:</p>
+
+<ul>
+<li>
+要在执行 <code>mountAndroid</code> 时装载磁盘映像,请运行以下命令:
+
+<pre class="devsite-click-to-copy">
+# mount the android file image
+mountAndroid() { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
+</pre>
+
+<p class="note"><strong>注意</strong>:如果系统创建的是 <code>.dmg.sparseimage</code> 文件,请将 <code>~/android.dmg</code> 替换成 <code>~/android.dmg.sparseimage</code>。</p>
+</li>
+
+<li>
+<p>要在执行 <code>umountAndroid</code> 时卸载磁盘映像,请运行以下命令:</p>
+<pre class="devsite-click-to-copy">
+# unmount the android file image
+umountAndroid() { hdiutil detach /Volumes/android; }
+</pre>
+</li>
+</ul>
+
+<p>装载 <code>android</code> 存储卷后,您将在其中开展所有工作。您可以像对待外接式存储盘一样将其弹出(卸载)。</p>
+
+<h3 id="installing-the-mac-jdk">安装 JDK</h3>
+
+<p>要查看要在开发各种 Android 版本时使用的 Java 版本,请参阅相关<a href="requirements.html">要求</a>。</p>
+
+<h4 id="installing-required-packages">安装所需的程序包</h4>
+
+<ol>
+<li>
+<p>使用以下命令安装 Xcode 命令行工具:</p><pre class="devsite-terminal devsite-click-to-copy">
+xcode-select --install
+</pre>
+
+<p>对于较低版本的 Mac OS(10.8 或更低版本),您需要通过 <a href="http://developer.apple.com/">Apple 开发者网站</a>安装 Xcode。如果您尚未注册成为 Apple 开发者,则需要创建一个 Apple ID 才能下载。</p>
+</li>
+
+<li>
+<p>通过 <a href="http://www.macports.org/install.php">macports.org</a> 安装 MacPorts。</p>
+
+<p class="note"><strong>注意</strong>:请确保在路径中 <code>/opt/local/bin</code> 显示在 <code>/usr/bin</code> <strong>之前</strong>。否则,请将以下内容添加到 <code>~/.bash_profile</code> 文件中:</p>
+
+<pre class="devsite-click-to-copy">
+export PATH=/opt/local/bin:$PATH
+</pre>
+
+<p class="note"><strong>注意</strong>:如果主目录中没有 <code>.bash_profile</code> 文件,请创建一个。</p>
+</li>
+
+<li>
+<p>通过 MacPorts 获取 Make、Git 和 GPG 程序包:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
+</pre>
+
+<p>如果您使用 Mac OS X v10.4,还需要安装 bison:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+POSIXLY_CORRECT=1 sudo port install bison
+</pre>
+</li>
+</ol>
+
+<h4 id="reverting-from-make-382">将 make 3.82 还原到较低版本</h4>
+
+<p>在 Android 4.0.x (Ice Cream Sandwich) 及更低版本中,gmake 3.82 中存在一个会导致 Android 无法编译的错误。您可以按照以下步骤使用 MacPorts 来安装 3.81 版:</p>
+
+<ol>
+<li>
+<p>修改 <code>/opt/local/etc/macports/sources.conf</code>,在 rsync 行上方添加下面这行内容:</p>
+<pre class="devsite-click-to-copy">
+file:///Users/Shared/dports
+</pre>
+
+<p>。然后创建该目录:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+mkdir /Users/Shared/dports
+</pre>
+</li>
+
+<li>
+<p>在新的 <code>dports</code> 目录下,运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
+</pre>
+</li>
+
+<li>
+<p>为新的本地存储库创建一个端口索引:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+portindex /Users/Shared/dports
+</pre>
+</li>
+
+<li>
+<p>使用以下命令安装旧版 gmake:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo port install gmake @3.81
+</pre>
+</li>
+</ol>
+
+<h4 id="setting-a-file-descriptor-limit">设置文件描述符数量上限</h4>
+
+<p>在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。</p>
+
+<p>要提高此上限,请将下列行添加到 <code>~/.bash_profile</code> 中:</p>
+<pre class="devsite-click-to-copy">
+# set the number of open files to be 1024
+ulimit -S -n 1024
+</pre>
+
+<h2 id="optimizing-a-build-environment">优化编译环境(可选)</h2>
+
+<h3 id="setting-up-ccache">设置 ccache</h3>
+
+<p>您可以视需要指示编译过程使用 ccache 编译工具,ccache 是适用于 C 和 C++ 的编译器缓存,有助于提高编译速度。这对于编译服务器和其他高容量生产环境来说尤其有用。ccache 可用作用于加快重新编译速度的编译器缓存。
+如果您经常使用 <code>make clean</code>,或者经常在不同的编译产品之间切换,则非常适合使用 ccache。</p>
+
+<p class="note"><strong>注意</strong>:如果您是在执行增量编译(例如个人开发者而非编译服务器),ccache 可能会让您为缓存未命中埋单,从而减慢您的编译速度。</p>
+
+<p>要使用 ccache,请在源代码树的根目录下执行以下命令:</p>
+
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">export USE_CCACHE=1</code>
+<code class="devsite-terminal">export CCACHE_DIR=/&lt;path_of_your_choice&gt;/.ccache</code>
+<code class="devsite-terminal">prebuilts/misc/linux-x86/ccache/ccache -M 50G</code>
+</pre>
+
+<p>建议的缓存大小为 50G 到 100G。</p>
+
+<p>请将以下内容添加到 <code>.bashrc</code>(或等同文件)中:</p>
+
+<pre class="devsite-click-to-copy">
+export USE_CCACHE=1
+</pre>
+
+<p>默认情况下,缓存将存储在 <code>~/.ccache</code> 下。
+如果您的主目录位于 NFS 或一些其他的非本地文件系统中,您还需要在 <code>.bashrc</code> 文件中指定目录。</p>
+
+<p>在 Mac OS 中,您应将 <code>linux-x86</code> 替换成 <code>darwin-x86</code>:</p>
+
+<pre class="devsite-click-to-copy">
+prebuilts/misc/darwin-x86/ccache/ccache -M 50G
+</pre>
+
+<p>在编译 Ice Cream Sandwich (4.0.x) 或更低版本时,ccache 位于其他位置:</p>
+
+<pre class="devsite-click-to-copy">
+prebuilt/linux-x86/ccache/ccache -M 50G
+</pre>
+
+<p>该设置会存储在 CCACHE_DIR 中,并且为永久设置。</p>
+
+<p>在 Linux 中,您可以运行以下命令来观看使用 ccache 时的情况:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+watch -n1 -d prebuilts/misc/linux-x86/ccache/ccache -s
+</pre>
+
+<h2 id="next-download-the-source">下一篇:下载源代码</h2>
+
+<p>编译环境已准备就绪!接下来您就可以<a href="downloading.html">下载源代码</a>了。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/jack.html b/zh-cn/setup/jack.html
new file mode 100644
index 0000000..8b1282f
--- /dev/null
+++ b/zh-cn/setup/jack.html
@@ -0,0 +1,262 @@
+<html devsite><head>
+    <title>使用 Jack 编译</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.
+  -->
+
+<aside class="warning"><strong>警告</strong>:在 <a href="https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html" class="external">2017 年 3 月 14 日公告</a>发布之后,Jack 工具链已被弃用。虽然您可以继续使用 Jack,但我们强烈建议您使用最新的 <a href="https://developer.android.com/studio/preview/index.html" class="external">Android Studio 预览版</a>,该版本可为内置到默认工具链中的 <a href="https://developer.android.com/studio/preview/features/java8-support.html" class="external">Java 8 语言功能</a>提供更好的支持。</aside>
+
+<p>Jack 是一种 Android 工具链,用于将 Java 源代码编译成 Android dex 字节码。它取代了之前由 javac、ProGuard、jarjar 和 dx 等多种工具组成的 Android 工具链。由于 Jack 是 Android 6.x 的默认 Android 编译工具链,因此要使用 Jack,您只需使用标准的 Makefile 命令来编译源代码树或您的项目即可,无需进行其他任何操作。</p>
+
+<h2 class="overview">Jack 简介</h2>
+<p>Jack 工具链具有以下优势:</p>
+
+<img src="./images/jack_overview.png" alt="Jack 概览"/>
+<figcaption><strong>图 1.</strong> Jack 概览。</figcaption>
+
+<ul>
+<li><strong>完全开放的源代码</strong>。Jack 是在 AOSP 中提供的;我们欢迎用户贡献内容。</li>
+<li><strong>提高编译速度</strong>。Jack 提供以下具体支持来缩短编译时间:dex 预处理、增量编译和 Jack 编译服务器。</li>
+<li><strong>能够处理以下任务:压缩、混淆、重新打包和多 dex 处理</strong>。
+不再需要使用单独的软件包(如 ProGuard)。</li>
+</ul>
+
+<p>从 Android 7.0 起,Jack 支持使用 JaCoCo 衡量代码覆盖率。如需了解详情,请参阅<a href="https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-code-coverage.md" class="external">使用 JaCoCo 衡量代码覆盖率</a>和 <a href="https://developer.android.com/preview/j8-jack.html" class="external">Java 8 语言功能</a>。</p>
+
+<h3 id="jack_library">Jack 库格式</h3>
+
+<p>Jack 具有自己的 .jack 文件格式,其中包含相应库的预编译 dex 代码,可实现更快速的编译(dex 预处理)。</p>
+
+<img src="./images/jack_library.png" alt="Jack 库文件内容"/>
+<figcaption><strong>图 2.</strong> Jack 库文件内容。</figcaption>
+
+<h3 id="jill">Jill</h3>
+
+<p>Jill 工具可将现有的 .jar 库转换为新的库格式,如下图所示。</p>
+
+<img src="./images/jack_jill.png" alt="使用 Jill 导入 .jar 库"/>
+<figcaption><strong>图 3.</strong> 导入现有 .jar 库的工作流程。</figcaption>
+
+<h2 id="using_jack">Jack 编译服务器</h2>
+
+<aside class="note"><strong>注意</strong>:以下说明仅适用于在 Android 6.x 中使用 Jack 的情况;如需关于在 Android 7.x 及更高版本中使用 Jack 的说明,请参阅 <a href="https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md" class="external">Jack 服务器文档</a>。</aside>
+
+<p>首次使用 Jack 时,它会在您的计算机上启动一个本地 Jack 编译服务器。该服务器:</p>
+
+<ul>
+<li>能够实现内在加速,因为它可以避免在每次编译时都启动新的主机 JRE JVM、加载 Jack 代码、初始化 Jack 以及准备 JIT。此外,它还会在小规模编译期间(例如增量模式下)尽可能优化编译所需时间。</li>
+<li>是短期内控制并行 Jack 编译数量的解决方案。该服务器可以避免计算机过载(内存或磁盘问题),因为它会限制并行编译的数量。</li>
+</ul>
+
+<p>如果没有任何编译工作,在空闲一段时间之后,Jack 服务器会自行关闭。
+它使用 localhost 接口上的两个 TCP 端口,因此无法从外部访问。您可以通过修改 <code>$HOME/.jack</code> 文件来修改所有参数(并行编译的数量、超时、端口号等)。</p>
+
+<h3 id="home_jack_file">$HOME/.jack 文件</h3>
+
+<p><code>$HOME/.jack</code> 文件包含以下针对 Jack 服务器变量的设置,采用纯 bash 语法:</p>
+
+<ul>
+<li><code>SERVER=true</code>:启用 Jack 的服务器功能。</li>
+<li><code>SERVER_PORT_SERVICE=8072</code>:设置该服务器上用于编译的 TCP 端口号。</li>
+<li><code>SERVER_PORT_ADMIN=8073</code>:设置该服务器上用于管理的 TCP 端口号。</li>
+<li><code>SERVER_COUNT=1</code>:未使用。
+</li><li><code>SERVER_NB_COMPILE=4</code>:设置允许的最大并行编译数量。</li>
+<li><code>SERVER_TIMEOUT=60</code>:设置无编译工作时服务器在自行关闭之前必须等待的空闲秒数。</li>
+<li><code>SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log}</code>:设置在其中写入服务器日志的文件。默认情况下,此变量可被环境变量重载。</li>
+<li><code>JACK_VM_COMMAND=${JACK_VM_COMMAND:=java}</code>:设置用于在主机上启动 JVM 的默认命令。默认情况下,此变量可被环境变量重载。</li>
+</ul>
+
+<h3 id="jack_troubleshooting">Jack 编译问题排查</h3>
+
+<table>
+<tbody><tr>
+<th>问题</th>
+<th>操作</th>
+</tr>
+<tr>
+<td>您的计算机在编译期间无响应,或者 Jack 编译因“Out of memory error”(内存不足错误)而失败</td>
+<td>您可以通过修改 <code>$HOME/.jack</code> 并将 <code>SERVER_NB_COMPILE</code> 改为较低的值来减少同时进行的 Jack 编译的数量,从而改善这种情况。</td>
+</tr>
+<tr>
+<td>编译因“Cannot launch background server”(无法启动后台服务器)而失败</td>
+<td>最可能的原因是您的计算机上的 TCP 端口都被占用了。您可以通过修改 <code>$HOME/.jack</code>(<code>SERVER_PORT_SERVICE</code> 和 <code>SERVER_PORT_ADMIN</code> 变量)来更改端口。
+
+<br /><br />如果上述方法无法解决问题,请报告该错误(务必附上您的编译日志和 <a href="#jack_log">Jack 服务器日志</a>)。要解决这种问题,请通过修改 <code>$HOME/.jack</code> 并将 <code>SERVER</code> 更改为 false 来停用 Jack 编译服务器。
+遗憾的是,这将大大降低编译速度,并可能会迫使您使用加载控制(<code>make -j</code> 的选项 <code>-l</code> )启动 <code>make</code>。
+</td>
+</tr>
+<tr>
+<td>编译卡住了,没有任何进展</td>
+<td>报告并提供以下信息(如果可能):
+<br />
+<ul>
+<li>卡住时所在的命令行。</li>
+<li>此命令行的输出。</li>
+<li>执行 <code>jack-admin server-stat</code> 获得的结果。</li>
+<li><code>$HOME/.jack</code> 文件。</li>
+<li><a href="#jack_log">Jack 服务器日志</a>(已转储服务器状态)的内容。要获取服务器日志,请执行以下操作:
+<ul>
+ <li>通过运行 <code>jack-admin list-server</code> 查找 Jack 后台服务器进程。</li>
+ <li>向该服务器发送 <code>kill -3</code> 命令,将其状态转储到日志文件中。</li>
+ </ul>
+</li>
+<li>执行 <code>ls -lR $TMPDIR/jack-$USER</code> 获得的结果。</li>
+<li>运行 <code>ps j -U $USER</code> 获得的结果。</li>
+</ul>
+
+要解决这种问题,请使用 <code>jack-admin kill-server</code> 停止 Jack 后台服务器,然后移除临时目录(<code>/tmp</code> 或 <code>$TMPDIR</code>)的 <code>jack-$USER</code> 中包含的临时目录。
+</td>
+</tr>
+<tr>
+<td>其他问题</td>
+<td>要报告错误或请求功能,请使用 <a href="http://b.android.com" class="external">http://b.android.com</a> 中的公开问题跟踪工具。使用 <a href="https://code.google.com/p/android/issues/entry?template=Jack%20bug%20report" class="external">Jack 工具错误报告</a>或 <a href="https://code.google.com/p/android/issues/entry?template=Jack%20feature%20request" class="external">Jack 工具功能请求</a>模板,并记得将 Jack 日志附到错误报告中。</td>
+</tr>
+</tbody></table>
+
+<h3 id="jack_log">查找 Jack 日志</h3>
+如果您曾针对 dist 目标运行 <code>make</code> 命令,则 Jack 日志位于 <code>$ANDROID_BUILD_TOP/out/dist/logs/jack-server.log</code> 中。
+如果没有,则您可以通过运行 <code>jack-admin server-log</code> 找到该日志。
+对于可重现的 Jack 错误,您可以通过设置以下变量来获取更详细的日志:<p></p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
+</pre>
+
+<p>使用标准 Makefile 命令编译源代码树(或您的项目),并附上标准输出和错误。要移除详细的编译日志,请运行以下命令:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+unset ANDROID_JACK_EXTRA_ARGS
+</pre>
+
+<h3 id="jack_limitations">Jack 的使用限制</h3>
+
+<ul>
+<li>默认情况下,Jack 服务器为单用户模式,一台计算机上只能有一位用户使用。要支持更多用户,请为每位用户选择不同的端口号,并相应地调整 <code>SERVER_NB_COMPILE</code>。您还可以通过在 <code>$HOME/.jack</code> 中设置 <code>SERVER=false</code> 来停用 Jack 服务器。</li>
+<li>当前的 <code>vm-tests-tf</code> 集成方案会导致 CTS 编译速度较慢。
+</li><li>不支持字节码处理工具(如 JaCoCo)。</li>
+</ul>
+
+<h2 id="using_jack_features">使用 Jack</h2>
+
+<p>Jack 支持 Java 编程语言 1.7,并集成了下述附加功能。</p>
+
+<h3 id="predexing">dex 预处理</h3>
+
+<p>在生成 Jack 库文件时,系统会生成该库的 .dex 文件并将其作为 dex 预处理文件存储在 .jack 库文件中。在进行编译时,Jack 会重复使用每个库中的 dex 预处理文件。所有库均会经过 dex 预处理:</p>
+
+<img src="./images/jack_predex.png" alt="包含 dex 预处理文件的 Jack 库"/>
+<figcaption><strong>图 4.</strong> 包含 dex 预处理文件的 Jack 库。</figcaption>
+
+<p>如果在编译过程中使用了压缩、混淆或重新打包功能,则 Jack 不会重复使用库的 dex 预处理文件。</p>
+
+<h3 id="incremental_compilation">增量编译</h3>
+
+<p>增量编译指的是,仅重新编译自上次编译后出现过更改的组件及其依赖项。当只有少数组件出现过更改时,进行增量编译可能比完整编译快得多。</p>
+
+<p>增量编译默认处于未启用状态(当压缩、混淆、重新打包或旧版多 dex 处理功能启用后,增量编译会自动被停用)。要启用增量编译,请将以下行添加到您要进行增量编译的项目的 <code>Android.mk</code> 文件中:</p>
+
+<pre class="devsite-click-to-copy">LOCAL_JACK_ENABLED := incremental</pre>
+
+<aside class="note"><strong>注意</strong>:首次使用 Jack 编译项目时,如果某些依赖项未编译,请使用 <code>mma</code> 对其进行编译,之后您可以使用标准编译命令。</aside>
+
+<h3 id="shrinking_and_obfuscation">压缩和混淆</h3>
+
+<p>Jack 会使用 proguard 配置文件来实现压缩和混淆功能。</p>
+
+<p>常用选项包括:</p>
+
+<ul>
+  <li> <code>@</code>
+  </li><li> <code>-include</code>
+  </li><li> <code>-basedirectory</code>
+  </li><li> <code>-injars</code>
+  </li><li> <code>-outjars // only 1 output jar supported</code>
+  </li><li> <code>-libraryjars</code>
+  </li><li> <code>-keep</code>
+  </li><li> <code>-keepclassmembers</code>
+  </li><li> <code>-keepclasseswithmembers</code>
+  </li><li> <code>-keepnames</code>
+  </li><li> <code>-keepclassmembernames</code>
+  </li><li> <code>-keepclasseswithmembernames</code>
+  </li><li> <code>-printseeds</code>
+</li></ul>
+
+<p>压缩选项包括:</p>
+
+<ul>
+  <li><code>-dontshrink</code>
+</li></ul>
+
+<p>混淆选项包括:</p>
+
+<ul>
+  <li> <code>-dontobfuscate</code>
+  </li><li> <code>-printmapping</code>
+  </li><li> <code>-applymapping</code>
+  </li><li> <code>-obfuscationdictionary</code>
+  </li><li> <code>-classobfuscationdictionary</code>
+  </li><li> <code>-packageobfuscationdictionary</code>
+  </li><li> <code>-useuniqueclassmembernames</code>
+  </li><li> <code>-dontusemixedcaseclassnames</code>
+  </li><li> <code>-keeppackagenames</code>
+  </li><li> <code>-flattenpackagehierarchy</code>
+  </li><li> <code>-repackageclasses</code>
+  </li><li> <code>-keepattributes</code>
+  </li><li> <code>-adaptclassstrings</code>
+</li></ul>
+
+<p>忽略的选项包括:</p>
+
+<ul>
+  <li> <code>-dontoptimize // Jack does not optimize</code>
+  </li><li> <code>-dontpreverify // Jack does not preverify</code>
+  </li><li> <code>-skipnonpubliclibraryclasses</code>
+  </li><li> <code>-dontskipnonpubliclibraryclasses</code>
+  </li><li> <code>-dontskipnonpubliclibraryclassmembers</code>
+  </li><li> <code>-keepdirectories</code>
+  </li><li> <code>-target</code>
+  </li><li> <code>-forceprocessing</code>
+  </li><li> <code>-printusage</code>
+  </li><li> <code>-whyareyoukeeping</code>
+  </li><li> <code>-optimizations</code>
+  </li><li> <code>-optimizationpasses</code>
+  </li><li> <code>-assumenosideeffects</code>
+  </li><li> <code>-allowaccessmodification</code>
+  </li><li> <code>-mergeinterfacesaggressively</code>
+  </li><li> <code>-overloadaggressively</code>
+  </li><li> <code>-microedition</code>
+  </li><li> <code>-verbose</code>
+  </li><li> <code>-dontnote</code>
+  </li><li> <code>-dontwarn</code>
+  </li><li> <code>-ignorewarnings</code>
+  </li><li> <code>-printconfiguration</code>
+  </li><li> <code>-dump</code>
+</li></ul>
+
+<aside class="note"><strong>注意</strong>:其他选项会引发错误。</aside>
+
+<h3 id="repackaging">重新打包</h3>
+
+<p>Jack 使用 jarjar 配置文件来进行重新打包。虽然 Jack 与“rule”规则类型兼容,但与“zap”或“keep”规则类型不兼容。如果您需要使用“zap”或“keep”规则类型,请提交功能请求,并在其中说明您在应用中如何使用该功能。</p>
+
+<h3 id="multidex_support">多 dex 处理支持</h3>
+
+<p>Jack 支持本地多 dex 处理和旧版多 dex 处理。由于 dex 文件的方法数上限为 65K,因此方法数超过 65K 的应用必须拆分成多个 dex 文件。有关详情,请参阅<a href="http://developer.android.com/tools/building/multidex.html" class="external">编译方法数超过 65K 的应用</a>。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/known-issues.html b/zh-cn/setup/known-issues.html
new file mode 100644
index 0000000..06ce270
--- /dev/null
+++ b/zh-cn/setup/known-issues.html
@@ -0,0 +1,56 @@
+<html devsite><head>
+    <title>源代码同步问题</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+  <p>尽管我们一直万分谨慎,但 Android 源代码有时还是会出现一些小问题。本页详细介绍了您在尝试同步 Android 源代码时可能会遇到的一些已知问题。
+
+</p><h2 id="difficulties-syncing-the-source-code-proxy-issues">
+同步源代码时遇到的问题(代理问题)</h2>
+<p><strong>症状</strong>:<code>repo init</code> 或 <code>repo sync</code> 失败,并显示 HTTP 错误,通常为 403 或 500。</p>
+<p><strong>原因</strong>:有很多可能的原因,大多数情况下都与 HTTP 代理有关,这些代理无法顺利传输大量数据。</p>
+<p><strong>解决方法</strong>:虽然还没有通用的解决方法,但有人报告说使用 Python 2.7 以及明确使用 <code>repo sync -j1</code> 可以改善某些用户的情况。</p>
+
+<h2 id="difficulties-syncing-the-source-tree-dns-issues">
+同步源代码树时遇到的问题(DNS 问题)</h2>
+<p><strong>症状</strong>:在运行 <code>repo sync</code> 时进程失败,并显示与无法识别主机名相关的各种错误。其中一种错误是 <code>&lt;urlopen error [Errno -2] Name or service not known&gt;</code>。</p>
+<p><strong>原因</strong>:有些 DNS 系统难以应对同步源代码树时涉及的大量查询(在最糟糕的情况下,可能会有数百条查询请求)。</p>
+<p><strong>解决方法</strong>:手动解析相关主机名,并在本地对解析结果进行硬编码。</p>
+<p>您可以使用 <code>nslookup</code> 命令解析主机名,该命令将为每个主机名指定一个数字 IP 地址(通常是在输出的“Address”(地址)部分)。</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">nslookup googlesource.com</code>
+<code class="devsite-terminal">nslookup android.googlesource.com</code>
+</pre>
+<p>然后,您可以在本地对它们进行硬编码,方法是修改 <code>/etc/hosts</code>,在该文件中添加两行内容,形式如下:</p>
+<pre class="devsite-click-to-copy">
+aaa.bbb.ccc.ddd googlesource.com
+eee.fff.ggg.hhh android.googlesource.com
+</pre>
+<p>请注意,这种方法只适用于服务器的地址不会更改的情况;如果服务器的地址发生更改,导致您无法连接,那么您必须重新解析这些主机名,并相应地修改 <code>etc/hosts</code>。</p>
+
+<h2 id="difficulties-syncing-the-source-tree-tcp-issues">
+同步源代码树时遇到的问题(TCP 问题)</h2>
+<p><strong>症状</strong>:在同步时 <code>repo sync</code> 挂起,通常是在同步操作完成 99% 时出现这种情况。</p>
+<p><strong>原因</strong>:TCP/IP 堆栈中的某些设置在有些网络环境中会导致出现问题,使得 <code>repo sync</code> 既无法完成,也不会失败。</p>
+<p><strong>解决方法</strong>:在 Linux 中,请输入以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">sysctl -w net.ipv4.tcp_window_scaling=0</pre>
+<p>在 MacOS 中,请在网络设置部分停用 rfc1323 扩展程序。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/licenses.html b/zh-cn/setup/licenses.html
new file mode 100644
index 0000000..1cfbcc8
--- /dev/null
+++ b/zh-cn/setup/licenses.html
@@ -0,0 +1,47 @@
+<html devsite><head>
+    <title>内容许可</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>在 Android 开源项目中,我们的软件使用<a href="http://www.opensource.org/">开放源代码促进会</a>批准的一些开放源代码许可。</p>
+<h2 id="android-open-source-project-license">Android 开放源代码项目许可</h2>
+<p>Android 开源项目的首选许可是 <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0 版</a>(“Apache 2.0”),Android 软件的大部分内容都是根据 Apache 2.0 授权用户使用。尽管该项目将尽可能遵循此首选许可,但也可能存在将根据具体情况处理的例外情况。例如,与系统使用的许可不同,Linux 内核补丁程序使用的是 GPLv2 许可,您可以在 <a href="http://www.kernel.org/pub/linux/kernel/COPYING">kernel.org</a> 上找到相关信息。</p>
+<h2 id="contributor-license-grants">贡献者许可协议</h2>
+<p><em></em>为 Android 开源项目提供想法、代码或文档的所有个人贡献者(即仅以个人名义做贡献的贡献者)都需要填写、签署并提交《<a href="https://cla.developers.google.com/about/google-individual">个人贡献者许可协议</a>》。该协议可通过<a href="https://android-review.googlesource.com/#/settings/agreements">代码审核工具</a>在线签署。该协议明确规定了他们为 Android 开放源代码项目贡献知识产权内容时遵循的条款。该许可既是为了保护贡献者,也是为了保护该项目;它不会影响贡献者将贡献内容用于任何其他用途的权利。</p>
+<p><em></em>对于已指派员工参与 Android 开源项目的企业(或其他实体),则需要签署《<a href="https://cla.developers.google.com/about/google-corporate">企业贡献者许可协议</a>》。该版本的协议中规定,企业可以对其指派的员工提交的贡献内容进行授权,并可以授予版权和专利许可。请注意,签署《企业贡献者许可协议》并不意味着任何开发者无需再以个人名义签署《个人贡献者许可协议》。所有开发者都必须签署个人协议,以涵盖他们贡献的任何不归签署《企业贡献者许可协议》的企业所有的内容。<em></em></p>
+<p>请注意,我们的协议是根据 <a href="http://www.apache.org">Apache 软件基金会</a>所用的协议(可在 <a href="http://www.apache.org/licenses/">Apache 网站</a>上找到)制定的。</p>
+<h2 id="why-apache-software-license">为什么使用 Apache Software License?</h2>
+<p>有时候,有人会问我们,为什么 Apache Software License 2.0 是 Android 的首选许可。对于用户空间(即非内核)软件,相比其他许可(例如 LGPL),我们确实更倾向于 ASL2.0(以及 BSD、MIT 等类似许可)。</p>
+<p>Android 的宗旨是自由和选择。Android 旨在促进移动世界的开放性,我们不认为我们能够预测出或规定用户希望将我们的软件应用到的所有用途。因此,虽然我们鼓励每个人打造开放且可修改的设备,但我们并不认为我们有权利强制他们这样做。使用 LGPL 库则往往会强制他们这样做。</p>
+<p>以下是我们关心的一些具体问题:</p>
+<ul>
+<li>
+<p>LGPL(简化条款形式)要求:将源代码植入到应用中;书面提供源代码;或者动态关联 LGPL-ed 库,并允许用户手动升级或替换该库。由于 Android 软件通常是以静态系统映像的形式植入的,因此遵守这些要求最终会限制原始设备制造商 (OEM) 的设计。(例如,用户很难在只读闪存中替换库。)</p>
+</li>
+<li>
+<p>LGPL 要求允许用户进行修改,并要求允许用户进行逆向工程以便调试这些修改。大多数设备制造商都不希望受到这些条款的约束。因此,为了尽量减轻这些公司的负担,我们会最大限度地减少在用户空间中使用 LGPL 软件。</p></li><p></p>
+
+<li>
+<p>过去,LGPL 库是下游设备制造商和应用开发者面临的大量合规问题的根源。遗憾的是,就这些问题对工程师提供指导非常困难而且进展缓慢。设备制造商能够尽可能轻松地遵守许可对于 Android 的成功至关重要。鉴于过去在遵守 LGPL 方面遇到的困难,最明智的做法就是,如果我们能够避免使用 LGPL 库,便不使用它们。</p>
+</li>
+</ul>
+<p>上面讨论的问题是我们为自己的代码首选 ASL2.0 的原因。它们并不是批判 LGPL 或其他许可。我们非常热衷于这一主题,甚至不厌其烦地想方设法确保尽可能多的代码根据 ASL2.0 授权用户使用。不过,我们喜欢各种免费的开放源代码许可,并尊重其他人的意见和偏好。我们只是认定 ASL2.0 是适合我们目标的许可而已。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/life-of-a-bug.html b/zh-cn/setup/life-of-a-bug.html
new file mode 100644
index 0000000..b6681d4
--- /dev/null
+++ b/zh-cn/setup/life-of-a-bug.html
@@ -0,0 +1,91 @@
+<html devsite><head>
+    <title>错误的生命周期</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>Android 开放源代码项目提供了一个公开问题跟踪工具,您可以在其中就 Android 核心软件堆栈报告错误及请求功能。(要详细了解此问题跟踪工具,请参阅<a href="report-bugs.html">报告错误</a>页面。)
+报告错误意义重大(谢谢!),但在您提交错误报告后它们会经历些什么?本页将介绍错误的生命周期。</p>
+
+<p class="note">Android 开源项目 (AOSP) 问题跟踪器仅适用于与 Android 核心软件堆栈相关的错误和功能请求,是一款面向开源社区的技术工具。</p>
+
+<p>它不是一个客户支持论坛。要获取支持信息,请参阅 <a href="https://support.google.com/nexus">Nexus</a> 和 <a href="https://support.google.com/pixelphone">Pixel</a> 帮助中心。
+对于其他设备,则由设备制造商或销售这些设备的运营商提供支持。</p>
+
+<p>通过 <a href="http://support.google.com/">Google 的支持网站</a>,可以获得 Google 应用方面的支持。对于第三方应用,则由每个应用的开发者提供支持,例如,您可以通过 Google Play 上提供的联系信息与他们联系。</p>
+
+<p>下面简要说明了错误的生命周期:</p>
+<ol>
+<li>用户提交一个错误,该错误的状态将为“New”(新)。</li>
+<li>AOSP 维护人员定期审核错误并进行分类。错误将被划分为以下 4 个类别之一:“New”(新)、“Open”(待解决)、“No-Action”(无需处理)或“Resolved”(已解决)。<em></em></li>
+<li>每个类别都包括多种状态,这些状态能够提供有关问题处理情况的更多详细信息。</li>
+<li>标记为“已解决”的错误最终将在未来版本的 Android 软件中予以修复。</li>
+</ol>
+
+<h2 id="bucket-details">类别详细信息</h2>
+<p>
+我们使用问题跟踪器中的 <strong>Status(状态)</strong>字段来指定问题处于解决过程中的什么状态。这与<a href="https://developers.google.com/issue-tracker/concepts/issues#status">问题跟踪器文档</a>中指定的定义一致。
+</p>
+<h3 id="new-issues">“新”问题</h3>
+<p>
+“新”问题包括尚未进行任何处理的错误报告,具有以下两种状态:
+</p>
+<ul>
+ <li><strong>New(新)</strong>:错误报告尚未被分类(即 AOSP 维护人员尚未审核。)</li>
+ <li><strong>New + Hotlist:NeedsInfo(新 + Hotlist:需要信息)</strong>:错误报告中的信息不充分,我们无法予以处理。报告错误的人员需要提供更多详细信息,然后我们才能对其进行分类。如果报告错误的人员在规定的时间内未提供新信息,相应错误默认可能会被关闭,变为“无需处理”类别下的某种状态。</li>
+</ul>
+<h3 id="open-issues">“待解决”的问题</h3>
+<p>
+此类别包含需要处理但仍未解决的错误(正在等待我们对源代码进行更改)。
+</p>
+<ul>
+ <li><strong>Assigned(已分配)</strong>:错误报告已被认定为细节充分、问题有效,且相应错误已被分配给特定贡献者进行评估和分析。</li>
+ <li><strong>Accepted(已接受)</strong>:被指派的人员已确认并已着手解决相应问题。</li>
+</ul>
+<p>
+通常情况下,错误一开始的状态为<strong>已分配</strong>且一直保持该状态,直到有人有意解决它,此时错误的状态会变为<strong>已接受</strong>。不过请注意,我们并不保证一定会是这样,而错误直接从<strong>已分配</strong>变为“已解决”类别下的某种状态也是很常见的。
+</p>
+<p>
+一般来说,如果错误处于“待解决”类别下的某种状态,则表明 AOSP 团队已将其认定为有效问题,并且贡献者贡献的高质量修复方案很可能会被接受。不过,我们无法保证及时修复任何特定版本的错误。
+</p>
+<h3 id="no-action-issues">“无需处理”的问题</h3>
+<p>
+此类别包含被视为不需要任何处理的错误。
+</p>
+<ul>
+ <li><strong>Won't Fix (Not reproducible)(无法修复(不可重现))</strong>:AOSP 贡献者尝试重现所描述的行为,但无法做到。有时,这意味着错误虽然有效但不常见或难以重现,或因信息不充分而无法解决问题。</li>
+ <li><strong>Won't Fix (Intended behavior)(无法修复(正常情况))</strong>:AOSP 维护人员已确定所描述的行为不是错误,而是正常情况。这种状态通常也称为“正常情况”(WAI)。<em></em>如果是功能请求,则 AOSP 维护人员已确定在 Android 中将不会实现相应请求。</li>
+ <li><strong>Won't Fix (Obsolete)(无法修复(过时))</strong>:由于产品有所变化,相应问题已无关紧要。</li>
+ <li><strong>Won't Fix (Infeasible)(无法修复(不可行))</strong>:解决问题所需进行的更改不可能实现。该状态还用于表示报告的问题无法在 AOSP 中予以处理,通常是因为问题与定制设备或外部应用相关,或者报告者误认为此跟踪器是帮助论坛。</li>
+ <li><strong>Duplicate(重复)</strong>:问题跟踪器中已有相同的报告。如有任何实际处理措施,都将针对相同报告予以报告。</li>
+</ul>
+<h3 id="resolved-issues">“已解决”的问题</h3>
+<p>
+此类别包含已被处理且现在被视为已解决的错误。
+</p>
+<ul>
+ <li><strong>Fixed (verified)(已修复(已通过验证))</strong>:相应错误已被修复,且修复方案已被纳入到一个正式版本中。在设置此状态的同时,我们也会尝试设置一个属性,说明错误是在哪个版本中修复的。</li>
+ <li><strong>Fixed(已修复)</strong>:相应错误已经在源代码树中予以修复(或功能已经实现),但修复方案尚未被纳入到正式版本中。</li>
+</ul>
+<h2 id="other-stuff">其他事项</h2>
+<p>
+上述状态和生命周期是我们通常在尝试跟踪软件时采取的方式。
+不过,由于 Android 包含大量软件,相应地也会收到大量错误报告。因此,有时候错误并没有经过正式流程中的所有状态。虽然我们会尽量确保系统保持最新状态,但我们倾向于定期进行“错误清除”- 在此过程中,我们会检查数据库并进行更新。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/life-of-a-patch.html b/zh-cn/setup/life-of-a-patch.html
new file mode 100644
index 0000000..232dea4
--- /dev/null
+++ b/zh-cn/setup/life-of-a-patch.html
@@ -0,0 +1,29 @@
+<html devsite><head>
+    <title>补丁程序的生命周期</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>Android 开源项目 (AOSP) 使用一种基于网页的代码审核工具,该工具称为 <a href="https://android-review.googlesource.com/">Gerrit</a>。下图是一个流程图,详细说明了补丁程序在编写好之后会发生什么。虽然这看起来可能非常复杂,但以下大多数步骤都是在网络应用中执行的。</p>
+<p>如需关于如何完成相关设置来使用 Gerrit 和 Git 的完整说明,请参阅<a href="submit-patches.html">提交补丁程序</a>页面。</p>
+<img src="/images/workflow-0.png" alt="工作流程示意图" id="figure1"/>
+<p class="img-caption">
+  <strong>图 1.</strong> 补丁程序工作流程</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/read-bug-reports.html b/zh-cn/setup/read-bug-reports.html
new file mode 100644
index 0000000..a679425
--- /dev/null
+++ b/zh-cn/setup/read-bug-reports.html
@@ -0,0 +1,863 @@
+<html devsite><head>
+    <title>阅读错误报告</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>无论是任何类型的开发工作,出错都在所难免,而错误报告对于找出和解决问题至关重要。Android 的所有版本都支持通过 <a href="http://developer.android.com/tools/help/adb.html">Android 调试桥 (adb)</a> 获取错误报告;Android 4.2 及更高版本支持一个旨在获取错误报告以及通过电子邮件、云端硬盘等分享报告的<a href="http://developer.android.com/tools/device.html#developer-device-options">开发者选项</a>。</p>
+
+<p>Android 错误报告中包含文本 (.txt) 格式的 <code>dumpsys</code>、<code>dumpstate</code> 和 <code>logcat</code> 数据,以便您轻松搜索特定内容。以下各部分详细说明了错误报告的组成部分、介绍了常见问题,并提供了关于查找与这些错误相关的日志的实用提示和 <code>grep</code> 命令。大多数部分中还包括 <code>grep</code> 命令及输出和/或 <code>dumpsys</code> 输出方面的示例。</p>
+
+<h2 id="logcat">Logcat</h2>
+<p><code>logcat</code> 日志是所有 <code>logcat</code> 信息的转储,并采用字符串形式。<strong>system</strong>(系统)部分专门用于记录框架方面的信息,与包含所有其他内容的 <strong>main</strong>(主要内容)部分相比,该部分包含更长时间内的记录。每行都以 <code>timestamp PID TID log-level</code> 开头。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>------ SYSTEM LOG (logcat -v threadtime -d *:v) ------
+--------- beginning of system
+<i>Blah</i>
+<i>Blah</i>
+<i>Blah</i>
+
+--------- beginning of main
+<i>Blah </i>
+<i>Blah</i>
+<i>Blah</i></pre><p></p>
+  </section>
+
+<h3 id="event-log">查看事件日志</h3>
+<p>该日志中包含将二进制格式转换成了字符串形式的日志消息。它比 <code>logcat</code> 日志要清晰明了,但也有些难以阅读。在查看事件日志时,您可以在这一部分中搜索特定进程 ID (PID),以查看相应进程一直在做什么。基本格式为:<code>timestamp PID TID log-level log-tag tag-values</code>。</p>
+
+<p>日志级别包括以下几种:</p>
+<ul>
+<li>V:详细</li>
+<li>D:调试</li>
+<li>I:信息</li>
+<li>W:警告</li>
+<li>E:错误</li>
+</ul>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>------ EVENT LOG (logcat -b events -v threadtime -d *:v) ------
+09-28 13:47:34.179   785  5113 I am_proc_bound: [0,23054,com.google.android.gms.unstable]
+09-28 13:47:34.777   785  1975 I am_proc_start: [0,23134,10032,com.android.chrome,broadcast,com.android.chrome/org.chromium.chrome.browser.precache.PrecacheServiceLauncher]
+09-28 13:47:34.806   785  2764 I am_proc_bound: [0,23134,com.android.chrome]
+...</pre><p></p>
+  </section>
+<p> </p>
+<p>有关其他实用的事件日志标记,请参阅 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/EventLogTags.logtags">/services/core/java/com/android/server/EventLogTags.logtags</a>。</p>
+
+<h2 id="anrs-deadlocks">ANR 和死锁</h2>
+<p>错误报告有助于您找出导致<a href="http://developer.android.com/training/articles/perf-anr.html">应用无响应 (ANR)</a> 错误和死锁事件的原因。</p>
+
+<h3 id="determine-anr-app">找出无响应的应用</h3>
+<p>当某个应用在一定时间内没有响应(通常是由于主线程被阻塞或繁忙)时,系统会终止该进程并将堆栈转储到 <code>/data/anr</code>。要找出 ANR 背后的罪魁祸首,请为二进制事件日志中的 <code>am_anr</code> 执行 grep 命令。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>grep "am_anr" bugreport-2015-10-01-18-13-48.txt
+10-01 18:12:49.599  4600  4614 I am_anr  : [0,29761,com.google.android.youtube,953695941,executing service com.google.android.youtube/com.google.android.apps.youtube.app.offline.transfer.OfflineTransferService]
+10-01 18:14:10.211  4600  4614 I am_anr  : [0,30363,com.google.android.apps.plus,953728580,executing service com.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService]</pre><p></p>
+  </section>
+
+<p></p>
+<p>您也可以为 <code>logcat</code> 日志(其中包含关于发生 ANR 时是什么在占用 CPU 的更多信息)中的 <code>ANR in</code> 执行 grep 命令。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>grep "ANR in" bugreport-2015-10-01-18-13-48.txt
+10-01 18:13:11.984  4600  4614 E ActivityManager: ANR in com.google.android.youtube
+10-01 18:14:31.720  4600  4614 E ActivityManager: ANR in com.google.android.apps.plus
+10-01 18:14:31.720  4600  4614 E ActivityManager: PID: 30363
+10-01 18:14:31.720  4600  4614 E ActivityManager: Reason: executing service com.google.android.apps.plus/com.google.android.apps.photos.service.PhotosService
+10-01 18:14:31.720  4600  4614 E ActivityManager: Load: 35.27 / 23.9 / 16.18
+10-01 18:14:31.720  4600  4614 E ActivityManager: CPU usage from 16ms to 21868ms later:
+10-01 18:14:31.720  4600  4614 E ActivityManager:   74% 3361/mm-qcamera-daemon: 62% user + 12% kernel / faults: 15276 minor 10 major
+10-01 18:14:31.720  4600  4614 E ActivityManager:   41% 4600/system_server: 18% user + 23% kernel / faults: 18597 minor 309 major
+10-01 18:14:31.720  4600  4614 E ActivityManager:   32% 27420/com.google.android.GoogleCamera: 24% user + 7.8% kernel / faults: 48374 minor 338 major
+10-01 18:14:31.720  4600  4614 E ActivityManager:   16% 130/kswapd0: 0% user + 16% kernel
+10-01 18:14:31.720  4600  4614 E ActivityManager:   15% 283/mmcqd/0: 0% user + 15% kernel
+...
+10-01 18:14:31.720  4600  4614 E ActivityManager:   0.1% 27248/irq/503-synapti: 0%
+10-01 18:14:31.721  4600  4614 I ActivityManager: Killing 30363:com.google.android.apps.plus/u0a206 (adj 0): bg anr</pre><p></p>
+  </section>
+
+<h3 id="find-stack-traces">查找堆栈跟踪</h3>
+<p>通常您可以找到与 ANR 对应的堆栈跟踪。请确保 VM 跟踪上的时间戳和 PID 与您正在调查的 ANR 相符,然后再检查进程的主线程。请注意:</p>
+<ul>
+<li>主线程只能让您了解发生 ANR 时它在做什么,这可能是导致 ANR 的真正原因,也可能不是。(错误报告中的堆栈可能是无辜的;可能有其他线程在恢复正常之前粘滞了很长时间,但不足以导致 ANR。)
+</li>
+<li>可能存在多组堆栈跟踪(<code>VM TRACES JUST NOW</code> 和 <code>VM TRACES AT LAST ANR</code>)。请确保您查看的是正确的部分。</li>
+</ul>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>------ VM TRACES AT LAST ANR (/data/anr/traces.txt: 2015-10-01 18:14:41) ------
+
+----- pid 30363 at 2015-10-01 18:14:11 -----
+Cmd line: com.google.android.apps.plus
+Build fingerprint: 'google/angler/angler:6.0/MDA89D/2294819:userdebug/dev-keys'
+ABI: 'arm'
+Build type: optimized
+Zygote loaded classes=3978 post zygote classes=27
+Intern table: 45068 strong; 21 weak
+JNI: CheckJNI is off; globals=283 (plus 360 weak)
+Libraries: /system/lib/libandroid.so /system/lib/libcompiler_rt.so /system/lib/libjavacrypto.so /system/lib/libjnigraphics.so /system/lib/libmedia_jni.so /system/lib/libwebviewchromium_loader.so libjavacore.so (7)
+Heap: 29% free, 21MB/30MB; 32251 objects
+Dumping cumulative Gc timings
+Total number of allocations 32251
+Total bytes allocated 21MB
+Total bytes freed 0B
+Free memory 9MB
+Free memory until GC 9MB
+Free memory until OOME 490MB
+Total memory 30MB
+Max memory 512MB
+Zygote space size 1260KB
+Total mutator paused time: 0
+Total time waiting for GC to complete: 0
+Total GC count: 0
+Total GC time: 0
+Total blocking GC count: 0
+Total blocking GC time: 0
+
+suspend all histogram:  Sum: 119.728ms 99% C.I. 0.010ms-107.765ms Avg: 5.442ms Max: 119.562ms
+DALVIK THREADS (12):
+"Signal Catcher" daemon prio=5 tid=2 Runnable
+  | group="system" sCount=0 dsCount=0 obj=0x12c400a0 self=0xef460000
+  | sysTid=30368 nice=0 cgrp=default sched=0/0 handle=0xf4a69930
+  | state=R schedstat=( 9021773 5500523 26 ) utm=0 stm=0 core=1 HZ=100
+  | stack=0xf496d000-0xf496f000 stackSize=1014KB
+  | held mutexes= "mutator lock"(shared held)
+  native: #00 pc 0035a217  /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;, int, char const*, art::ArtMethod*, void*)+126)
+  native: #01 pc 0033b03b  /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;) const+138)
+  native: #02 pc 00344701  /system/lib/libart.so (art::DumpCheckpoint::Run(art::Thread*)+424)
+  native: #03 pc 00345265  /system/lib/libart.so (art::ThreadList::RunCheckpoint(art::Closure*)+200)
+  native: #04 pc 00345769  /system/lib/libart.so (art::ThreadList::Dump(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;)+124)
+  native: #05 pc 00345e51  /system/lib/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;)+312)
+  native: #06 pc 0031f829  /system/lib/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream&lt;char, std::__1::char_traits&lt;char&gt; &gt;&amp;)+68)
+  native: #07 pc 00326831  /system/lib/libart.so (art::SignalCatcher::HandleSigQuit()+896)
+  native: #08 pc 003270a1  /system/lib/libart.so (art::SignalCatcher::Run(void*)+324)
+  native: #09 pc 0003f813  /system/lib/libc.so (__pthread_start(void*)+30)
+  native: #10 pc 00019f75  /system/lib/libc.so (__start_thread+6)
+  (no managed stack frames)
+
+"main" prio=5 tid=1 Suspended
+  | group="main" sCount=1 dsCount=0 obj=0x747552a0 self=0xf5376500
+  | sysTid=30363 nice=0 cgrp=default sched=0/0 handle=0xf74feb34
+  | state=S schedstat=( 331107086 164153349 851 ) utm=6 stm=27 core=3 HZ=100
+  | stack=0xff00f000-0xff011000 stackSize=8MB
+  | held mutexes=
+  kernel: __switch_to+0x7c/0x88
+  kernel: futex_wait_queue_me+0xd4/0x130
+  kernel: futex_wait+0xf0/0x1f4
+  kernel: do_futex+0xcc/0x8f4
+  kernel: compat_SyS_futex+0xd0/0x14c
+  kernel: cpu_switch_to+0x48/0x4c
+  native: #00 pc 000175e8  /system/lib/libc.so (syscall+28)
+  native: #01 pc 000f5ced  /system/lib/libart.so (art::ConditionVariable::Wait(art::Thread*)+80)
+  native: #02 pc 00335353  /system/lib/libart.so (art::Thread::FullSuspendCheck()+838)
+  native: #03 pc 0011d3a7  /system/lib/libart.so (art::ClassLinker::LoadClassMembers(art::Thread*, art::DexFile const&amp;, unsigned char const*, art::Handle&lt;art::mirror::Class&gt;, art::OatFile::OatClass const*)+746)
+  native: #04 pc 0011d81d  /system/lib/libart.so (art::ClassLinker::LoadClass(art::Thread*, art::DexFile const&amp;, art::DexFile::ClassDef const&amp;, art::Handle&lt;art::mirror::Class&gt;)+88)
+  native: #05 pc 00132059  /system/lib/libart.so (art::ClassLinker::DefineClass(art::Thread*, char const*, unsigned int, art::Handle&lt;art::mirror::ClassLoader&gt;, art::DexFile const&amp;, art::DexFile::ClassDef const&amp;)+320)
+  native: #06 pc 001326c1  /system/lib/libart.so (art::ClassLinker::FindClassInPathClassLoader(art::ScopedObjectAccessAlreadyRunnable&amp;, art::Thread*, char const*, unsigned int, art::Handle&lt;art::mirror::ClassLoader&gt;, art::mirror::Class**)+688)
+  native: #07 pc 002cb1a1  /system/lib/libart.so (art::VMClassLoader_findLoadedClass(_JNIEnv*, _jclass*, _jobject*, _jstring*)+264)
+  native: #08 pc 002847fd  /data/dalvik-cache/arm/system@[email protected] (Java_java_lang_VMClassLoader_findLoadedClass__Ljava_lang_ClassLoader_2Ljava_lang_String_2+112)
+  at java.lang.VMClassLoader.findLoadedClass!(Native method)
+  at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:362)
+  at java.lang.ClassLoader.loadClass(ClassLoader.java:499)
+  at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
+  at android.app.ActivityThread.installProvider(ActivityThread.java:5141)
+  at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748)
+  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688)
+  at android.app.ActivityThread.-wrap1(ActivityThread.java:-1)
+  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
+  at android.os.Handler.dispatchMessage(Handler.java:102)
+  at android.os.Looper.loop(Looper.java:148)
+  at android.app.ActivityThread.main(ActivityThread.java:5417)
+  at java.lang.reflect.Method.invoke!(Native method)
+  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
+  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
+
+  ...
+<i>  Stacks for other threads in this process follow</i>
+  ...</pre><p></p>
+  </section>
+
+<h3 id="deadlocks">查找死锁</h3>
+<p>由于线程出现粘滞,死锁往往首先表现为 ANR。如果系统服务器发生死锁,监控程序最终会将其终止,从而导致日志中出现类似以下的条目:<code>WATCHDOG KILLING SYSTEM PROCESS</code>。对于用户来说,他们看到的是设备重新启动,但从技术上来讲这是运行时重启,而不是真正的设备重新启动。</p>
+
+<ul>
+<li>在<strong>运行时</strong>重启时,系统服务器已死机并会重启,并且用户会看到设备返回到显示启动动画。</li>
+<li>在设备<strong>重新启动</strong>时,内核已崩溃,并且用户会看到设备返回到显示 Google 启动徽标。</li>
+</ul>
+
+<p>要查找死锁,请检查 VM 跟踪部分中是否存在以下模式:线程 A 在等待线程 B 占用的某些资源,而线程 B 也在等待线程 A 占用的某些资源。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>"Binder_B" prio=5 tid=73 Blocked
+  | group="main" sCount=1 dsCount=0 obj=0x13faa0a0 self=0x95e24800
+  | sysTid=2016 nice=0 cgrp=default sched=0/0 handle=0x8b68d930
+  | state=S schedstat=( 9351576559 4141431119 16920 ) utm=819 stm=116 core=1 HZ=100
+  | stack=0x8b591000-0x8b593000 stackSize=1014KB
+  | held mutexes=
+  at com.android.server.pm.UserManagerService.exists(UserManagerService.java:387)
+  - waiting to lock &lt;0x025f9b02&gt; (a android.util.ArrayMap) held by thread 20
+  at com.android.server.pm.PackageManagerService.getApplicationInfo(PackageManagerService.java:2848)
+  at com.android.server.AppOpsService.getOpsRawLocked(AppOpsService.java:881)
+  at com.android.server.AppOpsService.getOpsLocked(AppOpsService.java:856)
+  at com.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:719)
+  - locked &lt;0x0231885a&gt; (a com.android.server.AppOpsService)
+  at com.android.server.AppOpsService.noteOperation(AppOpsService.java:713)
+  at com.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260)
+  at com.android.server.MountService$MountServiceInternalImpl.getExternalStorageMountMode(MountService.java:3416)
+  at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3228)
+  at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3170)
+  at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3059)
+  at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1070)
+  - locked &lt;0x044d166f&gt; (a com.android.server.am.ActivityManagerService)
+  at com.android.server.am.ActivityManagerService.finishReceiver(ActivityManagerService.java:16950)
+  at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:494)
+  at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2432)
+  at android.os.Binder.execTransact(Binder.java:453)
+...
+  "PackageManager" prio=5 tid=20 Blocked
+  | group="main" sCount=1 dsCount=0 obj=0x1304f4a0 self=0xa7f43900
+  | sysTid=1300 nice=10 cgrp=bg_non_interactive sched=0/0 handle=0x9fcf9930
+  | state=S schedstat=( 26190141996 13612154802 44357 ) utm=2410 stm=209 core=2 HZ=100
+  | stack=0x9fbf7000-0x9fbf9000 stackSize=1038KB
+  | held mutexes=
+  at com.android.server.AppOpsService.noteOperationUnchecked(AppOpsService.java:718)
+  - waiting to lock &lt;0x0231885a&gt; (a com.android.server.AppOpsService) held by thread 73
+  at com.android.server.AppOpsService.noteOperation(AppOpsService.java:713)
+  at com.android.server.AppOpsService$2.getMountMode(AppOpsService.java:260)
+  at com.android.server.AppOpsService$2.hasExternalStorage(AppOpsService.java:273)
+  at com.android.server.MountService$MountServiceInternalImpl.hasExternalStorage(MountService.java:3431)
+  at com.android.server.MountService.getVolumeList(MountService.java:2609)
+  at android.os.storage.StorageManager.getVolumeList(StorageManager.java:880)
+  at android.os.Environment$UserEnvironment.getExternalDirs(Environment.java:83)
+  at android.os.Environment.isExternalStorageEmulated(Environment.java:708)
+  at com.android.server.pm.PackageManagerService.isExternalMediaAvailable(PackageManagerService.java:9327)
+  at com.android.server.pm.PackageManagerService.startCleaningPackages(PackageManagerService.java:9367)
+  - locked &lt;0x025f9b02&gt; (a android.util.ArrayMap)
+  at com.android.server.pm.PackageManagerService$PackageHandler.doHandleMessage(PackageManagerService.java:1320)
+  at com.android.server.pm.PackageManagerService$PackageHandler.handleMessage(PackageManagerService.java:1122)
+  at android.os.Handler.dispatchMessage(Handler.java:102)
+  at android.os.Looper.loop(Looper.java:148)
+  at android.os.HandlerThread.run(HandlerThread.java:61)
+  at com.android.server.ServiceThread.run(ServiceThread.java:46)</pre><p></p>
+  </section>
+
+<h2 id="activities">Activity</h2>
+<p><a href="http://developer.android.com/guide/components/activities.html">Activity</a> 是一种应用组件,可提供一个屏幕,用户能够通过与该屏幕互动来执行某些操作,例如拨打电话号码、拍照、发送电子邮件,等等。从错误报告的角度来看,一个 <a href="http://developer.android.com/reference/android/app/Activity.html">Activity</a> 是用户可以执行一项明确具体的操作,这使得查找在崩溃期间处于聚焦状态的 Activity 变得非常重要。Activity 通过 ActivityManager 运行进程,因此找出指定 Activity 的所有进程停止和启动事件也有助于进行问题排查。</p>
+
+<h3 id="history-focused-activities">查看处于聚焦状态的 Activity</h3>
+<p>要查看记录的处于聚焦状态的 Activity,请搜索 <code>am_focused_activity</code>。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>grep "am_focused_activity" bugreport-2015-10-01-18-13-48.txt
+10-01 18:10:41.409  4600 14112 I am_focused_activity: [0,com.google.android.GoogleCamera/com.android.camera.CameraActivity]
+10-01 18:11:17.313  4600  5687 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]
+10-01 18:11:52.747  4600 14113 I am_focused_activity: [0,com.google.android.GoogleCamera/com.android.camera.CameraActivity]
+10-01 18:14:07.762  4600  5687 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]</pre><p></p>
+  </section>
+
+<h3 id="history-process-starts">查看进程启动事件</h3>
+<p>要查看记录的进程启动事件,请搜索 <code>Start proc</code>。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>grep "Start proc" bugreport-2015-10-01-18-13-48.txt
+10-01 18:09:15.309  4600  4612 I ActivityManager: Start proc 24533:com.metago.astro/u0a240 for broadcast com.metago.astro/com.inmobi.commons.analytics.androidsdk.IMAdTrackerReceiver
+10-01 18:09:15.687  4600 14112 I ActivityManager: Start proc 24548:com.google.android.apps.fitness/u0a173 for service com.google.android.apps.fitness/.api.services.ActivityUpsamplingService
+10-01 18:09:15.777  4600  6604 I ActivityManager: Start proc 24563:cloudtv.hdwidgets/u0a145 for broadcast cloudtv.hdwidgets/cloudtv.switches.SwitchSystemUpdateReceiver
+10-01 18:09:20.574  4600  6604 I ActivityManager: Start proc 24617:com.wageworks.ezreceipts/u0a111 for broadcast com.wageworks.ezreceipts/.ui.managers.IntentReceiver
+...</pre><p></p>
+  </section>
+
+<h3 id="device-thrashing">设备是否发生系统颠簸?</h3>
+<p>要确定设备是否发生<a href="https://en.wikipedia.org/wiki/Thrashing_(computer_science)">系统颠簸</a>,请检查 <code>am_proc_died</code> 和 <code>am_proc_start</code> 前后在短时间内是否出现活动异常增加。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>grep -e "am_proc_died" -e "am_proc_start" bugreport-2015-10-01-18-13-48.txt
+10-01 18:07:06.494  4600  9696 I am_proc_died: [0,20074,com.android.musicfx]
+10-01 18:07:06.555  4600  6606 I am_proc_died: [0,31166,com.concur.breeze]
+10-01 18:07:06.566  4600 14112 I am_proc_died: [0,18812,com.google.android.apps.fitness]
+10-01 18:07:07.018  4600  7513 I am_proc_start: [0,20361,10113,com.sony.playmemories.mobile,broadcast,com.sony.playmemories.mobile/.service.StartupReceiver]
+10-01 18:07:07.357  4600  4614 I am_proc_start: [0,20381,10056,com.google.android.talk,service,com.google.android.talk/com.google.android.libraries.hangouts.video.CallService]
+10-01 18:07:07.784  4600  4612 I am_proc_start: [0,20402,10190,com.andcreate.app.trafficmonitor:loopback_measure_serivce,service,com.andcreate.app.trafficmonitor/.loopback.LoopbackMeasureService]
+10-01 18:07:10.753  4600  5997 I am_proc_start: [0,20450,10097,com.amazon.mShop.android.shopping,broadcast,com.amazon.mShop.android.shopping/com.amazon.identity.auth.device.storage.LambortishClock$ChangeTimestampsBroadcastReceiver]
+10-01 18:07:15.267  4600  6605 I am_proc_start: [0,20539,10173,com.google.android.apps.fitness,service,com.google.android.apps.fitness/.api.services.ActivityUpsamplingService]
+10-01 18:07:15.985  4600  4612 I am_proc_start: [0,20568,10022,com.android.musicfx,broadcast,com.android.musicfx/.ControlPanelReceiver]
+10-01 18:07:16.315  4600  7512 I am_proc_died: [0,20096,com.google.android.GoogleCamera]</pre><p></p>
+  </section>
+
+<h2 id="memory">内存</h2>
+<p>由于 Android 设备的物理内存通常都存在限制,因此管理随机存取存储器 (RAM) 至关重要。错误报告中包含一些用于指示内存不足的指标以及一个提供内存快照的 dumpstate。</p>
+
+<h3 id="low-memory">发现内存不足的情况</h3>
+<p>内存不足可能会导致系统发生颠簸,这是因为虽然内存不足时系统会终止某些进程来释放内存,但又会继续启动其他进程。要查看内存不足的确凿证据,请检查二进制事件日志中 <code>am_proc_died</code> 和 <code>am_proc_start</code> 条目的密集程度。</p>
+
+<p>内存不足还可能会减慢任务切换速度,并且可能会阻止进行返回尝试(因为用户尝试返回到的任务已被终止)。如果启动器被终止,它会在用户触摸主屏幕按钮时重启,并且日志中会显示启动器重新加载其内容。</p>
+
+<h4 id="historical-low-memory">查看历史指标</h4>
+<p>二进制事件日志中的 <code>am_low_memory</code> 条目表示最后一个缓存的进程已终止。在此之后,系统开始终止各项服务。
+
+  </p><section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>grep "am_low_memory" bugreport-2015-10-01-18-13-48.txt
+10-01 18:11:02.219  4600  7513 I am_low_memory: 41
+10-01 18:12:18.526  4600 14112 I am_low_memory: 39
+10-01 18:12:18.874  4600  7514 I am_low_memory: 38
+10-01 18:12:22.570  4600 14112 I am_low_memory: 40
+10-01 18:12:34.811  4600 20319 I am_low_memory: 43
+10-01 18:12:37.945  4600  6521 I am_low_memory: 43
+10-01 18:12:47.804  4600 14110 I am_low_memory: 43</pre><p></p>
+  </section>
+
+<h4 id="thrashing-indicators">查看系统颠簸指标</h4>
+<p>关于系统颠簸(分页、直接回收等)的其他指标包括 <code>kswapd</code>、<code>kworker</code> 和 <code>mmcqd</code> 消耗的 CPU 周期。(请注意,收集错误报告可能会影响系统颠簸指标。)</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>------ CPU INFO (top -n 1 -d 1 -m 30 -t) ------
+
+User 15%, System 54%, IOW 28%, IRQ 0%
+User 82 + Nice 2 + Sys 287 + Idle 1 + IOW 152 + IRQ 0 + SIRQ 5 = 529
+
+  PID   TID PR CPU% S     VSS     RSS PCY UID      Thread          Proc
+15229 15229  0  19% R      0K      0K  fg root     kworker/0:2
+29512 29517  1   7% D 1173524K 101188K  bg u0_a27   Signal Catcher  com.google.android.talk
+24565 24570  3   6% D 2090920K 145168K  fg u0_a22   Signal Catcher  com.google.android.googlequicksearchbox:search
+19525 19525  2   6% R   3476K   1644K  fg shell    top             top
+24957 24962  2   5% R 1706928K 125716K  bg u0_a47   Signal Catcher  com.google.android.GoogleCamera
+19519 19519  3   4% S      0K      0K  fg root     kworker/3:1
+  120   120  0   3% S      0K      0K  fg root     mmcqd/1
+18233 18233  1   3% S      0K      0K  fg root     kworker/1:1
+25589 25594  1   2% D 1270476K  75776K  fg u0_a8    Signal Catcher  com.google.android.gms
+19399 19399  2   1% S      0K      0K  fg root     kworker/2:2
+ 1963  1978  1   0% S 1819100K 125136K  fg system   android.fg      system_server
+ 1963  1981  3   0% S 1819100K 125136K  fg system   android.display system_server</pre><p></p>
+  </section>
+<p></p>
+
+<p>ANR 日志可以提供类似的内存快照。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>10-03 17:19:59.959  1963  1976 E ActivityManager: ANR in com.google.android.apps.magazines
+10-03 17:19:59.959  1963  1976 E ActivityManager: PID: 18819
+10-03 17:19:59.959  1963  1976 E ActivityManager: Reason: Broadcast of Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x4000010 cmp=com.google.android.apps.magazines/com.google.apps.dots.android.newsstand.appwidget.NewsWidgetProvider (has extras) }
+10-03 17:19:59.959  1963  1976 E ActivityManager: Load: 19.19 / 14.76 / 12.03
+10-03 17:19:59.959  1963  1976 E ActivityManager: CPU usage from 0ms to 11463ms later:
+10-03 17:19:59.959  1963  1976 E ActivityManager:   54% 15229/kworker/0:2: 0% user + 54% kernel
+10-03 17:19:59.959  1963  1976 E ActivityManager:   38% 1963/system_server: 14% user + 23% kernel / faults: 17152 minor 1073 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   11% 120/mmcqd/1: 0% user + 11% kernel
+10-03 17:19:59.959  1963  1976 E ActivityManager:   10% 2737/com.android.systemui: 4.7% user + 5.6% kernel / faults: 7211 minor 149 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   0.2% 1451/debuggerd: 0% user + 0.2% kernel / faults: 15211 minor 147 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   8.7% 6162/com.twofortyfouram.locale: 4% user + 4.7% kernel / faults: 4924 minor 260 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   6.1% 24565/com.google.android.googlequicksearchbox:search: 2.4% user + 3.7% kernel / faults: 2902 minor 129 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   6% 55/kswapd0: 0% user + 6% kernel
+10-03 17:19:59.959  1963  1976 E ActivityManager:   4.9% 18819/com.google.android.apps.magazines: 1.5% user + 3.3% kernel / faults: 10129 minor 986 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   2.8% 18233/kworker/1:1: 0% user + 2.8% kernel
+10-03 17:19:59.959  1963  1976 E ActivityManager:   4.2% 3145/com.android.phone: 2% user + 2.2% kernel / faults: 3005 minor 43 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   4.2% 8084/com.android.chrome: 2% user + 2.1% kernel / faults: 4798 minor 380 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   3.4% 182/surfaceflinger: 1.1% user + 2.3% kernel / faults: 842 minor 13 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   3% 18236/kworker/1:2: 0% user + 3% kernel
+10-03 17:19:59.959  1963  1976 E ActivityManager:   2.9% 19231/com.android.systemui:screenshot: 0.8% user + 2.1% kernel / faults: 6119 minor 348 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   2.3% 15350/kworker/0:4: 0% user + 2.3% kernel
+10-03 17:19:59.959  1963  1976 E ActivityManager:   2.2% 1454/mediaserver: 0% user + 2.2% kernel / faults: 479 minor 6 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   2% 16496/com.android.chrome:sandboxed_process10: 0.1% user + 1.8% kernel / faults: 3610 minor 234 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   1% 3119/com.android.nfc: 0.4% user + 0.5% kernel / faults: 1789 minor 17 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   1.7% 19337/com.jarettmillard.localeconnectiontype:background: 0.1% user + 1.5% kernel / faults: 7854 minor 439 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   0.7% 3066/com.google.android.inputmethod.latin: 0.3% user + 0.3% kernel / faults: 1336 minor 7 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   1% 25589/com.google.android.gms: 0.3% user + 0.6% kernel / faults: 2867 minor 237 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   0.9% 1460/sensors.qcom: 0.5% user + 0.4% kernel / faults: 262 minor 5 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   0.8% 3650/mpdecision: 0% user + 0.8% kernel / faults: 160 minor 1 major
+10-03 17:19:59.959  1963  1976 E ActivityManager:   0.1% 3132/com.redbend.vdmc: 0% user + 0% kernel / faults: 1746 minor 5 major</pre><p></p>
+  </section>
+
+<h3 id="memory-snapshot">获取内存快照</h3>
+<p>内存快照是一种 dumpstate,其中会列出正在运行的 Java 进程和本机进程(有关详情,请参阅<a href="https://developer.android.com/tools/debugging/debugging-memory.html#ViewingAllocations">查看整体内存分配</a>)。请注意,快照仅提供特定时刻的状态;在此快照之前,系统的状况可能更好,也可能更糟。</p>
+<ul>
+<li>要了解某个进程的运行时长,请参阅<a href="#process-runtime">进程运行时</a>。</li>
+<li>要了解为什么某个进程当前正在运行,请参阅<a href="#why-is-process-running">某个进程为什么正在运行?</a></li>
+</ul>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>Total PSS by OOM adjustment:
+    86752 kB: Native
+               22645 kB: surfaceflinger (pid 197)
+               18597 kB: mediaserver (pid 204)
+               ...
+   136959 kB: System
+              136959 kB: system (pid 785)
+   220218 kB: Persistent
+              138859 kB: com.android.systemui (pid 947 / activities)
+               39178 kB: com.android.nfc (pid 1636)
+               28313 kB: com.android.phone (pid 1659)
+               13868 kB: com.redbend.vdmc (pid 1646)
+     9534 kB: Persistent Service
+                9534 kB: com.android.bluetooth (pid 23807)
+   178604 kB: Foreground
+              168620 kB: com.google.android.googlequicksearchbox (pid 1675 / activities)
+                9984 kB: com.google.android.apps.maps (pid 13952)
+   188286 kB: Visible
+               85326 kB: com.google.android.wearable.app (pid 1535)
+               38978 kB: com.google.process.gapps (pid 1510)
+               31936 kB: com.google.android.gms.persistent (pid 2072)
+               27950 kB: com.google.android.gms.wearable (pid 1601)
+                4096 kB: com.google.android.googlequicksearchbox:interactor (pid 1550)
+    52948 kB: Perceptible
+               52948 kB: com.google.android.inputmethod.latin (pid 1566)
+   150851 kB: A Services
+               81121 kB: com.google.android.gms (pid 1814)
+               37586 kB: com.google.android.talk (pid 9584)
+               10949 kB: com.google.android.music:main (pid 4019)
+               10727 kB: com.motorola.targetnotif (pid 31071)
+               10468 kB: com.google.android.GoogleCamera (pid 9984)
+    33298 kB: Previous
+               33298 kB: com.android.settings (pid 9673 / activities)
+   165188 kB: B Services
+               49490 kB: com.facebook.katana (pid 15035)
+               22483 kB: com.whatsapp (pid 28694)
+               21308 kB: com.iPass.OpenMobile (pid 5325)
+               19788 kB: com.google.android.apps.googlevoice (pid 23934)
+               17399 kB: com.google.android.googlequicksearchbox:search (pid 30359)
+                9073 kB: com.google.android.apps.youtube.unplugged (pid 21194)
+                7660 kB: com.iPass.OpenMobile:remote (pid 23754)
+                7291 kB: com.pujie.wristwear.pujieblack (pid 24240)
+                7157 kB: com.instagram.android:mqtt (pid 9530)
+                3539 kB: com.qualcomm.qcrilmsgtunnel (pid 16186)
+   204324 kB: Cached
+               43424 kB: com.amazon.mShop.android (pid 13558)
+               22563 kB: com.google.android.apps.magazines (pid 13844)
+               ...
+                4298 kB: com.google.android.apps.enterprise.dmagent (pid 13826)</pre><p></p>
+  </section>
+
+<h2 id="broadcasts">广播</h2>
+<p>应用会生成广播,以便在当前应用内发送事件或向其他应用发送事件。广播接收方可以通过过滤器订阅特定消息,以便收听和响应广播。错误报告中包含已发送广播和未发送广播的相关信息,以及关于收听特定广播的所有接收方的 dumpsys。</p>
+
+<h3 id="historical-broadcasts">查看历史广播</h3>
+<p>历史广播是指已发送的广播,按时间逆序排列。</p>
+
+<p><strong>summary</strong>(摘要)部分用于提供最近 300 个前台广播和最近 300 个后台广播的概况。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre> Historical broadcasts summary [foreground]:
+ #0: act=android.intent.action.SCREEN_ON flg=0x50000010
+    +1ms dispatch +90ms finish
+    enq=2015-10-29 17:10:51 disp=2015-10-29 17:10:51 fin=2015-10-29 17:10:51
+  #1: act=android.intent.action.SCREEN_OFF flg=0x50000010
+    0 dispatch +60ms finish
+    enq=2015-10-29 17:10:05 disp=2015-10-29 17:10:05 fin=2015-10-29 17:10:05
+ ...
+ Historical broadcasts summary [background]:
+ ...</pre><p></p>
+  </section>
+<p></p>
+
+<p><strong>detail</strong>(详情)部分包含最近 50 个前台广播和最近 50 个后台广播的完整信息,以及每个广播的接收方。其中:</p>
+<ul>
+<li>具有 <code>BroadcastRecord</code> 条目的接收方是在运行时注册的,并且只会被发送到已在运行的进程。</li>
+<li>具有 <code>ResolveInfo</code> 条目的接收方是通过清单条目注册的。ActivityManager 会为每个 <code>ResolveInfo</code> 启动相应进程(如果相应进程尚未在运行)。</li>
+</ul>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>Historical broadcasts [foreground]:
+ ...
+ Historical broadcasts [background]:
+ Historical Broadcast background #0:
+ ...
+ Historical Broadcast background #5:
+    BroadcastRecord{18dbb16 u0 android.intent.action.USER_PRESENT} to user 0
+    Intent { act=android.intent.action.USER_PRESENT flg=0x24000010 }
+    caller=com.android.systemui 2925:com.android.systemui/u0a27 pid=2925 uid=10027
+    enqueueClockTime=2015-10-29 17:10:55 dispatchClockTime=2015-10-29 17:10:55
+    dispatchTime=-2s321ms (0 since enq) finishTime=-2s320ms (+1ms since disp)
+    Receiver #0: BroadcastFilter{8181cc1 u-1 ReceiverList{5d929a8 902 system/1000/u-1 local:eca4dcb}}
+    Receiver #1: BroadcastFilter{6371c97 u-1 ReceiverList{2938b16 902 system/1000/u-1 local:840b831}}
+    ...
+    Receiver #19: BroadcastFilter{93f16b u0 ReceiverList{5c61eba 17016 com.google.android.gm/10079/u0 remote:24083e5}}
+ ...
+ Historical Broadcast background #37:
+    BroadcastRecord{7f6dd6 u0 android.hardware.action.NEW_PICTURE} to user 0
+    Intent { act=android.hardware.action.NEW_PICTURE dat=content://media/external/images/media/6345 flg=0x10 }
+    caller=com.google.android.GoogleCamera 32734:com.google.android.GoogleCamera/u0a53 pid=32734 uid=10053
+    enqueueClockTime=2015-10-29 17:09:48 dispatchClockTime=2015-10-29 17:09:49
+    dispatchTime=-45s720ms (+399ms since enq) finishTime=-45s701ms (+19ms since disp)
+    resultTo=null resultCode=0 resultData=null
+    nextReceiver=4 receiver=null
+    Receiver #0: ResolveInfo{33d2857 com.google.android.gms/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000}
+      priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+      ActivityInfo:
+        name=com.google.android.libraries.social.mediamonitor.MediaMonitor
+        packageName=com.google.android.gms
+        enabled=true exported=true processName=com.google.android.gms
+        ...
+    Receiver #1: ResolveInfo{d9edf44 com.google.android.apps.maps/com.google.android.apps.gmm.ugc.clientnotification.StartPhotoTakenNotifierServiceReceiver m=0x608000}
+      priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+      ActivityInfo:
+        name=com.google.android.apps.gmm.ugc.clientnotification.StartPhotoTakenNotifierServiceReceiver
+        packageName=com.google.android.apps.maps
+        enabled=true exported=true processName=com.google.android.apps.maps
+        ...
+    Receiver #2: ResolveInfo{743f82d com.google.android.apps.photos/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000}
+      priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+      ActivityInfo:
+        name=com.google.android.libraries.social.mediamonitor.MediaMonitor
+        packageName=com.google.android.apps.photos
+        enabled=true exported=true processName=com.google.android.apps.photos
+        ...
+    Receiver #3: ResolveInfo{d5c9162 com.google.android.apps.plus/com.google.android.libraries.social.mediamonitor.MediaMonitor m=0x608000}
+      priority=0 preferredOrder=0 match=0x608000 specificIndex=-1 isDefault=false
+      ActivityInfo:
+        name=com.google.android.libraries.social.mediamonitor.MediaMonitor
+        packageName=com.google.android.apps.plus
+        enabled=true exported=true processName=com.google.android.apps.plus
+        ...</pre><p></p>
+  </section>
+
+<h3 id="active-broadcasts">查看待发送的广播</h3>
+<p>待发送的广播是指尚未发送的广播。如果队列中存在大量广播,则意味着系统无法足够快地发送广播来跟上进度。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre> Active ordered broadcasts [background]:
+ Active Ordered Broadcast background #133: <i>// size of queue</i>
+ ...</pre><p></p>
+  </section>
+
+<h3 id="broadcast-listeners">查看广播收听方</h3>
+<p>要查看收听某个广播的接收方列表,请查看 <code>dumpsys activity broadcasts</code> 中的 Receiver Resolver Table。以下示例显示了收听 <code>USER_PRESENT</code> 的所有接收方。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>-------------------------------------------------------------------------------
+ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)
+..
+  Receiver Resolver Table:
+    Full MIME Types:
+    ..
+    Wild MIME Types:
+    ..
+    Schemes:
+    ..
+    Non-Data Actions:
+    ..
+        android.intent.action.USER_PRESENT:
+          BroadcastFilter{8181cc1 u-1 ReceiverList{5d929a8 902 system/1000/u-1 local:eca4dcb}}
+          BroadcastFilter{6371c97 u-1 ReceiverList{2938b16 902 system/1000/u-1 local:840b831}}
+          BroadcastFilter{320c00 u0 ReceiverList{d3a6283 902 system/1000/u0 local:799c532}}
+          BroadcastFilter{e486048 u0 ReceiverList{36fbaeb 902 system/1000/u0 local:5f51e3a}}
+          BroadcastFilter{22b02 u-1 ReceiverList{b3f744d 902 system/1000/u-1 local:de837e4}}
+          BroadcastFilter{3e989ab u0 ReceiverList{f8deffa 2981 com.google.process.gapps/10012/u0 remote:26bd225}}
+          BroadcastFilter{fb56150 u0 ReceiverList{22b7b13 2925 com.android.systemui/10027/u0 remote:c54a602}}
+          BroadcastFilter{63bbb6 u-1 ReceiverList{ba6c751 3484 com.android.nfc/1027/u-1 remote:5c4a478}}
+          BroadcastFilter{95ad20d u0 ReceiverList{d8374a4 3586 com.google.android.googlequicksearchbox/10029/u0 remote:feb3737}}
+          BroadcastFilter{fdef551 u0 ReceiverList{28ca78 3745 com.google.android.gms.persistent/10012/u0 remote:f23afdb}}
+          BroadcastFilter{9830707 u0 ReceiverList{aabd946 3745 com.google.android.gms.persistent/10012/u0 remote:a4da121}}
+          BroadcastFilter{83c43d2 u0 ReceiverList{d422e5d 3745 com.google.android.gms.persistent/10012/u0 remote:f585034}}
+          BroadcastFilter{8890378 u0 ReceiverList{26d2cdb 3745 com.google.android.gms.persistent/10012/u0 remote:dfa61ea}}
+          BroadcastFilter{7bbb7 u0 ReceiverList{214b2b6 3745 com.google.android.gms.persistent/10012/u0 remote:8353a51}}
+          BroadcastFilter{38d3566 u0 ReceiverList{de859c1 3745 com.google.android.gms.persistent/10012/u0 remote:e003aa8}}
+          BroadcastFilter{3435d9f u0 ReceiverList{6e38b3e 3745 com.google.android.gms.persistent/10012/u0 remote:8dd7ff9}}
+          BroadcastFilter{d0a34bb u0 ReceiverList{5091d4a 3745 com.google.android.gms.persistent/10012/u0 remote:d6d22b5}}
+          BroadcastFilter{d43c416 u0 ReceiverList{51a3531 3745 com.google.android.gms.persistent/10012/u0 remote:d0b9dd8}}
+          BroadcastFilter{aabf36d u0 ReceiverList{a88bf84 3745 com.google.android.gms.persistent/10012/u0 remote:a9d6197}}
+          BroadcastFilter{93f16b u0 ReceiverList{5c61eba 17016 com.google.android.gm/10079/u0 remote:24083e5}}
+          BroadcastFilter{68f794e u0 ReceiverList{4cb1c49 947 com.google.android.googlequicksearchbox:search/10029/u0 remote:251d250}}
+      ..
+    MIME Typed Actions:</pre><p></p>
+  </section>
+
+<h2 id="monitor contention">显示器争用</h2>
+<p>显示器争用日志记录有时可以表明实际的显示器争用情况,但通常情况下会表明系统负载过重,从而导致所有进程都变慢了。您可能会在系统日志或事件日志中看到 ART 记录的长时间占用显示器的事件。</p>
+
+<p>在系统日志中:</p>
+<p></p><pre>10-01 18:12:44.343 29761 29914 W art     : Long monitor contention event with owner method=void android.database.sqlite.SQLiteClosable.acquireReference() from SQLiteClosable.java:52 waiters=0 for 3.914s</pre><p></p>
+
+<p>在事件日志中:</p>
+<p></p><pre>10-01 18:12:44.364 29761 29914 I dvm_lock_sample: [com.google.android.youtube,0,pool-3-thread-9,3914,ScheduledTaskMaster.java,138,SQLiteClosable.java,52,100]</pre><p></p>
+
+<h2 id="background-compilation">后台编译</h2>
+<p>编译可能会占用大量资源,而且会加重设备负载。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>09-14 06:27:05.670  2508  2587 E ActivityManager: CPU usage from 0ms to 5857ms later:
+09-14 06:27:05.670  2508  2587 E ActivityManager:   84% 5708/dex2oat: 81% user + 2.3% kernel / faults: 3731 minor 1 major
+09-14 06:27:05.670  2508  2587 E ActivityManager:   73% 2508/system_server: 21% user + 51% kernel / faults: 10019 minor 28 major
+09-14 06:27:05.670  2508  2587 E ActivityManager:   1% 3935/com.android.phone: 0.3% user + 0.6% kernel / faults: 2684 minor 2 major</pre><p></p>
+  </section>
+<p></p>
+
+<p>下载 Google Play 商店更新时,编译可能会在后台进行。在这种情况下,来自 Google Play 商店应用 (<code>finsky</code>) 和 <code>installd</code> 的消息会显示在 <code>dex2oat</code> 消息之前。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>10-07 08:42:33.725 11051 11051 D Finsky  : [1] InstallerTask.advanceState: Prepare to patch com.garmin.android.apps.virb (com.garmin.android.apps.virb) from content://downloads/my_downloads/3602 format 2
+10-07 08:42:33.752   495   495 I installd: free_cache(48637657) avail 15111192576
+…
+10-07 08:42:39.998  2497  2567 I PackageManager.DexOptimizer: Running dexopt (dex2oat) on: /data/app/vmdl436577137.tmp/base.apk pkg=com.garmin.android.apps.virb isa=arm vmSafeMode=false debuggable=false oatDir = /data/app/vmdl436577137.tmp/oat bootComplete=true
+…</pre><p></p>
+  </section>
+<p></p>
+
+<p>当某个应用正在加载尚未编译的 dex 文件时,编译也可能会在后台进行。在这种情况下,您将看不到 <code>finsky</code> 或 <code>installd</code> 日志记录。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>09-14 07:29:20.433 15736 15736 I dex2oat : /system/bin/dex2oat -j4 --dex-file=/data/user/0/com.facebook.katana/app_secondary_program_dex/program-72cef82b591768306676e10161c886b58b34315a308602be.dex.jar --oat-file=/data/user/0/com.facebook.katana/app_secondary_program_dex_opt/program-72cef82b591768306676e10161c886b58b34315a308602be.dex.dex
+...
+09-14 07:29:25.102 15736 15736 I dex2oat : dex2oat took 4.669s (threads: 4) arena alloc=7MB java alloc=3MB native alloc=29MB free=4MB</pre><p></p>
+  </section>
+
+<h2 id="narrative">叙述</h2>
+<p>创建问题叙述(如何开始、发生了什么、系统是如何应对的)需要一个固定的事件时间轴。您可以利用错误报告中的信息来同步多个日志中的时间轴并确定错误报告的确切时间戳。</p>
+
+<h3 id="timelines">同步时间轴</h3>
+<p>错误报告会反映多个并行时间轴(系统日志、事件日志、内核日志)以及针对广播、电池统计信息等的多个专用时间轴。遗憾的是,系统通常会使用不同的时间基准来报告时间轴。</p>
+
+<p>系统日志时间戳和事件日志时间戳采用用户所用的时区(与大多数其他时间戳一样)。例如,当用户点按主屏幕按钮时,系统日志会报告以下内容:</p>
+<p></p><pre>10-03 17:19:52.939  1963  2071 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.google.android.googlequicksearchbox/com.google.android.launcher.GEL (has extras)} from uid 1000 on display 0</pre><p></p>
+
+<p>对于上述操作,事件日志会报告以下内容:</p>
+<p></p><pre>10-03 17:19:54.279  1963  2071 I am_focused_activity: [0,com.google.android.googlequicksearchbox/com.google.android.launcher.GEL]</pre><p></p>
+
+<p>内核 (<code>dmesg</code>) 日志采用不同的时间基准,按距离引导加载程序完成的时间来标记日志内容(以秒为单位)。要按照其他时间表的时间基准记录此时间表,请搜索“suspend exit”(暂停退出)和“suspend entry”(暂停进入)消息:<em></em><em></em></p>
+<p></p><pre>&lt;6&gt;[201640.779997] PM: suspend exit 2015-10-03 19:11:06.646094058 UTC
+…
+&lt;6&gt;[201644.854315] PM: suspend entry 2015-10-03 19:11:10.720416452 UTC</pre><p></p>
+
+<p>由于内核日志在暂停状态下可能不会包含时间,因此您应该分段记录暂停进入和暂停退出消息之间的日志。此外,内核日志使用 UTC 时区,您必须将其调整为用户时区。</p>
+
+<h3 id="time-of-bugreport">确定错误报告的生成时间</h3>
+<p>要确定错误报告的生成时间,请先查看系统日志 (Logcat) 中的 <code>dumpstate: begin</code>:</p>
+<p></p><pre>10-03 17:19:54.322 19398 19398 I dumpstate: begin</pre><p></p>
+
+<p>接下来,查看内核日志 (<code>dmesg</code>) 时间戳中的 <code>Starting service
+'bugreport'</code> 消息:</p>
+<p></p><pre>&lt;5&gt;[207064.285315] init: Starting service 'bugreport'...</pre><p></p>
+
+<p>进行逆向推算以关联这两个事件,同时牢记<a href="#timelines">同步时间轴</a>中提到的注意事项。尽管在初始化错误报告之后发生了很多活动,但大多数活动并不是非常有用,因为生成错误报告这一活动会大大加重系统负载。</p>
+
+<h2 id="power">电源</h2>
+
+<p>事件日志中包含屏幕电源状态,其中 0 表示屏幕关闭,1 表示屏幕打开,2 表示已锁屏。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>grep screen_toggled bugreport-2015-10-18-16-52-22.txt
+10-18 15:05:04.383   992   992 I screen_toggled: 1
+10-18 15:05:07.010   992   992 I screen_toggled: 0
+10-18 15:23:15.063   992   992 I screen_toggled: 1
+10-18 15:23:25.684   992   992 I screen_toggled: 0
+10-18 15:36:31.623   992   992 I screen_toggled: 1
+10-18 15:36:37.660  3283  3283 I screen_toggled: 2</pre><p></p>
+  </section>
+
+<p></p>
+<p>错误报告中还包含关于唤醒锁的统计信息,唤醒锁是应用开发者采用的一种机制,用于表明其应用需要设备保持开启状态。(要详细了解唤醒锁定,请参阅 <a href="https://developer.android.com/reference/android/os/PowerManager.WakeLock.html">PowerManager.WakeLock</a> 和<a href="https://developer.android.com/training/scheduling/wakelock.html#cpu">使 CPU 保持运行状态</a>。)
+
+</p><p>唤醒锁定总时长统计信息<strong>仅</strong>跟踪唤醒锁定实际负责使设备保持唤醒状态的时间,<strong>不</strong>包括屏幕处于开启状态的时间。此外,如果同时持有多个唤醒锁,系统会在它们之间分配唤醒锁时长。</p>
+
+<p>如需直观呈现电源状态方面的更多帮助,请使用 <a href="https://github.com/google/battery-historian">Battery Historian</a>(一种 Google 开放源代码工具,能够利用 Android 错误报告文件分析电池消耗进程)。</p>
+
+<h2 id="packages">程序包</h2>
+<p>“DUMP OF SERVICE”程序包中包含应用版本(以及其他实用信息)。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>...
+Packages:
+...
+ Package [com.google.android.gms] (3cf534b):
+   userId=10013
+   sharedUser=SharedUserSetting{98f3d28 com.google.uid.shared/10013}
+   pkg=Package{b8f6a41 com.google.android.gms}
+   codePath=/system/priv-app/PrebuiltGmsCore
+   resourcePath=/system/priv-app/PrebuiltGmsCore
+   legacyNativeLibraryDir=/system/priv-app/PrebuiltGmsCore/lib
+   primaryCpuAbi=arm64-v8a
+   secondaryCpuAbi=armeabi-v7a
+   versionCode=8186448 targetSdk=23
+   versionName=8.1.86 (2287566-448)
+   splits=[base]
+   applicationInfo=ApplicationInfo{5158507 com.google.android.gms}
+   flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]
+   privateFlags=[ PRIVILEGED ]
+   dataDir=/data/user/0/com.google.android.gms
+   supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
+   libraries:
+     com.google.android.gms
+   usesOptionalLibraries:
+     com.android.location.provider
+     com.google.android.ble
+     com.android.media.remotedisplay
+   usesLibraryFiles:
+     /system/framework/com.android.media.remotedisplay.jar
+     /system/framework/com.android.location.provider.jar
+   timeStamp=2015-10-14 15:17:56
+   firstInstallTime=2015-09-22 14:08:35
+   lastUpdateTime=2015-10-14 15:17:56
+   signatures=PackageSignatures{db63be6 [1af63d8]}
+   installPermissionsFixed=true installStatus=1
+   pkgFlags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA ]
+   declared permissions:
+     com.google.android.gms.permission.INTERNAL_BROADCAST: prot=signature, INSTALLED
+     ...
+     com.google.android.gms.permission.CAR_VENDOR_EXTENSION: prot=dangerous, INSTALLED
+   User 0:  installed=true hidden=false stopped=false notLaunched=false enabled=0
+     disabledComponents:
+       com.google.android.gms.icing.service.PowerConnectedReceiver
+       ...
+       com.google.android.gms.icing.proxy.AppsMonitor
+     enabledComponents:
+       com.google.android.gms.mdm.receivers.GmsRegisteredReceiver
+       ...
+       com.google.android.gms.subscribedfeeds.SyncService</pre><p></p>
+  </section>
+
+<h2 id="processes">进程</h2>
+<p>错误报告中包含大量的进程数据,例如启动和停止时间、运行时时长、相关服务、<code>oom_adj</code> 得分等。要详细了解 Android 如何管理进程,请参阅<a href="http://developer.android.com/guide/components/processes-and-threads.html">进程和线程</a>。</p>
+
+<h3 id="process-runtime">确定进程运行时</h3>
+<p><code>procstats</code> 部分包含有关进程及相关服务已运行时长的完整统计信息。要快速获得便于用户阅读的摘要,请搜索 <code>AGGREGATED OVER</code> 以查看最近 3 个小时或 24 个小时的数据,然后搜索 <code>Summary:</code> 以查看进程列表、这些进程已以各种优先级运行的时长,以及它们使用 RAM 的情况(格式为“最小-平均-最大 PSS”/“最小-平均-最大 USS”)。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>-------------------------------------------------------------------------------
+DUMP OF SERVICE processinfo:
+-------------------------------------------------------------------------------
+DUMP OF SERVICE procstats:
+COMMITTED STATS FROM 2015-10-19-23-54-56 (checked in):
+...
+COMMITTED STATS FROM 2015-10-20-03-00-00 (checked in):
+...
+CURRENT STATS:
+...
+AGGREGATED OVER LAST 24 HOURS:
+System memory usage:
+...
+Per-Package Stats:
+...
+Summary:
+...
+  * com.google.android.gms.persistent / u0a13 / v8186448:
+           TOTAL: 100% (21MB-27MB-40MB/20MB-24MB-38MB over 597)
+             Top: 51% (22MB-26MB-38MB/21MB-24MB-36MB over 383)
+          Imp Fg: 49% (21MB-27MB-40MB/20MB-25MB-38MB over 214)
+…
+          Start time: 2015-10-19 09:14:37
+  Total elapsed time: +1d0h22m7s390ms (partial) libart.so
+
+AGGREGATED OVER LAST 3 HOURS:
+System memory usage:
+...
+Per-Package Stats:
+...
+Summary:
+  * com.google.android.gms.persistent / u0a13 / v8186448:
+           TOTAL: 100% (23MB-27MB-32MB/21MB-25MB-29MB over 111)
+             Top: 61% (23MB-26MB-31MB/21MB-24MB-28MB over 67)
+          Imp Fg: 39% (23MB-28MB-32MB/21MB-26MB-29MB over 44)
+...
+          Start time: 2015-10-20 06:49:24
+  Total elapsed time: +2h46m59s736ms (partial) libart.so</pre><p></p>
+  </section>
+
+<h3 id="why-is-process-running">某个进程为什么正在运行?</h3>
+<p><code>dumpsys activity processes</code> 部分会列出当前正在运行的所有进程,并按 <code>oom_adj</code> 得分排序(Android 通过为进程分配 <code>oom_adj</code> 值来表明进程的重要性,该值可由 ActivityManager 动态更新)。这种输出类似于<a href="#memory-snapshot">内存快照</a>的输出,但包含有关是什么导致进程运行的更多信息。在以下示例中,以粗体显示的条目表明 <code>gms.persistent</code> 进程正在以 <code>vis</code>(可见)优先级运行,因为该系统进程已经与其 <code>NetworkLocationService</code> 绑定。</p>
+
+  <section class="expandable">
+    <h4 class="showalways">显示示例</h4>
+    <p></p><pre>-------------------------------------------------------------------------------
+ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)
+...
+Process LRU list (sorted by oom_adj, 34 total, non-act at 14, non-svc at 14):
+    PERS #33: sys   F/ /P  trm: 0 902:system/1000 (fixed)
+    PERS #32: pers  F/ /P  trm: 0 2925:com.android.systemui/u0a27 (fixed)
+    PERS #31: pers  F/ /P  trm: 0 3477:com.quicinc.cne.CNEService/1000 (fixed)
+    PERS #30: pers  F/ /P  trm: 0 3484:com.android.nfc/1027 (fixed)
+    PERS #29: pers  F/ /P  trm: 0 3502:com.qualcomm.qti.rcsbootstraputil/1001 (fixed)
+    PERS #28: pers  F/ /P  trm: 0 3534:com.qualcomm.qti.rcsimsbootstraputil/1001 (fixed)
+    PERS #27: pers  F/ /P  trm: 0 3553:com.android.phone/1001 (fixed)
+    Proc #25: psvc  F/ /IF trm: 0 4951:com.android.bluetooth/1002 (service)
+        com.android.bluetooth/.hfp.HeadsetService&lt;=Proc{902:system/1000}
+    Proc # 0: fore  F/A/T  trm: 0 3586:com.google.android.googlequicksearchbox/u0a29 (top-activity)
+  Proc #26: vis   F/ /SB trm: 0 3374:com.google.android.googlequicksearchbox:interactor/u0a29 (service)
+        com.google.android.googlequicksearchbox/com.google.android.voiceinteraction.GsaVoiceInteractionService&lt;=Proc{902:system/1000}
+<b>    Proc # 5: vis   F/ /T  trm: 0 3745:com.google.android.gms.persistent/u0a12 (service)</b>
+<b>        com.google.android.gms/com.google.android.location.network.NetworkLocationService&lt;=Proc{902:system/1000}</b>
+    Proc # 3: vis   F/ /SB trm: 0 3279:com.google.android.gms/u0a12 (service)
+        com.google.android.gms/.icing.service.IndexService&lt;=Proc{947:com.google.android.googlequicksearchbox:search/u0a29}
+    Proc # 2: vis   F/ /T  trm: 0 947:com.google.android.googlequicksearchbox:search/u0a29 (service)
+        com.google.android.googlequicksearchbox/com.google.android.sidekick.main.remoteservice.GoogleNowRemoteService&lt;=Proc{3586:com.google.android.googlequicksearchbox/u0a29}
+    Proc # 1: vis   F/ /T  trm: 0 2981:com.google.process.gapps/u0a12 (service)
+        com.google.android.gms/.tapandpay.hce.service.TpHceService&lt;=Proc{3484:com.android.nfc/1027}
+    Proc #11: prcp  B/ /IB trm: 0 3392:com.google.android.inputmethod.latin/u0a64 (service)
+        com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME&lt;=Proc{902:system/1000}
+    Proc #24: svc   B/ /S  trm: 0 27071:com.google.android.music:main/u0a67 (started-services)
+    Proc #22: svc   B/ /S  trm: 0 853:com.qualcomm.qcrilmsgtunnel/1001 (started-services)
+    Proc # 4: prev  B/ /LA trm: 0 32734:com.google.android.GoogleCamera/u0a53 (previous)
+    Proc #23: svcb  B/ /S  trm: 0 671:com.qualcomm.telephony/1000 (started-services)
+    Proc #20: cch   B/ /CE trm: 0 27659:com.android.providers.calendar/u0a2 (provider)
+        com.android.providers.calendar/.CalendarProvider2&lt;=Proc{27697:com.google.android.calendar/u0a40}
+    Proc #13: cch   B/ /CE trm: 0 653:com.google.android.gms.wearable/u0a12 (cch-empty)
+    Proc #10: cch   B/ /S  trm: 0 4067:com.google.android.talk/u0a62 (cch-started-ui-services)
+    Proc # 7: cch   B/ /S  trm: 0 18868:com.google.corp.huddle.android/u0a95 (cch-started-ui-services)
+    Proc # 6: cch   B/ /CA trm: 0 27697:com.google.android.calendar/u0a40 (cch-act)
+    Proc # 8: cch+1 B/ /CA trm: 0 25675:com.google.android.apps.genie.geniewidget/u0a81 (cch-act)
+    Proc #16: cch+2 B/ /CE trm: 0 1272:com.google.android.keep/u0a106 (cch-empty)
+    Proc #15: cch+2 B/ /CE trm: 0 885:android.process.media/u0a9 (cch-empty)
+    Proc #14: cch+2 B/ /CE trm: 0 15146:android.process.acore/u0a3 (cch-empty)
+    Proc # 9: cch+3 B/ /CA trm: 0 17016:com.google.android.gm/u0a79 (cch-act)
+    Proc #19: cch+4 B/ /CE trm: 0 973:com.google.android.apps.maps/u0a66 (cch-empty)
+    Proc #18: cch+4 B/ /CE trm: 0 1091:com.google.android.apps.photos/u0a71 (cch-empty)
+    Proc #17: cch+4 B/ /CE trm: 0 1141:com.google.android.apps.plus/u0a74 (cch-empty)
+    Proc #12: cch+5 B/ /CA trm: 0 22299:com.google.android.apps.dogfood/u0a105 (cch-act)
+    Proc #21: cch+6 B/ /CE trm: 0 995:com.google.android.partnersetup/u0a18 (cch-empty)&gt;</pre><p></p>
+  </section>
+
+<h2 id="scans">扫描</h2>
+<p>您可以按照以下步骤来确定过度执行蓝牙低功耗 (BLE) 扫描的应用:</p>
+<ul>
+<li>查找 <code>BluetoothLeScanner</code> 的日志消息:<pre>
+$ grep 'BluetoothLeScanner' ~/downloads/bugreport.txt
+07-28 15:55:19.090 24840 24851 D BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5
+</pre></li>
+<li>在日志消息中找到 PID。在此示例中,“24840”和“24851”分别为 PID(进程 ID)和 TID(线程 ID)。</li>
+<li>找到与该 PID 关联的应用:<pre>
+PID #24840: ProcessRecord{4fe996a 24840:com.badapp/u0a105}
+</pre>
+<p>在此示例中,程序包名称为 <code>com.badapp</code>。</p></li>
+<li>在 Google Play 上查找该程序包名称,以找出相应的应用:<strong>https://play.google.com/store/apps/details?id=com.badapp</strong>。</li>
+</ul>
+<p class="note"><strong>注意</strong>:对于运行 Android 7.0 的设备,系统会收集 BLE 扫描数据,并会将这些活动与初始应用相关联。有关详情,请参阅<a href="/devices/tech/power/values.html#le-bt-scans">低功耗 (LE) 和蓝牙扫描</a>。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/report-bugs.html b/zh-cn/setup/report-bugs.html
new file mode 100644
index 0000000..da4d045
--- /dev/null
+++ b/zh-cn/setup/report-bugs.html
@@ -0,0 +1,238 @@
+<html devsite><head>
+    <title>报告错误</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<p>
+感谢您对 Android 的关注!您可以在 <a href="#bug-queues">Android 问题跟踪器</a>中报告问题及提出功能请求,以协助我们改进 Android。Android 问题跟踪器中会列出各方面的待解决技术任务、这些任务的相关信息及进展情况(包括哪些任务可能会在短期内得到处理)。
+</p>
+<p class="note">要详细了解我们为何改用问题跟踪器,请参阅<a href="http://android-developers.googleblog.com/2017/04/a-new-issue-tracker-for-our-aosp.html">这篇博文</a>。</p>
+<p>
+问题跟踪器不是客户支持论坛。要获取支持信息,请参阅 <a href="https://support.google.com/nexus">Nexus</a> 和 <a href="https://support.google.com/pixelphone">Pixel</a> 帮助中心。对于其他设备,则由设备制造商或销售这些设备的运营商提供支持。
+</p>
+<p>
+<a href="http://support.google.com/">Google 的支持网站</a>提供 Google 应用的支持信息。对于第三方应用,则由应用的开发者提供支持,例如,您可以通过 Google Play 上提供的联系信息与他们联系。要获取更多 Android 支持资源的列表,请参阅我们的<a href="/setup/community">“社区”页面</a>。
+</p>
+<p>
+我们无法保证可以在任何特定版本中修复任何特定错误。要了解在您报告错误之后它们的历程,请参阅<a href="/setup/life-of-a-bug.html">错误的生命周期</a>。
+</p>
+<h2 id="filing-a-bug">提交错误</h2>
+<ol>
+<li><a href="https://issuetracker.google.com/issues?q=componentid:190923%2B">搜索您遇到的错误</a>,看看是否已有人报告过该错误。请记得在所有问题中搜索,而不仅仅是在待解决的那些问题中搜索,因为可能已有人报告过您遇到的问题并且该问题已被关闭。为了方便您找到最热门的结果,请按星数对结果进行排序。</li>
+<li>如果您找到了自己遇到的问题,并且该问题对您来说很重要,请<a href="https://developers.google.com/issue-tracker/guides/subscribe#starring_an_issue">为其加注星标</a>!错误获得的星数有助于我们知道哪些错误最亟待修复。</li>
+<li>如果没有人报告过您的错误,请提交该错误。首先,请<a href="https://issuetracker.google.com/components">进行浏览以找到相应的组件</a>(如<a href="https://issuetracker.google.com/issues?q=componentid:192705">框架</a>或<a href="https://issuetracker.google.com/issues?q=componentid:192634">网络</a>),然后填写所提供的模板。您也可以从下面的表格中选择所需的错误队列。
+<p class="key-point">
+<strong>提示</strong>:有些组件包含子组件,如<strong>网络 &gt; 短信</strong>和<strong>框架 &gt; 存储</strong>。
+</p>
+</li>
+<li>按照相应错误队列的说明,提供尽可能多的错误相关信息。只是说某些方面存在问题并没有多大帮助,而且问题可能不经任何处理就被关闭。您提供的详细信息(如日志文件、重现步骤,甚至补丁程序集)越多,越有助于我们解决问题。</li>
+</ol>
+<h2 id="bug-queues">错误队列</h2>
+<p>
+Android 问题跟踪器包含多种子组件,这些子组件分属大量与 Android 相关的类别。安全、平台、Android 开发者工具、文档等都有对应的组件。
+</p>
+
+<h3 id="security">安全</h3>
+<p>
+如果您在 Nexus 或 Pixel 设备中发现了影响 Android 或组件安全的问题,请遵循<a href="/security/overview/updates-resources#report-issues">此处</a>的说明。
+此外,如果报告安全错误,您还可以参加 <a href="https://www.google.com/about/appsecurity/android-rewards/">Android 安全漏洞奖励活动</a>。
+</p>
+<p>
+由于安全错误具有敏感性,因此您无法浏览待解决的问题,只能浏览已关闭或已公开的问题。
+</p>
+
+<table>
+  <tbody><tr>
+   <th>浏览错误</th>
+   <th>详细信息</th>
+   <th>提交错误</th>
+  </tr>
+  <tr>
+   <td>安全</td>
+   <td><a href="/security/overview/updates-resources#report-issues">Android 安全性详细信息</a></td>
+   <td><a href="https://www.google.com/appserve/security-bugs/m2/new">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+</tr></tbody></table>
+
+<h3 id="platform">平台</h3>
+<p>
+如果您发现了影响 Android 平台某个方面的问题,请在下面的某个组件中提交您的错误。
+</p>
+<p><a class="button button-primary" href="https://issuetracker.google.com/issues?q=componentid:(192786%20%7C%20192805%20%7C%20192705%20%7C%20192792%20%7C%20192644%20%7C%20192694%20%7C%20192710%20%7C%20192810%20%7C%20192634%20%7C%20192698%20%7C%20192706%20%7C%20192815%20%7C%20192715%20%7C%20192720%20%7C%20192711%20%7C%20192629%20%7C%20192643%20%7C%20192693%20%7C%20192639)">浏览所有平台问题</a></p>
+<table>
+  <tbody><tr>
+   <th>浏览错误</th>
+   <th>提交错误</th>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192629%2B">ART</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192629"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192693%2B">浏览器</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192693"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192639%2B">CTS</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192639"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192705%2B">框架</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192705"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192644%2B">GfxMedia</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192644"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:316045%2B">免安装应用</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=316045"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192694%2B">Jack</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192694"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192710%2B">Libcore</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192710"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192634%2B">网络</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192634"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:190951%2B">安全</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=190951"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192706%2B">系统</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192706"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192715%2B">文本</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192715"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192720%2B">Things</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192720"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192711%2B">Wear</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192711"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+</tbody></table>
+
+<h3 id="developer-tools">Android 开发者工具</h3>
+<p>
+如果您发现了影响某个 Android 开发者工具(如 Android Studio、SDK、模拟器、系统映像或支持库)的问题,请在下面的某个组件中提交错误。
+</p>
+<p>
+由于这些工具的要求各不相同,因此请阅读<a href="https://developer.android.com/studio/report-bugs.html">一般错误提交详细信息</a>,以及相应工具的链接中提供的详细信息。
+</p>
+
+<a class="button button-primary" href="http://issuetracker.google.com/issues?q=componentid:192633%2B">浏览所有开发者工具问题</a>
+<table>
+  <tbody><tr>
+   <th>浏览错误</th>
+   <th>详细信息</th>
+   <th>提交错误</th>
+  </tr>
+  <tr>
+   <td><a href="https://issuetracker.google.com/issues?q=componentid:192633%2B">Android Studio</a></td>
+   <td><a href="https://developer.android.com/studio/report-bugs.html#studio-bugs">Android Studio 详细信息</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192708&template=840533">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="http://issuetracker.google.com/issues?q=componentid:192717%2B">C++</a></td>
+   <td>Android Studio 中的问题</td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192717">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="http://issuetracker.google.com/issues?q=componentid:192727%2B">模拟器或系统映像</a></td>
+   <td><a href="https://developer.android.com/studio/report-bugs.html#emulator-bugs">模拟器详细信息</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192727">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="http://issuetracker.google.com/issues?q=componentid:192709%2B">Gradle</a></td>
+   <td><a href="https://developer.android.com/studio/report-bugs.html#build-bugs">Gradle 详细信息</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192709&template=842921">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="http://issuetracker.google.com/issues?q=componentid:192751%2B">Instant Run</a></td>
+   <td><a href="https://developer.android.com/studio/report-bugs.html#instant-run-bugs">Instant Run 详细信息</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192751">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td colspan="2"><a href="http://issuetracker.google.com/issues?q=componentid:192718%2B">Lint</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192718">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="https://github.com/android-ndk/ndk/issues">NDK</a></td>
+   <td>独立的 NDK 方面的问题</td>
+   <td><a href="https://github.com/android-ndk/ndk/issues"><i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td colspan="2"><a href="http://issuetracker.google.com/issues?q=componentid:192722%2B">分析器</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192722">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td colspan="2"><a href="http://issuetracker.google.com/issues?q=componentid:192731%2B">支持库</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192731">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td colspan="2"><a href="http://issuetracker.google.com/issues?q=componentid:192735%2B">测试支持库</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192735">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+</tbody></table>
+
+<h3 id="documentation">文档</h3>
+<p>
+如果您在本网站或 <a href="https://developer.android.com/">developer.android.com</a> 上发现了问题,请提交错误,相应作者会提供帮助。
+</p>
+
+<table>
+  <tbody><tr>
+   <th>浏览错误</th>
+   <th>提交错误</th>
+  </tr>
+  <tr>
+   <td><a href="http://issuetracker.google.com/issues?q=componentid:192697%2B">developer.android.com</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=192697">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+  <tr>
+   <td><a href="http://issuetracker.google.com/issues?q=componentid:191476%2B">source.android.com</a></td>
+   <td><a href="https://issuetracker.google.com/issues/new?component=191476">
+   <i class="material-icons">bug_report</i></a></td>
+  </tr>
+</tbody></table>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/requirements.html b/zh-cn/setup/requirements.html
new file mode 100644
index 0000000..104df07
--- /dev/null
+++ b/zh-cn/setup/requirements.html
@@ -0,0 +1,115 @@
+<html devsite><head>
+    <title>要求</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>下载和编译 Android 源代码之前,请先确保您的系统符合以下要求。然后,请参阅<a href="initializing.html">构建编译环境</a>,查看适用于相应操作系统的安装说明。</p>
+
+<h2 id="hardware-requirements">硬件要求</h2>
+
+<p>您的开发工作站必须达到或超出以下硬件要求:</p>
+
+<ul>
+
+  <li>如果是 Gingerbread (2.3.x) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
+  </li>
+
+  <li>如果是校验代码,至少需要 100GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译或使用 ccache,则需要更多空间。<p></p>
+  </li>
+
+  <li>如果您在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。
+  </li>
+
+</ul>
+
+<h2 id="software-requirements">软件要求</h2>
+
+<p><a href="https://android.googlesource.com/">Android 开源项目 (AOSP)</a> <code>master</code> 分支历来都是在 Ubuntu Long Term Support (LTS) 版本中进行开发和测试,但您也可以使用其他 Ubuntu 分发版本。要查看建议使用的版本,请参阅下面的列表。</p>
+
+<p>您的工作站必须具有下面列出的软件。要查看所需的其他软件包以及用于安装这些软件包的命令,请参阅<a href="initializing.html">构建编译环境</a>。</p>
+
+<h3 id="latest-version">操作系统和 JDK</h3>
+
+<p>如果您要针对 AOSP <code>master</code> 分支进行开发,请使用下列操作系统之一:Ubuntu 14.04 (Trusty)/Mac OS v10.10 (Yosemite) 或更高版本(具有 Xcode 4.5.2 和命令行工具)。</p>
+
+<p>对于 Java 开发套件 (JDK),需要注意的是 AOSP 中 Android 的 <code>master</code> 分支带有预编译版本的 OpenJDK;因此无需另外进行安装。较低的版本则需要单独进行安装。</p>
+
+<p>请参阅<a href="#older-versions">较低 Android 版本的软件包</a>。
+
+</p><h3 id="packages">主要软件包</h3>
+  <ul>
+    <li><a href="http://www.python.org/download/">python.org</a> 中提供的 Python 2.6 - 2.7</li>
+    <li><a href="http://ftp.gnu.org/gnu/make/">gnu.org</a> 中提供的 GNU Make 3.81 - 3.82
+     </li><li><a href="http://git-scm.com/download">git-scm.com</a> 中提供的 Git 1.7 或更高版本</li>
+  </ul>
+
+<h3 id="binaries">设备二进制文件</h3>
+<p>下载预览、出厂映像、驱动程序、无线下载 (OTA) 更新和下列其他 Blob。如需更多详细信息,请参阅<a href="/setup/building.html#obtaining-proprietary-binaries">下载专有二进制文件</a>。</p>
+  <ul>
+     <li><a href="https://developers.google.com/android/blobs-preview">预览二进制文件 (Blob)</a> - 用于 AOSP <code>master</code> 分支开发</li>
+     <li><a href="https://developers.google.com/android/images">出厂映像</a> - 针对运行带标记的 AOSP 版本分支的受支持设备</li>
+     <li><a href="https://developers.google.com/android/drivers">硬件支持二进制文件</a> - 针对运行带标记的 AOSP 版本分支的设备</li>
+  </ul>
+
+  <h3 id="toolchain">编译工具链</h3>
+
+  <p>Android 8.0 及更高版本仅支持使用 <a href="https://developer.android.com/ndk/guides/standalone_toolchain.html#working_with_clang">Clang/LLVM</a> 来编译 Android 平台。您可以加入 <a href="https://groups.google.com/forum/#!forum/android-llvm">android-llvm</a> 网上论坛来提出问题并获取帮助。在 <a href="https://github.com/android-ndk/ndk">NDK GitHub</a> 上报告 NDK/编译器问题。</p>
+
+<p>对于<a href="https://developer.android.com/ndk/guides/index.html">原生开发工具包 (NDK)</a> 和旧版内核,您也可以使用 AOSP 主分支中包含的 GCC 4.9(在 <code>prebuilts/</code> 下)。</p>
+
+<h3 id="older-versions">较低 Android 版本的软件包</h3>
+
+<p>以下部分提供了较低 Android 版本的相关操作系统和 JDK 软件包。</p>
+
+<h4 id="operating-system">操作系统</h4>
+
+<p>Android 通常是在 GNU/Linux 或 Mac OS 操作系统中进行编译。您也可以使用虚拟机在不支持的系统(例如 Windows)中编译 Android。<br />
+
+  </p><h5 id="linux">GNU/Linux</h5>
+
+  <ul>
+    <li>Android 6.0 (Marshmallow) - AOSP master:Ubuntu 14.04 (Trusty)</li>
+    <li>Android 2.3.x (Gingerbread) - Android 5.x (Lollipop):Ubuntu 12.04 (Precise)</li>
+    <li>Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu 10.04 (Lucid)</li>
+  </ul>
+
+<h5 id="mac">Mac OS (Intel/x86)</h5>
+
+  <ul>
+    <li>Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具</li>
+    <li>Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具</li>
+    <li>Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的开发者工具)</li>
+    <li>Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK</li>
+  </ul>
+
+<h4 id="jdk">JDK</h4>
+
+<p>有关较低 Android 版本的预编译路径和安装说明,请参阅<a href="initializing.html#installing-the-jdk">安装 JDK</a>。</p>
+  <ul>
+    <li>Android 7.0 (Nougat) - Android 8.0 (O):Ubuntu - <a href="http://openjdk.java.net/install/">OpenJDK 8</a>;Mac OS - <a href="http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html#jdk-8u45-oth-JPR">jdk 8u45 或更高版本</a></li>
+    <li>Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - <a href="http://openjdk.java.net/install/">OpenJDK 7</a>;Mac OS - <a href="https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u71-oth-JPR">jdk-7u71-macosx-x64.dmg</a></li>
+    <li>Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - <a href="http://www.oracle.com/technetwork/java/javase/archive-139210.html">Java JDK 6</a>;Mac OS - <a href="http://support.apple.com/kb/dl1572">Java JDK 6</a></li>
+    <li>Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - <a href="http://www.oracle.com/technetwork/java/javase/archive-139210.html">Java JDK 5</a></li>
+  </ul>
+
+  <h4 id="make">品牌</h4>
+  <p>Android 4.0.x (Ice Cream Sandwich) 及更低版本需要<a href="initializing.html#reverting-from-make-382">将 make 3.82 还原到较低版本</a>,以避免出现编译错误</p>。
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/roles.html b/zh-cn/setup/roles.html
new file mode 100644
index 0000000..b7f1b8d
--- /dev/null
+++ b/zh-cn/setup/roles.html
@@ -0,0 +1,63 @@
+<html devsite><head>
+    <title>项目角色</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>Android 开放源代码项目 (AOSP) 涉及担任各种角色的人员。Google 负责 Android 产品管理以及核心框架和平台的工程流程;不过,该项目要考虑所有来源的贡献,而不仅仅只是 Google 的贡献。本页介绍了有兴趣者可以担任的各种角色。</p>
+<p>任何有兴趣探索 Android 以及有兴趣为 Android 做贡献的人都可以使用 Android 开放源代码项目资源。任何人都可以加入论坛、提问、贡献补丁程序、报告错误、查看贡献者提交的补丁程序,以及使用相关工具。要开始进行 Android 代码方面的事情,请参阅<a href="/setup/contributing.html">贡献</a>。</p>
+<h2 id="contributor">贡献者</h2>
+<p>“贡献者”是指为 AOSP 源代码做贡献的人,包括 Google 或其他公司的员工,以及以个人名义为 Android 做贡献的个人开发者。Google 聘请的贡献者与其他贡献者并无差别;所有工程师都使用相同的工具(Git、Repo 和 Gerrit),遵循相同的代码审核流程,并遵守相同的代码样式要求,等等。</p>
+<h2 id="developer">开发者</h2>
+<p>“开发者”是指编写在 Android 设备上运行的应用的工程师。开发者与贡献者要具备的技能通常并没有太大差异。但 AOSP 使用“开发者”将使用该平台的工程师与为该平台做贡献的工程师区分开来。开发者(以及用户)是贡献者打造的 Android 平台的“客户”。因此,我们经常会提到开发者,尽管从技术层面来讲,其本质上并不是 AOSP 中的一个单独角色。</p>
+<h2 id="verifier">验证者</h2>
+<p>“验证者”负责测试更改请求。当有人向该项目提交了大量高质量代码后,项目负责人可能会邀请他们成为验证者。</p>
+<p class="note"><strong>注意</strong>:目前,验证者的角色与审批者类似。</p>
+<h2 id="approver">审批者</h2>
+<p>“审批者”是该项目中经验丰富的成员,他们展现出了出色的设计技能,并为该项目做出了重大的技术贡献。在代码审核流程中,审批者会决定是纳入还是排除某项更改。项目负责人(通常是 Google 员工)负责选择审批者,有时也会将曾在特定项目中展现出杰出专业技能的验证者晋升为审批者。</p>
+<h2 id="project-leads">项目负责人</h2>
+<p>Android 包含许多子项目;您可以在 Git 存储库中看到这些作为单个 .git 文件存在的子项目。“项目负责人”是资深贡献者,负责监督各个 Android 项目的工程工作。这些项目负责人通常是 Google 员工。各个项目的负责人负责以下事项:</p>
+<ul>
+<li>
+<p>主导项目的所有技术事宜,包括项目路线图、开发、发布周期、版本管理和质量保证 (QA)。</p>
+</li>
+<li>
+<p>确保项目及时通过 QA 测试,不耽误预定的 Android 平台发布。</p>
+</li>
+<li>
+<p>为贡献者提交的补丁程序指定验证者和审批者。</p>
+</li>
+<li>
+<p>在审核更改时保持客观公正。根据技术价值以及是否符合 Android 策略来接受或拒绝补丁程序。</p>
+</li>
+<li>
+<p>及时审核更改,并在更改未被接受时尽最大努力与相关人员进行沟通。</p>
+</li>
+<li>
+<p>视需要维护项目的网站,以便提供针对相应项目的信息和文档。</p>
+</li>
+<li>
+<p>担任解决技术冲突的调解者。</p>
+</li>
+<li>
+<p>担任项目的公开负责人以及项目相关问题的联系人。</p>
+</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/running.html b/zh-cn/setup/running.html
new file mode 100644
index 0000000..60aaeb1
--- /dev/null
+++ b/zh-cn/setup/running.html
@@ -0,0 +1,379 @@
+<html devsite><head>
+    <title>运行编译系统</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>本页提供了关于在特定设备上运行编译系统的详细信息,是对<a href="/setup/building.html">编译系统</a>部分的补充。</p>
+
+<h2 id="building-fastboot-and-adb">编译 fastboot 和 adb</h2>
+<p>如果您还没有 <code>fastboot</code> 和 <code>adb</code>,则可以使用常规编译系统来编译。请按照<a href="/setup/building.html">编译系统</a>中的说明操作,将主 <code>make</code> 命令替换为以下命令:</p>
+<pre class="devsite-click-to-copy devsite-terminal">make fastboot adb</pre>
+
+<h2 id="booting-into-fastboot-mode">启动进入 fastboot 模式</h2>
+<p><code>Fastboot</code> 是一种引导加载程序模式,您可以在该模式下刷写设备。
+在设备冷启动过程中,可使用以下组合键进入 <code>fastboot</code> 模式:</p>
+<table>
+<thead>
+<tr>
+<th>设备</th>
+<th>代号</th>
+<th>组合键</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>Pixel XL</td>
+<td>marlin</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Pixel</td>
+<td>sailfish</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>hikey</td>
+<td>hikey</td>
+<td>连接 J15 的引脚 1-2 和 5-6。</td>
+</tr>
+<tr>
+<td>Nexus 6P</td>
+<td>angler</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 5X</td>
+<td>bullhead</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 6</td>
+<td>shamu</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus Player</td>
+<td>fugu</td>
+<td>按住电源键<em></em>。</td>
+</tr>
+<tr>
+<td>Nexus 9</td>
+<td>volantis</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 5</td>
+<td>hammerhead</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键。<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 7</td>
+<td>flo</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 7 3G</td>
+<td>deb</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 10</td>
+<td>manta</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键。<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 4</td>
+<td>mako</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 7 (2012)</td>
+<td>grouper</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus 7 3G (2012)</td>
+<td>tilapia</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus Q</td>
+<td>phantasm</td>
+<td>启动设备,然后在 LED 指示灯亮起后用一只手盖住设备,直至指示灯变成红色。</td>
+</tr>
+<tr>
+<td>Galaxy Nexus GSM</td>
+<td>maguro</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键。<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>Galaxy Nexus (Verizon)</td>
+<td>toro</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键。<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>Galaxy Nexus (Sprint)</td>
+<td>toroplus</td>
+<td>同时按住音量调高键和音量调低键,然后按住电源键。<em></em><em></em><em></em></td>
+</tr>
+<tr>
+<td>Motorola Xoom</td>
+<td>wingray</td>
+<td>按住音量调低键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus S</td>
+<td>crespo</td>
+<td>按住音量调高键,然后按住电源键。<em></em><em></em></td>
+</tr>
+<tr>
+<td>Nexus SG</td>
+<td>crespo4g</td>
+<td>按住音量调高键,然后按住电源键。<em></em><em></em></td>
+</tr>
+</tbody>
+</table>
+
+<p>您还可以使用命令 <code>adb reboot bootloader</code> 直接在 Android 系统中重新启动进入引导加载程序,而无需使用任何组合键。</p>
+
+<h2 id="unlocking-the-bootloader">解锁引导加载程序</h2>
+
+<p>只有在引导加载程序允许的情况下,您才可以刷写定制系统,而引导加载程序默认处于锁定状态。您可以解锁引导加载程序,但这样做会导致系统出于保护隐私方面的考虑而删除用户数据。<em></em>解锁之后,系统会清空设备上的所有数据,即应用中的个人数据以及可通过 USB 访问的共享数据(包括照片和影片)。请务必先备份设备上的所有重要文件,然后再尝试解锁引导加载程序。</p>
+
+<p>您只需解锁引导加载程序一次即可,并可视需要将其重新锁定。</p>
+
+<h3>解锁新款设备</h3>
+<p>自 2014 年以来发布的所有 Nexus 和 Pixel 设备(从 Nexus 6 和 Nexus 9 开始)都内置有恢复出厂设置保护功能,需要通过多个步骤才能解锁引导加载程序。</p>
+
+<ol>
+<li>要在设备上启用 OEM 解锁功能,请执行以下操作:
+<ol>
+  <li>在“设置”中,点按<strong>关于手机</strong>,然后点按<strong>版本号</strong>七 (7) 次。</li>
+  <li>当看到“您已处于开发者模式”这条消息后,点按返回按钮。</li>
+  <li>点按<strong>开发者选项</strong>,然后启用 <strong>OEM 解锁</strong>和 <strong>USB 调试</strong>(如果 OEM 解锁处于停用状态,请连接到互联网,以便设备可以至少签到一次。如果 OEM 解锁仍处于停用状态,则说明您的设备可能已被运营商锁定 SIM 卡,系统无法解锁引导加载程序)。</li>
+  </ol>
+</li>
+<li>重新启动进入引导加载程序,然后使用 <code>fastboot</code> 解锁。
+  <ul>
+  <li>对于新款设备(2015 年及之后发布的设备):
+  <pre class="devsite-click-to-copy devsite-terminal">fastboot flashing unlock</pre>
+  </li>
+  <li>对于老款设备(2014 年及之前发布的设备):
+  <pre class="devsite-click-to-copy devsite-terminal">fastboot oem unlock</pre>
+  </li>
+  </ul>
+</li>
+<li>在屏幕上确认解锁。</li>
+</ol>
+
+<aside class="note"><strong>注意</strong>:在 Nexus 10 上,解锁引导加载程序后,内部存储空间仍将保持未格式化状态。您可以依次使用 <code>fastboot format cache</code> 和 <code>fastboot format userdata</code> 来格式化设备。</aside>
+
+<h3 id="relocking-the-bootloader">重新锁定引导加载程序</h3>
+<p>要重新锁定引导加载程序,请执行以下命令:</p>
+<ul>
+<li>对于新款设备(2015 年及之后发布的设备):
+<pre class="devsite-click-to-copy devsite-terminal">fastboot flashing lock</pre>
+</li>
+<li>对于老款设备(2014 年及之前发布的设备):
+<pre class="devsite-click-to-copy devsite-terminal">fastboot oem lock</pre>
+</li>
+</ul>
+
+<aside class="note"><strong>注意</strong>:在 Motorola Xoom 上重新锁定引导加载程序会清空用户数据(包括共享的 USB 数据)。</aside>
+
+<h2 id="flash-unlock">使用刷写解锁</h2>
+<p><code>getFlashLockState()</code> 系统 API 会传输引导加载程序状态,<code>PersistentDataBlockManager.getFlashLockState()</code> 系统 API 会返回兼容设备上引导加载程序的锁定状态。</p>
+
+<table>
+<tbody><tr>
+<th>返回的值</th>
+<th>条件</th>
+</tr>
+<tr>
+<td><code>FLASH_LOCK_UNKNOWN</code></td>
+<td>仅升级到 Android 7.x 或更高版本的符合以下条件的设备会返回此值:设备支持刷写锁定/解锁功能,但之前不支持获取刷写锁定状态所需的引导加载程序变更。<br />
+<ul>
+<li>运行 Android 7.x 或更高版本的新设备必须为 <code>FLASH_LOCK_LOCKED</code> 或 <code>FLASH_LOCK_UNLOCKED</code> 状态。</li>
+<li>升级到 Android 7.x 或更高版本且不支持刷写解锁/锁定功能的设备应返回 <code>FLASH_LOCK_LOCKED</code> 状态。</li>
+</ul>
+</td>
+</tr>
+<tr>
+<td><code>FLASH_LOCK_LOCKED</code></td>
+<td>不支持刷写锁定/解锁的设备(即设备始终处于锁定状态)或支持刷写锁定/解锁且处于锁定状态的设备应该会返回此值。</td>
+</tr>
+<tr>
+<td><code>FLASH_LOCK_UNLOCKED</code></td>
+<td>支持刷写锁定/解锁且当前处于已解锁状态的设备会返回此值。</td>
+</tr>
+</tbody></table>
+
+<p>制造商应测试由已锁定/解锁引导加载程序的设备返回的值。例如,Android 开源项目 (AOSP) 包含根据 <code>ro.boot.flash.locked</code> 启动属性返回值的参考实现。示例代码位于以下目录中:</p>
+
+<ul>
+<li><code>frameworks/base/services/core/java/com/android/server/PersistentDataBlockService.java</code></li>
+<li><code>frameworks/base/core/java/android/service/persistentdata/PersistentDataBlockManager.java</code></li>
+</ul>
+
+<h2 id="selecting-device-build">选择设备编译系统</h2>
+
+<p><code>lunch</code>菜单中提供了建议的设备编译系统,在不使用任何参数的情况下运行 <code>lunch</code> 命令即可查看。
+您可以从 developers.google.com 下载 Nexus 设备的出厂映像和二进制文件。请参阅<a href="/setup/requirements#binaries">设备二进制文件</a>进行下载。有关详情以及其他资源,请参阅<a href="building.html#obtaining-proprietary-binaries">下载专有二进制文件</a>。
+
+<table>
+<thead>
+<tr>
+<th>设备</th>
+<th>代号</th>
+<th>编译配置</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>Pixel XL</td>
+<td>marlin</td>
+<td>aosp_marlin-userdebug</td>
+</tr>
+<tr>
+<td>Pixel</td>
+<td>sailfish</td>
+<td>aosp_sailfish-userdebug</td>
+</tr>
+<tr>
+<td>HiKey</td>
+<td>hikey</td>
+<td>hikey-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 6P</td>
+<td>angler</td>
+<td>aosp_angler-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 5X</td>
+<td>bullhead</td>
+<td>aosp_bullhead-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 6</td>
+<td>shamu</td>
+<td>aosp_shamu-userdebug</td>
+</tr>
+<tr>
+<td>Nexus Player</td>
+<td>fugu</td>
+<td>aosp_fugu-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 9</td>
+<td>volantis (flounder)</td>
+<td>aosp_flounder-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 5 (GSM/LTE)</td>
+<td>hammerhead</td>
+<td>aosp_hammerhead-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7 (WLAN)</td>
+<td>razor (flo)</td>
+<td>aosp_flo-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7(移动版)</td>
+<td>razorg (deb)</td>
+<td>aosp_deb-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 10</td>
+<td>mantaray (manta)</td>
+<td>full_manta-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 4</td>
+<td>occam (mako)</td>
+<td>full_mako-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7 (WLAN)</td>
+<td>nakasi (grouper)</td>
+<td>full_grouper-userdebug</td>
+</tr>
+<tr>
+<td>Nexus 7(移动版)</td>
+<td>nakasig (tilapia)</td>
+<td>full_tilapia-userdebug</td>
+</tr>
+<tr>
+<td>Galaxy Nexus (GSM/HSPA+)</td>
+<td>yakju (maguro)</td>
+<td>full_maguro-userdebug</td>
+</tr>
+<tr>
+<td>Galaxy Nexus (Verizon)</td>
+<td>mysid (toro)</td>
+<td>aosp_toro-userdebug</td>
+</tr>
+<tr>
+<td>Galaxy Nexus(试验版)</td>
+<td>mysidspr (toroplus)</td>
+<td>aosp_toroplus-userdebug</td>
+</tr>
+<tr>
+<td>Motorola Xoom(美国 WLAN 版)</td>
+<td>wingray</td>
+<td>full_wingray-userdebug</td>
+</tr>
+<tr>
+<td>Nexus S</td>
+<td>soju (crespo)</td>
+<td>full_crespo-userdebug</td>
+</tr>
+<tr>
+<td>Nexus S 4G</td>
+<td>sojus (crespo4g)</td>
+<td>full_crespo4g-userdebug</td>
+</tr>
+</tbody>
+</table>
+
+</p><aside class="note"><strong>注意</strong>:请不要在原本搭载 Android 4.1.2 或更高版本的 Nexus 7 上使用 Android 4.1.1。</aside>
+
+<h2 id="flashing-a-device">刷写设备</h2>
+
+<p>您可以通过运行一个命令来刷写整个 Android 系统;这样做可验证正在刷写的系统与已安装的引导加载程序和无线通信模块的驱动程序是否兼容,还可以将启动、恢复和系统分区一起写入,然后重新启动系统。与 <code>fastboot oem
+unlock</code> 类似,刷写设备也会清空所有用户数据。</p>
+
+<p>要刷写设备,请执行以下操作:</p>
+<ol>
+<li>在启动时按住相应的组合键或使用以下命令使设备进入 <code>fastboot</code> 模式:<pre class="devsite-click-to-copy devsite-terminal">adb reboot bootloader</pre></li>
+<li>在设备处于 fastboot 模式后,运行以下命令:
+<pre class="devsite-click-to-copy devsite-terminal">fastboot flashall -w</pre>
+<code>-w</code> 选项会清除设备上的 <code>/data</code> 分区;该选项在您第一次刷写特定设备时非常有用,但在其他情况下则没必要使用。</li>
+</ol>
+
+<aside class="note"><strong>注意</strong>:在 Motorola Xoom 上通过 <code>fastboot</code> 创建的文件系统无法发挥最佳作用。建议您使用 <code>$ adb reboot
+recovery</code> 命令通过恢复功能来重新创建文件系统。在执行恢复操作时,打开菜单(同时按电源键和音量调高键),擦除缓存分区,然后擦除数据。</aside>
+
+<h2 id="restoring-devices-to-factory-state">将设备恢复到出厂状态</h2>
+
+<p>您可以在 <a href="https://developers.google.com/android/nexus/images" class="external">Nexus 和 Pixel 设备的出厂映像</a>上查看 Google 设备的出厂映像。Motorola Xoom 的出厂映像由 Motorola 直接提供。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/site-updates.html b/zh-cn/setup/site-updates.html
new file mode 100644
index 0000000..a20ab43
--- /dev/null
+++ b/zh-cn/setup/site-updates.html
@@ -0,0 +1,407 @@
+<html devsite><head>
+    <title>网站更新</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>本页介绍了我们对 source.android.com 进行的重大修订。要查看我们对本网站进行的更改的完整列表,请参阅 <a href="https://android.googlesource.com/platform/docs/source.android.com/+log/master?pretty=full&no-merges">Android 开源项目 (AOSP) docs/source.android.com 日志</a>。
+
+</p><h2 id="Sept-2017">2017 年 9 月</h2>
+
+<p>本网站已在中国发布,网址为:<a href="https://source.android.google.cn" class="external-link">source.android.google.cn</a>。此外,所有非参考资料也都已翻译为简体中文,方便相应用户使用。</p>
+
+<h2 id="August-2017">2017 年 8 月</h2>
+
+<p>Android 8.0 已发布!本部分介绍了 Android 8.0 平台中的主要新功能。</p>
+
+<h3 id="architecture">架构</h3>
+
+<h4>Treble</h4>
+<p>
+Android 8.0 支持 Treble,这是 Android 操作系统框架在架构方面的一项重大改变,旨在让制造商以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。文档中详细介绍了 <a href="/devices/architecture/hidl/index.html">HAL 接口定义语言 (HIDL)</a>、全新的 <a href="/devices/architecture/configstore/index.html">ConfigStore HAL</a>、<a href="/devices/architecture/dto/index.html">设备树叠加层</a>、<a href="/devices/architecture/vndk/index.html">供应商原生开发套件 (VNDK)</a>、<a href="/devices/architecture/vintf/index.html">供应商接口对象 (VINTF)</a>、<a href="/devices/architecture/kernel/modular-kernels.html">模块化内核要求</a>以及<a href="/devices/tech/vts/index.html">供应商测试套件 (VTS) 和基础架构</a>。
+</p>
+
+<h4>FunctionFS 支持</h4>
+<p>
+<a class="external-link" href="https://www.kernel.org/doc/Documentation/usb/functionfs.txt">FunctionFS</a> (FFS) 是一个通过用户空间进行设计和控制的 USB gadget 函数。
+提供对该函数的支持后,所有函数和协议特定代码都将存在于用户空间中,而所有 USB 传输代码则存在于内核中。使用 FFS 可将媒体传输协议 (MTP) 实现移至用户空间。
+</p>
+
+<p>
+在框架方面,大部分主要变化都存在于 MtpServer 中。USB 驱动程序接口已被重构为两个不同的类:一个类使用旧的内核驱动程序,另一个类使用 FFS。然后,MtpServer 可以使用该驱动程序接口,而无需了解实现的细节。服务器启动时,FFS 驱动程序会将 USB 描述符写入文件;然后,它会将数据写入端点文件(类似于内核驱动程序使用方式)。
+</p>
+
+<h4>用于 LLDB/C++ 调试的内核增强功能</h4>
+<p>
+Android 8.0 版本包含一些内核增强功能,这些功能可改善开发者的调试体验,有助于开发者开发出更好的应用。如需更多信息,请参阅<a href="/devices/architecture/kernel/lldb-debug.html">实现用于 LLDB/C++ 调试的内核增强功能</a>。
+</p>
+
+<h4>内核加固</h4>
+<p>
+上游内核加固功能和工具,用于发现内核驱动程序中的错误。
+如需更多信息,请参阅<a href="/devices/architecture/kernel/hardening.html">内核加固</a>。
+</p>
+
+<h4>在内核级别优化 SquashFS</h4>
+<p>
+SquashFS 是一个面向 Linux 且经过压缩的只读文件系统,适合在系统分区上使用。该文档中描述的优化功能有助于提高 SquashFS 的性能。如需更多信息,请参阅<a href="/devices/architecture/kernel/squashfs.html">在内核级优化 SquashFS</a>。
+</p>
+
+<h3 id="art-dalvik">ART 和 Dalvik</h3>
+<h4>模糊测试</h4>
+<p>
+Android 开源项目 (AOSP) 提供了用于测试 <a href="/devices/tech/dalvik/">Android 运行时 (ART)</a> 基础架构的全新模糊测试套件。全新的工具包 JFuzz 以及经过改进的 DexFuzz 现在可以直接在 AOSP 中获得,并且随附了相关文档。
+请参阅:
+<a href="https://android.googlesource.com/platform/art/+/master/tools/jfuzz/README.md">https://android.googlesource.com/platform/art/+/master/tools/jfuzz/README.md</a>
+<a href="https://android.googlesource.com/platform/art/+/master/tools/dexfuzz/README">https://android.googlesource.com/platform/art/+/master/tools/dexfuzz/README</a>
+</p>
+<p>
+无需做任何工作,即可实现或使用这些新工具。必要时您可以对这些工具进行更改,就像您可以更改运行时/编译器一样。
+</p>
+
+<h4>VDEX 文件:提升系统更新性能</h4>
+<p>
+VDEX 文件有助于提升软件更新的性能和用户体验。VDEX 文件用于存储包含验证程序依赖关系且经过预验证的 DEX 文件,以便 ART 在系统更新期间无需再次解压和验证 DEX 文件。无需执行任何操作,即可实现该功能。该功能默认处于启用状态。要停用该功能,请将 <code>ART_ENABLE_VDEX</code> 环境变量设为 <code>false</code>。
+</p>
+
+<h4>ART 性能改进</h4>
+<p>
+在 Android 8.0 版本中,Android Runtime (ART) 有了极大改进。该文档总结了设备制造商可以在 ART 中获得的增强功能。如需更多信息,请参阅<a href="/devices/tech/dalvik/improvements.html">提升 Android 8.0 中的 ART 性能</a>。
+</p>
+
+<h4>Android A/B OTA 更新</h4>
+<p>
+该更新解答了设备制造商经常遇到的 Android A/B(无缝)系统更新问题。如需更多信息,请参阅 <a href="/devices/tech/ota/ab_updates#frequently-asked-questions.html">A/B(无缝)系统更新常见问题解答</a>。
+</p>
+
+<h3 id="automotive">车载</h3>
+
+<h4>蓝牙连接管理功能</h4>
+<p>
+Android 8.0 在车载信息娱乐系统中提供了蓝牙连接管理功能,可实现更顺畅的蓝牙用户体验。如需更多信息,请参阅<a href="/devices/automotive/ivi_connectivity.html#bluetooth-connection-management">蓝牙连接管理功能</a>。
+</p>
+
+<h4>蓝牙多设备 HFP</h4>
+<p>
+使用蓝牙多设备连接,用户可以将多台设备连接到 Android Automotive IVI 蓝牙中的电话配置文件。如需更多信息,请参阅 <a href="/devices/automotive/ivi_connectivity.html#bluetooth-multi-device-connectivity">IVI 连接</a>。
+</p>
+
+<h4>车载相机 HAL</h4>
+<p>
+介绍了外景系统 (EVS) 堆栈的设计,并提供了可获取和呈现车载相机数据的 HAL 规范。如需更多信息,请参阅<a href="/devices/automotive/camera-hal.html">外景系统 (EVS) 车载相机 HAL</a>。
+</p>
+
+<h3 id="bluetooth">蓝牙</h3>
+<p>
+请参阅更新后的<a href="/devices/bluetooth/index.html">蓝牙概览</a>。
+</p>
+
+<h4>验证和调试蓝牙</h4>
+<p>
+一个新页面,其中介绍了如何验证和调试原生蓝牙堆栈。请在<a href="/devices/bluetooth/verifying_debugging.html">验证和调试</a>上查看此页面。
+</p>
+
+<h4>蓝牙服务</h4>
+<p>
+蓝牙提供了多种协助实现跨设备核心服务的功能,如音频流式传输、接打电话和收发短信。如需关于 Android 蓝牙服务的更多信息,请参阅<a href="/devices/bluetooth/services.html">蓝牙服务</a>。
+</p>
+
+<h4>BLE 广告</h4>
+<p>
+蓝牙 5 支持不同的蓝牙低功耗数据广告模式,包括更高的带宽或更大的范围。如需更多信息,请参阅<a href="/devices/bluetooth/ble_advertising.html">蓝牙低功耗广告</a>。
+</p>
+
+<h4>音频编解码器的蓝牙支持</h4>
+<p>
+Android 8.0 版本支持蓝牙高清音频编解码器。如需更多信息,请参阅<a href="/devices/bluetooth/services.html#advanced-audio-codecs">高级音频编解码器</a>。
+</p>
+
+<h3 id="camera">相机</h3>
+
+<h4>主要的相机功能</h4>
+<p>
+Android 8.0 版本中包含对相机服务的以下主要增强:共享表面、多个表面可共用相同的 OutputConfiguration System API 以实现自定义相机模式,以及 onCaptureQueueEmpty。如需更多信息,请参阅<a href="/devices/camera/versioning.html">相机版本支持</a>。
+</p>
+
+<h3 id="configuration">配置</h3>
+
+<h4>Ambient 权能</h4>
+<p>
+借助此类权能,Linux 进程可以舍弃大多数类似于 root 的权限,同时保留执行其功能所需的权限。
+Ambient 权能允许系统服务在其 <code>.rc</code> 文件中配置各项权能,从而将所有配置放入单个文件中。如需更多信息,请参阅<a href="/devices/tech/config/ambient.html">实现 Ambient 权能</a>。
+</p>
+
+<h4>特许权限白名单要求</h4>
+<p>
+从 Android 8.0 开始,必须将所有特权应用显式加入到 <code>/etc/permissions</code> 目录下的系统配置 XML 文件的白名单中。如果不这样做,则虽然设备可以启动,但设备实现将无法通过 CTS。如需更多信息,请参阅<a href="/devices/tech/config/perms-whitelist.html">特许权限白名单要求</a>。
+</p>
+
+<h4>实现 USB HAL</h4>
+<p>
+Android 8.0 版本将 USB 命令的处理从 init 脚本移至了原生 USB 守护进程,以实现更好的配置和代码可靠性。如需更多信息,请参阅<a href="/devices/tech/config/usb-hal.html">实现 USB HAL</a>。
+</p>
+
+<h3 id="connectivity">连接</h3>
+
+<h4>为流量已用完的用户自定义设备行为</h4>
+<p>
+流量已用完的 Android 设备允许网络流量通过,但需要运营商和电信服务商来实现缓解协议。该功能实现了一个通用解决方案,使运营商和电信服务商能够在设备用完流量时予以指示。如需更多信息,请参阅<a href="/devices/tech/connect/oob-users.html">为流量已用完的用户自定义设备行为</a>。
+</p>
+
+<h3 id="debugging">调试</h3>
+
+<h4>在 Android 编译系统中启用清理程序</h4>
+<p>
+清理程序是基于编译器的工具组件,在开发和测试期间使用,旨在识别错误和改进 Android。
+Android 目前的一系列清理程序可以发现和诊断内存滥用错误以及可能存在危险的未定义行为。如需更多信息,请参阅<a href="/devices/tech/debug/sanitizers.html">在 Android 编译系统中启用清理程序</a>。
+</p>
+
+<h4>恢复陷入重新启动循环的设备</h4>
+<p>
+Android 8.0 中包含一项能够在发现核心系统组件陷入崩溃循环时派出“救援队”(Rescure Party) 的功能。然后,Rescue Party 会采取一系列措施来上报相关情况,以恢复设备。如需更多信息,请参阅 <a href="/devices/tech/debug/rescue-party.html">Rescue Party</a>。
+</p>
+
+<h4>Storaged</h4>
+<p>
+Android 8.0 添加了对 <code>storaged</code>(一个 Android 本机守护进程,可在 Android 设备上收集和发布存储指标)的支持。如需更多信息,请参阅<a href="/devices/tech/debug/storaged.html">实现 Storaged</a>。
+</p>
+
+<h3 id="display">显示</h3>
+
+<h4>针对悬浮窗口的 Air Traffic Control</h4>
+<p>
+Android 8.0 引入了针对悬浮窗口的 Air Traffic Control,以简化和统一应用的叠加显示方式。Android 开源项目 (AOSP) 中包含使用该功能所需的所有内容。
+</p>
+<p>
+借助 Air Traffic Control,开发者可以为应用创建全新的(受管理)悬浮层/窗口类型,以用于在其他应用之前显示窗口。该功能会为所有使用悬浮层的应用显示持续性通知,以便用户管理此类提醒窗口。
+</p>
+<p>
+Android 兼容性测试套件 (CTS) 可以确认:
+</p> <ul>
+ <li>当前提醒窗口类型为:<code>TYPE_PHONE</code>、<code>TYPE_PRIORITY_PHONE</code>、<code>TYPE_SYSTEM_ALERT</code>、<code>TYPE_SYSTEM_OVERLAY</code> 或 <code>TYPE_SYSTEM_ERROR</code>
+ </li><li>目标为 O SDK 的应用无法使用上述窗口类型在其他应用之前显示窗口。它们需要使用新窗口类型 TYPE_APPLICATION_OVERLAY。
+</li><li>目标为较低版本 SDK 的应用仍然可以使用目前的窗口类型;不过,这些窗口在 Z 轴上将排在新的 TYPE_APPLICATION_OVERLAY 窗口之后。
+ </li><li>系统可以在新层中移动或调整窗口大小,以减少杂乱现象。
+ </li><li>设备制造商必须保留通知,以便用户控制哪个应用显示在其他应用之前。</li> </ul>
+
+<h4>在辅助显示屏上启动 Activity</h4>
+<p>
+所有人都可以使用虚拟显示屏,无需任何特殊硬件。任何应用都可以创建虚拟显示屏实例;在 Android 8.0 版本中,如果关联的功能已启用,则可以在相应虚拟显示屏上启动 Activity。
+</p>
+<p>
+要支持多显示屏功能,您应使用现有受支持的辅助设备连接方式之一,或编译新硬件。
+在 Nexus 和 Pixel 设备上连接显示屏的受支持的方式包括 Google Cast 和<a href="https://developer.android.com/reference/android/hardware/display/VirtualDisplay.html">应用内虚拟显示屏</a>。是否支持其他方式取决于每种具体情况下(如 MHL 或 DisplayPort over USB-C)的内核驱动程序支持,以及完全实现 HardwareComposer HAL(IComposerCallback.hal 和 IComposerClient.hal)中与显示屏相关的接口定义。
+</p>
+<p>
+每种方式都可能需要 SoC 或 OEM 支持。例如,要启用 DisplayPort over USB-C,则同时需要硬件 (SOC) 和软件(驱动程序)支持。您可能需要为硬件实现驱动程序,才能支持连接外接显示器。
+</p>
+<p>
+默认实现将允许在辅助显示屏上启动各项 Activity 的全屏堆叠。您可以自定义辅助显示屏上的堆叠、系统界面和行为。
+</p>
+
+<h4>对通用提示的支持</h4>
+<p>
+Android 8.0 允许开发者为按钮及其他图标上的鼠标悬停行为提供描述性操作名称及其他实用信息。设备制造商可以设计弹出式提示的样式。其布局在 <code>android/frameworks/base/core/res/res/layout/tooltip.xml</code> 中定义。
+
+</p>
+<p>
+OEM 可以替换布局或更改其尺寸和样式参数。请仅使用文字,并使尺寸在合理的范围内尽可能小。该功能完全在 View 类中实现,且有一些相当详尽的 CTS 测试,这些测试用于检查提示行为的很多方面。
+</p>
+<p>
+
+</p><h4>对扩展宽高比的支持</h4>
+<p>
+Android 8.0 包含一个新的清单属性 <a href="https://developer.android.com/reference/android/R.attr.html#maxAspectRatio">maxAspectRatio</a>,该属性可让 Activity 或应用指定其支持的最大宽高比。
+maxAspectRatio 将之前的元数据标记替换成一个顶级 API,并让设备可支持大于 16:9 的宽高比。
+</p><ul>
+<li>如果 Activity 或应用的<a href="https://developer.android.com/guide/topics/ui/multi-window.html#configuring">大小可调整</a>,则允许 Activity 填充屏幕。
+</li><li>如果 Activity 或应用的大小不可调整,或者平台会强制调整 Activity 的大小,则允许应用窗口根据 <a href="https://developer.android.com/reference/android/R.attr.html#maxAspectRatio">maxAspectRatio</a> 值,以不超过此值的宽高比显示。<ul>
+ <li>对于运行 Android 8.0 的设备上的应用,默认值为当前设备的宽高比。
+ </li><li>对于运行较低版本 Android 的设备上的应用,默认值为 16:9。</li> </ul>
+</li> </ul>
+
+<h4>实现自适应图标</h4>
+<p>
+如果开发者仅提供一个图标素材资源,自适应图标的形状在设备内会保持一致,但在设备之间会有所差异。此外,图标支持两个图层(前景和背景),以实现动画效果,为用户提供愉悦的视觉体验。如需更多信息,请参阅<a href="/devices/tech/display/adaptive-icons.html">实现自适应图标</a>。
+</p>
+
+<h4>夜间模式</h4>
+<p>
+Android 7.0.1 中引入了夜间模式,该模式允许用户降低其屏幕发出的蓝光量。Android 8.0 使用户可以更好地控制夜间模式的强度。如需更多信息,请参阅<a href="/devices/tech/display/night-light.html">实现夜间模式</a>。
+</p>
+
+<h4>画中画</h4>
+<p>
+Android 8.0 支持在 Android 手持设备上使用画中画 (PIP) 功能。借助画中画功能,用户可以将有正在进行的活动(如视频)的应用调整到一个小窗口中。如需更多信息,请参阅 <a href="/devices/tech/display/pip.html">Android 手机上的画中画</a>。
+</p>
+
+<h4>改进分屏交互</h4>
+<p>
+多窗口模式使用户设备的屏幕上可以同时显示多个应用。
+Android 8.0 改进了默认模式(分屏),当用户在进入分屏模式后点按主屏幕时,会压缩顶部窗格并调整启动器的大小。如需更多信息,请参阅<a href="/devices/tech/display/split-screen.html">改进分屏交互</a>。
+</p>
+
+<h4>添加微件/快捷方式</h4>
+<p>
+Android 8.0 中的一个新 API 使应用开发者可以从应用内添加快捷方式和微件,而不必依靠微件面板。出于安全考虑,以前通过发送广播添加快捷方式的方法已被弃用。如需更多信息,请参阅<a href="/devices/tech/display/widgets-shortcuts.html">实现添加微件/快捷方式</a>。
+</p>
+
+<h3 id="downloading-building">下载和编译</h3>
+
+<h4>Android LLVM 工具链改进</h4>
+<p>
+希望使用我们的最新工具链/工具的 OEM 需要确保其任意私有代码都可以通过更新后的工具链成功编译。这可能需要他们修复其代码中存在的与未定义行为相关的问题。(当然,他们也可以随意使用喜欢的任何工具来编译自己的代码。)
+</p>
+<p>
+他们必须确保自己的代码不含未定义的行为(通过使用 UBSan 等工具),以使之不易受到新工具链带来的问题的影响。所有工具链都始终在 AOSP 中直接更新。远远在 OC 发布之前,所有功能便都已可用,因此 OEM 应已遵循相关规定。
+</p>
+<p>
+如需常规说明,请参阅<a href="https://llvm.org/">公开的 Clang/LLVM</a> 文档;如需 Android 专属指南,请参阅 AOSP 中的 <a href="https://android.googlesource.com/platform/external/clang/+/dev/ReadmeAndroid.md">Android Clang/LLVM</a> 文档集。
+最后,请加入 <a href="https://groups.google.com/forum/#!forum/android-llvm">android-llvm</a> 公开论坛,以获取帮助和参与开发。
+</p>
+
+<h3 id="drm-kms">DRM/KMS</h3>
+
+<h4>Linux 内核版本 4.9 中的 DRM/KMS</h4>
+<p>
+Android 使用的 Direct Rendering Manager (DRM)/Kernel Mode Setting (KMS) 框架由 Linux 内核开发者在 Linux 内核中开发和维护。Android 从 Linux 内核向下合并。如果从我们的通用内核向下合并,设备制造商可以自动获得 DRM/KMS 框架。
+</p>
+<p>
+DRM/KMS 在 Linux 内核版本 4.9 中开始可用,Android <strong>强烈建议</strong> OEM 合作伙伴从这个内核版本开始使用 DRM/KMS。4.9 及更高版本的通用 Android 内核将不再支持 <a href="https://lwn.net/Articles/565422/">Atomic Display Framework (ADF)</a>(Android 目前官方支持的显示框架);从 4.9 版开始,Android 将支持 DRM/KMS。OEM 可以继续使用 ADF(或任何其他框架),但 Android 在通用 Android 内核中将不再为其提供支持。
+</p>
+<p>
+要实现 DRM/KMS,除了从 Android 通用内核向下合并 DRM/KMS 框架之外,您还需要使用 DRM/KMS 编写自己的驱动程序。
+</p>
+
+<h3 id="keystore">密钥存储区</h3>
+
+<h4>Keymaster 3</h4>
+<p>
+Android 8.0 更新了 Keymaster(密钥存储区 HAL):扩展了 Android 设备上硬件支持的密钥存储区的功能。这基于 Android 7.1.2 对 Keymaster 2 的更新。如需更多信息,请参阅 <a href="/security/keystore/index.html">Keymaster 3 文档</a>。
+</p>
+
+<h3 id="security-enhancements">安全增强功能</h3>
+
+<h4>从 HttpsURLConnection 中移除了不安全的 TLS 版本回退功能</h4>
+<p>
+对于某些服务器中有问题的 TLS 协议降级协商实现,不安全的 TLS/SSL 协议版本回退功能是一种解决方法。这种方法容易受到 POODLE 攻击。Chrome 45 在 2015 年 9 月弃用不安全的回退功能时,依赖它的服务器不到 0.01%。为了提高安全性,在 Android 8.0 中,我们从 <a href="https://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html">HttpsURLConnection</a> 中移除了不安全的 TLS 版本回退功能。如需更多信息,请参阅<a href="https://android-developers.googleblog.com/2017/04/android-o-to-drop-insecure-tls-version.html
+">这篇博文</a>。
+</p>
+<p>
+要在搭载 Android 8.0 的设备上测试该功能,请运行以下 CTS 测试用例:
+</p>
+
+<pre class="devsite-click-to-copy devsite-terminal" data-terminal-prefix="# ">
+cts-tradefed run cts -m CtsLibcoreOkHttpTestCases</pre>
+
+<h3 id="performance">性能</h3>
+
+<h4>闪存磨损管理</h4>
+<p>
+介绍 eMMC 行为和新功能,以协助 OEM 降低 Automotive 环境中 eMMC 发生故障的风险。如需更多信息,请参阅 <a href="/devices/tech/perf/flash-wear.html">Android Automotive 中的闪存磨损管理</a>。
+</p>
+
+<h4>优化启动时间</h4>
+<p>
+有关缩短特定 Android 设备启动时间的指南。如需更多信息,请参阅<a href="/devices/tech/perf/boot-times.html">优化启动时间</a>。
+</p>
+
+<h4>任务快照</h4>
+<p>
+任务快照是在 Android 8.0 中引入的基础架构,可将窗口管理器中最近任务的缩略图以及已保存平面的缩略图进行合并,从而节省内存。如需更多信息,请参阅<a href="/devices/tech/perf/task-snapshots.html">任务快照</a>。
+</p>
+
+<h3 id="peripherals">外设</h3>
+
+<h4>默认打印服务</h4>
+<p>
+<a href="https://developer.android.com/reference/android/printservice/PrintService.html">打印服务</a>是一款应用,可用于发现打印机并将其呈现给设备的打印框架。在较低的 Android 版本中,用户必须搜索并安装第三方打印服务才能进行打印。
+</p>
+<p>
+Android 8.0 在 <code><a href="https://android.googlesource.com/platform/packages/services/BuiltInPrintService/">platform/packages/services/BuiltInPrintService/</a></code> 中纳入了一项默认打印服务,该服务可让用户在现代打印机上进行打印,而无需安装任何额外的应用。
+此实现支持符合以下条件的打印机:使用 Internet Printing Protocol (IPP) 进行通信,并使用 PCLm、PWG-Raster 或 PDF 发送可打印的内容。对于较旧的打印机,用户应安装 <a href="https://android.googlesource.com/platform/frameworks/base/+/android-7.0.0_r1/packages/PrintRecommendationService/">PrintRecommendationService</a> 推荐的应用,如<a href="https://youtu.be/M_JGeGLpOKs?t=16m20s">此 I/O 演示</a>中所示。
+
+</p><h3 id="reference">参考资料更新</h3>
+
+<p>
+顶级导航菜单中添加了<a href="/reference/">参考资料</a>部分。作为 <a href="/devices/architecture/treble">Treble</a> 更新的一部分,其中添加了 <a href="/reference/hidl/">HIDL 参考资料</a>部分。
+<a href="/reference/tradefed/">Trade Federation</a> 和<a href="/reference/hal/">旧版 HAL</a> 参考文档已更新。
+</p>
+
+<h3 id="settings-menu">“设置”菜单</h3>
+
+<h4>设置:模式和组件</h4>
+<p>
+在 Android 8.0 中,“设置”菜单中增加了一些能够涵盖常见使用情况的组件和微件。如需更多信息,请参阅<a href="/devices/tech/settings/patterns-components.html">模式和组件</a>。
+</p>
+
+<h4>设置:信息架构更新</h4>
+<p>
+Android 8.0 为“设置”应用引入了全新的信息架构。新信息架构的目标是简化设置的组织方式,让用户能够更轻松地快速查找自定义 Android 设备所需的设置。如需更多信息,请参阅如何实现<a href="/devices/tech/settings/info-architecture.html">已更新的信息架构</a>。
+</p>
+
+<h4>个性化设置</h4>
+<p>
+Android“设置”应用可为用户提供一系列建议。该功能会根据所有相关信息或用户以往与建议的互动情况对建议进行排名。如需更多信息,请参阅<a href="/devices/tech/settings/personalized.html">个性化设置</a>。
+</p>
+
+<h4>实现设置:通用搜索</h4>
+<p>
+Android 8.0 为“设置”菜单添加了经过扩展的搜索功能。该文档介绍了如何添加设置,以及如何确保正确地将其加入“设置”索引。
+如需更多信息,请参阅<a href="/devices/tech/settings/universal-search.html">通用搜索</a>。
+</p>
+
+<h3 id="storage">存储</h3>
+
+<h4>更快获取存储统计信息</h4>
+<p>
+Android 8.0 利用 EXT4 文件系统的“配额”支持,近乎即时地提供磁盘使用情况统计信息。如需更多信息,请参阅如何<a href="/devices/storage/faster-stats.html">实现更快获取存储统计信息</a>。
+</p>
+
+<h2 id="april-2017">2017 年 4 月</h2>
+<p>欢迎访问新版 source.android.com!本网站经过了全新改版,可让您更轻松地浏览、搜索和阅读日益增多的信息。以下是我们对本网站所做改进的摘要:</p>
+
+<h3 id="screen-estate">屏幕空间更宽裕,字体更大</h3>
+<p>整个网站的空间更宽裕,可让您同时查看更多内容。代码示例和命令更加醒目,并且所有文字均采用更大的字体。</p>
+
+<h3 id="mobile-ready">适合移动设备的视图</h3>
+<p>通过专用的移动视图,新版网站可以在手持设备上更明晰地呈现内容。</p>
+
+<div style="width:407px">
+  <img src="images/mobile-view.png" alt="新移动视图" height="533px"/>
+  <p class="img-caption">
+    <strong>图 1.</strong> 网站的新移动视图</p>
+</div>
+
+<h3 id="top-tabs">新的顶级标签</h3>
+<p>之前的“设备”标签已更名为<a href="/devices/">移植</a>,并且之前的“核心技术”子标签已更名为<a href="/devices/tech/">微调</a>并移到了网站顶部,以便更好地显示给用户。<em></em><em></em></p>
+
+<h3 id="security-forefront">“安全性”标签排在了前列</h3>
+<p>随着人们越来越关注 Android 的安全性,我们将<a href="/security/">安全性</a>标签向前移到了<a href="/setup/">源代码</a>旁边,以体现其重要性。</p>
+
+<h3 id="reference-materials">更好的参考资料</h3>
+<p>您可以直接从顶层的<a href="/reference/">参考资料</a>标签获得<a href="/reference/hal/">硬件抽象层</a>和 <a href="/reference/tradefed/packages">Trade Federation</a> 参考资料。</p>
+
+<h3 id="code-links">每页都有的代码链接</h3>
+<p>在每个页面中,您只需点击一下右上角的<a href="https://android.googlesource.com/">转到源代码</a>按钮,即可访问 <strong>AOSP 代码库</strong>。</p>
+
+<h3 id="comprehensive-footers">包罗广泛的页脚</h3>
+<p>除了已有的“关于”、“社区”和“法律”页脚之外,现在您还可以在每个页面的底部找到全面的链接列表。这些链接对应的页面中提供了编译 Android、与 Android 生态系统建立联系以及操作系统使用帮助等方面的信息。<em></em><em></em><em></em></p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/submit-patches.html b/zh-cn/setup/submit-patches.html
new file mode 100644
index 0000000..924146a
--- /dev/null
+++ b/zh-cn/setup/submit-patches.html
@@ -0,0 +1,144 @@
+<html devsite><head>
+    <title>提交补丁程序</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>本页介绍向 AOSP 提交补丁程序的完整流程,包括使用 <a href="https://android-review.googlesource.com/">Gerrit</a> 查看和跟踪更改。</p>
+<h3 id="prerequisites">前提条件</h3>
+<ul>
+<li>
+<p>您需要先<a href="/setup/initializing.html">初始化编译环境</a>、<a href="/setup/downloading.html">下载源代码</a>、<a href="https://android.googlesource.com/new-password">创建密码</a>并按照密码生成器页面中的说明操作,然后再按照本页中的说明操作。</p>
+</li>
+<li>
+<p>如需详细了解 Repo 和 Git,请参阅<a href="/setup/developing.html">开发</a>部分。</p>
+</li>
+<li>
+<p>如需了解您可以在 Android 开源社区中担任的不同角色,请参阅<a href="/setup/roles.html">项目角色</a>。</p>
+</li>
+<li>
+<p>如果您计划向 Android 平台贡献代码,请务必阅读 <a href="/setup/licenses.html">AOSP 的许可信息</a>。</p>
+</li>
+<li>
+<p>请注意,如果要对 Android 使用的某些上游项目做出更改,请直接针对相应项目进行更改,如<a href="#upstream-projects">上游项目</a>部分中所述。</p>
+</li>
+</ul>
+
+<h2 id="for-contributors">贡献者须知</h2>
+
+<h3 id="authenticate-with-the-server">向服务器验证身份</h3>
+<p>您需要先<a href="https://android.googlesource.com/new-password">创建一个密码</a>(该密码将用于服务器识别您的身份),然后您才可以向 Gerrit 上传内容。请按照密码生成器页面上的说明操作。您只需执行此流程一次即可。如需了解更多详情,请参阅<a href="/setup/downloading.html#using-authentication">使用身份验证</a>。</p>
+<h3 id="start-a-repo-branch">新建一个 Repo 分支</h3>
+<p>对于您打算进行的每项更改,请在相关的 Git 存储库中新建一个分支:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo start <var>NAME</var> .
+</pre>
+<p>您可以在同一存储库中同时新建多个独立的分支。“NAME”分支是您的工作区的本地分支,不会包含在 Gerrit 或最终源代码树中。</p>
+<h3 id="make-your-change">进行更改</h3>
+<p>在您修改源代码文件(并且验证)后,请将这些更改提交到您的本地存储库:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">git add -A</code>
+<code class="devsite-terminal">git commit -s</code>
+</pre>
+<p>请在您的提交消息中提供相关更改的详细说明。该说明将会被推送到公开 AOSP 存储库,因此请按照我们的准则来撰写更改列表说明:</p>
+<ul>
+
+<li>
+<p>以一行摘要(最多 50 个字符)开头,后跟一个空白行。
+这是 Git 和 Gerrit 支持的格式,适用于各种屏幕尺寸的设备。</p>
+</li>
+
+<li>
+<p>从第三行开始输入较长的说明,说明会在达到 72 个字符时自动硬回车换行。该部分应着重说明更改解决了什么问题,以及如何解决了问题。尽管我们建议您提供第二部分的内容,但这在实现新功能时是可选内容。</p>
+</li>
+<li>
+<p>添加对任何假设或背景信息的简短说明,这些内容可能对下一年研究此功能的其他贡献者起到很大的帮助作用。</p>
+</li>
+</ul>
+
+<p>以下是一个示例提交消息:</p>
+<pre class="devsite-click-to-copy">short description on first line
+
+more detailed description of your patch,
+which is likely to take up multiple lines.
+</pre>
+
+<p><code>repo
+init</code> 期间提供的唯一更改 ID 以及您的姓名和电子邮件将自动添加到您的提交消息中。</p>
+
+<h3 id="upload-to-gerrit">上传到 Gerrit</h3>
+<p>将更改提交到您的个人历史记录后,请使用以下命令将其上传到 Gerrit:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo upload
+</pre>
+<p>如果您在同一存储库中新建了多个分支,则系统会提示您选择要上传的分支。</p>
+<p>上传成功后,Repo 会为您提供 <a href="https://android-review.googlesource.com/">Gerrit</a> 上对应新页面的网址。访问该链接可在审核服务器上查看您上传的补丁程序、添加注释,或者为您的补丁程序申请特定审核者。</p>
+<h3 id="uploading-a-replacement-patch">上传替换补丁程序</h3>
+<p>假设某位审核者已看过您的补丁程序,并要求您做一些小小的修改。您可以在 Git 中修改提交的内容,这会在 Gerrit 中生成一个新的补丁程序,该补丁程序与原始补丁程序具有相同的更改 ID。</p>
+<aside class="note"><b>注意</b>:如果您在上传该补丁程序之后进行了其他提交,那么您将需要手动移动 Git HEAD。</aside>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">git add -A</code>
+<code class="devsite-terminal">git commit --amend</code>
+</pre>
+<p>当您上传修改后的补丁程序时,它将替换 Gerrit 和本地 Git 历史记录中的原始补丁程序。</p>
+
+<h3 id="resolving-sync-conflicts">解决同步冲突</h3>
+<p>如果提交到源代码树的其他补丁程序与您的存在冲突,那么您需要在源代码存储库的新 HEAD 的基础上对您的补丁程序执行“衍合”(rebase) 命令。执行此操作的一种简单方法是运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo sync
+</pre>
+<p>此命令首先从源代码服务器获取更新,然后尝试在新的远程 HEAD 的基础上对您的 HEAD 自动执行衍合命令。</p>
+<p>如果自动衍合命令失败,您就必须手动执行衍合。</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo rebase
+</pre>
+<p>使用 <code>git mergetool</code> 可帮助您处理衍合冲突。在成功合并冲突文件后,运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+git rebase --continue
+</pre>
+<p>在自动或手动衍合完成之后,运行 <code>repo
+upload</code> 来提交衍合后的补丁程序。</p>
+
+<h3 id="after-a-submission-is-approved">提交内容获得批准后</h3>
+<p>在提交内容通过审核和验证流程之后,Gerrit 会自动将更改合并到公开存储库。其他用户可以运行 <code>repo sync</code> 将更新提取到自己的本地客户端。</p>
+
+<h2 id="upstream-projects">上游项目</h2>
+<p>Android 使用了许多其他开源项目,例如<a href="/setup/code-lines.html">代码流水线、分支和版本</a>中所述的 Linux 内核和 WebKit。对于 <code>external/</code> 下的大多数项目,如果要提交更改,则应该在上游进行,然后 Android 维护者会收到有关包含这些更改的新上游版本的通知。上传补丁程序也可能有助于我们跟踪新的上游版本,但如果是 Android 中广泛使用的项目(如下面提到的大多数大型项目),我们将很难做出更改。在这种情况下,我们倾向于在每次发布版本时进行升级。</p>
+<p>一个有趣的特殊情况是 Bionic。由于大部分代码都是来自 BSD,因此,除非更改涉及对 Bionic 新内容的编码,否则我们宁愿使用上游修复程序,然后从相应的 BSD 中提取一个全新文件。(可惜的是,我们目前有各种不同的 BSD,但我们希望将来能够解决该问题,并能够更密切地跟踪上游项目。)</p>
+<h3 id="icu4c">ICU4C</h3>
+<p>对于 <code>external/icu4c</code> 中的 ICU4C 项目,所有更改都应通过 <a href="http://site.icu-project.org/">icu-project.org/</a> 在上游进行。
+如需了解详情,请参阅<a href="http://site.icu-project.org/bugs">提交 ICU 错误和功能请求</a>。</p>
+
+<h3 id="llvmclangcompiler-rt">LLVM/Clang/Compiler-rt</h3>
+<p>对于与 LLVM 相关的项目(<code>external/clang</code>、<code>external/compiler-rt</code>、<code>external/llvm</code>),所有更改都应通过 <a href="http://llvm.org/">llvm.org/</a> 在上游进行。</p>
+
+<h3 id="mksh">mksh</h3>
+<p>对于 <code>external/mksh</code> 中的 MirBSD Korn Shell 项目,所有更改都应在上游进行:通过向 [email protected] 发送电子邮件(无需订阅即可提交),或者在 <a href="https://launchpad.net/mksh">Launchpad</a> 中进行(可选)。
+</p>
+<h3 id="openssl">OpenSSL</h3>
+<p>对于 <code>external/openssl</code> 中的 OpenSSL 项目,所有更改都应通过 <a href="http://www.openssl.org">openssl.org</a> 在上游进行。</p>
+<h3 id="v8">V8</h3>
+<p>对于 <code>external/v8</code> 中的 V8 项目,所有更改都应通过 <a href="https://code.google.com/p/v8">code.google.com/p/v8</a> 在上游提交。如需了解详情,请参阅<a href="https://code.google.com/p/v8/wiki/Contributing">为 V8 贡献代码</a>。</p>
+<h3 id="webkit">WebKit</h3>
+<p>对于 <code>external/webkit</code> 中的 WebKit 项目,所有更改都应通过 <a href="http://www.webkit.org">webkit.org</a> 在上游进行。该过程需从提交 WebKit 错误开始。
+只有当该错误仅限于 Android 时,才可以在 <code>Platform</code> 和 <code>OS</code> 字段中使用 <code>Android</code>。如果附有建议的修复程序并包含测试结果,则错误更有可能引起审核者的注意。如需了解详情,请参阅<a href="http://webkit.org/coding/contributing.html">为 WebKit 贡献代码</a>。</p>
+<h3 id="zlib">zlib</h3>
+<p>对于 <code>external/zlib</code> 中的 zlib 项目,所有更改都应通过 <a href="http://zlib.net">zlib.net</a> 在上游进行。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/using-repo.html b/zh-cn/setup/using-repo.html
new file mode 100644
index 0000000..448f264
--- /dev/null
+++ b/zh-cn/setup/using-repo.html
@@ -0,0 +1,280 @@
+<html devsite><head>
+    <title>Repo 命令参考资料</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>使用 Repo 需遵循的格式如下:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo <var>&lt;COMMAND&gt; &lt;OPTIONS&gt;</var>
+</pre>
+<p>可选元素显示在方括号 [ ] 中。例如,许多命令会将项目列表用作参数。您可以为项目指定项目列表,作为名称列表或本地源代码目录的路径列表:</p>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">repo sync [<var>&lt;PROJECT0&gt; &lt;PROJECT1&gt; ... &lt;PROJECTN&gt;</var>]</code>
+<code class="devsite-terminal">repo sync [<var>&lt;/PATH/TO/PROJECT0&gt; ... &lt;/PATH/TO/PROJECTN&gt;</var>]</code>
+</pre>
+
+<h2 id="help">help</h2>
+<p>安装 Repo 后,您可以通过运行以下命令找到最新文档(开头是包含所有命令的摘要):</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo help
+</pre>
+<p>您可以通过在 Repo 树中运行以下命令来获取有关某个命令的信息:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo help <var>&lt;COMMAND&gt;</var>
+</pre>
+
+<p>例如,以下命令会生成 Repo <code>init</code> 参数的说明和选项列表,该参数会在当前目录中初始化 Repo。(要了解详情,请参阅 <a href="#init">init</a>。)</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo help init
+</pre>
+
+<h2 id="init">init</h2>
+<pre class="devsite-terminal devsite-click-to-copy">repo init -u <var>&lt;URL&gt;</var> [<var>&lt;OPTIONS&gt;</var>]
+</pre>
+<p>在当前目录中安装 Repo。这会创建一个 <code>.repo/</code> 目录,其中包含用于 Repo 源代码和标准 Android 清单文件的 Git 代码库。该 <code>.repo/</code> 目录中还包含 <code>manifest.xml</code>,这是一个指向 <code>.repo/manifests/</code> 目录中所选清单的符号链接。有关更新清单的说明,请参阅 <a href="https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt" class="external">manifest-format.txt</a>。</p>
+<p>选项:</p>
+<ul>
+<li>
+<p><code>-u</code>:指定要从中检索清单代码库的网址。您可以在 <code>https://android.googlesource.com/platform/manifest</code> 中找到常见清单</p>
+</li>
+<li>
+<p><code>-m</code>:在代码库中选择清单文件。如果未选择任何清单名称,则会默认选择 default.xml。</p>
+</li>
+<li>
+<p><code>-b</code>:指定修订版本,即特定的清单分支。</p>
+</li>
+</ul>
+<p class="note"><strong>注意</strong>:对于其余的所有 Repo 命令,当前工作目录必须是 <code>.repo/</code> 的父目录或相应父目录的子目录。</p>
+
+<h2 id="sync">sync</h2>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo sync [<var>&lt;PROJECT_LIST&gt;</var>]
+</pre>
+<p>下载新的更改并更新本地环境中的工作文件。如果您在未使用任何参数的情况下运行 <code>repo sync</code>,则该操作会同步所有项目的文件。</p>
+<p>运行 <code>repo sync</code> 后,将出现以下情况:</p>
+<ul>
+<li>
+<p>如果目标项目从未同步过,则 <code>repo sync</code> 相当于 <code>git clone</code>。远程代码库中的所有分支都会复制到本地项目目录中。</p>
+</li>
+<li>
+<p>如果目标项目已同步过,则 <code>repo sync</code> 相当于以下命令:</p>
+<pre><code>git remote update
+git rebase origin/<var>&lt;BRANCH&gt;</var>
+</code></pre>
+<p>其中 <code>&lt;BRANCH&gt;</code> 是本地项目目录中当前已检出的分支。如果本地分支没有在跟踪远程代码库中的分支,则相应项目不会发生任何同步。</p>
+</li>
+<li>
+<p>如果 git rebase 操作导致合并冲突,那么您需要使用普通 Git 命令(例如 <code>git rebase --continue</code>)来解决冲突。</p>
+</li>
+</ul>
+<p><code>repo sync</code> 运行成功后,指定项目中的代码会与远程代码库中的代码保持同步。</p>
+<p>选项:</p>
+<ul>
+<li>
+<p><code>-d</code>:将指定项目切换回清单修订版本。如果项目当前属于某个主题分支,但只是临时需要清单修订版本,则此选项会有所帮助。</p>
+</li>
+<li>
+<p><code>-s</code>:同步到当前清单中清单服务器元素指定的一个已知的良好版本。</p>
+</li>
+<li>
+<p><code>-f</code>:即使某个项目同步失败,系统也会继续同步其他项目。</p>
+</li>
+</ul>
+
+<h2 id="upload">upload</h2>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo upload [<var>&lt;PROJECT_LIST&gt;</var>]
+</pre>
+<p>对于指定的项目,Repo 会将本地分支与最后一次 repo sync 时更新的远程分支进行比较。Repo 会提示您选择一个或多个尚未上传以供审核的分支。</p>
+<p>您选择一个或多个分支后,所选分支上的所有提交都会通过 HTTPS 连接传输到 Gerrit。您需要配置一个 HTTPS 密码以启用上传授权。要生成新的用户名/密码对以用于 HTTPS 传输,请访问<a href="https://android-review.googlesource.com/new-password">密码生成器</a>。</p>
+<p>当 Gerrit 通过其服务器接收对象数据时,它会将每项提交转变成一项更改,以便审核者可以单独针对每项提交给出意见。要将几项“检查点”提交合并为一项提交,请使用 git rebase -i,然后再运行 repo upload。</p>
+<p>如果您在未使用任何参数的情况下运行 repo upload,则该操作会搜索所有项目中的更改以进行上传。</p>
+<p>要在更改上传之后对其进行修改,您应该使用 <code>git rebase -i</code> 或 <code>git commit --amend</code> 等工具更新您的本地提交。修改完成之后,请执行以下操作:</p>
+<ul>
+<li>
+<p>进行核对以确保更新后的分支是当前已检出的分支。</p>
+</li>
+<li>
+<p>对于相应系列中的每项提交,请在方括号内输入 Gerrit 更改 ID:</p>
+<pre><code># Replacing from branch foo
+[ 3021 ] 35f2596c Refactor part of GetUploadableBranches to lookup one specific...
+[ 2829 ] ec18b4ba Update proto client to support patch set replacments
+# Insert change numbers in the brackets to add a new patch set.
+# To create a new change record, leave the brackets empty.
+</code></pre>
+</li>
+</ul>
+<p>上传完成后,这些更改将拥有一个额外的补丁程序集。</p>
+<p>如果您只希望上传当前已检出的 Git 分支,则可以使用标记 <code>--current-branch</code> (简称 <code>--cbr</code>)。</p>
+
+<h2 id="diff">diff</h2>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo diff [<var>&lt;PROJECT_LIST&gt;</var>]
+</pre>
+<p>使用 <code>git diff</code> 显示提交与工作树之间的明显更改。</p>
+
+<h2 id="download">download</h2>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo download <var>&lt;TARGET&gt; &lt;CHANGE&gt;</var>
+</pre>
+<p>从审核系统中下载指定更改,并放在您项目的本地工作目录中供使用。</p>
+<p>例如,要将<a href="https://android-review.googlesource.com/23823">更改 23823</a> 下载到您的平台/编译目录,请运行以下命令:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo download platform/build 23823
+</pre>
+<p><code>repo sync</code> 应该可以有效移除通过 <code>repo download</code> 检索到的任何提交。或者,您可以将远程分支检出,例如 <code>git checkout m/master</code>。</p>
+<p class="note"><strong>注意</strong>:由于全球的所有服务器均存在复制延迟,因此某项更改(位于 <a href="https://android-review.googlesource.com/">Gerrit</a> 中)出现在网络上的时间与所有用户可通过 <code>repo download</code> 找到此项更改的时间之间存在些许的镜像延迟。</p>
+
+<h2 id="forall">forall</h2>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo forall [<var>&lt;PROJECT_LIST&gt;</var>] -c <var>&lt;COMMAND&gt;</var>
+</pre>
+<p>在每个项目中运行指定的 shell 命令。通过 <code>repo forall</code> 可使用下列额外的环境变量:</p>
+<ul>
+<li>
+<p><code>REPO_PROJECT</code> 可设为项目的具有唯一性的名称。</p>
+</li>
+<li>
+<p><code>REPO_PATH</code> 是客户端根目录的相对路径。</p>
+</li>
+<li>
+<p><code>REPO_REMOTE</code> 是清单中远程系统的名称。</p>
+</li>
+<li>
+<p><code>REPO_LREV</code> 是清单中修订版本的名称,已转换为本地跟踪分支。如果您需要将清单修订版本传递到某个本地运行的 Git 命令,则可使用此变量。</p>
+</li>
+<li>
+<p><code>REPO_RREV</code> 是清单中修订版本的名称,与清单中显示的名称完全一致。</p>
+</li>
+</ul>
+<p>选项:</p>
+<ul>
+<li>
+<p><code>-c</code>:要运行的命令和参数。此命令会通过 <code>/bin/sh</code> 进行求值,它之后的任何参数都将作为 shell 位置参数传递。</p>
+</li>
+<li>
+<p><code>-p</code>:在指定命令输出结果之前显示项目标头。这通过以下方式实现:将管道绑定到命令的 stdin、stdout 和 sterr 流,然后通过管道将所有输出结果传输到一个页面调度会话中显示的连续流中。</p>
+</li>
+<li>
+<p><code>-v</code>:显示该命令向 stderr 写入的消息。</p>
+</li>
+</ul>
+
+<h2 id="prune">prune</h2>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo prune [<var>&lt;PROJECT_LIST&gt;</var>]
+</pre>
+<p>删减(删除)已合并的主题。</p>
+
+<h2 id="start">start</h2>
+<pre class="devsite-terminal devsite-click-to-copy">repo start <var>&lt;BRANCH_NAME&gt;</var> [<var>&lt;PROJECT_LIST&gt;</var>]
+</pre>
+<p>从清单中指定的修订版本开始,创建一个新的分支进行开发。</p>
+<p><code>&lt;BRANCH_NAME&gt;</code> 参数应简要说明您尝试对项目进行的更改。如果您不知道,则不妨考虑使用默认名称。</p>
+<p><code>&lt;PROJECT_LIST&gt;</code> 指定了将参与此主题分支的项目。</p>
+<p class="note"><strong>注意</strong>:“.”是一个非常实用的简写形式,用来代表当前工作目录中的项目。</p>
+
+<h2 id="status">status</h2>
+<pre class="devsite-terminal devsite-click-to-copy">
+repo status [<var>&lt;PROJECT_LIST&gt;</var>]
+</pre>
+<p>对于每个指定的项目,将工作树与临时区域(索引)以及此分支 (HEAD) 上的最近一次提交进行比较。在这三种状态存在差异之处显示每个文件的摘要行。</p>
+<p>要仅查看当前分支的状态,请运行 <code>repo status</code>。系统会按项目列出状态信息。对于项目中的每个文件,系统使用两个字母的代码来表示:</p>
+<p>在第一列中,大写字母表示临时区域与上次提交状态之间的不同之处。</p>
+<table>
+<thead>
+<tr>
+<th>字母</th>
+<th>含义</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>-</td>
+<td>无更改</td>
+<td>HEAD 与索引中相同</td>
+</tr>
+<tr>
+<td>A</td>
+<td>已添加</td>
+<td>不存在于 HEAD 中,但存在于索引中</td>
+</tr>
+<tr>
+<td>M</td>
+<td>已修改</td>
+<td>存在于 HEAD 中,但索引中的文件已修改</td>
+</tr>
+<tr>
+<td>D</td>
+<td>已删除</td>
+<td>存在于 HEAD 中,但不存在于索引中</td>
+</tr>
+<tr>
+<td>R</td>
+<td>已重命名</td>
+<td>不存在于 HEAD 中,但索引中的文件的路径已更改</td>
+</tr>
+<tr>
+<td>C</td>
+<td>已复制</td>
+<td>不存在于 HEAD 中,已从索引中的另一个文件复制</td>
+</tr>
+<tr>
+<td>T</td>
+<td>模式已更改</td>
+<td>HEAD 与索引中的内容相同,但模式已更改</td>
+</tr>
+<tr>
+<td>U</td>
+<td>未合并</td>
+<td>HEAD 与索引之间存在冲突;需要解决方案</td>
+</tr>
+</tbody>
+</table>
+<p>在第二列中,小写字母表示工作目录与索引之间的不同之处。</p>
+<table>
+<thead>
+<tr>
+<th>字母</th>
+<th>含义</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>-</td>
+<td>新/未知</td>
+<td>不存在于索引中,但存在于工作树中</td>
+</tr>
+<tr>
+<td>m</td>
+<td>已修改</td>
+<td>存在于索引中,也存在于工作树中(但已修改)</td>
+</tr>
+<tr>
+<td>d</td>
+<td>已删除</td>
+<td>存在于索引中,不存在于工作树中</td>
+</tr>
+</tbody>
+</table>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/view-patches.html b/zh-cn/setup/view-patches.html
new file mode 100644
index 0000000..26e430a
--- /dev/null
+++ b/zh-cn/setup/view-patches.html
@@ -0,0 +1,90 @@
+<html devsite><head>
+    <title>查看补丁程序</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>
+如果您要查看 Android 开源项目的所有补丁程序,或者要查看或验证某项更改,请参阅 <a href="https://www.google.com/url?sa=D&q=https%3A%2F%2Fandroid-review.googlesource.com%2F%23%2Fq%2Fstatus%3Aopen%2BOR%2Bstatus%3Aclosed">AOSP Gerrit</a>。要详细了解如何查找某项具体的更改,请参阅 <a href="https://gerrit-review.googlesource.com/Documentation/user-search.html">Gerrit 代码审核 - 搜索更改</a>。
+    </p>
+
+    <h2 id="reviewing-a-change">审核更改</h2>
+
+      <p>
+如果您被指定为某项更改的审核者,则需要确定以下几点:<em></em></p>
+
+      <ul>
+        <li>这项更改是否符合此项目的既定目的?</li>
+        <li>这项更改在项目的现有架构中是否有效?
+        </li>
+        <li>这项更改是否会引入会在将来造成问题的设计缺陷?</li>
+        <li>这项更改是否遵循了针对此项目制定的最佳做法?</li>
+        <li>这项更改是否是执行所述功能的绝佳方式?</li>
+        <li>这项更改是否会带来任何安全风险或不稳定性方面的风险?</li>
+      </ul>
+
+      <p>如果您要批准这项更改,请在 Gerrit 中将其标记为 LGTM(“看起来不错”)。
+      </p>
+
+    <h2 id="verifying-a-change">验证更改</h2>
+
+      <p>
+如果您被指定为某项更改的验证者,则需要执行以下工作:<em></em></p>
+
+      <ul>
+        <li>使用其中一种下载命令将更改以补丁程序的形式添加到自己的本地客户端。</li>
+        <li>编译并测试更改内容。</li>
+        <li>在 Gerrit 中选择 <strong>Reply</strong>(回复)按钮。系统会打开一个注释框,您可以选择是否在此框中将更改标记为“Verified”(已验证),并添加一条消息说明发现了哪些问题。<em></em></li>
+      </ul>
+
+    <h2 id="downloading-changes-from-gerrit">从 Gerrit 下载更改内容</h2>
+
+      <p>
+已验证并合并的提交内容将在下一次运行 <code>repo sync</code> 时下载。如果您想下载尚未获得批准的特定更改,请运行以下命令:
+      </p>
+
+      <pre class="devsite-terminal devsite-click-to-copy">
+repo download <var>TARGET CHANGE</var></pre>
+
+      <p>其中 <code><var>TARGET</var></code> 是更改应该下载到的本地目录,<code><var>CHANGE</var></code> 是 Gerrit 中列出的更改编号。如需了解详细信息,请参阅 <a href="/setup/using-repo.html">Repo 参考资料</a>。
+      </p>
+
+    <h2 id="how-do-i-become-a-verifier-or-reviewer">如何成为验证者或审核者?</h2>
+
+      <p>简言之,为一个或多个 Android 项目贡献高质量代码。要详细了解 Android 开源社区中的不同角色以及谁在担任这些角色,请参阅<a href="/setup/roles.html">项目角色</a>。
+      </p>
+
+    <h2 id="diffs-and-comments">差异和注释</h2>
+
+      <p>
+要在 Gerrit 中打开某项更改的详细信息,请点击这项更改的“Id number”(ID 号)或“Subject”(主题)。<em></em><em></em>要比较原有代码与更新后的代码,请点击“Side-by-side diffs”(并排显示差异)下的文件名。<em></em>
+      </p>
+
+    <h2 id="adding-comments">添加注释</h2>
+
+      <p>社区中的任何人都可以使用 Gerrit 为提交的代码添加代码内注释。如果注释内容与 Gerrit 中其所依附的代码行或代码段相关,那就是一条好注释。注释可能是关于如何改进一行代码的简短而有建设性的建议,也可能是作者对于为什么这样编写代码的解释。
+      </p>
+
+      <p>要添加代码内注释,请双击代码的相关行,然后在打开的文本框中编写注释。点击“<strong>Save</strong>”(保存)后,只有您可以看到自己的注释。
+      </p>
+
+      <p>要发布注释以便让其他使用 Gerrit 的人可以看到,请点击“Publish Comments”(发布注释)按钮。您的注释将通过电子邮件发送给这项更改的所有相关方,包括更改的所有者、补丁程序集上传者(如果与所有者不同)以及所有当前审核者。
+      </p>
+
+</body></html>
\ No newline at end of file