Docs: Changes to source.android.com

  - 220816688 Devsite localized content from translation request 1008214. by Android Partner Docs <[email protected]>
  - 220816664 Devsite localized content from translation request 1013270. by Android Partner Docs <[email protected]>
  - 220816636 Devsite localized content from translation request 1013272. by Android Partner Docs <[email protected]>
  - 220816628 Devsite localized content from translation request 1014969. by Android Partner Docs <[email protected]>
  - 220815612 Fix CVE reference for CVE-2017-1000112 by Android Partner Docs <[email protected]>
  - 220713007 Edit text, distinguish between simple and complex setup, ... by Clay Murphy <[email protected]>
  - 220702656 Document default Java getService behavior. by Android Partner Docs <[email protected]>
  - 220485453 Update docs for ODM manifest overriding vendor manifest. by Android Partner Docs <[email protected]>
  - 220485175 Devsite localized content from translation request 1012616. by Android Partner Docs <[email protected]>
  - 220485126 Devsite localized content from translation request 964305. by Android Partner Docs <[email protected]>
  - 220485102 Devsite localized content from translation request 1009438. by Android Partner Docs <[email protected]>
  - 220485097 Devsite localized content from translation request 1012331. by Android Partner Docs <[email protected]>
  - 220346894 Adding GSI details for app developers and device complian... by Heidi von Markham <[email protected]>
  - 220346865 Updated the Index.yaml file by Android Partner Docs <[email protected]>
  - 220316234 Adding AOSP links to 2018-11-01.html by Android Partner Docs <[email protected]>
  - 220310886 Fix broken link on advisory page by Danielle Roberts <[email protected]>
  - 220291759 Devsite localized content from translation request 997229. by Android Partner Docs <[email protected]>
  - 220291718 Devsite localized content from translation request 1009639. by Android Partner Docs <[email protected]>
  - 220291707 Devsite localized content from translation request 1010359. by Android Partner Docs <[email protected]>
  - 220289357 Add tags for OPM7.181105.004 (angler/bullhead), OPM8.1811... by Android Partner Docs <[email protected]>
  - 220197576 Update WFoV assembly box to 2.7 by Kenneth Lau <[email protected]>
  - 220193030 Change Input overview title by Danielle Roberts <[email protected]>
  - 220174571 Updated HTC components table by Android Partner Docs <[email protected]>
  - 220124279 November 2018 bulletins by Danielle Roberts <[email protected]>
  - 220118829 Devsite localized content from translation request 1012605. by Android Partner Docs <[email protected]>
  - 219944386 Update ASHA CoC spec. based on feedback from Oticon and i... by Android Partner Docs <[email protected]>
  - 219852814 Mention Soong on home page by Clay Murphy <[email protected]>
  - 219843976 Devsite localized content from translation request 1007156. by Android Partner Docs <[email protected]>
  - 219827948 Fix some html style issue. by Android Partner Docs <[email protected]>
  - 219823685 Devsite localized content from translation request 1001117. by Android Partner Docs <[email protected]>
  - 219738856 Fix reference to Soong introduction in Android version by Clay Murphy <[email protected]>
  - 219733022 Add a bullentin column to release numbers by Android Partner Docs <[email protected]>
  - 219707540 Move testing docs from AOSP to SAC proper by Clay Murphy <[email protected]>
  - 219701714 Devsite localized content from translation request 1010885. by Android Partner Docs <[email protected]>
  - 219675967 Hello, this changelist shows a new page called 'Codelab a... by Android Partner Docs <[email protected]>
  - 219615108 Added note that OTA clients must notify DPCs about OTA st... by Android Partner Docs <[email protected]>
  - 219525544 Fixed the Trusty API Reference link from by Android Partner Docs <[email protected]>
  - 219491359 Devsite localized content from translation request 1008378. by Android Partner Docs <[email protected]>
  - 219351557 Fix links to manifest-format.md by Android Partner Docs <[email protected]>
  - 219338673 Update documentation for file-based encryption by Android Partner Docs <[email protected]>
  - 219306017 Devsite localized content from translation request 1010762. by Android Partner Docs <[email protected]>
  - 219306010 Devsite localized content from translation request 1007340. by Android Partner Docs <[email protected]>
  - 219305976 Devsite localized content from translation request 1010760. by Android Partner Docs <[email protected]>
  - 219305971 Devsite localized content from translation request 1007769. by Android Partner Docs <[email protected]>
  - 219305969 Devsite localized content from translation request 1001106. by Android Partner Docs <[email protected]>
  - 219163709 Update our Android Severity webpage to clarify that Insta... by Android Partner Docs <[email protected]>
  - 219161004 Devsite localized content from translation request 1009631. by Android Partner Docs <[email protected]>
  - 219160993 Devsite localized content from translation request 1009414. by Android Partner Docs <[email protected]>
  - 219160986 Devsite localized content from translation request 980845. by Android Partner Docs <[email protected]>
  - 218920762 Change examples from /data/misc/media* to /data/misc/audi... by Christina Nguyen <[email protected]>
  - 218917538 Update the description of fastboot to the correct behavior. by Christina Nguyen <[email protected]>

PiperOrigin-RevId: 220816688
Change-Id: Ifd1ceca1330d6c1f951fa5d7b2da571c95cd212b
diff --git a/zh-cn/compatibility/cdd.html b/zh-cn/compatibility/cdd.html
index 2d7bab1..30f4e50 100644
--- a/zh-cn/compatibility/cdd.html
+++ b/zh-cn/compatibility/cdd.html
@@ -46,9 +46,9 @@
   </tr>
   <tr>
     <td>9</td>
-    <td><a href="9.0/android-9.0-cdd.pdf">android-9.0-cdd.pdf</a></td>
-    <td><a href="9.0/android-9.0-cdd.html">android-9.0-cdd.html</a></td>
-    <td><a href="9.0/versions.html">9.0 版</a></td>
+    <td><a href="9/android-9-cdd.pdf">android-9-cdd.pdf</a></td>
+    <td><a href="9/android-9-cdd.html">android-9-cdd.html</a></td>
+    <td><a href="9/versions.html">9 版</a></td>
   </tr>
   <tr>
     <td>8.1</td>
diff --git a/zh-cn/compatibility/cts/audio-framework.html b/zh-cn/compatibility/cts/audio-framework.html
index 6b8f0ea..e65b0b0 100644
--- a/zh-cn/compatibility/cts/audio-framework.html
+++ b/zh-cn/compatibility/cts/audio-framework.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>这套新测试需要人为干预,并会用到一些外部硬件(包括<a href="#loopback_latency">回环插头</a>、<a href="#audio_frequency_speaker_test">USB 参照麦克风</a>和<a href="#audio_frequency_microphone_test">外部扬声器</a>。对于没有 3.5 毫米 (⅛") 耳机端口的设备,用户将能够跳过测试并将其标记为成功。有关详情,请参阅以下部分。</p>
+<p>这套新测试需要人为干预,并会用到一些外部硬件(包括<a href="#loopback_latency">回环插头</a>、<a href="#audio_frequency_speaker_test">USB 参照麦克风</a>和<a href="#audio_frequency_microphone_test">外部扬声器</a>)。对于没有 3.5 毫米 (⅛") 耳机端口的设备,用户将能够跳过测试并将其标记为成功。有关详情,请参阅以下部分。</p>
 
 <h2 id="loopback_latency">回环插头延迟测试</h2>
 
@@ -127,7 +127,7 @@
 
 <p>参照麦克风是指频响平缓、自然的麦克风。它们通常用于分析和测量设备。</p>
 
-<p>市面上有一些便宜的 USB 参照麦克风(例如,<a href="https://minidsp.com/products/acoustic-measurement/umik-1">miniDSP USB 测量校准麦克风</a>、<a href="http://www.daytonaudio.com/index.php/umm-6-usb-measurement-microphone.html">Dayton 音频 UMM-6 USB 测量麦克风</a>),主要供家庭影院爱好者用来校准其设置。</p>
+<p>市面上有一些便宜的 USB 参照麦克风(例如,<a href="https://minidsp.com/products/acoustic-measurement/umik-1">miniDSP USB 测量校准麦克风</a>、<a href="http://www.daytonaudio.com/index.php/umm-6-usb-measurement-microphone.html">Dayton 音频 UMM-6 USB 测量麦克风</a>),主要供家庭影院爱好者校准其设置。</p>
 
 <p>推荐的最低参照麦克风特征:<br />介于 100 Hz - 20 kHz 之间的平缓频率响应:+/- 2 dB<br />信噪比为 70 dB(A 加权)<br />频率为 1000 Hz,声压级为 127 dB 时,总谐波畸变率小于 1%</p><p>
 
diff --git a/zh-cn/compatibility/cts/camera-wfov-box-assembly.html b/zh-cn/compatibility/cts/camera-wfov-box-assembly.html
index 891c2c1..0c56bb6 100644
--- a/zh-cn/compatibility/cts/camera-wfov-box-assembly.html
+++ b/zh-cn/compatibility/cts/camera-wfov-box-assembly.html
@@ -24,7 +24,7 @@
 <p>Android 9 引入了盒装 ITS 修订版 2,它是相机图像测试套件 (ITS) 中的一种自动测试系统,适用于宽视野 (WFoV) 和常规视野 (RFoV) 相机系统。修订版 1 旨在测试 FoV 小于 90 度 (RFoV) 的移动设备相机。修订版 2 还可用于测试 FoV 大于 90 度 (WFoV) 的相机,这样,您便能够使用一个盒装 ITS 系统测试 FoV 各不相同的不同相机。</p>
 
 <p>盒装 ITS 系统由一个根据计算机辅助设计 (CAD) 图纸激光切割而成的塑料盒、一个内部照明系统、一台图表平板电脑和一部被测设备 (DUT) 组成。您可以购买盒装 ITS,也可以自行构建。</p>
-<aside class="note"><strong>注意</strong>:<span>要详细了解如何构建盒装 ITS 修订版 1(仅适用于 RFoV 相机),请参阅<a href="/compatibility/cts/camera-its-box-assembly">组装盒装 ITS</a>。</span></aside>
+<aside class="note"><strong>注意:</strong><span>要详细了解如何构建盒装 ITS 修订版 1(仅适用于 RFoV 相机),请参阅<a href="/compatibility/cts/camera-its-box-assembly">组装盒装 ITS</a>。</span></aside>
 <h2 id="purchasing_a_wfov_its-in-a-box">购买 WFoV 盒装 ITS</h2>
 
 <p>建议您通过以下任一合格的供应商购买 WFoV 盒装 ITS。</p>
diff --git a/zh-cn/compatibility/cts/downloads.html b/zh-cn/compatibility/cts/downloads.html
index 77ee96c..ffcff01 100644
--- a/zh-cn/compatibility/cts/downloads.html
+++ b/zh-cn/compatibility/cts/downloads.html
@@ -23,59 +23,59 @@
 <p>感谢您对 Android 兼容性计划的关注!您可以通过以下链接访问关于该计划的重要文档和信息。随着 CTS 的更新,此网页上会陆续添加新的版本。CTS 版本在链接名称中由 R&lt;数字&gt; 表示。</p>
 
 <h2 id="android-90">Android 9</h2>
-<p>Android 9 是代号为 P 的开发里程碑版本。以下测试(包括针对免安装应用的测试)的源代码可以与开源代码树中的“android-cts-9.0_r1”标记同步。</p>
+<p>Android 9 是代号为 P 的开发里程碑版本。以下测试(包括针对免安装应用的测试)的源代码可以与开源代码树中的“android-cts-9.0_r2”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-9.0_r1-linux_x86-arm.zip">Android 9.0 R1 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-9.0_r1-linux_x86-x86.zip">Android 9.0 R1 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-9.0_r1-linux_x86-arm.zip">Android 9.0 R1 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-9.0_r1-linux_x86-x86.zip">Android 9.0 R1 CTS 验证程序 - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts_instant-9.0_r1-linux_x86-arm.zip">Android 9.0 R1 CTS(适用于免安装应用)- ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts_instant-9.0_r1-linux_x86-x86.zip">Android 9.0 R1 CTS(适用于免安装应用)- x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-9.0_r2-linux_x86-arm.zip">Android 9.0 R2 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-9.0_r2-linux_x86-x86.zip">Android 9.0 R2 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-9.0_r2-linux_x86-arm.zip">Android 9.0 R2 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-9.0_r2-linux_x86-x86.zip">Android 9.0 R2 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts_instant-9.0_r2-linux_x86-arm.zip">Android 9.0 R2 CTS(适用于免安装应用)- ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts_instant-9.0_r2-linux_x86-x86.zip">Android 9.0 R2 CTS(适用于免安装应用)- x86</a></li>
 </ul>
 
 <h2 id="android-81">Android 8.1</h2>
-<p>Android 8.1 是代号为 Oreo-MR1 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-8.1_r7”标记同步。</p>
+<p>Android 8.1 是代号为 Oreo-MR1 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-8.1_r9”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r7-linux_x86-arm.zip">Android 8.1 R7 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r7-linux_x86-x86.zip">Android 8.1 R7 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r7-linux_x86-arm.zip">Android 8.1 R7 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r7-linux_x86-x86.zip">Android 8.1 R7 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r9-linux_x86-arm.zip">Android 8.1 R9 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r9-linux_x86-x86.zip">Android 8.1 R9 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r9-linux_x86-arm.zip">Android 8.1 R9 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r9-linux_x86-x86.zip">Android 8.1 R9 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-80">Android 8.0</h2>
-<p>Android 8.0 是代号为 Oreo 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-8.0_r11”标记同步。</p>
+<p>Android 8.0 是代号为 Oreo 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-8.0_r13”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r11-linux_x86-arm.zip">Android 8.0 R11 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r11-linux_x86-x86.zip">Android 8.0 R11 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r11-linux_x86-arm.zip">Android 8.0 R11 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r11-linux_x86-x86.zip">Android 8.0 R11 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r13-linux_x86-arm.zip">Android 8.0 R13 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r13-linux_x86-x86.zip">Android 8.0 R13 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r13-linux_x86-arm.zip">Android 8.0 R13 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r13-linux_x86-x86.zip">Android 8.0 R13 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-71">Android 7.1</h2>
-<p>Android 7.1 是代号为 Nougat-MR1 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-7.1_r19”标记同步。</p>
+<p>Android 7.1 是代号为 Nougat-MR1 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-7.1_r21”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r19-linux_x86-arm.zip">Android 7.1 R19 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r19-linux_x86-x86.zip">Android 7.1 R19 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r19-linux_x86-arm.zip">Android 7.1 R19 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r19-linux_x86-x86.zip">Android 7.1 R19 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r21-linux_x86-arm.zip">Android 7.1 R21 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r21-linux_x86-x86.zip">Android 7.1 R21 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r21-linux_x86-arm.zip">Android 7.1 R21 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r21-linux_x86-x86.zip">Android 7.1 R21 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-70">Android 7.0</h2>
-<p>Android 7.0 是代号为 Nougat 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-7.0_r23”标记同步。</p>
+<p>Android 7.0 是代号为 Nougat 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-7.0_r25”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r23-linux_x86-arm.zip">Android 7.0 R23 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r23-linux_x86-x86.zip">Android 7.0 R23 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r23-linux_x86-arm.zip">Android 7.0 R23 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r23-linux_x86-x86.zip">Android 7.0 R23 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r25-linux_x86-arm.zip">Android 7.0 R25 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r25-linux_x86-x86.zip">Android 7.0 R25 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r25-linux_x86-arm.zip">Android 7.0 R25 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r25-linux_x86-x86.zip">Android 7.0 R25 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-60">Android 6.0</h2>
-<p>Android 6.0 是代号为 Marshmallow 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-6.0_r30”标记同步。</p>
+<p>Android 6.0 是代号为 Marshmallow 的开发里程碑版本。以下测试的源代码可以与开源代码树中的“android-cts-6.0_r32”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r30-linux_x86-arm.zip">Android 6.0 R30 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r30-linux_x86-x86.zip">Android 6.0 R30 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r30-linux_x86-arm.zip">Android 6.0 R30 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r30-linux_x86-x86.zip">Android 6.0 R30 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r32-linux_x86-arm.zip">Android 6.0 R32 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r32-linux_x86-x86.zip">Android 6.0 R32 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r32-linux_x86-arm.zip">Android 6.0 R32 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r32-linux_x86-x86.zip">Android 6.0 R32 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-51">Android 5.1</h2>
diff --git a/zh-cn/compatibility/cts/interpret.html b/zh-cn/compatibility/cts/interpret.html
index 56e23f4..fc68b75 100644
--- a/zh-cn/compatibility/cts/interpret.html
+++ b/zh-cn/compatibility/cts/interpret.html
@@ -29,7 +29,7 @@
 
 <p>在 zip 压缩包中,testResult.xml 文件会包含实际的结果。在任何网络浏览器(推荐使用与 HTML 5 技术兼容的浏览器)中打开此文件,即可查看测试结果。</p>
 
-<p>使用 Chrome 浏览器时,如果 testResult.xml 显示空白页,请<a href="https://www.chromium.org/developers/how-tos/run-chromium-with-flags">更改浏览器配置</a>以启用 --allow-file-access-from-files<em></em> 命令行标记。</p>
+<p>使用 Chrome 浏览器时,如果 testResult.xml 显示空白页,请<a href="https://www.chromium.org/developers/how-tos/run-chromium-with-flags">更改浏览器配置</a>,以启用 --allow-file-access-from-files 命令行标记。<em></em></p>
 
 <h3 id="reading-the-test-results">阅读测试结果</h3>
 
diff --git a/zh-cn/compatibility/cts/run.html b/zh-cn/compatibility/cts/run.html
index 5af1293..e055437 100644
--- a/zh-cn/compatibility/cts/run.html
+++ b/zh-cn/compatibility/cts/run.html
@@ -28,7 +28,7 @@
   <li>至少连接一个设备。
   </li><li>在开始运行 CTS 时,按<strong>主屏幕</strong>按钮将设备设置为显示主屏幕。</li><li>当设备在运行测试时,它不能用于执行任何其他任务,并且必须保持静止状态(以免触发传感器活动),同时要让相机指向某个可以聚焦的对象。
   </li><li>在运行 CTS 时,不要按设备上的任何键。按测试设备上的键或触摸其屏幕会干扰正在运行的测试,并且可能导致测试失败。
-  </li><li>通过运行解压缩 CTS 包所得文件夹中的 cts-tradefed<em></em> 脚本(例如 <code>$ ./android-cts/tools/cts-tradefed</code>)来启动 CTS 控制台
+  </li><li><em></em>通过运行解压缩 CTS 包所得文件夹中的 cts-tradefed 脚本(例如 <code>$ ./android-cts/tools/cts-tradefed</code>)启动 CTS 控制台。
   </li><li>通过附加以下命令启动默认测试计划(包含所有测试包):<code>run
     cts --plan CTS</code>。这将启动测试兼容性所需的所有 CTS 测试。
       <ul>
@@ -36,10 +36,10 @@
         </li><li>对于 CTS v2(Android 7.0 及更高版本),您可以输入 <code>list modules</code> 来查看测试模块的列表。
       </li></ul>
   </li>
-  <li>或者,您也可以使用以下命令,从命令行中运行所选择的 CTS 计划:<code>cts-tradefed run cts --plan
+  <li>或者,您也可以使用以下命令,从命令行中运行所选的 CTS 计划:<code>cts-tradefed run cts --plan
       <plan_name>
       </plan_name></code>
-<p class="note"><strong>注意</strong>:我们建议仅在运行 Android 6.0 (Marshmallow) CTS 时,使用 <code>--skip-preconditions</code> 选项跳过可能会在执行 CTS 测试时导致问题且存在前提条件的实验性功能。</p>
+<p class="note"><strong>注意:</strong>我们建议仅在运行 Android 6.0 (Marshmallow) CTS 时,使用 <code>--skip-preconditions</code> 选项跳过可能会在执行 CTS 测试时导致问题且存在前提条件的实验性功能。</p>
   </li><li>查看控制台中报告的测试进度和结果。
   </li><li>如果您的设备运行的是 Android 5.0 或更高版本,并且声明支持 ARM 和 x86 ABI,则应运行 ARM 和 x86 CTS 包。
 </li></ol>
@@ -240,7 +240,7 @@
     </tr>
     <tr>
       <td><code>run retry</code></td>
-      <td><p><strong>对于 Android 9</strong>:重新尝试运行在以前的会话中失败或未执行的所有测试。例如,包含 TF 分片的 <code>run retry --retry <session id> -s<device serial></device></session></code> 或 <code>run retry --retry <session id> --shard-count</session></code>。</p>
+      <td><p><strong>对于 Android 9</strong>:重新尝试运行在以前的会话中失败或未执行的所有测试。例如,<code>run retry --retry <session id> -s<device serial></device></session></code>,或包含 TF 分片的 <code>run retry --retry <session id> --shard-count</session></code>。</p>
         <p>Android 9 不允许使用 <code>run cts --retry</code>。</p></td>
     </tr>
     <tr>
@@ -258,7 +258,7 @@
     </tr>
     <tr>
       <td><code>-- module/-m &lt;test_module_name&gt; -- test &lt;test_name&gt; </code></td>
-      <td>运行指定的模块并进行测试。例如,<code>run cts -m Gesture --test android.gesture.cts.GestureTest#testGetStrokes</code> 会运行指定的包、类或测试。</td>
+      <td>运行指定的模块和测试。例如,<code>run cts -m Gesture --test android.gesture.cts.。GestureTest#testGetStrokes</code> 会运行指定的包、类或测试。</td>
     </tr>
     <tr>
       <td><code>--retry</code></td>
diff --git a/zh-cn/compatibility/cts/secure-element.html b/zh-cn/compatibility/cts/secure-element.html
index 6f66d97..9875e19 100644
--- a/zh-cn/compatibility/cts/secure-element.html
+++ b/zh-cn/compatibility/cts/secure-element.html
@@ -24,77 +24,30 @@
 
 <h1 id="cts_test_for_secure_element" class="page-title">针对安全元件的 CTS 测试</h1>
 
-<p>为了提供更好的安全性,有些设备嵌入了安全元件 (SE),这是一种单独的防篡改硬件,专门用于存储加密数据。Open Mobile API 是一种<a href="https://globalplatform.org/specs-library/open-mobile-api-specification-v3-2/" class="external">标准 API</a>,用于与设备的安全元件进行通信。Android 9 支持该 API,并提供后端实现(包括安全元件服务和 SE HAL)。</p>
+<p>为了提供更好的安全性,有些设备嵌入了安全元件 (SE),这是一种单独的防篡改硬件,专门用于存储加密数据。Open Mobile API 是一种<a href="https://globalplatform.org/specs-library/open-mobile-api-specification-v3-2/" class="external">标准 API</a>,用于与设备的安全元件通信。Android 9 支持该 API,并提供后端实现(包括安全元件服务和 SE HAL)。</p>
 
 <p>安全元件服务负责检查设备是否支持全局平台支持的安全元件(实质上是检查设备是否具备 SE HAL 实现,如果具备,有多少),可用作测试该 API 和底层安全元件实现的基础。</p>
 
-<h2 id="terminology">术语</h2>
-
-<table>
-<thead>
-<tr>
-<th>术语</th>
-<th>定义</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>AID</td>
-<td>应用标识符</td>
-</tr>
-<tr>
-<td>APDU</td>
-<td>应用协议数据单元</td>
-</tr>
-<tr>
-<td>BER</td>
-<td>基本编码规则</td>
-</tr>
-<tr>
-<td>TLV</td>
-<td>标记长度值</td>
-</tr>
-<tr>
-<td>UICC</td>
-<td>UMTS 集成电路卡</td>
-</tr>
-<tr>
-<td>ARA</td>
-<td>访问规则应用(主)</td>
-</tr>
-<tr>
-<td>ARF</td>
-<td>访问规则文件</td>
-</tr>
-<tr>
-<td>小程序</td>
-<td>安全元件上的 Java Card 应用</td>
-</tr>
-</tbody>
-</table>
-
 <h2 id="open_mobile_api_test_cases">Open Mobile API 测试用例</h2>
 
-<p>Open Mobile API 测试用例用于贯彻 API 指南,以及确认安全元件的底层实现是否符合 Open Mobile API 规范。要使用这些测试用例,必须安装一个特殊小程序,以便 CTS 应用进行通信。要进行安装,请使用可在 <a href="https://android.googlesource.com/platform/cts/+/master/tests/tests/secure_element/sample_applet/src/com/android/cts/omapi/test/CtsAndroidOmapiTestApplet.java" class="external">CtsAndroidOmapiTestApplet.java</a> 和 <a href="https://android.googlesource.com/platform/cts/+/master/tests/tests/secure_element/sample_applet/test.cap" class="external">test.cap</a> 中找到的示例小程序。</p>
+<p>Open Mobile API (OMAPI) 测试用例用于贯彻 API 指南,以及确认安全元件的底层实现是否符合 Open Mobile API 规范。要使用这些测试用例,您必须安装一个特殊小程序(安全元件上的 Java Card 应用),以便 CTS 应用进行通信。要进行安装,请使用可在 <a href="https://android.googlesource.com/platform/cts/+/master/tests/tests/secure_element/sample_applet/uicc" class="external"><code>google-cardlet.cap</code></a> 中找到的示例小程序。</p>
 
 <p>要通过 OMAPI 测试用例的测试,底层安全元件服务和 SE 应符合以下条件:</p>
 
 <ol>
 <li>所有安全元件读取器名称都应以 SIM、eSE 或 SD 开头。</li>
-<li>不是基于 SIM 卡的读取器应能够打开基本频道。</li>
-<li><p><code>CtsOmapiTestCases.apk</code> 应能够选择具有以下 AID 的小程序:</p>
-  <ol>
-  <li><p>0xA000000476416E64726F696443545331</p>
+<li>非基于 SIM 卡的读取器应能够打开基本频道。</li>
+<li><code>CtsOmapiTestCases.apk</code> 应不能选择此 AID:A000000476416E64726F6964435453FF。</li>
+<li><code>CtsOmapiTestCases.apk</code> 应能够选择具有以下应用标识符 (AIDs) 的小程序:<ol>
+  <li>0xA000000476416E64726F696443545331
     <ol>
-      <li><p>当在 android.se.omapi.Channel.Transmit(以下简称 Transmit<em></em>)中收到以下 APDU 时,该小程序应抛出安全异常:</p>
-        <ol>
+      <li>当在 <code>android.se.omapi.Channel.Transmit</code> (Transmit<em></em>) 中收到以下应用协议数据单元 (APDU) 时,该小程序应引发安全异常:<ol>
           <li>0x00700000</li>
           <li>0x00708000</li>
           <li>0x00A40404104A535231373754657374657220312E30</li>
         </ol>
       </li>
-      <li><p>当在 Transmit<em></em> 中收到以下 APDU 时,该小程序不应返回任何数据:</p>
-        <ol>
+      <li>当在 Transmit<em></em> 中收到以下 APDU 时,该小程序不应返回任何数据:<ol>
           <li>0x00060000</li>
           <li>0x80060000</li>
           <li>0xA0060000</li>
@@ -105,8 +58,7 @@
           <li>0x940A000001AA</li>
         </ol>
       </li>
-      <li><p>对于以下 Transmit<em></em> APDU,该小程序应返回 256 个字节的数据:</p>
-        <ol>
+      <li>对于以下 Transmit<em></em> APDU,该小程序应返回 256 个字节的数据:<ol>
          <li>0x0008000000</li>
          <li>0x8008000000</li>
          <li>0xA008000000</li>
@@ -116,12 +68,11 @@
          <li>0xA00C000001AA00</li>
          <li>0x940C000001AA00</li>
        </ol>
-      </li><li><p>对于以下 Transmit<em></em> APDU,该小程序应返回对应的状态字响应:</p>
-        <table>
+      </li><li>对于以下各 Transmit<em></em> APDU,该小程序应返回相应的状态字词响应:<table>
         <thead>
         <tr>
         <th>Transmit APDU</th>
-        <th>状态字</th>
+        <th>状态字词</th>
         <th>数据</th>
         </tr>
         </thead>
@@ -448,49 +399,82 @@
         </tr>
         </tbody>
         </table>
-        <p class="note"><strong>注意</strong>:响应应包含与输入 APDU 相同的数据,不过第一个字节是 0x01,而非 0x00。</p>
+        <small>*响应应包含与输入 APDU 相同的数据,不过第一个字节是 0x01,而非 0x00。</small>
       </li>
-      <li><p>对于命令 a、b、c、d、f 和 g,该小程序应返回大小为 2048 个字节的分段响应;对于 APDU(e),应返回 32767 个字节的响应,并且最后一个数据字节为 0xFF;对于以下 APDU,应返回成功状态字 &lt;0x9000&gt;:<!--0x9000--></p>
-        <ol>
-         <li>0x00C2080000</li>
-         <li>0x00C4080002123400</li>
-         <li>0x00C6080000</li>
-         <li>0x00C8080002123400</li>
-         <li>0x00C27FFF00</li>
-         <li>0x00CF080000</li>
-         <li>0x94C2080000</li>
-       </ol>
+      <li>小程序应返回最后一个数据字节为 <code>0xFF</code> 的分段响应,并具有以下 APDU 的相应状态字词和响应长度。
+
+        <table>
+        <thead>
+        <tr>
+        <th>APDU</th>
+        <th>状态字词</th>
+        <th>响应长度(字节)</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr>
+        <td>0x00C2080000</td>
+        <td>0x9000</td>
+        <td>2048</td>
+        </tr>
+        <tr>
+        <td>0x00C4080002123400</td>
+        <td>0x9000</td>
+        <td>2048</td>
+        </tr>
+        <tr>
+        <td>0x00C6080000</td>
+        <td>0x9000</td>
+        <td>2048</td>
+        </tr>
+        <tr>
+        <td>0x00C8080002123400</td>
+        <td>0x9000</td>
+        <td>2048</td>
+        </tr>
+        <tr>
+        <td>0x00C27FFF00</td>
+        <td>0x9000</td>
+        <td>2048</td>
+        </tr>
+        <tr>
+        <td>0x00CF080000</td>
+        <td>0x9000</td>
+        <td>32767</td>
+        </tr>
+        <tr>
+        <td>0x94C2080000</td>
+        <td>0x9000</td>
+        <td>2048</td>
+        </tr>
+        </tbody>
+        </table>
       </li>
-      <li>对于以下指定 APDU,该小程序应返回成功状态字 &lt;0x9000&gt;:0x00F40000</li>
+      <li>对于以下指定的 APDU,该小程序应返回成功状态字词 <code>0x9000</code>:0x00F40000</li>
     </ol>
-  </li><li><p>A000000476416E64726F696443545332</p>
-    <ol>
-      <li><p>该 AID(如果已选择)应返回大于 2 个字节并采用正确的 BER TLV 格式的特定响应。</p></li>
+  </li><li>A000000476416E64726F696443545332<ol>
+      <li>选中后,该 AID 应返回一个多于 2 个字节并使用基本编码规则 (BER) 和标记长度值 (TLV) 进行正确格式化的特定响应。</li>
     </ol>
   </li>
 </ol>
-
-<p></p></li><li><p><code>CtsOmapiTestCases.apk</code> 应不能选择以下 AID:</p>
-  <ol>
-    <li>A000000476416E64726F6964435453FF</li>
-  </ol>
-</li>
-</ol><p></p>
+</li></ol>
 
 <h2 id="access_control_test_cases">访问控制测试用例</h2>
 
-<p>在安全元件中配置的访问控制用例有助于确保只有可以访问小程序的应用才能与小程序进行通信。此外,对于可通过 APK 进行交换的特定 APDU,Android 支持为其配置规则。要通过以下测试,设备制造商必须配置特殊的访问控制规则(ARA 或 ARF)。</p>
+<p>在安全元件中配置的访问控制用例有助于确保只有可以访问小程序的应用才能与小程序进行通信。此外,对于可通过 APK 进行交换的特定 APDU,Android 支持为其配置规则。</p>
 
-<p>建议使用进行 OMAPI 测试所用的同一个小程序(请参阅“Open Mobile API 测试用例”部分中介绍的小程序功能行为),因为必须支持相同的命令,才能通过访问控制测试。</p>
+<p>要通过这些测试,请配置特殊的访问控制规则,即访问规则应用 (ARA)(主)或访问规则文件 (ARF)。您应该使用进行<a href="#open_mobile_api_test_cases"> OMAPI 测试</a>所用的小程序,因为只有支持相同的命令,才能通过访问控制测试。</p>
 
-<p>您必须在以下每个 AID 下创建该小程序的实例:</p>
+<p>在以下 AID 下创建该小程序的实例:</p>
 
 <ul>
 <li>0xA000000476416E64726F696443545340</li>
 <li>0xA000000476416E64726F696443545341</li>
 <li>0xA000000476416E64726F696443545342</li>
+<li>0xA000000476416E64726F696443545343</li>
 <li>0xA000000476416E64726F696443545344</li>
 <li>0xA000000476416E64726F696443545345</li>
+<li>0xA000000476416E64726F696443545346</li>
 <li>0xA000000476416E64726F696443545347</li>
 <li>0xA000000476416E64726F696443545348</li>
 <li>0xA000000476416E64726F696443545349</li>
@@ -502,18 +486,23 @@
 <li>0xA000000476416E64726F69644354534F</li>
 </ul>
 
-<h3 id="1_ctssecureelementaccesscontroltestcases1">1. <code>CtsSecureElementAccessControlTestCases1</code></h3>
+<h3 id="ctssecureelementaccesscontroltestcases1"><code>CtsSecureElementAccessControlTestCases1</code></h3>
 
 <ul>
-<li>AKP 的哈希值:0x4bbe31beb2f753cfe71ec6bf112548687bb6c34e</li>
-<li><p>已授权 AID</p>
+<li><strong>APK 的哈希值</strong>:0x4bbe31beb2f753cfe71ec6bf112548687bb6c34e</li>
+<li><p><strong>已授权 AID</strong></p>
 
 <ul>
 <li><p>0xA000000476416E64726F696443545340</p>
 
 <ol>
-<li>以上 AID 的已授权 APDU:0x00060000A0060000</li>
-<li><p>以上 AID 的未授权 APDU:</p>
+<li><p>已授权 APDU:</p>
+
+<ol>
+<li>0x00060000</li>
+<li>0xA0060000</li>
+</ol></li>
+<li><p>未授权 APDU:</p>
 
 <ol>
 <li>0x0008000000</li>
@@ -525,7 +514,7 @@
 <li><p>0xA000000476416E64726F696443545341</p>
 
 <ol>
-<li><p>以上 AID 的已授权 APDU:</p>
+<li><p>已授权 APDU:</p>
 
 <ol>
 <li>0x94060000</li>
@@ -533,7 +522,7 @@
 <li>0x940C000001AA00</li>
 <li>0x940A000001AA</li>
 </ol></li>
-<li><p>以上 AID 的未授权 APDU:</p>
+<li><p>未授权 APDU:</p>
 
 <ol>
 <li>0x00060000</li>
@@ -563,7 +552,7 @@
 <li><p>0xA000000476416E64726F69644354534E</p></li>
 <li><p>0xA000000476416E64726F69644354534F</p></li>
 </ul></li>
-<li><p>未授权 AID:</p>
+<li><p><strong>未授权 AID:</strong></p>
 
 <ul>
 <li>0xA000000476416E64726F696443545343</li>
@@ -571,23 +560,23 @@
 </ul></li>
 </ul>
 
-<h3 id="2_ctssecureelementaccesscontroltestcases2">2. <code>CtsSecureElementAccessControlTestCases2</code></h3>
+<h3 id="ctssecureelementaccesscontroltestcases2"><code>CtsSecureElementAccessControlTestCases2</code></h3>
 
 <ul>
-<li>APK 的哈希值:0x93b0ff2260babd4c2a92c68aaa0039dc514d8a33</li>
-<li><p>已授权 AID:</p>
+<li><strong>APK 的哈希值</strong>:0x93b0ff2260babd4c2a92c68aaa0039dc514d8a33</li>
+<li><p><strong>已授权 AID:</strong></p>
 
 <ul>
 <li><p>0xA000000476416E64726F696443545340</p>
 
 <ol>
-<li><p>以上 AID 的已授权 APDU:</p>
+<li><p>已授权 APDU:</p>
 
 <ol>
 <li>0x00060000</li>
 <li>0xA0060000</li>
 </ol></li>
-<li><p>以上 AID 的未授权 APDU:</p>
+<li><p>未授权 APDU:</p>
 
 <ol>
 <li>0x0008000000</li>
@@ -599,7 +588,7 @@
 <li><p>0xA000000476416E64726F696443545341</p>
 
 <ol>
-<li><p>以上 AID 的已授权 APDU:</p>
+<li><p>已授权 APDU:</p>
 
 <ol>
 <li>0x94060000</li>
@@ -607,7 +596,7 @@
 <li>0x940C000001AA00</li>
 <li>0x940A000001AA</li>
 </ol></li>
-<li><p>以上 AID 的未授权 APDU:</p>
+<li><p>未授权 APDU:</p>
 
 <ol>
 <li>0x0006000</li>
@@ -628,13 +617,14 @@
 <li><p>0xA000000476416E64726F696443545345</p></li>
 <li><p>0xA000000476416E64726F696443545346</p></li>
 </ul></li>
-<li><p>未授权 AID:</p>
+<li><p><strong>未授权 AID:</strong></p>
 
 <ul>
 <li>0xA000000476416E64726F696443545342</li>
 <li>0xA000000476416E64726F696443545344</li>
 <li>0xA000000476416E64726F696443545347</li>
 <li>0xA000000476416E64726F696443545348</li>
+<li>0xA000000476416E64726F696443545349</li>
 <li>0xA000000476416E64726F69644354534A</li>
 <li>0xA000000476416E64726F69644354534B</li>
 <li>0xA000000476416E64726F69644354534C</li>
@@ -644,17 +634,17 @@
 </ul></li>
 </ul>
 
-<h3 id="3_ctssecureelementaccesscontroltestcases3">3. <code>CtsSecureElementAccessControlTestCases3</code></h3>
+<h3 id="ctssecureelementaccesscontroltestcases3"><code>CtsSecureElementAccessControlTestCases3</code></h3>
 
 <ul>
-<li>APK 的哈希值:0x5528ca826da49d0d7329f8117481ccb27b8833aa</li>
-<li><p>已授权 AID:</p>
+<li><strong>APK 的哈希值</strong>:0x5528ca826da49d0d7329f8117481ccb27b8833aa</li>
+<li><p><strong>已授权 AID:</strong></p>
 
 <ul>
 <li><p>0xA000000476416E64726F696443545340</p>
 
 <ol>
-<li><p>以上 AID 的已授权 APDU:</p>
+<li><p>已授权 APDU:</p>
 
 <ol>
 <li>0x00060000</li>
@@ -678,7 +668,7 @@
 <li><p>0xA000000476416E64726F696443545341</p>
 
 <ol>
-<li><p>以上 AID 的已授权 APDU:</p>
+<li><p>已授权 APDU:</p>
 
 <ol>
 <li>0x94060000</li>
@@ -686,7 +676,7 @@
 <li>0x940C000001AA00</li>
 <li>0x940A00000aAA</li>
 </ol></li>
-<li><p>以上 AID 的未授权 APDU:</p>
+<li><p>未授权 APDU:</p>
 
 <ol>
 <li>0x00060000</li>
@@ -706,7 +696,7 @@
 <li><p>0xA000000476416E64726F696443545345</p></li>
 <li><p>0xA000000476416E64726F696443545346</p></li>
 </ul></li>
-<li><p>未授权 AID:</p>
+<li><p><strong>未授权 AID:</strong></p>
 
 <ul>
 <li>0xA000000476416E64726F696443545342</li>
@@ -714,6 +704,7 @@
 <li>0xA000000476416E64726F696443545344</li>
 <li>0xA000000476416E64726F696443545347</li>
 <li>0xA000000476416E64726F696443545348</li>
+<li>0xA000000476416E64726F696443545349</li>
 <li>0xA000000476416E64726F69644354534A</li>
 <li>0xA000000476416E64726F69644354534B</li>
 <li>0xA000000476416E64726F69644354534C</li>
@@ -725,30 +716,31 @@
 
 <h2 id="appendix">附录</h2>
 
-<h3 id="sample_applet_and_installation_steps_for_uicc">UICC 的示例小程序和安装步骤</h3>
+<h3 id="sample_applet_and_installation_steps_for_umts_integrated_circuit_card_uicc">UMTS 集成电路卡 (UICC) 的示例小程序和安装步骤</h3>
 
-<h4 id="1_package_specification">1. 软件包规格</h4>
+<h4 id="1_package_specification">1.软件包规格</h4>
 
-<p>文件名:<code>google-cardlet.cap</code></p>
+<p><strong>文件名</strong>:<code>google-cardlet.cap</code></p>
 
-<p>软件包 AID:6F 6D 61 70 69 63 61 72 64 6C 65 74
-版本:1.0<br />
-SHA1:5F72E0A073BA9E61A7358F2FE3F031<br />
-SHA256:ECC1217AA0BC687DD89D5BB233F743</p>
+<p><strong>软件包 AID</strong>:6F 6D 61 70 69 63 61 72 64 6C 65 74<br />
+<strong>版本</strong>:1.63<br />
+<strong>哈希</strong>:5F72E0A073BA9E61A7358F2FE3F031A99F3F81E9</p>
 
-<p>模块 AID:<br />
-6F 6D 61 70 69 4A 53 52 31 37 37 = SelectResponse 模块
-6F 6D 61 70 69 43 61 63 68 69 6E 67 = XXLResponse 模块</p>
+<p><strong>小程序:</strong><br />
+6F 6D 61 70 69 4A 53 52 31 37 37 = SelectResponse 模块<br />6F 6D 61 70 69 43 61 63 68 69 6E 67 = XXLResponse 模块</p>
 
-<p>导入:<br />
+<p><strong>导入:</strong><br />
 javacard.framework v1.3 - A0000000620101<br />
-java.lang v1.0 - A0000000620001</p>
+java.lang v1.0 - A0000000620001<br />
+uicc.hci.framework v1.0 - A0000000090005FFFFFFFF8916010000<br />
+uicc.hci.services.cardemulation v1.0 - A0000000090005FFFFFFFF8916020100<br />
+uicc.hci.services.connectivity v1.0 - A0000000090005FFFFFFFF8916020200</p>
 
-<p>卡上尺寸:4463</p>
+<p><strong>卡上尺寸</strong>:39597</p>
 
-<h4 id="2_installation_steps">2. 安装步骤</h4>
+<h4 id="2_installation_steps">2.安装步骤</h4>
 
-<p>按照相应步骤(请咨询您的 SE 制造商)将 <code>google-cardlet.cap</code> 文件加载到 SIM 卡上。</p>
+<p>按照相应程序(请咨询您的 SE 制造商)将 <a href="https://android.googlesource.com/platform/cts/+/master/tests/tests/secure_element/sample_applet/uicc" class="external"><code>google-cardlet.cap</code></a> 文件加载到 SIM 卡上。</p>
 
 <p>为每个小程序运行安装命令。</p>
 
@@ -757,18 +749,19 @@
 <p>小程序安装命令</p>
 
 <p><code>80E60C00300C6F6D617069636172646C65740B<var>module_AID</var>10<var>AID</var>010002C90000</code><br />
-Module_AID =&gt; 6F 6D 61 70 69 4A 53 52 31 37 37
-AID:A000000476416E64726F696443545331
-<code>80E60C00310C6F6D617069636172646C65740B<var>module_AID</var>10<var>AID</var>010002C9000</code><br />
-Module_AID =&gt; 6F 6D 61 70 69 43 61 63 68 69 6E 67
-AID:A000000476416E64726F696443545332</p>
+<strong>Module_AID</strong>:6F 6D 61 70 69 4A 53 52 31 37 37<br />
+<strong>AID</strong>:A000000476416E64726F696443545331</p>
+
+<p><code>80E60C00310C6F6D617069636172646C65740B<var>module_AID</var>10<var>AID</var>010002C9000</code><br />
+<strong>Module_AID</strong>:6F 6D 61 70 69 43 61 63 68 69 6E 67<br />
+<strong>AID</strong>:A000000476416E64726F696443545332</p>
 
 <h5 id="accesscontrol_tests_template_using_pkcs15_structure">AccessControl 测试(使用 PKCS#15 结构的模板)</h5>
 
 <p><code>80E60C003C0C6F6D617069636172646C65740B<var>module_AID</var>10<var>AID</var>01000EEF0AA008810101A5038201C0C90000</code><br />
-Module_AID =&gt; 6F 6D 61 70 69 4A 53 52 31 37 37</p>
+<strong>Module_AID</strong>:6F 6D 61 70 69 4A 53 52 31 37 37</p>
 
-<p>AID:</p>
+<p><strong>AID:</strong></p>
 
 <ul>
 <li>0xA000000476416E64726F696443545340</li>
@@ -787,6 +780,6 @@
 <li>0xA000000476416E64726F69644354534F</li>
 </ul>
 
-<p>如需用于设置与 CTS 测试匹配的 PKCS#15 结构的分步命令,请参阅<a href="/compatibility/cts/images/commands-for-pkcs15.pdf">针对 PKCS#15 的命令</a>。</p>
+<p>如需用于设置与 CTS 测试匹配的 PKCS#15 结构的分步命令,请参阅<a href="/compatibility/cts/pkcs15-commands.txt">针对 PKCS#15 的命令</a>。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/compatibility/cts/sensor-fusion-box-assembly.html b/zh-cn/compatibility/cts/sensor-fusion-box-assembly.html
index c9f36b6..0a5876c 100644
--- a/zh-cn/compatibility/cts/sensor-fusion-box-assembly.html
+++ b/zh-cn/compatibility/cts/sensor-fusion-box-assembly.html
@@ -32,21 +32,21 @@
 <li><em>Acu Spec, Inc.</em><br />
 990 Richard Ave, Ste 103, Santa Clara, CA 95050<br />
 [email protected]  </li>
-<li><em>MYWAY DESIGN</em><br />
-网站:http://www.myway.tw/<br />
-Fu-ming (Troy) Tsai,[email protected]</li>
+<li><em>MYWAY, Inc</em><br />
+台湾新北市福营路 163 号 4 楼<br />
[email protected]</li>
 </ul>
 
 <h2 id="building_a_sensor_fusion_box">制作传感器融合盒</h2>
 
 <p>这一部分逐步介绍了如何使用激光切割的塑料组件来组装传感器融合盒(如图 1 所示):</p>
 
-<p><img src="images/sensor_fusion_assembly_box_cad_drawing.png" width="700" alt="传感器融合盒组件的 CAD 图纸"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_box_cad_drawing.png" width="700" alt="传感器融合盒组件的 CAD 图纸"/><br />
 <strong>图 1.</strong> 传感器融合盒组件的 CAD 图纸</p>
 
 <h3 id="required_tools">所需工具</h3>
 
-<p>开始之前,请先确保您已下载传感器融合盒的技术图纸(包含在 <a href="sensor_fusion_box_1.3.zip">Sensor Fusion Box 1.3.zip 文件</a>中),并准备好以下工具:</p>
+<p>开始之前,请先确保您已下载传感器融合盒的技术图纸(包含在 <a href="/compatibility/cts/sensor_fusion_1.4.zip">Sensor Fusion Box zip 文件</a>中),并准备好以下工具:</p>
 
 <ul>
 <li>十字头螺丝刀</li>
@@ -60,10 +60,10 @@
 <p>使用激光切割机制作好塑料组件后,您可以为塑料盒组件贴上乙烯基贴纸:</p>
 
 <ol>
-<li>将乙烯基贴纸贴在 ABS(丙烯脯二乙烯丁二烯树脂)组件的光滑面上(如<strong>图 2</strong> 所示)。如需关于如何贴乙烯基贴纸的实用提示,请参阅 <a href="https://www.wikihow.com/Install-a-Vinyl-Graphic">wikiHow</a>。</li>
+<li>将乙烯基贴纸贴在 ABS(丙烯脯二乙烯丁二烯树脂)组件的光滑面上(如<strong>图 2</strong> 所示)。如需关于如何贴乙烯基贴纸的实用提示,请参阅 <a href="https://www.wikihow.com/Install-a-Vinyl-Graphic" class="external">wikiHow</a>。</li>
 <li><p>在乙烯基贴纸上裁出必要的孔。</p>
 
-<p><img src="images/sensor_fusion_assembly_abs_pieces.png" width="350" alt="BS 件"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_abs_pieces.png" width="350" alt="BS 件"/><br />
 <strong>图 2.</strong> 光滑面上贴好乙烯基贴纸的 ABS 组件(盒内部)</p></li>
 </ol>
 
@@ -75,21 +75,21 @@
 <li><p>在手机夹上攻出 3 个 ¼" - 20 螺纹孔,并在手机夹背面制作埋头孔:
 <table class="columns">
   <tbody><tr>
-    <td><img src="images/sensor_fusion_assembly_phone_fixture_holes1.png" width="250" alt="手机夹螺纹孔"/></td>
-    <td><img src="images/sensor_fusion_assembly_phone_fixture_holes2.png" width="250" alt="手机夹埋头孔"/></td>
+    <td><img src="/compatibility/cts/images/sensor_fusion_assembly_phone_fixture_holes1.png" width="250" alt="手机夹螺纹孔"/></td>
+    <td><img src="/compatibility/cts/images/sensor_fusion_assembly_phone_fixture_holes2.png" width="250" alt="手机夹埋头孔"/></td>
   </tr>
 </tbody></table>
 <strong>图 3.</strong> 显示螺纹孔和埋头孔的手机夹</p></li>
 <li><p>在伺服器附带的较大轴上,用 43 号钻头(2.26 毫米)从两侧最靠边的孔中分别钻出一个定位孔,以便用 4-40 螺钉进行固定:</p>
 
-<p><img src="images/sensor_fusion_assembly_servo_shaft.png" width="350" alt="伺服器轴"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_servo_shaft.png" width="350" alt="伺服器轴"/><br />
 <strong>图 4.</strong> 两端带有定位孔的伺服器轴</p></li>
 <li><p>用 4-40 平头螺钉将轴紧固到手机夹正面:</p>
 
-<p><img src="images/sensor_fusion_assembly_shaft_screws.png" width="350" alt="轴和螺钉"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_shaft_screws.png" width="350" alt="轴和螺钉"/><br />
 <strong>图 5.</strong> 显示轴和螺钉的手机夹正面</p>
 
-<p><img src="images/sensor_fusion_assembly_shaft.png" width="350" alt="轴"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_shaft.png" width="350" alt="轴"/><br />
 <strong>图 6.</strong> 手机夹背面的轴(已用从正面拧入的螺钉紧固)</p></li>
 </ol>
 
@@ -100,23 +100,23 @@
 <ol>
 <li><p>将尼龙手拧螺钉和导线固定在铝制夹钳上,并涂上橡胶粘合剂:</p>
 
-<p><img src="images/sensor_fusion_assembly_clamp.png" width="350" alt="涂有橡胶粘合剂的夹钳"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_clamp.png" width="350" alt="涂有橡胶粘合剂的夹钳"/><br />
 <strong>图 7.</strong> 涂上橡胶粘合剂并固定好手拧螺钉和导线的夹钳</p></li>
 <li><p>将手机夹钳上的手拧螺钉拧入到手机夹的螺纹孔中。</p>
 
 <ul>
 <li><p>CAD 图纸:</p>
 
-<p><img src="images/sensor_fusion_assembly_clamp_attachment_cad_drawing.png" width="450" alt="关于固定夹钳的 CAD 图纸"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_clamp_attachment_cad_drawing.png" width="450" alt="关于固定夹钳的 CAD 图纸"/><br />
 <strong>图 8.</strong> 夹钳固定在手机夹上的 CAD 图纸</p></li>
 <li><p>夹钳固定在手机夹上的实际效果:</p>
 
-<p><img src="images/sensor_fusion_assembly_assembled_fixture.png" width="350" alt="组装好的手机夹"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_assembled_fixture.png" width="350" alt="组装好的手机夹"/><br />
 <strong>图 9.</strong> 组装好的手机夹</p></li>
 </ul></li>
 <li><p>在盒子顶部和底部安装导轨(朝向前方)。下图显示的是将 6-32 螺钉固定在预攻螺纹孔中的效果,但如果需要,您也可以使用自攻螺钉。</p>
 
-<p><img src="images/sensor_fusion_assembly_fixed_rail.png" width="350" alt="安装好的导轨"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_fixed_rail.png" width="350" alt="安装好的导轨"/><br />
 <strong>图 10.</strong> 安装在盒子顶部和底部的导轨</p></li>
 </ol>
 
@@ -127,25 +127,25 @@
 <ol>
 <li><p>将两个手柄件叠放在一起,然后使用 6-32 螺钉(或自攻螺钉)连接起来:</p>
 
-<p><img src="images/sensor_fusion_assembly_handle_pieces.png" width="450" alt="手柄件和组装"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_handle_pieces.png" width="450" alt="手柄件和组装"/><br />
 <strong>图 11.</strong> 传感器融合盒手柄件及组装</p></li>
 <li><p>准备 4 组 4-40 螺钉和螺母,将灯具套件上的安装架固定在盒壁上:</p>
 
-<p><img src="images/sensor_fusion_assembly_interior_wall_screws.png" width="350" alt="内壁上的螺钉和支架"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_interior_wall_screws.png" width="350" alt="内壁上的螺钉和支架"/><br />
 <strong>图 12.</strong> 盒内壁上的螺钉和灯架<br />
-<img src="images/sensor_fusion_assembly_exterior_bolts.png" width="350" alt="装有螺栓的外部"/><br />
+<img src="/compatibility/cts/images/sensor_fusion_assembly_exterior_bolts.png" width="350" alt="装有螺栓的外部"/><br />
 <strong>图 13.</strong> 从盒外部拧入螺孔的螺栓</p></li>
 <li><p>将灯具卡入支架(可能会有点紧):</p>
 
-<p><img src="images/sensor_fusion_assembly_interior_wall_lights.png" width="450" alt="内壁上的灯具"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_interior_wall_lights.png" width="450" alt="内壁上的灯具"/><br />
 <strong>图 14.</strong> 使用支架固定到内壁的灯具</p></li>
 <li><p>将灯光漫射膜裁成合适的尺寸,以便将灯棍包裹起来:</p>
 
-<p><img src="images/sensor_fusion_assembly_light_strips_diffusers.png" width="350" alt="灯棍和灯光漫射膜"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_light_strips_diffusers.png" width="350" alt="灯棍和灯光漫射膜"/><br />
 <strong>图 15.</strong> 灯棍和灯光漫射膜</p></li>
 <li><p>将灯光漫射膜裹在灯棍上,然后在背面用胶带粘好:</p>
 
-<p><img src="images/sensor_fusion_assembly_strips_taped_back.png" width="350" alt="从背面用胶带粘好的灯棍和漫射膜"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_strips_taped_back.png" width="350" alt="从背面用胶带粘好的灯棍和漫射膜"/><br />
 <strong>图 16.</strong> 从背面用胶带粘好的灯棍和灯光漫射膜</p></li>
 </ol>
 
@@ -156,15 +156,15 @@
 <ol>
 <li><p>准备 4 个 6-32 螺钉和一个伺服器板,以便将伺服器安装到盒壁上。从内部将螺钉拧入到盒壁外部的伺服器板上。</p>
 
-<p><img src="images/sensor_fusion_assembly_servo_servo_plate.png" width="450" alt="伺服器和伺服器板"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_servo_servo_plate.png" width="450" alt="伺服器和伺服器板"/><br />
 <strong>图 17.</strong> 使用 6-32 螺钉固定的伺服器和伺服器板</p></li>
 <li><p>使用尼龙锁紧螺母将手机夹固定到伺服器上(将轴的中心推入到伺服器的旋转中心):</p>
 
-<p><img src="images/sensor_fusion_assembly_phone_fixture.png" width="450" alt="伺服器上的手机夹"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_phone_fixture.png" width="450" alt="伺服器上的手机夹"/><br />
 <strong>图 18.</strong> 伺服器上的手机夹</p></li>
 <li><p>用伺服器螺钉将手机夹固定到伺服器上:</p>
 
-<p><img src="images/sensor_fusion_assembly_servo_screw.png" width="350" alt="伺服器上的手机夹(带有螺钉)"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_servo_screw.png" width="350" alt="伺服器上的手机夹(带有螺钉)"/><br />
 <strong>图 19.</strong> 用伺服器螺钉将手机夹固定到伺服器上</p></li>
 </ol>
 
@@ -175,25 +175,26 @@
 <ol>
 <li><p>从外侧用 4-40 螺钉将伺服器控制箱固定在伺服器左侧,并用螺母从内部紧固:</p>
 
-<p><img src="images/sensor_fusion_assembly_servo_on_wall.png" width="450" alt="盒壁上的伺服器控制箱"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_servo_on_wall.png" width="450" alt="盒壁上的伺服器控制箱"/><br />
 <strong>图 20.</strong> 将伺服器控制箱固定到盒壁上</p></li>
 <li><p>用胶带将盒子粘在一起,然后用螺钉将各部件固定到一起(您可能需要在某些部件上预先钻一些孔)。</p>
 
 <ul>
 <li><p>CAD 图纸:</p>
 
-<p><img src="images/sensor_fusion_assembly_complete_box_drawing.png" width="450" alt="完整盒子的 CAD 图纸"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_complete_box_drawing.png" width="450" alt="完整盒子的 CAD 图纸"/><br />
 <strong>图 21.</strong> 完整传感器盒的 CAD 图纸</p></li>
 <li><p>实际的传感器融合盒:</p>
 
-<p><img src="images/sensor_fusion_assembly_taped_box.png" width="450" alt="用胶带粘在一起的盒子"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_taped_box.png" width="450" alt="用胶带粘好的盒子"/><br />
 <strong>图 22.</strong> 用胶带粘好的盒子(带有电机组件和伺服器控制箱)和螺钉细部视图</p></li>
 </ul></li>
-<li><p>在 A3 纸(或 11 x 17 英寸的纸)上打印一份彩色的棋盘格(包含在 <a href="sensor_fusion_box_1.3.zip">Sensor Fusion Box 1.3.zip 文件</a>中),并用胶带粘到手机夹对面的盒壁上。</p>
+<li><p>在 A3 纸(或 11 x 17 英寸的纸)上打印一份彩色的棋盘格(包含在 <a href="/compatibility/cts/sensor_fusion_1.4.zip">Sensor Fusion
+Box zip 文件</a>中),并用胶带粘到手机夹对面的盒壁上。</p>
 
 <p>放置在手机夹上时,请确保棋盘格中心的红点正对着摄像头(如下所示):</p>
 
-<p><img src="images/sensor_fusion_assembly_checkerboard.png" width="350" alt="棋盘格"/><br />
+<p><img src="/compatibility/cts/images/sensor_fusion_assembly_checkerboard.png" width="350" alt="棋盘格"/><br />
 <strong>图 23.</strong> 打印出棋盘格并用胶带粘到手机夹对面的盒壁上</p></li>
 </ol>
 
diff --git a/zh-cn/compatibility/cts/sensor-fusion-quick-start.html b/zh-cn/compatibility/cts/sensor-fusion-quick-start.html
index 6f63830..791f6bc 100644
--- a/zh-cn/compatibility/cts/sensor-fusion-quick-start.html
+++ b/zh-cn/compatibility/cts/sensor-fusion-quick-start.html
@@ -23,7 +23,7 @@
     <p>
 在开始之前,请确保您已准备好以下线缆和电线:</p>
     <figure id="sensor-fusion-test-component">
-      <img src="images/sensor_fusion_test_components.png" width="700" alt="传感器融合测试组件"/>
+      <img src="/compatibility/cts/images/sensor_fusion_test_components.png" width="700" alt="传感器融合测试组件"/>
       <figcaption><b>图 1.</b> 进行传感器融合测试所需的组件</figcaption>
     </figure>
     <ul>
@@ -42,15 +42,15 @@
       <li>用互连线缆将两盏灯连起来。</li>
       <li>将一盏灯连接到转换线缆。
         <figure id="sensor-fusion-connect-lights">
-          <img src="images/sensor_fusion_connect_lights.png" width="300" alt="连接灯具"/>
+          <img src="/compatibility/cts/images/sensor_fusion_connect_lights.png" width="300" alt="连接灯具"/>
           <figcaption><b>图 2.</b> 将两盏灯连接在一起,并将一盏灯连接到转换线缆</figcaption>
         </figure>
       </li>
       <li>将转换线缆未连接灯具的一端从通往盒外的圆孔中穿出,然后连接到灯具的电源线缆。
         <table class="columns">
           <tbody><tr>
-            <td><img src="images/sensor_fusion_conversion_cable1.png" width alt="转换线缆和电源线"/></td>
-            <td><img src="images/sensor_fusion_conversion_cable2.png" width alt="灯具电源线"/></td>
+            <td><img src="/compatibility/cts/images/sensor_fusion_conversion_cable1.png" width alt="转换线缆和电源线"/></td>
+            <td><img src="/compatibility/cts/images/sensor_fusion_conversion_cable2.png" width alt="灯具电源线"/></td>
           </tr>
         </tbody></table>
       <b>图 3.</b> 灯具转换线缆伸出盒子并连接到电源线缆</li>
@@ -62,22 +62,22 @@
     <ol>
       <li>将伺服器接头插入伺服器控制箱。插入接头时,请务必确保电线的颜色要与标示的颜色一一对应(Y = 黄色,R = 红色,B = 黑色),颜色顺序颠倒可能会损坏电机。
         <figure id="sensor-fusion-servo-connector">
-          <img src="images/sensor_fusion_servo_connector.png" width="300" alt="伺服器连接到伺服器控制箱"/>
+          <img src="/compatibility/cts/images/sensor_fusion_servo_connector.png" width="300" alt="伺服器连接到伺服器控制箱"/>
           <figcaption><b>图 4.</b> 伺服器连接到伺服器控制箱</figcaption>
         </figure>
         </li><li>将伺服器控制箱连接到电源线(灯具和伺服器控制箱具有单独的专用电源)。
           <table class="columns">
             <tbody><tr>
-              <td><img src="images/sensor_fusion_servo_control1.png" width alt="伺服器控制箱"/></td>
-              <td><img src="images/sensor_fusion_servo_control2.png" width alt="伺服器控制箱电源"/></td>
+              <td><img src="/compatibility/cts/images/sensor_fusion_servo_control1.png" width alt="伺服器控制箱"/></td>
+              <td><img src="/compatibility/cts/images/sensor_fusion_servo_control2.png" width alt="伺服器控制箱电源"/></td>
             </tr>
           </tbody></table>
           <b>图 5.</b> 将伺服器控制箱连接到专用电源
           </li><li>使用 USB A 转 B 线缆将伺服器控制箱连接到主机(即运行测试的机器)。
             <table class="columns">
               <tbody><tr>
-                <td><img src="images/sensor_fusion_servo_control_box1.png" width alt="连接伺服器控制箱"/></td>
-                <td><img src="images/sensor_fusion_servo_control_box2.png" width alt="将伺服器控制箱连接到主机"/></td>
+                <td><img src="/compatibility/cts/images/sensor_fusion_servo_control_box1.png" width alt="连接伺服器控制箱"/></td>
+                <td><img src="/compatibility/cts/images/sensor_fusion_servo_control_box2.png" width alt="将伺服器控制箱连接到主机"/></td>
               </tr>
             </tbody></table>
           <b>图 6.</b> 将伺服器控制箱连接到主机</li>
@@ -87,17 +87,16 @@
           <li>将手机放在手机夹上并夹紧。<br />
             <table class="columns">
               <tbody><tr>
-                <td><img src="images/sensor_fusion_fixture1.png" width alt="手机在手机夹上"/></td>
-                <td><img src="images/sensor_fusion_fixture2.png" width alt="将手机夹在手机夹上"/></td>
+                <td><img src="/compatibility/cts/images/sensor_fusion_fixture1.png" width alt="手机在手机夹上"/></td>
+                <td><img src="/compatibility/cts/images/sensor_fusion_fixture2.png" width alt="将手机夹在手机夹上"/></td>
               </tr>
             </tbody></table>
             <b>图 7.</b> 将手机放在手机夹上并夹紧
-            <p>倒置的手拧螺钉可提供背部支撑,而另一个螺钉可通过向右旋转来拧紧手柄。如需更多帮助,请参阅有关装载手机的视频(包含在<a href="sensor_fusion_box_1.3.zip">传感器融合盒 zip 文件</a>中)。
-              </p>
+            <p>倒置的手拧螺钉可提供背部支撑,而另一个螺钉可通过向右旋转来拧紧手柄。如需更多帮助,请参阅有关装载手机的视频(包含在<a href="/compatibility/cts/sensor_fusion_1.4.zip">传感器融合盒 zip 文件</a>中)。</p>
           </li>
           <li>使用束线带将手机 USB 线固定在手机夹板上,并穿过出口孔引出盒外。将这条线的另一端插入到运行测试的主机。
             <figure id="sensor-fusion-zip-ties">
-              <img src="images/sensor_fusion_zip_ties.png" width="300" alt="带束线带的手机 USB 线"/>
+              <img src="/compatibility/cts/images/sensor_fusion_zip_ties.png" width="300" alt="带束线带的手机 USB 线"/>
               <figcaption><b>图 8.</b> 使用束线带将手机 USB 线固定在手机夹上</figcaption>
             </figure>
           </li>
@@ -138,7 +137,7 @@
       <table class="columns">
         <tbody><tr>
           <td>
-            <img src="images/sensor_fusion_adjust.png" width alt="调整伺服器的位置和速度"/>
+            <img src="/compatibility/cts/images/sensor_fusion_adjust.png" width alt="调整伺服器的位置和速度"/>
           </td>
           <td>
             <ul>
@@ -153,7 +152,7 @@
     </li>
   </ol>
   <p>
-如需更多帮助,请参阅有关传感器融合盒运行方面的视频(包含在<a href="sensor_fusion_box_1.3.zip">传感器融合盒 zip 文件</a>中)。
+如需更多帮助,请参阅有关传感器融合盒运行的视频(包含在<a href="/compatibility/cts/sensor_fusion_1.4.zip">传感器融合盒 zip 文件</a>中)。
   </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/compatibility/cts/setup.html b/zh-cn/compatibility/cts/setup.html
index d547d79..2339eff 100644
--- a/zh-cn/compatibility/cts/setup.html
+++ b/zh-cn/compatibility/cts/setup.html
@@ -43,7 +43,7 @@
 <p>如果您无法访问原生 IPv6 网络、IPv6 运营商网络或 IPv6 VPN,以致无法通过基于 IPv6 的一些测试,则可以改为使用 WLAN 接入点和 IPv6 隧道。请参阅维基百科 <a href="http://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers">IPv6 隧道代理列表</a>。</p>
 
 <h3 id="rtt">Wi-Fi RTT(往返时间)</h3>
-<p>Android 9 针对 <a ref="/devices/tech/connect/wifi-rtt">Wi-Fi RTT</a> 功能增加了一个 API,此 API 允许设备测量自身与接入点之间的距离(误差幅度在 1 到 2 米内),从而显著提高室内位置信息精确度。以下是支持 WLAN RTT 的两款推荐设备:<a href="https://store.google.com/product/google_wifi">Google Wifi</a> 和 <a href="https://fit-iot.com/web/products/fitlet2/">Compulab 的 Filet2 接入点</a>(设为 40MHz 带宽,频率为 5GHz)。</p>
+<p>Android 9 针对 <a ref="/devices/tech/connect/wifi-rtt">Wi-Fi RTT</a> 功能增加了一个 API,此 API 允许设备测量自身与接入点之间的距离(误差幅度在 1 到 2 米内),从而显著提高室内位置信息精确度。以下是支持 Wi-Fi RTT 的两款推荐设备:<a href="https://store.google.com/product/google_wifi">Google Wifi</a> 和 <a href="https://fit-iot.com/web/products/fitlet2/">Compulab 的 Filet2 接入点</a>(使用 5GHz 频段,带宽设为 40MHz)。</p>
 
 <p>接入点应接入电源,但无需连接到任何网络。接入点无需紧挨着测试设备,但建议将其放置在距离 DUT 40 英尺的位置。通常情况下,一个接入点就足够了。</p>
 
@@ -165,7 +165,7 @@
     <p class="warning"><strong>警告:</strong>这将清空设备中的所有用户数据。</p>
   </li><li>将设备的语言设置为英语(<strong>美国</strong>):<strong>设置 &gt; 语言和输入法 &gt; 语言</strong>
   </li><li>如果设备具有 GPS 或 WLAN/移动网络功能,则打开位置信息设置:<strong>设置 &gt; 位置信息 &gt; 开启</strong>
-  </li><li>连接到满足以下要求的 WLAN 网络:支持 IPv6,可以将被测设备 (DUT) 视为隔离的客户端(请参阅上文的<a href="#physical_environment">物理环境</a>部分),并可连接到互联网:<strong>设置 &gt; WLAN</strong><em></em>
+  </li><li>连接到满足以下要求的 WLAN 网络:支持 IPv6,可以将被测设备 (DUT) 视为隔离客户端<em></em>(请参阅上文的<a href="#physical_environment">物理环境</a>部分),并可连接到互联网。具体操作方法为:<strong>设置 &gt; WLAN</strong>
   </li><li>确保设备上未设置锁定图案或密码:<strong>设置 &gt; 安全 &gt; 屏幕锁定 &gt; 无</strong>
   </li><li>在设备上启用 <strong>USB 调试</strong>:<strong>设置 &gt; 开发者选项 &gt; USB 调试</strong>。
        <p class="note"><strong>注意:</strong>在 Android 4.2 及更高版本中,默认情况下会隐藏<strong>开发者选项</strong>。要显示这些选项,请依次转到<strong>设置 &gt; 关于手机</strong>,然后点按<strong>版本号</strong>七次。返回上一屏幕以查找<strong>开发者选项</strong>。要查看其他详细信息,请参阅<a href="http://developer.android.com/studio/run/device.html#developer-device-options">启用设备上的开发者选项</a>。</p>
@@ -181,10 +181,9 @@
 <p class="note"><strong>注意:</strong>对于 CTS 版本 2.1 R2 至 4.2 R4,请通过以下命令设置您的设备(或模拟器),以便执行无障碍测试:<br />
 <code>adb install -r android-cts/repository/testcases/CtsDelegatingAccessibilityService.apk</code><br />
 在设备上,依次启用:<strong>设置 &gt; 无障碍 &gt; 无障碍 &gt; Delegating Accessibility Service</strong></p>
-<p class="note"><strong>注意</strong>:对于 7.0 之前的 CTS 版本,请在声明 <code>android.software.device_admin</code> 的设备上设置您的设备,以使用以下命令执行设备管理测试:<br />
+<p class="note"><strong>注意:</strong>对于 7.0 之前的 CTS 版本,请在声明 <code>android.software.device_admin</code> 的设备上设置您的设备,以使用以下命令执行设备管理测试:<br />
 <code>adb install -r android-cts/repository/testcases/CtsDeviceAdmin.apk</code><br />
-</p><p>
-依次选择“设置”&gt;“安全”&gt;“选择设备管理器”,然后启用两个 <code>android.deviceadmin.cts.CtsDeviceAdminReceiver*</code> 设备管理器。确保 <code>android.deviceadmin.cts.CtsDeviceAdminDeactivatedReceiver</code> 和任何其他预加载的设备管理器均保持停用状态。
+</p><p>依次选择“设置”&gt;“安全”&gt;“选择设备管理器”,然后启用两个 <code>android.deviceadmin.cts.CtsDeviceAdminReceiver*</code> 设备管理器。确保 <code>android.deviceadmin.cts.CtsDeviceAdminDeactivatedReceiver</code> 和任何其他预加载的设备管理器均保持停用状态。
 </p>
 </li><li>将 CTS 媒体文件复制到设备上,如下所示:<p class="note"><strong>注意:</strong>对于 CTS 2.3 R12 及更高版本,如果设备支持视频编解码器,则必须将 CTS 媒体文件复制到设备上。</p>
 <ul>
diff --git a/zh-cn/compatibility/cts/usb-audio.html b/zh-cn/compatibility/cts/usb-audio.html
index dd76d46..08e4695 100644
--- a/zh-cn/compatibility/cts/usb-audio.html
+++ b/zh-cn/compatibility/cts/usb-audio.html
@@ -1,9 +1,10 @@
 <html devsite><head>
-    <title>USB 音频 CTS 验证程序测试</title>
-    <meta name="project_path" value="/_project.yaml"/>
-    <meta name="book_path" value="/_book.yaml"/>
-  </head>
-  <body>
+  <title>USB 音频 CTS 验证程序测试</title>
+  <meta name="project_path" value="/_project.yaml"/>
+  <meta name="book_path" value="/_book.yaml"/>
+</head>
+
+<body>
   <!--
       Copyright 2017 The Android Open Source Project
 
@@ -20,324 +21,364 @@
       limitations under the License.
   -->
 
-<p>
-针对 <a href="/devices/audio/usb">Android USB 音频</a>的几项 <a href="/compatibility/cts/">Android 兼容性测试套件 (CTS)</a> 测试需要人工干预,并且要求以物理方式连接 USB 音频外设。我们为此实现了额外的 CTS 验证程序测试。
-本文档介绍了这些测试的要求和协议。
-</p>
+  <p>针对 <a href="/devices/audio/usb">Android USB 音频</a>的几项 <a href="/compatibility/cts/">Android 兼容性测试套件 (CTS)</a> 测试要求以物理方式连接 USB 音频外设。我们为此实现了额外的 CTS 验证程序测试。</p>
 
-<h2 id="nomenclature">术语</h2>
+  <h2 id="nomenclature">术语</h2>
 
-<p>
-在本文档中,术语“设备”和“外设”的使用方式非常明确:
-</p>
-<ul>
-<li><em></em>“设备”是指 Android 设备。</li>
-<li><em></em>“外设”指的是连接到 Android 设备的外部 USB 音频外设。</li>
-</ul>
+  <p>在本文档中,所用的术语“设备”和“外设”具有非常明确的指代含义:</p>
 
-<h2 id="recommended-peripherals">指定外设</h2>
+  <ul>
+    <li><em></em>“设备”是指 Android 设备。</li>
 
-<p>
-为了使 USB 音频 CTS 验证程序测试了解它们正在验证的属性和功能,您需要指定一组已知的外设作为测试依据。因此,下面指定了一些特定品牌和类型。要成功完成这些测试,您使用的每个外设都必须属于下文指定的外设类别中的一种。使用其他类型将导致测试失败。
-</p>
+    <li><em></em>“外设”是指连接到 Android 设备的外部 USB 音频外设。</li>
+  </ul>
 
-<h3 id="usb-audio-interface">USB 音频接口</h3>
+  <h2 id="recommended-peripherals">指定外设</h2>
 
-<p>请使用以下任一外设进行 USB 音频外设属性测试、播放测试和录制测试:</p>
+  <p>为了使 USB 音频 CTS 验证程序测试了解它们正在验证的属性和功能,您需要指定一组已知的外设作为测试依据。有鉴于此,下面指定了一些具体的外设品牌和类型。有些测试需要使用具体指定的外设。还有些测试则只需要使用满足具体测试要求的 USB 音频外设。请注意,USB 音频外设属性测试的所有指定外设也会符合播放测试和录制测试的要求。</p>
 
-<ul>
-  <li><a href="http://www.presonus.com/products/audiobox-22VSL">Presonus AudioBox 22VSL</a></li>
-  <li><a href="https://www.presonus.com/products/audiobox-usb">Presonus AudioBox USB</a></li>
-</ul>
+  <h3 id="usb-audio-interface">USB 音频接口</h3>
 
-<table>
-  <tbody><tr>
-   <td width="50%">USB 音频接口 (PreSonus AudioBox 22VSL)
-   </td>
-   <td width="50%"><img src="/compatibility/cts/images/usb_audio_interface.png" alt="USB 音频接口" width="300" id="usb_audio_interface"/></td>
-  </tr>
-</tbody></table>
+  <p>请使用以下任一外设进行 USB 音频外设属性测试。同时,这些外设也适用于播放测试和录制测试。</p>
 
-<h3 id="usb-headset">USB 耳机</h3>
+  <ul>
+    <li><a href="http://www.presonus.com/products/audiobox-22VSL" class="external">Presonus
+    AudioBox 22VSL</a>
+    </li>
 
-<p>您可以使用数字 <a href="https://www.amazon.com/gp/product/B06VVGR2XM/ref=oh_aui_detailpage_o06_s00?ie=UTF8&psc=1">JBL Reflect Aware C 入耳式运动耳机</a>进行 USB 音频外设播放测试和耳机按钮测试,而无需使用适配器。</p>
+    <li><a href="https://www.presonus.com/products/audiobox-usb" class="external">Presonus
+    AudioBox USB</a>
+    </li>
+  </ul>
 
-<p>否则,请使用以下任一数字 USB-C 转 3.5 毫米音频耳机插孔适配器:
+  <p>请注意,制造商已停止销售这两个外设,在未来版本的 CTS 验证程序中将弃用它们。</p>
 
-</p><ul>
-  <li><a href="https://store.google.com/us/product/usb_c_headphone_adapter">Google 数字 USB-C 转 3.5 毫米头戴式耳机适配器</a></li>
-  <li><a href="https://www.htc.com/us/accessories-b/#!pid=htc-u11&acc=usb-c-digital-to-3-5mm-htc-u11">HTC 数字 USB-C 转 3.5 毫米音频耳机插孔适配器</a></li>
-</ul>
+  <ul>
+    <li><a href="https://www.amazon.com/PreSonus-AudioBox-USB-96-%20Interface/dp/B06ZZCR6P4/ref=sr_1_3?ie=UTF8&amp;qid=1537371840&amp;sr=8-3&amp;keywords%20=Presonus+AudioBox+USB+96&amp;dpID=41xVV2y1j%252BL&amp;preST=_SX300_QL70_&amp;dpSrc=srch" class="external">
+    Presonus AudioBox USB 96</a>
+    </li>
 
-<p>请将以上任一适配器连接到任一兼容 Android 的模拟耳机,以进行 USB 音频外设播放测试和耳机按钮测试:</p>
+    <li><a href="https://www.amazon.com/Focusrite-Scarlett-Audio-%20Interface-Tools/dp/B01E6T50LY/ref=sr_1_3?ie=UTF8&amp;qid=1537371877&amp;sr=%208-3&amp;keywords=Focusrite+Scarlett+2i4&amp;dpID=41riKC0pb9L&amp;preST=%20_SX300_QL70_&amp;dpSrc=srch" class="external">
+    Focusrite Scarlett 2i4</a>
+    </li>
 
-<ul>
-  <li><a href="https://www.bose.com/en_us/products/headphones/earphones/soundsport-in-ear-headphones-samsung-devices.html">Bose SoundSport® 入耳式耳机 – Samsung 和 Android™ 设备</a></li>
-  <li><a href="https://www.urbanears.com/ue_us_en/reimers#reimers-black-belt">专为 Android 设备打造的 UrbanEars Reimers Black Belt</a></li>
-</ul>
+    <li><a href="https://www.amazon.com/Behringer-UMC204HD-BEHRINGER-U-%20PHORIA/dp/B00QHURLCW/ref=sr_1_3?ie=UTF8&amp;qid=1537371923&amp;sr=8-3&amp;keywords%20=Behringer+UMC204HD&amp;dpID=41vDeQgewhL&amp;preST=_SY300_QL70_&amp;dpSrc=srch" class="external">
+    Behringer UMC204HD</a>
+    </li>
 
-<table>
-  <tbody><tr>
-   <td width="50%">USB 耳机
-   </td>
-    <td width="50%"><img src="/compatibility/cts/images/usb_headset.png" alt="USB 耳机" width="300" id="usb_headset"/></td>
-  </tr>
-</tbody></table>
+    <li><a href="https://www.amazon.com/Roland-USB-Audio-Interface-%20RUBIX22/dp/B01N14VOZM/ref=sr_1_1?ie=UTF8&amp;qid=1537371963&amp;sr=8-1&amp;%20keywords=roland+rubix+24&amp;dpID=41bDXqlk1rL&amp;preST=_%20SX300_QL70_&amp;dpSrc=srch" class="external">
+    Roland Rubix 24</a>
+    </li>
+  </ul>
 
-<h3 id="peripheral-profiles">外设配置文件</h3>
+  <table>
+    <tbody><tr>
+      <td width="50%">USB 音频接口 (PreSonus AudioBox 22VSL)。</td>
 
-<p>
-USB 音频 CTS 验证程序测试通过 Android 提供的内置配置文件(其中说明了外设的属性和功能)来“了解”这些推荐的外设。当外设连接到受测 Android 设备时,系统会自动选择正确的配置文件。
-</p>
+      <td width="50%"><img src="/compatibility/cts/images/usb_audio_interface.png" alt="USB 音频接口" width="300" id="usb_audio_interface"/>
+      </td>
+    </tr>
+  </tbody></table>
 
-<h2 id="required-additional-hardware">所需的其他硬件</h2>
+  <h3 id="usb-headset">USB 耳机</h3>
 
-<p>跳线(用作回环)
-2 条 ¼" 阳头接 ¼" 阳头的短跳线,用来连接 USB 的输出端和输入端</p>
+  <p>CTS 验证程序 USB 音频按钮测试不需要使用特定的 USB 耳机外设。该测试可以使用以下任一类型的耳机外设。</p>
 
-<table>
-  <tbody><tr>
-   <td width="50%">
-   ¼" 阳头接 ¼" 阳头跳线
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/patch_cables.png" alt="跳线" width="300" id="patch_cables"/></td>
+  <ul>
+    <li><span style="color:#202124;">支持 <a href="/devices/accessories/headset/usb-headset-spec">Android USB 耳机配件规范</a>的 USB 耳机外设<span style="color:#202124;">。这类耳机外设通常带有制造商标记的“专为 Android 设备打造”(Made for Android) 字样。</span></span>
+    </li>
 
-  </tr>
-</tbody></table>
+    <li>支持 <a href="/devices/accessories/headset/usb-headset-spec">Android USB 耳机配件规范</a> 的模拟耳机。这类耳机应连接到 USB 转模拟音频转换器(如,<a href="https://store.google.com/us/product/usb_c_headphone_adapter" class="external">Google 数字 USB-C 型转 3.5 毫米头戴式耳机适配器</a>或 <a href="https://www.htc.com/us/accessories-b/#!pid=htc-u11&amp;acc=usb-c-digital-to-3-5mm-htc-u11" class="external">HTC 数字 USB-C 型转 3.5 毫米音频耳机插孔适配器</a>)。<br />例如,已知的兼容模拟耳机外设包括 <a href="https://www.bose.com/en_us/products/headphones/earphones/soundsport-in-ear-headphones-samsung-devices.html" class="external">Bose SoundSport® 入耳式耳机 – Samsung 和 Android™ 设备</a>,以及<a href="https://www.urbanears.com/ue_us_en/reimers#reimers-black-belt" class="external">专为 Android 耳机打造的 UrbanEars Reimers Black Belt</a>。这些模拟耳机必须通过 USB 转音频转换器连接到设备上的 USB 端口。
+    </li>
+  </ul>
 
-<p>USB 外设数据线</p>
+  <p>请注意,无论使用上述哪一类耳机外设,对于三个必需的按钮(音量调高、音量调低、播放/暂停),对应的按钮都必须能生成虚拟按键代码,测试才能成功。有关虚拟按键代码的说明,请参阅 <a href="/devices/accessories/headset/usb-headset-spec">Android USB 耳机配件规范</a>中的“软件映射”部分。</p>
 
-<table>
-  <tbody><tr>
-   <td width="50%">此数据线(通常随附于外设)可将 USB 音频外设连接到主机设备
-   </td>
+  <table>
+    <tbody><tr>
+      <td width="50%">USB 耳机。</td>
 
-      <td width="50%"><img src="/compatibility/cts/images/peripheral_cable.png" alt="外设数据线" width="300" id="peripheral_cable"/></td>
+      <td width="50%"><img src="/compatibility/cts/images/usb_headset.png" alt="USB 耳机" width="300" id="usb_headset"/>
+      </td>
+    </tr>
+  </tbody></table>
 
-  </tr>
-</tbody></table>
+  <h2 id="required-additional-hardware">所需的其他硬件</h2>
 
-<p>USB On The Go (OTG) 适配器</p>
+  <p>跳线(用作回环)2 条 ¼" 阳头接 ¼" 阳头的短跳线,用来连接 USB 的输出端和输入端</p>
 
-<table>
-  <tbody><tr>
-   <td width="50%">需要使用 USB On The Go (OTG) 适配器才能将外设连接到 Android 设备,并向 Android 设备指明它应该承担“主机”的角色
-   </td>
+  <table>
+    <tbody><tr>
+      <td width="50%">¼" 阳头接 ¼" 阳头的跳线</td>
 
-      <td width="50%"><img src="/compatibility/cts/images/otg_adapter.png" alt="OTG 适配器" width="300" id="otg_adapter"/></td>
+      <td width="50%"><img src="/compatibility/cts/images/patch_cables.png" alt="跳线" width="300" id="patch_cables"/>
+      </td>
+    </tr>
+  </tbody></table>
 
-  </tr>
-</tbody></table>
+  <p>USB 外设数据线</p>
 
-<p>模拟耳机用于在播放测试中监测 USB 音频接口的输出。</p>
+  <table>
+    <tbody><tr>
+      <td width="50%">此数据线(通常外设产品会随附)可将 USB 音频外设连接到主机设备。</td>
 
-<table>
-  <tbody><tr>
-   <td width="50%">一副模拟耳机。
-   </td>
+      <td width="50%"><img src="/compatibility/cts/images/peripheral_cable.png" alt="外设数据线" width="300" id="peripheral_cable"/>
+      </td>
+    </tr>
+  </tbody></table>
 
-      <td width="50%"><img src="/compatibility/cts/images/analog_headphones.png" alt="模拟耳机" width="300" id="analog_headphones"/></td>
+  <p>USB On The Go (OTG) 适配器</p>
 
-  </tr>
-</tbody></table>
+  <table>
+    <tbody><tr>
+      <td width="50%">需要使用 USB On The Go (OTG) 适配器才能将外设连接到 Android 设备,并向 Android 设备指明它应该承担“主机”的角色。</td>
 
-<h2 id="tests">测试</h2>
+      <td width="50%"><img src="/compatibility/cts/images/otg_adapter.png" alt="OTG 适配器" width="300" id="otg_adapter"/>
+      </td>
+    </tr>
+  </tbody></table>
 
-<p>
-在每项测试中,请通过点击 <strong>test pass</strong>(对勾标记)按钮来表示测试成功。另外,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。
-</p>
+  <p>模拟耳机用于在播放测试中监测 USB 音频接口的输出。</p>
 
-<h3 id="attributes-test">属性测试</h3>
+  <table>
+    <tbody><tr>
+      <td width="50%">一副模拟耳机。</td>
 
-<h4 id="abstract">概要</h4>
+      <td width="50%"><img src="/compatibility/cts/images/analog_headphones.png" alt="模拟耳机" width="300" id="analog_headphones"/>
+      </td>
+    </tr>
+  </tbody></table>
 
-<p>
-此测试会验证相关属性(支持的采样率、声道配置、采样格式等)是否与设备的已知先验属性集相匹配。
-</p>
+  <h2 id="tests">测试</h2>
 
-<h4 id="process">流程</h4>
+  <p>在每项测试中,如果测试成功,请点击 <strong>test pass</strong>(对勾标记)按钮来表示该结果。反之,如果测试失败,请点击 <strong>test fail</strong>(感叹号)按钮来表示该结果。</p>
 
-<p>
-从主菜单中调用此测试后,请连接 USB 音频外设。如果这些属性相匹配,则系统将启用 <strong>test pass</strong>(对勾标记)按钮。点击 <strong>test pass</strong> 按钮即可表示成功。如果这些属性不匹配,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。
-</p>
+  <h3 id="attributes-test">属性测试</h3>
 
-<table>
-  <tbody><tr>
-   <td width="50%">选择“USB Audio Peripheral Attributes Test”。<em></em>
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/attributes_test.png" alt="属性测试" width="300" id="attributes test"/></td>
-  </tr>
+  <h4 id="abstract">概要</h4>
+
+  <p>此测试会验证相关属性(支持的采样率、声道配置、采样格式等)是否与设备的已知先验属性集相匹配。</p>
+
+  <h4 id="process">流程</h4>
+
+  <p>从主菜单中调用此测试后,请连接 USB 音频外设。如果这些属性与已知先验属性相匹配,则系统将启用 <strong>test pass</strong>(对勾标记)按钮。</p>
+
+  <table>
+    <tbody><tr>
+      <td width="50%">选择“USB Audio Peripheral Attributes Test”。<em></em></td>
+
+      <td width="50%"><img src="/compatibility/cts/images/attributes_test.png" alt="属性测试" width="300" id="attributes test"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">显示的说明摘要。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/attributes_summary.png" alt="属性摘要" width="300" id="attributes_summary"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">建立连接前的屏幕。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/attributes_preconnect.png" alt="属性(建立连接前)" width="300" id="attributes_preconnect"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">USB 音频外设已通过外设数据线和 OTG 适配器连接到 Android 设备。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/attributes_connected.png" alt="属性(已连接)" width="300" id="attributes_connected"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">建立连接后的屏幕。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/attributes_postconnect.png" alt="属性(建立连接后)" width="300" id="attributes_postconnect"/>
+      </td>
+    </tr>
+  </tbody></table>
+
+  <h3 id="play-test">播放测试音轨</h3>
+
+  <h4 id="abstract">概要</h4>
+
+  <p>此测试可验证音频播放是否正常。为实现此目的,它会生成 1KHz 测试音调,然后使用立体声(双声道)将其传送到 USB 音频外设。</p>
+
+  <h4 id="process">流程</h4>
+
+  <p>从主菜单中调用此测试后,将 USB 音频接口(包括模拟耳机)连接到监测接口上的耳机输出插孔。</p>
+
+  <p>按 <strong>PLAY</strong>(播放)按钮。如果在耳机的两个声道中都能听到测试音调,请通过点击 <strong>test pass</strong>(对勾标记)按钮来表示测试通过。如果其中任一声道无法播放音调,或者两个声道都无法播放,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。</p>
+
+  <h4 id="notes">备注</h4>
+
+  <table>
+    <tbody><tr>
+      <td width="50%">选择“USB Audio Peripheral Buttons Test”<em></em></td>
+
+      <td width="50%"><img src="/compatibility/cts/images/play_test.png" alt="播放测试" width="300" id="play_test"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">显示的说明摘要。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/play_summary.png" alt="播放摘要" width="300" id="play_summary"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">建立连接前的屏幕。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/play_preconnect.png" alt="播放(建立连接前)" width="300" id="play_preconnect"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">将 USB 音频外设连接到 Android 设备。
+
+        <p>耳机已连接到用于监测的 USB 音频接口上的耳机输出插孔。</p>
+      </td>
+
+      <td width="50%"><img src="/compatibility/cts/images/play_connected.png" alt="播放(已连接)" width="300" id="play_connected"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">建立连接后的屏幕。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/play_postconnect.png" alt="播放(建立连接后)" width="300" id="play_postconnect"/>
+      </td>
+    </tr>
+  </tbody></table>
+
+  <h3 id="record-loopback-test">录制(回环)测试</h3>
+
+  <h4 id="abstract">概要</h4>
+
+  <p>此测试可验证录音功能是否正常。为实现此目的,这项测试会在 USB 音频接口的输出端生成音调,然后通过跳线将该音调传送到 USB 音频外设的输入端。</p>
+
+  <h4 id="process">流程</h4>
+
+  <p>从主菜单中调用此测试后,连接 USB 音频接口。使用跳线将模拟输出端连接到模拟输入端。按 <strong>RECORD LOOPBACK</strong>(录制回环)按钮。如果所录制测试音调的两个声道都显示在下面的视图中,请通过点击 <strong>test pass</strong>(对勾标记)按钮来表示测试通过。如果其中任一声道未显示,或者两个声道都未显示,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。</p>
+
+  <h4 id="notes">备注</h4>
+
+  <p>请务必使用正接法同时连接外设上的输入插孔和输出插孔。为确保正确显示录制的信号,将需要调整输入等级。</p>
+
+  <table>
+    <tbody><tr>
+      <td width="50%">选择“USB Audio Peripheral Record Test”<em></em></td>
+
+      <td width="50%"><img src="/compatibility/cts/images/record_test.png" alt="录制测试" width="300" id="record_test"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">显示的说明摘要。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/record_summary.png" alt="录制摘要" width="300" id="record_summary"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">建立连接前的屏幕。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/record_preconnect.png" alt="录制(建立连接前)" width="300" id="record_preconnect"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">USB 音频接口已通过回环连接到 Android 设备</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/record_connected.png" alt="录制(已连接)" width="300" id="record_connected"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">USB 音频接口背面的连接</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/record_connected_back.png" alt="录制(已在背面连接)" width="300" id="record_connected_back"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">USB 音频接口正面的连接</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/record_connected_front.png" alt="录制(已在正面连接)" width="300" id="record_connected_front"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">建立连接后的屏幕</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/record_postconnect.png" alt="录制(建立连接后)" width="300" id="record_postconnect"/>
+      </td>
+    </tr>
   <tr>
-   <td width="50%">显示的说明摘要
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/attributes_summary.png" alt="属性摘要" width="300" id="attributes_summary"/></td>
-  </tr>
-  <tr>
-   <td width="50%">建立连接前的屏幕
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/attributes_preconnect.png" alt="属性(建立连接前)" width="300" id="attributes_preconnect"/></td>
-  </tr>
-  <tr>
-   <td width="50%">USB 音频外设已通过外设数据线和 OTG 适配器连接到 Android 设备
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/attributes_connected.png" alt="属性(已连接)" width="300" id="attributes_connected"/></td>
-  </tr>
-  <tr>
-   <td width="50%">建立连接后的屏幕
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/attributes_postconnect.png" alt="属性(建立连接后)" width="300" id="attributes_postconnect"/></td>
-  </tr>
-</tbody></table>
+      <td width="50%">建立连接后的屏幕,正在运行录制测试</td>
 
-<h3 id="play-test">播放测试音轨</h3>
+      <td width="50%"><img src="/compatibility/cts/images/record_postconnect_running.png" alt="录制(建立连接后,正在运行测试)" width="300" id="attributes_postconnect_running."/>
+      </td>
+    </tr>
+  </tbody></table>
 
-<h4 id="abstract">概要</h4>
+  <h3 id="headset-buttons-test">耳机按钮测试</h3>
 
-<p>
-此测试会验证音频播放是否正常。为实现此目的,它会生成 1KHz 测试音调,然后采用立体声(双声道)将其传送到 USB 音频外设。
-</p>
+  <h4 id="abstract">概要</h4>
 
-<h4 id="process">流程</h4>
+  <p>此测试可验证是否已正确识别所推荐耳机上的 <strong>media/transport</strong> 按钮。</p>
 
-<p>
-从主菜单中调用此测试后,将 USB 音频接口(包括模拟耳机)连接到用于监测的接口上的耳机输出插孔。
-</p>
+  <h4 id="process">流程</h4>
 
-<p>
-按 <strong>PLAY</strong> 按钮。如果在耳机的两个声道中都能听到测试音调,请通过点击 <strong>test pass</strong>(对勾标记)按钮来表示测试通过。如果其中任一声道(或两个声道都)无法播放音调,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。
-</p>
+  <p>
+从主菜单中调用此测试后,连接 USB 耳机外设。按耳机上的每个 <strong>media/transport</strong>(播放、暂停、音量调高和音量调低)按钮。系统每识别出一个按钮,便会在测试面板中标识出该按钮。在识别出所有按钮后,系统将启用 <strong>test pass</strong>(对勾标记)按钮。点击 <strong>test pass</strong> 按钮即可表示测试成功。如果无法识别全部按钮,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。</p>
 
-<h4 id="notes">备注</h4>
+  <h4 id="notes">备注</h4>
 
-<table>
-  <tbody><tr>
-   <td width="50%">选择“USB Audio Peripheral Play Test”<em></em>
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/play_test.png" alt="播放测试" width="300" id="play_test"/></td>
-  </tr>
-  <tr>
-   <td width="50%">显示的说明摘要
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/play_summary.png" alt="播放摘要" width="300" id="play_summary"/></td>
-  </tr>
-  <tr>
-   <td width="50%">建立连接前的屏幕
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/play_preconnect.png" alt="播放(建立连接前)" width="300" id="play_preconnect"/></td>
-  </tr>
-  <tr>
-   <td width="50%">将 USB 音频外设连接到 Android 设备
-<p>
-耳机已连接到用于监测的 USB 音频接口上的耳机输出插孔。
-   </p></td>
-      <td width="50%"><img src="/compatibility/cts/images/play_connected.png" alt="播放(已连接)" width="300" id="play_connected"/></td>
-  </tr>
-  <tr>
-   <td width="50%">建立连接后的屏幕
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/play_postconnect.png" alt="播放(建立连接后)" width="300" id="play_postconnect"/></td>
-  </tr>
-</tbody></table>
+  <table>
+    <tbody><tr>
+      <td width="50%">USB 耳机外设已连接到 Android 设备。
 
-<h3 id="record-loopback-test">录制(回环)测试</h3>
+        <p>请留意 OTG 适配器。</p>
+      </td>
 
-<h4 id="abstract">概要</h4>
+      <td width="50%"><img src="/compatibility/cts/images/buttons_connected.png" alt="按钮(已连接)" width="300" id="buttons_connected"/>
+      </td>
+    </tr>
 
-<p>
-此测试会验证录音功能是否正常。为实现此目的,这项测试会在 USB 音频接口的输出端生成音调,然后通过跳线将该音调传送到 USB 音频外设的输入端。
-</p>
+    <tr>
+      <td width="50%">选择“USB Audio Peripheral Buttons Test”<em></em></td>
 
-<h4 id="process">流程</h4>
+      <td width="50%"><img src="/compatibility/cts/images/buttons_test.png" alt="按钮测试" width="300" id="buttons_test"/>
+      </td>
+    </tr>
 
-<p>
-从主菜单中调用此测试后,连接 USB 音频接口。
-使用跳线将模拟输出端连接到模拟输入端。按 <strong>RECORD LOOPBACK</strong> 按钮。如果录制的测试音调的两个声道都显示在下面的视图中,请通过点击 <strong>test pass</strong>(对勾标记)按钮来表示测试通过。如果其中任一声道(或两个声道都)未显示,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。
-</p>
+    <tr>
+      <td width="50%">显示的说明摘要。</td>
 
-<h4 id="notes">备注</h4>
+      <td width="50%"><img src="/compatibility/cts/images/buttons_summary.png" alt="按钮摘要" width="300" id="buttons_summary"/>
+      </td>
+    </tr>
 
-<p>
-请确保使用正接法同时连接外设上的输入和输出插孔。需要调整输入等级才能正确显示录制的信号。
-</p>
+    <tr>
+      <td width="50%">已连接外设,但尚未识别出任何按钮。
 
-<table>
-  <tbody><tr>
-   <td width="50%">选择“USB Audio Peripheral Record Test”<em></em>
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/record_test.png" alt="录制测试" width="300" id="record_test"/></td>
-  </tr>
-  <tr>
-   <td width="50%">显示的说明摘要
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/record_summary.png" alt="录制摘要" width="300" id="record_summary"/></td>
-  </tr>
-  <tr>
-   <td width="50%">建立连接前的屏幕
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/record_preconnect.png" alt="录制(建立连接前)" width="300" id="record_preconnect"/></td>
-  </tr>
-  <tr>
-   <td width="50%">USB 音频接口已通过回环连接到 Android 设备</td>
-      <td width="50%"><img src="/compatibility/cts/images/record_connected.png" alt="录制(已连接)" width="300" id="record_connected"/></td>
-  </tr>
-  <tr>
-   <td width="50%">USB 音频接口背面的连接
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/record_connected_back.png" alt="录制(已在背面连接)" width="300" id="record_connected_back"/></td>
-  </tr>
-  <tr>
-   <td width="50%">USB 音频接口正面的连接
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/record_connected_front.png" alt="录制(已在正面连接)" width="300" id="record_connected_front"/></td>
-  </tr>
-  <tr>
-   <td width="50%">建立连接后的屏幕,正在运行录制测试
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/record_postconnect.png" alt="录制(建立连接后)" width="300" id="record_postconnect"/></td>
-  </tr>
-</tbody></table>
-<h3></h3>
-<h3 id="headset-buttons-test">耳机按钮测试</h3>
-<h4 id="abstract">概要</h4>
-<p>
-此测试用于验证是否已正确识别出所推荐耳机上的 <strong>media/transport</strong> 按钮。
-</p>
-<h4 id="process">流程</h4>
-<p>
-从主菜单中调用此测试后,请连接 USB 耳机外设。
-按耳机上的每个 <strong>media/transport</strong>(播放、暂停、音量调高和音量调低)按钮。每当系统识别出一个按钮,它都会在测试面板中被标识出来。识别出所有按钮后,系统将启用 <strong>test pass</strong>(对勾标记)按钮。点击 <strong>test pass</strong> 按钮即可表示成功。如果无法识别整组按钮,请通过点击 <strong>test fail</strong>(感叹号)按钮来表示测试失败。
-</p>
-<h4 id="notes">备注</h4>
-<table>
-  <tbody><tr>
-   <td width="50%">USB 耳机外设已连接到 Android 设备
-<p>
-请留意 OTG 适配器
-   </p></td>
-      <td width="50%"><img src="/compatibility/cts/images/buttons_connected.png" alt="按钮(已连接)" width="300" id="buttons_connected"/></td>
-  </tr>
-  <tr>
-   <td width="50%">选择“USB Audio Peripheral Buttons Test”<em></em>
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/buttons_test.png" alt="按钮测试" width="300" id="buttons_test"/></td>
-  </tr>
-  <tr>
-   <td width="50%">显示的说明摘要
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/buttons_summary.png" alt="按钮摘要" width="300" id="buttons_summary"/></td>
-  </tr>
-  <tr>
-   <td width="50%">已连接外设,但尚未识别出任何按钮
-<p>
-请注意,预期按钮(设备配置文件所知的按钮)用白色文本显示;不属于测试外设的按钮以灰色文本显示
-   </p></td>
-      <td width="50%"><img src="/compatibility/cts/images/buttons_not_recognized.png" alt="未识别出按钮" width="300" id="buttons not recognized"/></td>
-  </tr>
-  <tr>
-   <td width="50%">已连接外设,并已识别出预期按钮
-   </td>
-      <td width="50%"><img src="/compatibility/cts/images/buttons_recognized.png" alt="已识别出按钮" width="300" id="buttons recognized"/></td>
-  </tr>
-</tbody></table>
+        <p>请注意,预期应识别出的按钮(设备配置文件所知的按钮)以白色文本显示;不属于测试外设的按钮以灰色文本显示。</p>
+      </td>
+
+      <td width="50%"><img src="/compatibility/cts/images/buttons_not_recognized.png" alt="未识别出按钮" width="300" id="buttons not recognized"/>
+      </td>
+    </tr>
+
+    <tr>
+      <td width="50%">已连接外设,并已识别出预期按钮。</td>
+
+      <td width="50%"><img src="/compatibility/cts/images/buttons_recognized.png" alt="已识别出按钮" width="300" id="buttons recognized"/>
+      </td>
+    </tr>
+  </tbody></table>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/compatibility/index.html b/zh-cn/compatibility/index.html
index 47efeaf..468d616 100644
--- a/zh-cn/compatibility/index.html
+++ b/zh-cn/compatibility/index.html
@@ -29,9 +29,9 @@
 <p>尽管如此,但为了让用户在使用其他 Android 设备时能够获得一致的体验,请在设计和自定义您的实现时考虑以下既定标准。</p>
 
 <ol>
-<li><p>查看<a href="/devices/architecture/">架构</a>中的 Android 平台开发基本原则,尤其是 Android 8.0 中引入的<a href="/devices/architecture/hidl/">HIDL</a> 格式。</p></li>
-<li><p>确保根据 <a href="/compatibility/cdd">Android 兼容性定义文档</a>(Android 的核心规范)的相关要求,设备属于<a href="/compatibility/overview">兼容性</a>设备。</p></li>
-<li><p>参阅<a href="/devices/tech/display/">显示</a>功能和<a href="/devices/tech/settings/settings-guidelines">设置</a>指南,获取界面方面的帮助。</p></li>
+<li><p>查看<a href="/devices/architecture/">架构</a>中的 Android 平台开发基本原则,尤其是 Android 8.0 中引入的 <a href="/devices/architecture/hidl/">HIDL</a> 格式。</p></li>
+<li><p>确保根据 <a href="/compatibility/overview">Android 兼容性定义文档</a>(Android 的核心规范)的相关要求,设备属于<a href="/compatibility/cdd">兼容性</a>设备。</p></li>
+<li><p>参阅<a href="/devices/tech/display/">显示</a>功能和<a href="/devices/tech/settings/settings-guidelines">设置</a>指南,获取用户界面方面的帮助。</p></li>
 <li><p>利用所有可用的<a href="/compatibility/tests">测试</a>调试和改进您的 Android 设备。</p></li>
 <li><p>在开发面向用户的应用时,请先熟悉一下<a href="https://developer.android.com/design/" class="external">应用设计</a>原则和 <a href="https://material.io/design/" class="external">Material Design</a> 技术。</p></li>
 </ol>
diff --git a/zh-cn/compatibility/overview.html b/zh-cn/compatibility/overview.html
index f35b4b4..5403ff4 100644
--- a/zh-cn/compatibility/overview.html
+++ b/zh-cn/compatibility/overview.html
@@ -70,8 +70,8 @@
 <p>Android 兼容性计划由三个关键组成部分组成:</p>
 <ul>
 <li><a href="https://android.googlesource.com/">Android 开放源代码项目</a>源代码</li>
-<li><a href="cdd.html">兼容性定义文档 (CDD)</a><a>:代表兼容性方面的“政策”</a></li><a>
-</a><li><a></a><a href="cts/index.html">兼容性测试套件 (CTS)</a>:代表兼容性方面的“机制”</li>
+<li><a href="cdd.html">兼容性定义文档 (CDD)</a><a>,代表兼容性方面的“政策”</a></li><a>
+</a><li><a></a><a href="cts/index.html">兼容性测试套件 (CTS)</a>,代表兼容性的“机制”</li>
 </ul>
 
 <h2 id="android-compatibility-is-free-and-its-easy">Android 兼容性计划是免费的,而且申请步骤很简单</h2>
@@ -86,6 +86,6 @@
 <p>就像每个版本的 Android 平台存在于源代码树的单独分支中一样,每个版本也具有单独的 CTS 和 CDD。CDD、CTS 和源代码,再加上您的硬件和软件自定义内容,便是打造兼容设备所需的一切。</p>
 
 <h2 id="licensing-gms">申请 Google 移动服务 (GMS) 许可</h2>
-<p>打造与 Android 兼容的设备后,请考虑申请在 Android 上运行的 Google 移动服务(简称 GMS,指 Google 拥有的一系列应用,包括 Google Play、YouTube、Google 地图、Gmail 等)的使用许可。GMS 不是 Android 开放源代码项目的一部分,您只有在获得 Google 许可后才能使用它们。如需关于如何申请 GMS 许可的信息,请参阅<a href="/setup/community#for-business-inquiries">联系方式/社群</a>页面。</p>
+<p>打造与 Android 兼容的设备后,请考虑申请在 Android 上运行的 Google 移动服务(简称 GMS,指 Google 拥有的一系列应用,包括 Google Play、YouTube、Google 地图、Gmail 等)的使用许可。GMS 不是 Android 开放源代码项目的一部分,您只有在获得 Google 许可后才能使用它们。要了解如何申请 GMS 许可,请参阅<a href="/setup/community#for-business-inquiries">联系方式/社群</a>页面。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/compatibility/tests.html b/zh-cn/compatibility/tests.html
index 719d0c1..3e73d47 100644
--- a/zh-cn/compatibility/tests.html
+++ b/zh-cn/compatibility/tests.html
@@ -24,7 +24,7 @@
 
 <h1 id="tests" class="page-title">测试</h1>
 
-<p>作为一个开放源代码操作系统,Android 提供了许多测试和调试工具。请先花点时间了解一下<a href="https://android.googlesource.com/platform/platform_testing/+/master/docs/basics/index.md" class="external">测试</a>方面的基础知识,然后再了解以下选项。</p>
+<p>作为一个开放源代码操作系统,Android 提供了许多测试和调试工具。请先花点时间了解一下<a href="https://android.googlesource.com/platform/platform_testing/+/master/docs/basics/index.md" class="external">测试的基础知识</a>,然后再了解以下选项。</p>
 
 <h2 id="atest">Atest</h2>
 
diff --git a/zh-cn/compatibility/vts/hal-testability.html b/zh-cn/compatibility/vts/hal-testability.html
index 71893ff..3534caa 100644
--- a/zh-cn/compatibility/vts/hal-testability.html
+++ b/zh-cn/compatibility/vts/hal-testability.html
@@ -134,7 +134,7 @@
 <h2 id="vts-testability-checker">VTS 可测试性检查工具</h2>
 
 <p><code><a href="https://android.googlesource.com/platform/test/vts/+/master/utils/native/testability_checker/?q=vts_testability&amp;g=0" class="external">
-  vts_testibility_checker</a></code> 是与 VTS 打包在一起的二进制程序,VTS 测试框架会在运行时使用该工具确定指定的 HAL 测试是否可测试。该文件基于 <code><a href="https://android.googlesource.com/platform/system/libvintf/+/master" class="external">libvintf</a></code> 来加载和解析供应商清单文件,并实现上一部分中所述的决策流程。
+  vts_testibility_checker</a></code> 是与 VTS 打包在一起的二进制程序,VTS 测试框架会在运行时使用该工具确定指定的 HAL 测试是否可测试。该工具基于 <code><a href="https://android.googlesource.com/platform/system/libvintf/+/master" class="external">libvintf</a></code> 来加载和解析供应商清单文件,并实现上一部分中所述的决策流程。
 </p>
 
 <p>要使用 <code>vts_testability_check</code>,请运行以下命令:</p>
@@ -158,9 +158,10 @@
 
 <h2 id="determining-accessed-hals">确定会访问哪些 HAL</h2>
 
-<p>要确定 VTS 测试会访问哪些 HAL,请确保每个 HAL 测试都使用 <code><a href="https://android.googlesource.com/platform/test/vts/+/master/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.h" class="external">VtsHalHidlTargetTestEnvBase</a></code> 模板来注册要在测试中访问的 HAL。接下来,VTS 测试框架会在预处理测试时提取已注册的 HAL。</p>
+<p>
+要确定 VTS 测试会访问哪些 HAL,请确保每个 HAL 测试都使用 <code><a href="https://android.googlesource.com/platform/test/vts/+/master/runners/target/vts_hal_hidl_target/VtsHalHidlTargetTestEnvBase.h" class="external">VtsHalHidlTargetTestEnvBase</a></code> 模板注册要在测试中访问的 HAL。接下来,VTS 测试框架会在预处理测试时提取已注册的 HAL。</p>
 
-<p>对于合规性测试,您还可以检查 <code>/system/etc/vintf/manifest.xml</code>。如果此文件中定义了 HAL,则 VTS 应测试该 HAL(系统提供的 HAL 服务(例如 <code>graphics.composer/vr</code>)在 <code>/system/manifest.xml</code> 中声明)。
+<p>对于合规性测试,您还可以检查 <code>/system/etc/vintf/manifest.xml</code>。如果此文件中定义了 HAL,则 VTS 应测试该 HAL(对于系统提供的 HAL 服务(例如 <code>graphics.composer/vr</code>),HAL 在 <code>/system/manifest.xml</code> 中声明)。
 </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/compatibility/vts/index.html b/zh-cn/compatibility/vts/index.html
index 8d05762..d1b558b 100644
--- a/zh-cn/compatibility/vts/index.html
+++ b/zh-cn/compatibility/vts/index.html
@@ -42,13 +42,13 @@
     <li><a href="/compatibility/vts/ui.html">界面</a>:一个统一的界面,利用 Material Design 有效显示与测试结果、分析和覆盖率相关的信息。</li>
   </ul>
   </li>
-  <li><strong>实验室基础架构</strong>:介绍了在搭载 AOSP <a href="/setup/build/gsi">常规系统映像 (GSI)</a> 的合作伙伴设备上运行 VTS、CTS 或其他测试的<a href="/compatibility/vts/automated-test-infra">自动化测试基础架构</a>所采用的架构。需要<a href="/compatibility/vts/host-controller">主机控制器</a>。
+  <li><strong>实验室基础架构</strong>:介绍了在搭载 AOSP <a href="/compatibility/vts/automated-test-infra">常规系统映像 (GSI)</a> 的合作伙伴设备上运行 VTS、CTS 或其他测试的<a href="/setup/build/gsi">自动化测试基础架构</a>所采用的架构。需要<a href="/compatibility/vts/host-controller">主机控制器</a>。
   </li>
   <li><a href="/compatibility/vts/performance.html">binder 和 hwbinder 性能测试</a>:用于衡量吞吐量和延迟的工具。</li>
 </ul>
 
 <p>
-要了解详情,请参阅 developer.android.com 上的 <a href="https://codelabs.developers.google.com/codelabs/android-vts/#0" class="external">Android VTS 代码实验室</a>以及由 Google Developers 制作的 <a href="https://www.youtube.com/watch?v=7BX7oSHc7nk&list=PLWz5rJ2EKKc9JOMtoWWMJHFHgvXDoThva" class="external">Android VTS 产品视频</a>。
+要了解详情,请参阅 developer.android.com 上的 <a href="https://codelabs.developers.google.com/codelabs/android-vts/#0" class="external">Android VTS Codelab</a> 以及由 Google Developers 制作的 <a href="https://www.youtube.com/watch?v=7BX7oSHc7nk&list=PLWz5rJ2EKKc9JOMtoWWMJHFHgvXDoThva" class="external">Android VTS 产品视频</a>。
 </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/compatibility/vts/performance.html b/zh-cn/compatibility/vts/performance.html
index 579b2af..0d03604 100644
--- a/zh-cn/compatibility/vts/performance.html
+++ b/zh-cn/compatibility/vts/performance.html
@@ -117,10 +117,8 @@
 <p>吞吐量测试是针对 binder/hwbinder 事务吞吐量而运行的。在未过载的系统中,延迟气泡很少,而且只要迭代的次数足够多,就可以消除其影响。</p>
 
 <ul>
-<li><strong>binder</strong> 吞吐量测试位于
-<code>system/libhwbinder/vts/performance/Benchmark_binder.cpp</code> 下。</li>
-<li><strong>hwbinder</strong> 吞吐量测试位于
-<code>system/libhwbinder/vts/performance/Benchmark.cpp</code> 下。</li>
+<li><strong>binder</strong> 吞吐量测试位于 <code>system/libhwbinder/vts/performance/Benchmark_binder.cpp</code> 下。</li>
+<li><strong>hwbinder</strong> 吞吐量测试位于 <code>system/libhwbinder/vts/performance/Benchmark.cpp</code> 下。</li>
 </ul>
 
 <h3 id="throughput-results">测试结果</h3>
@@ -291,7 +289,7 @@
 
 </dl>
 
-<p class="note"><strong>注意:</strong>后台负荷可能会影响延迟测试中的吞吐量结果和
+<p class="note"><strong>注意</strong>:后台负荷可能会影响延迟测试中的吞吐量结果和
 <code>other_ms</code> 元组。只要后台负荷的优先级低于 <code>fifo_ms</code>,就可能只有 <code>RT-fifo</code> 会显示类似的结果。</p>
 
 <h4 id="pair-values">指定对值</h4>
diff --git a/zh-cn/devices/architecture/dto/compile.html b/zh-cn/devices/architecture/dto/compile.html
index d861ad4..3d617b7 100644
--- a/zh-cn/devices/architecture/dto/compile.html
+++ b/zh-cn/devices/architecture/dto/compile.html
@@ -1,9 +1,11 @@
 <html devsite><head>
-    <title>编译和验证</title>
-    <meta name="project_path" value="/_project.yaml"/>
-    <meta name="book_path" value="/_book.yaml"/>
-  </head>
-  <body>
+  <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
 
@@ -20,53 +22,305 @@
       limitations under the License.
   -->
 
-<p>您可以使用设备树编译器 (DTC) 来编译设备树源文件。不过,在将叠加 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果。</p>
+  <p>您可以使用设备树编译器 (DTC) 来编译设备树源文件。不过,在将叠加层 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果。</p>
 
-<h2 id="compile">通过 DTC 进行编译</h2>
-<p>使用 <code>dtc</code> 编译 <code>.dts</code> 时,您必须添加选项 <code>-@</code> 以在生成的 <code>.dtbo</code> 中添加 <code>__symbols__</code> 节点。<code>__symbols__</code> 节点包含带标签的所有节点的列表,DTO 库可使用这个列表作为参考。</p>
+  <h2 id="compile">通过 DTC 进行编译</h2>
 
-<p>编译主 <code>.dts</code> 的示例命令:</p>
+  <p>使用 <code>dtc</code> 编译 <code>.dts</code> 时,您必须添加选项 <code>-@</code> 以在生成的 <code>.dtbo</code> 中添加 <code>__symbols__</code> 节点。<code>__symbols__</code> 节点包含带标签的所有节点的列表,DTO 库可使用这个列表作为参考。</p>
 
-<pre class="devsite-terminal">
+  <p>编译主 <code>.dts</code> 的示例命令:</p>
+
+  <pre class="devsite-terminal">
 dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
 </pre>
 
-<p>编译叠加 DT <code>.dts</code> 的示例命令:</p>
+  <p>编译叠加层 DT <code>.dts</code> 的示例命令:</p>
 
-<pre class="devsite-terminal">
+  <pre class="devsite-terminal">
 dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
 </pre>
 
-<p class="note"><strong>注意</strong>:如果您遇到 DTC 编译错误:<code>invalid option --'@'</code>,则可能需要更新 DTC 版本。在 AOSP 上游,官方 DTC 对 DTO 的支持从<a href="https://github.com/dgibson/dtc/tree/v1.4.4" class="external">版本 1.4.4</a> 开始,而且大部分补丁程序在 2016 年 12 月后就完成了合并。为了支持 DTO,建议您使用 AOSP 中的 <code><a href="https://android.googlesource.com/platform/external/dtc/" class="external">external/dtc</a></code>,它已与最新的 DTC 同步(已视需要合并 DTO 补丁程序)。</p>
+  <aside class="note"><strong>注意</strong>:如果您遇到 DTC 编译错误:<code>invalid option --'@'</code>,则可能需要更新 DTC 版本。在 AOSP 上游,官方 DTC 对 DTO 的支持从<a href="https://github.com/dgibson/dtc/tree/v1.4.4" class="external">版本 1.4.4</a> 开始,而且大部分补丁程序在 2016 年 12 月后就完成了合并。为了支持 DTO,建议您使用 AOSP 中的 <code><a href="https://android.googlesource.com/platform/external/dtc/" class="external">external/dtc</a></code>,它已与最新的 DTC 同步(已视需要合并 DTO 补丁程序)。</aside>
 
-<h2 id="verify">在主机上验证 DTO 结果</h2>
-<p>验证流程可以帮助您识别将叠加 DT 放在主 DT 上时可能发生的错误。更新目标之前,您可以通过在 <code>.dts</code> 中使用 <code>/include/</code> 来模拟 DTO 行为,从而在主机上验证叠加 DT 的结果。</p>
+  <h2 id="verify">在主机上验证 DTO 结果</h2>
 
-<p class="note"><strong>注意</strong>:<code>/include/</code> 不支持在叠加 DT 源中使用 <code>__overlay__</code>。</p>
+  <p>验证流程可以帮助您识别将叠加层 DT 放在主 DT 上时可能发生的错误。更新目标之前,您可以通过在 <code>.dts</code> 中使用 <code>/include/</code> 来模拟 DTO 行为,从而在主机上验证叠加 DT 的结果。</p>
 
-<p><img src="../images/treble_dto_simulate.png"/></p>
-<p><strong>图 1</strong> 使用语法 <code>/include/</code> 来模拟主机上的 DTO。</p>
+  <aside class="note"><strong>注意</strong>:<code>/include/</code> 不支持在叠加层 DT 源中使用 <code>__overlay__</code>。</aside>
 
-<ol>
-<li>创建叠加 <code>.dts</code> 的副本。在副本中,移除第一行头文件。例如:<pre>
+  <p><img src="../images/treble_dto_simulate.png"/>
+  </p>
+
+  <figcaption><strong>图 1.</strong> 使用语法 <code>/include/</code> 来模拟主机上的 DTO</figcaption>
+
+  <ol>
+    <li>创建叠加层 <code>.dts</code> 的副本。在副本中,移除第一行头文件。示例:
+
+      <pre>
 /dts-v1/;
 /plugin/;
-</pre>将文件另存为 <code>my_overlay_dt_wo_header.dts</code>(或您希望的任何文件名)。</li>
+</pre>将文件另存为 <code>my_overlay_dt_wo_header.dts</code>(或您希望的任何文件名)。
+    </li>
 
-<li>创建主 <code>.dts</code> 的副本。在副本中的最后一行后,为您在第 1 步中创建的文件附加包含语法。例如:<pre>
+    <li>创建主 <code>.dts</code> 的副本。在副本中的最后一行后,为您在第 1 步中创建的文件附加 include 语法。例如:
+
+      <pre>
 /include/ "my_overlay_dt_wo_header.dts"
-</pre>将文件另存为 <code>my_main_dt_with_include.dts</code>(或您希望的任何文件名)。</li>
+</pre>将文件另存为 <code>my_main_dt_with_include.dts</code>(或您希望的任何文件名)。
+    </li>
 
-<li>使用 <code>dtc</code> 编译 <code>my_main_dt_with_include.dts</code> 以获得合并的 DT,这应该与使用 DTO 进行编译所得到的结果相同。例如:<pre class="devsite-terminal">
+    <li>使用 <code>dtc</code> 编译 <code>my_main_dt_with_include.dts</code> 以获得合并的 DT,这应该与使用 DTO 进行编译所得到的结果相同。例如:
+
+      <pre class="devsite-terminal">
 dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
 </pre>
-</li>
+    </li>
 
-<li>使用 <code>dtc</code> 转储 <code>my_merged_dt.dto</code>。
-<pre class="devsite-terminal">
+    <li>使用 <code>dtc</code> 转储 <code>my_merged_dt.dto</code>。
+
+      <pre class="devsite-terminal">
 dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
 </pre>
-</li>
-</ol>
+    </li>
+  </ol>
+
+  <h2 id="verifying-DTO-in-p">在 Android 9 中验证 DTO</h2>
+
+  <p>Android 9 需要具有设备树 Blob 叠加层 (DTBO) 分区。要在 SoC DT 中添加节点或更改属性,引导加载程序必须在 SoC DT 之上动态叠加设备专用的 DT。</p>
+
+  <h3 id="indicating-applied-overlays">指示已应用的叠加层</h3>
+
+  <p>要使<a href="/compatibility/vts/">供应商测试套件 (VTS)</a> 能够评估叠加层应用的准确性,供应商必须添加新的内核命令行参数 <code>androidboot.dtbo_idx</code>,用于指示从 DTBO 分区中选择哪些叠加层。例如,参数 <code>androidboot.
+  dtbo_idx=x,y,z</code> 将 <code>x</code>、<code>y</code> 和 <code>z</code> 报告为 DTBO 分区中已由引导加载程序按相同顺序应用于基础设备树 (DT) 的设备树叠加层 (DTO) 的索引,这些索引以零为起点。</p>
+
+  <p>叠加层可以应用于主设备树中的节点,也可以添加新节点,但<strong>不能</strong>引用之前叠加层中添加的节点。这种限制是必要的,因为叠加层应用不会将叠加层符号表与主 DT 符号表合并(不合并的做法既可避免符号名称出现冲突,也可避免叠加层之间的依赖关系复杂化)。</p>
+
+  <h4 id="example-invalid-overlays">示例:无效叠加层</h4>
+
+  <p>在此示例中,<code>overlay_2.dts</code> 引用了由 <code>overlay_1.dts</code> 添加的节点 <strong><code>e</code></strong>。在将 <code>overlay_1</code> 应用于主 DT 之后,如果尝试将 <code>overlay_2</code> 应用于生成的 DT,则叠加层应用将发生故障,并出现基础 DT 的符号表中不存在符号 <strong><code>e</code></strong> 的错误。</p>
+
+  <table>
+    <tbody><tr>
+      <th width="33%">main.dts</th>
+
+      <th>overlay_1.dts</th>
+
+      <th>overlay_2.dts</th>
+
+    </tr>
+    <tr>
+      <td>
+        <pre>
+
+<strong>[main.dts]</strong>
+
+/dts-v1/;
+
+/ {
+  a: a {};
+  b: b {};
+  c: c {};
+};
+</pre>
+  </td>
+
+        <td>
+          <pre>
+
+<strong>[overlay_1.dts]</strong>
+
+/dts-v1/;
+/plugin/;
+
+&amp;b { ref1 =  &lt;&amp;a&gt;;
+    e: e {
+        prop = &lt;0x0a&gt;;
+        phandle = &lt;0x04&gt;;
+    };
+};
+</pre>
+</td>
+
+      <td>
+<pre>
+
+<strong>[overlay_2.dts]</strong>
+
+/dts-v1/;
+/plugin/;
+
+/* invalid! */
+<font color="red">&amp;e</font> {
+    prop = &lt;0x0b&gt;;
+};
+</pre>
+      </td>
+    </tr>
+  </tbody></table>
+
+  <h4 id="example-valid-overlays">示例:有效叠加层</h4>
+
+  <p>在此示例中,<code>overlay_2.dts</code> 仅引用了主 DTS 中的节点 <strong><code>b</code></strong>。将 <code>overlay_1</code> 和 <code>overlay_2</code> 依次应用于基础 DT 之后,节点 <strong><code>e</code></strong> 的属性 <strong><code>prop</code></strong> 的值(由 <code>overlay_1.dts</code> 设置)将被 <code>overlay_2.dts</code> 设置的值覆盖。</p>
+
+  <table>
+    <tbody><tr>
+      <th width="33%">main.dts</th>
+
+      <th>overlay_1.dts</th>
+
+      <th>overlay_2.dts</th>
+
+    </tr>
+
+    <tr>
+      <td>
+      <pre>
+
+<strong>[final.dts]</strong>
+
+/dts-v1/;
+
+/ {
+  a: a {};
+  b: b {};
+  c: c {};
+};
+</pre>
+        </td>
+
+      <td>
+      <pre>
+
+<strong>[overlay_1.dts]</strong>
+
+/dts-v1/;
+/plugin/;
+
+&amp;b { ref1 =  &lt;&amp;a&gt;;
+     e {
+          prop = &lt;0x0c&gt;;
+      };
+};
+</pre>
+        </td>
+
+      <td>
+      <pre>
+
+<strong>[overlay_2.dts]</strong>
+
+/dts-v1/;
+/plugin/;
+
+/* valid */
+<font color="blue">&amp;b</font> { ref1 =  &lt;&amp;c&gt;;
+     e {
+          prop = &lt;0x0d&gt;;
+      };
+};
+</pre>
+      </td>
+    </tr>
+  </tbody></table>
+
+  <h3 id="implementing-the-dtbo-partition">实现 DTBO 分区</h3>
+
+  <p>要实现所需的 DTBO 分区,请确保引导加载程序可以执行以下操作:</p>
+
+  <ol>
+    <li>识别它正在哪个开发板上运行,并选择要应用的相应叠加层。</li>
+
+    <li>将 <code>androidboot.dtbo_idx</code> 参数附加到内核命令行。
+
+      <ul>
+        <li>该参数必须指示 DTBO 分区映像中由引导加载程序按相同顺序应用于基础 DT 的 DTO 的索引,这些索引以零为起点。</li>
+
+        <li>这些索引必须引用叠加层在 DTBO 分区中的位置。</li>
+      </ul>
+    </li>
+  </ol>
+
+  <p>要详细了解 DTBO 分区结构,请访问 source.android.com 上的<a href="https://source.android.com/devices/architecture/dto/">设备树叠加层</a>。</p>
+
+  <h3 id="validating-the-dtbo-partition">验证 DTBO 分区</h3>
+
+  <p>您可以使用 VTS 来验证以下内容:</p>
+
+  <ul>
+    <li>内核命令行参数 <code>androidboot.dtbo_idx</code> 是否存在(方法:检查 <code>Init</code> 是否已自动设置相应的 <code>ro.boot.dtbo_idx</code> 系统属性)。</li>
+
+    <li><code>ro.boot.dtbo_idx</code> 系统属性的有效性(方法:检查该属性是否至少指定了一个有效的 DTBO 映像索引)。</li>
+
+    <li>DTBO 分区的有效性(还应验证 DTBO 分区中应用于基础 DT 的叠加层的有效性)。</li>
+
+    <li>生成的 DT 中的其他节点或属性更改是否已呈现给 Linux 内核。</li>
+  </ul>
+
+  <p>例如,在以下叠加层和最终 DT 中,将 <code>androidboot.dtbo_idx=5,3</code> 添加到内核命令行可通过验证,而将 <code>androidboot.dtbo_idx=3,5</code> 添加到内核命令行则不能通过验证。</p>
+
+  <table>
+    <tbody><tr>
+      <th width="50%">索引 3 处的叠加层 DT</th>
+
+      <th>索引 5 处的叠加层 DT</th>
+
+</tr><tr>
+<td>
+<pre>
+
+<strong>[overlay_1.dts]</strong>
+
+/dts-v1/;
+/plugin/;
+
+&amp;c <strong>{ prop = &lt;0xfe&gt;; }</strong>;
+</pre>
+      </td>
+
+      <td>
+      <pre>
+
+<strong>[overlay_2.dts]</strong>
+
+/dts-v1/;
+/plugin/;
+
+&amp;c { prop = &lt;0xff&gt;; };
+</pre>
+        </td>
+    </tr>
+
+</tbody></table><table>
+    <tbody><tr>
+   <th>最终 DT</th>
+
+   </tr><tr>
+   <td>
+   <pre>
+
+/dts-v1/;
+/ {
+
+	a {
+		phandle = &lt;0x1&gt;;
+	};
+
+	b {
+		phandle = &lt;0x2&gt;;
+	};
+
+	c {
+		phandle = &lt;0x3&gt;;
+		<strong>prop = &lt;0xfe&gt;</strong>;
+	};
+
+	__symbols__ {
+		a = "/a";
+		b = "/b";
+		c = "/c";
+	};
+};
+
+  </pre></td></tr></tbody></table>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/dto/index.html b/zh-cn/devices/architecture/dto/index.html
index 6f4e2d8..a571b45 100644
--- a/zh-cn/devices/architecture/dto/index.html
+++ b/zh-cn/devices/architecture/dto/index.html
@@ -4,8 +4,9 @@
     <meta name="book_path" value="/_book.yaml"/>
   </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.
@@ -20,21 +21,26 @@
       limitations under the License.
   -->
 
-<p>设备树 (DT) 是用于描述“不可发现”硬件的命名节点和属性的数据结构。操作系统(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件,接下来 Linux 会将这些文件编译到引导加载程序使用的设备树 Blob (DTB) 文件中。</p><a href="https://lkml.org/lkml/2012/11/5/615" class="external">设备树叠加层</a> (DTO) 可让主要的 DTB 叠加在设备树上。使用 DTO 的引导加载程序可以维护系统芯片 (SoC) DT,并动态叠加设备特定的 DT,从而向树中添加节点并对现有树中的属性进行更改。<p></p>
+<p>设备树 (DT) 是用于描述“不可发现”硬件的命名节点和属性的数据结构。操作系统(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件,接下来 Linux 会将这些文件编译到引导加载程序使用的设备树 Blob (DTB) 文件中。</p>
 
-<p>本页详细介绍了引导加载程序加载 DT 的典型工作流程,并列出了常见的 DT 术语。本节的其他页介绍了如何<a href="/devices/architecture/dto/implement.html">为 DTO 实现引导加载程序支持</a>,如何<a href="/devices/architecture/dto/compile.html">编译</a>、验证和<a href="/devices/architecture/dto/optimize.html">优化 DTO 实现</a>以及如何<a href="/devices/architecture/dto/multiple.html">使用多个 DT</a>。您还可以获取关于 <a href="/devices/architecture/dto/syntax.html">DTO 语法</a>和推荐的 <a href="/devices/architecture/dto/partition.html">DTO/DTBO 分区格式的详细信息</a>。</p>
+<p><a href="https://lkml.org/lkml/2012/11/5/615" class="external">设备树叠加层</a> (DTO) 可让主要的设备树 Blob (DTB) 叠加在设备树上。使用 DTO 的引导加载程序可以维护系统芯片 (SoC) DT,并动态叠加针对特定设备的 DT,从而向树中添加节点并对现有树中的属性进行更改。</p>
+
+<p>本页详细介绍了引导加载程序加载 DT 的典型工作流程,并列出了常见的 DT 术语。本节的其他页介绍了如何<a href="/devices/architecture/dto/implement.html">为 DTO 实现引导加载程序支持</a>,如何<a href="/devices/architecture/dto/compile.html">编译</a>、验证和<a href="/devices/architecture/dto/optimize.html">优化 DTO 实现</a>以及如何<a href="/devices/architecture/dto/multiple.html">使用多个 DT</a>。您还可以获取关于 <a href="/devices/architecture/dto/syntax.html">DTO 语法</a>和必需的 <a href="/devices/architecture/dto/partitions.html">DTO/DTBO 分区格式</a>的详细信息。</p>
+
+<h2 id="p-update">Android 9 版本中的更新</h2>
+<p>在 Android 9 中,在将统一设备树 Blob 传递给内核之前,引导加载程序不得修改设备树叠加层中定义的属性。</p>
 
 <h2 id="load-dt">加载设备树</h2>
 <p>在引导加载程序中加载设备树会涉及到编译、分区和运行。</p>
 
 <figure id="treble_dto_bootloader">
 <img src="../images/treble_dto_bootloader.png"/>
-<figcaption><strong>图 1</strong> 用于在引导加载程序中加载设备树的典型实现。</figcaption>
+<figcaption><strong>图 1.</strong> 用于在引导加载程序中加载设备树的典型实现。</figcaption>
 </figure>
 
 <ol>
 <li>要进行编译,请执行以下操作:<ul>
-<li>使用设备树编译器 (<code>dtc</code>) 将设备树源 (<code>.dts</code>) 编译为设备树 blob (<code>.dtb</code>)(格式化为扁平设备树)。</li>
+<li>使用设备树编译器 (<code>dtc</code>) 将设备树源 (<code>.dts</code>) 编译为设备树 blob (<code>.dtb</code>)(格式化为扁平化设备树)。</li>
 <li>将 <code>.dtb</code> 文件刷写到引导加载程序在运行时可访问的位置(详见下文)。</li>
 </ul>
 </li>
@@ -100,7 +106,7 @@
 </tr>
 <tr>
 <th>FDT</th>
-<td>扁平化设备树,包含在 <code>.dtb</code> blob 文件中的二进制格式</td>
+<td>扁平化设备树,一种包含在 <code>.dtb</code> blob 文件中的二进制格式</td>
 </tr>
 </tbody>
 </table>
diff --git a/zh-cn/devices/architecture/dto/optimize.html b/zh-cn/devices/architecture/dto/optimize.html
index 5e097d7..e6dbbf0 100644
--- a/zh-cn/devices/architecture/dto/optimize.html
+++ b/zh-cn/devices/architecture/dto/optimize.html
@@ -82,8 +82,7 @@
 
 <p>
   虽然最新的 <code><a href="https://github.com/dgibson/dtc/tree/master/libfdt" class="external">libfdt</a></code> 支持 DTO,但是我们建议您使用 <code>libufdt</code> 来实现 DTP(AOSP 源代码位于 <code><a href="https://android.googlesource.com/platform/system/libufdt/+/refs/heads/master" class="external">platform/system/libufdt</a></code> 下)。
-  <code>libufdt</code> 会从扁平化设备树 (FDT) 编译真实的树结构(非扁平化设备树,简称“ufdt”),从而改善两个 <code>.dtb</code> 文件(从 O(N2) 到 O(N),其中 N 是树中的节点数)的合并效果。
-<em></em>
+  <code>libufdt</code> 会从扁平化设备树 (FDT) 编译真实的树结构(非扁平化设备树,简称“ufdt”),从而改善两个 <code>.dtb</code> 文件(从 O(N2) 到 O(N),其中 N 是树中的节点数)的合并效果。<em></em>
 </p>
 
 <h3 id="performance">性能测试</h3>
@@ -148,7 +147,8 @@
 </p>
 
 <p>
-  SoC 供应商必须定义主 DT 的叠加能力;ODM/OEM 只能使用由 SoC 供应商定义的标签附加或覆盖节点。要解决这个问题,您可以在基础 DT 中的根节点下定义一个 <strong><code>odm</code></strong> 节点,使叠加 DT 中的所有 ODM 节点都能够添加新节点。或者,您也可以将基础 DT 中的所有 SoC 相关节点放在根节点下的 <strong><code>soc</code></strong> 节点中,如下所述:
+  SoC 供应商必须定义主 DT 的叠加能力;ODM/OEM 只能使用由 SoC 供应商定义的标签附加或覆盖节点。要解决这个问题,您可以在基础 DT 中的根节点下定义一个 <strong><code>odm</code></strong> 节点,使叠加 DT 中的所有 ODM 节点都能够添加新节点。
+或者,您也可以将基础 DT 中的所有 SoC 相关节点放在根节点下的 <strong><code>soc</code></strong> 节点中,如下所述:
 </p>
 
 <table>
diff --git a/zh-cn/devices/architecture/dto/partitions.html b/zh-cn/devices/architecture/dto/partitions.html
index 9814501..49cc820 100644
--- a/zh-cn/devices/architecture/dto/partitions.html
+++ b/zh-cn/devices/architecture/dto/partitions.html
@@ -5,7 +5,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.
@@ -23,7 +23,7 @@
 <p>如果您的 DTB/DTBO 位于专属的分区(例如 <code>dtb</code> 和 <code>dtbo</code> 分区)中,请使用以下表格结构和头文件格式:</p>
 
 <p><img src="../images/treble_dto_partition_layout.png"/></p>
-<figcaption><strong>图 1</strong> 分区布局示例 <code>dtb</code>/<code>dtbo</code>(要了解 AVB 签名相关信息,请参阅<a href="/devices/architecture/dto/implement.html#security">安全性</a>)。
+<figcaption><strong>图 1.</strong> <code>dtb</code>/<code>dtbo</code> 分区布局示例(要了解 AVB 签名相关信息,请参阅<a href="/devices/architecture/dto/implement.html#security">安全性</a>)。
 </figcaption>
 
 <h2 id="structures">数据结构</h2>
@@ -44,7 +44,9 @@
                               // from head of dt_table_header
 
   uint32_t page_size;         // flash page size we assume
-  uint32_t reserved[1];       // must be zero
+  uint32_t version;       // DTBO image version, the current version is 0.
+                          // The version will be incremented when the
+                          // dt_table_header struct is updated.
 };
 
 struct dt_table_entry {
@@ -120,7 +122,7 @@
 </pre></li></ul>
 
 <h2 id="mkdtimg">mkdtimg</h2>
-<p><code>mkdtimg</code> 是用于创建 <code>dtb</code>/<code>dtbo</code> 映像(AOSP 中 <code>system/libufdt</code> 下的<a href="https://android-review.googlesource.com/#/q/topic:mkdtimg+(status:open+OR+status:merged+OR+status:pending)" class="external">源代码</a>的工具。<code>mkdtimg</code> 支持多个命令,包括 <code>create</code>、<code>cfg_create</code> 和 <code>dump</code>。</p>
+<p><code>mkdtimg</code> 是用于创建 <code>dtb</code>/<code>dtbo</code> 映像的工具(<a href="https://android-review.googlesource.com/#/q/topic:mkdtimg+(status:open+OR+status:merged+OR+status:pending)" class="external">源代码</a>位于 AOSP 中的 <code>system/libufdt</code> 下)。<code>mkdtimg</code> 支持多个命令,包括 <code>create</code>、<code>cfg_create</code> 和 <code>dump</code>。</p>
 
 <h3 id="create">create</h3>
 <p>使用 <code>create</code> 命令创建 <code>dtb</code>/<code>dtbo</code> 映像:</p>
@@ -234,7 +236,7 @@
       dt_entry_count = 3
    dt_entries_offset = 32
            page_size = 2048
-         reserved[0] = 00000000
+             version = 0
 dt_table_entry[0]:
              dt_size = 380
            dt_offset = 128
diff --git a/zh-cn/devices/architecture/hal/dynamic-lifecycle.html b/zh-cn/devices/architecture/hal/dynamic-lifecycle.html
new file mode 100644
index 0000000..6108702
--- /dev/null
+++ b/zh-cn/devices/architecture/hal/dynamic-lifecycle.html
@@ -0,0 +1,59 @@
+<html devsite><head>
+  <title>动态可用的 HAL</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.
+  -->
+Android 9 支持动态关停未使用或不需要的 Android 硬件子系统。例如,如果用户未使用 WLAN,则 WLAN 子系统不应占用内存、耗损电量或使用其他系统资源。早期版本的 Android 中,在 Android 手机启动的整个持续时间内,Android 设备上的 HAL/驱动程序都会保持开启状态。
+
+  <p>实现动态关停涉及连接数据流以及执行动态进程,下文对此进行了详细介绍。</p>
+
+  <h2 id="changes-HAL-definitions">对 HAL 定义所做的更改</h2>
+
+  <p>要实现动态关停,需要有关于哪些进程为哪些 HAL 接口提供服务的信息(此类信息之后在其他上下文中也可能很有用),还需要确保在设备启动时不启动进程,而且在进程退出后,直到系统再次请求启动它们之前,都不重新启动它们。</p>
+
+  <pre class="prettyprint"># some init.rc script associated with the HAL
+service vendor.some-service-name /vendor/bin/hw/some-binary-service
+    # init language extension, provides information of what service is served
+    # if multiple interfaces are served, they can be specified one on each line
+    interface [email protected]::ILight default
+    # restarted if hwservicemanager dies
+    # would also cause the hal to start early during boot if oneshot wasn't set
+    class hal
+    # will not be restarted if it exits until it is requested to be restarted
+    oneshot
+    # will only be started when requested
+    disabled
+    # ... other properties</pre>
+
+  <h2 id="changes-init-and-hwservicemanager">对 init 和 hwservicemanager 所做的更改</h2>
+
+  <p>要实现动态关停,还需要让 <code>hwservicemanager</code> 告知 <code>init</code> 启动所请求的服务。在 Android 9 中,<code>init</code> 包含三个额外的控制消息(例如,<code>ctl.start</code>):<code>ctl.interface_start</code>、<code>ctl.interface_stop</code> 和 <code>ctl.interface_restart</code>。这些消息可用于指示 <code>init</code> 打开或关闭特定硬件接口。如果系统请求使用某个服务但该服务未注册,则 <code>hwservicemanager</code> 将请求启动该服务。</p>
+
+  <h2 id="determining-HAL-exit">确定 HAL 退出</h2>
+
+  <p>要实现动态关停,需要多个政策来决定何时启动和关停 HAL。如果 HAL 出于任何原因而决定退出,则当系统再次需要用到它时,它将使用以下信息和基础架构自动重新启动:HAL 定义中提供的信息,以及通过更改 <code>init</code> 和 <code>hwservicemanager</code> 提供的基础架构。这可能会涉及多个不同的政策,包括:</p>
+
+  <ul>
+    <li>如果有人对 HAL 调用关闭命令或类似的 API,则 HAL 可能会选择自行调用退出命令。此行为必须在相应的 HAL 接口中指定。</li>
+
+    <li>HAL 可在任务完成后关停(记录在 HAL 文件中)。</li>
+  </ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/hal/framework-testing.html b/zh-cn/devices/architecture/hal/framework-testing.html
new file mode 100644
index 0000000..545bbcb
--- /dev/null
+++ b/zh-cn/devices/architecture/hal/framework-testing.html
@@ -0,0 +1,130 @@
+<html devsite><head>
+  <title>HIDL 框架向后兼容性验证</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.
+  -->
+
+  <p><a href="/devices/architecture/#hidl">HIDL HAL</a> 可保证 Android 核心系统(也称为 system.img 或框架)向后兼容。虽然<a href="/compatibility/vts">供应商测试套件 (VTS)</a> 测试可确保 HAL 按预期运行(例如,针对所有 1.2 实现运行 1.1 HAL 测试),但仍需要进行框架测试,以确保提供受支持的 HAL(1.0、1.1 或 1.2)时该框架适用于该 HAL。</p>
+
+  <p>要详细了解 HAL 接口定义语言 (HIDL),请参阅 <a href="/devices/architecture/hidl">HIDL</a>、<a href="/devices/architecture/hidl/versioning">HIDL 版本控制</a>和 <a href="/devices/architecture/vintf/fcm#hal-version-deprecation">HIDL HAL 弃用</a>。</p>
+
+  <h2 id="about-HAL-upgrades">关于 HAL 升级</h2>
+
+  <p>HAL 升级分为两类:主要和次要。<em></em><em></em>大多数系统仅包含一个 HAL 实现,但支持多个实现。例如:</p>
+
+<pre>[email protected] # initial interface
[email protected] # minor version upgrade
[email protected] # another minor version upgrade
+...
[email protected] # major version upgrade
+...</pre>
+
+  <p>系统分区通常包含一个框架守护进程(如 <code>teleportd</code>),用于管理与特定 HAL 实现组进行的通信。作为一种替代方法,系统可能会包含一个用于实现便捷客户端行为的系统库(如 <code>android.hardware.configstore-utils</code>)。在上面的示例中,无论设备上安装了哪个版本的 HAL,<code>teleportd</code> 都必须能够正常运行。</p>
+
+  <h2 id="google-maintained-versions">Google 维护的版本</h2>
+
+  <p>如果存在主要版本升级(1.0、2.0、3.0 等),则至少必须有一台 Google 维护的设备来维护各主要版本的实现,直到该版本弃用为止。如果 Google 维护的所有设备均未搭载特定主要版本,则 Google 会继续维护该主要版本的旧实现。</p>
+
+  <p>这种维护会增加一点额外的开销,因为创建新实现(如 2.0)时,旧实现(如 1.2)将保留且默认处于不使用的状态。</p>
+
+  <h2 id="testing-minor-version-upgrades">测试次要版本升级</h2>
+
+  <p>如要测试框架中次要版本的向后兼容性,则需要一种自动生成次要版本实现的方法。鉴于 Google 维护的版本存在一定限制,<code>hidl-gen</code> 只会(且只能)生成采用 1.(x+n) 实现并提供 1.x 实现的适配器;它无法根据 2.0 实现生成 1.0 实现(以主要版本的定义为准)。</p>
+
+  <p>例如,要针对 1.2 实现运行 1.1 测试,则必须能够模拟具有 1.1 实现的情况。1.2 接口可自动用作 1.1 实现,但行为上存在一些细微差别(例如,框架会手动检查所属的具体版本或对自身调用 <code>castFrom</code>)。</p>
+  <p>基本做法如下所示:</p>
+
+  <ol>
+    <li>在 Android 移动设备上安装 x.(y+n) 接口。</li>
+
+    <li>安装并启用目标为 x.y 的适配器。</li>
+
+    <li>测试设备,验证它能否按预期运行旧版次要版本。</li>
+  </ol>
+
+  <p>这些适配器完全隐藏了如下事实:实现实际上由 1.2 接口提供支持,并且仅提供 1.1 接口(适配器采用 1.2 接口并让其看起来像 1.1 接口)。</p>
+
+  <h3 id="example-workflow">工作流程示例</h3>
+
+  <p>在此示例中,Android 设备运行 <code>[email protected]::IFoo/default</code>。要确保客户端在 <code>[email protected]::IFoo/default</code> 上正常运行,请执行以下操作:</p>
+
+  <ol>
+    <li>在终端中,运行以下命令:
+
+<pre>$ [email protected]
+$ INTERFACE=IAllocator
+$ INSTANCE=ashmem
+$ THREAD_COUNT=1 # can see current thread use on `lshal -i -e`
+$ m -j $PACKAGE
+$ /data/nativetest64/$PACKAGE/$PACKAGE $INTERFACE $INSTANCE $THREAD_COUNT
+Trying to adapt down [email protected]/default
+Press any key to disassociate adapter.</pre>
+    </li>
+
+    <li>使用 <code>adb shell stop</code>(或 <code>start</code>)重启客户端,或者仅终止相应进程。</li>
+
+    <li>测试完成后,取消关联适配器。</li>
+
+    <li>通过重启设备或重启客户端来恢复系统状态。</li>
+  </ol>
+
+  <h3 id="additional-targets">其他目标</h3>
+
+  <p>对于编译系统中使用 <code>hidl_interface</code> 指定的每个接口,<code>hidl-gen</code> 会自动为其适配器添加额外的编译目标。对于软件包 <code>[email protected]</code>,还需添加额外的 C++ 目标 <code>[email protected]</code>。</p>
+
+  <aside class="note"><strong>注意</strong>:无需提供任何 Java 适配器,因为 C++ 适配器始终可用于封装 Java 服务。</aside>
+
+  <p><code>[email protected]</code> 的适配器将一些实现 <code>a.b.c@x.(y+n)::ISomething/instance-name</code> 用作输入,并且必须注册 <code>[email protected]::ISomething/instance-name</code>,还必须取消注册 <code>y+n</code> 实现。</p>
+
+  <p>假设有如下示例接口:</p>
+
+<pre>// IFoo.hal
+package [email protected];
+interface IFoo {
+    doFoo(int32_t a) generates (int64_t b);
+    doSubInterface() generates (IFoo a);
+};</pre>
+
+  <p>由 <code>[email protected]</code> 提供的代码与以下示例类似:</p>
+
+  <pre>// autogenerated code
+// in namespace a::b::c::V1_0::IFoo
+struct MockFoo {
+    // takes some subclass of V1_0. May be V1_1, V1_2, etc...
+    MockFoo(V1_0::IFoo impl) mImpl(impl) {}
+
+    Return&lt;int64_t&gt; doFoo(int32_t a) {
+        return this-&gt;mImpl-&gt;doFoo(a);
+    }
+
+    Return&lt;V1_0::ICallback&gt; doSubInterface() {
+        // getMockForBinder returns MockCallback instance
+        // that corresponds to a particular binder object
+        // It can't return a new object every time or
+        // clients using interfacesSame will have
+        // divergent behavior when using the mock.
+        auto _hidl_out = this-&gt;mImpl-&gt;doSubInterface();
+        return getMockForBinder(_hidl_out);
+    }
+};</pre>
+
+  <p>数据值会精确地转发到自动生成的模拟类以及从中转出,子接口除外(它们会返回)。这些接口必须封装在相应的最新回调对象中。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/hidl/memoryblock.html b/zh-cn/devices/architecture/hidl/memoryblock.html
new file mode 100644
index 0000000..29c0a7d
--- /dev/null
+++ b/zh-cn/devices/architecture/hidl/memoryblock.html
@@ -0,0 +1,230 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="hidl_memory_block" class="page-title">HIDL 内存块</h1>
+
+<p>HIDL MemoryBlock 是构建在 <code>hidl_memory</code>、<code>HIDL
[email protected]::IAllocator</code> 和 <code>HIDL @1.0::IMapper</code> 之上的抽象层,专为有多个内存块共用单个内存堆的 HIDL 服务而设计。</p>
+
+<h2 id="performance_improvements">性能提升</h2>
+
+<p>在应用中使用 MemoryBlock 可显著减少 <code>mmap</code>/<code>munmap</code> 数量和用户空间细分错误,从而提升性能。例如:</p>
+
+<ul>
+<li>对每个缓冲区分配使用一个 <code>hidl_memory</code>,则每次分配平均用时 238 us。</li>
+<li>使用 <code>MemoryBlock</code> 并共享单个 <code>hidl_memory</code>,则每次分配平均用时 2.82 us。</li>
+</ul>
+
+<h2 id="architecture">架构</h2>
+
+<p>HIDL MemoryBlock 架构包括一些有多个内存块共用单个内存堆的 HIDL 服务:</p>
+
+<p><img src="/devices/architecture/images/hidl_memoryblock_arch.png" alt="HIDL MemoryBlock"/></p>
+
+<p><strong>图 1.</strong> HIDL MemoryBlock 架构</p>
+
+<h2 id="normal_usage">常规用法</h2>
+
+<p>本部分提供了一个关于如何通过以下方式使用 MemoryBlock 的示例:先声明 HAL,然后实现 HAL。</p>
+
+<h3 id="declaring_the_hal">声明 HAL</h3>
+
+<p>对于以下示例 IFoo HAL:</p>
+<pre class="prettyprint"><code>import [email protected]::MemoryBlock;
+
+interface IFoo {
+    getSome() generates(MemoryBlock block);
+    giveBack(MemoryBlock block);
+};
+</code></pre>
+<p><code>Android.bp</code> 如下所示:</p>
+<pre class="prettyprint"><code>hidl_interface {
+    ...
+    srcs: [
+        "IFoo.hal",
+    ],
+    interfaces: [
+        "[email protected]",
+        ...
+};
+</code></pre>
+<h3 id="implementing_the_hal">实现 HAL</h3>
+
+<p>要实现示例 HAL,请执行以下操作:</p>
+
+<ol>
+<li><p>获取 <code>hidl_memory</code>(有关详情,请参阅 <a href="/devices/architecture/hidl-cpp/">HIDL C++</a>)。</p>
+<pre class="prettyprint"><code>#include &lt;android/hidl/allocator/1.0/IAllocator.h&gt;
+
+using ::android::hidl::allocator::V1_0::IAllocator;
+using ::android::hardware::hidl_memory;
+...
+  sp&lt;IAllocator&gt; allocator = IAllocator::getService("ashmem");
+  allocator-&gt;allocate(2048, [&amp;](bool success, const hidl_memory&amp; mem)
+  {
+        if (!success) { /* error */ }
+        // you can now use the hidl_memory object 'mem' or pass it
+  }));
+</code></pre></li>
+<li><p>使用获取的 <code>hidl_memory</code> 创建 <code>HidlMemoryDealer</code>:</p>
+<pre class="prettyprint"><code>#include &lt;hidlmemory/HidlMemoryDealer.h&gt;
+
+using ::android::hardware::HidlMemoryDealer
+/* The mem argument is acquired in the Step1, returned by the ashmemAllocator-&gt;allocate */
+sp&lt;HidlMemoryDealer&gt; memory_dealer = HidlMemoryDealer::getInstance(mem);
+</code></pre></li>
+<li><p>分配 <code>MemoryBlock</code>(使用 HIDL 定义的结构体)。</p>
+
+<p>示例 <code>MemoryBlock</code>:</p>
+<pre class="prettyprint"><code>struct MemoryBlock {
+IMemoryToken token;
+uint64_t size;
+uint64_t offset;
+};
+</code></pre>
+<p>使用 <code>MemoryDealer</code> 分配 <code>MemoryBlock</code> 的示例:</p>
+<pre class="prettyprint"><code>#include &lt;android/hidl/memory/block/1.0/types.h&gt;
+
+using ::android::hidl::memory::block::V1_0::MemoryBlock;
+
+Return&lt;void&gt; Foo::getSome(getSome_cb _hidl_cb) {
+    MemoryBlock block = memory_dealer-&gt;allocate(1024);
+    if(HidlMemoryDealer::isOk(block)){
+        _hidl_cb(block);
+    ...
+</code></pre></li>
+<li><p>解除 <code>MemoryBlock</code> 分配:</p>
+<pre class="prettyprint"><code>Return&lt;void&gt; Foo::giveBack(const MemoryBlock&amp; block) {
+    memory_dealer-&gt;deallocate(block.offset);
+...
+</code></pre></li>
+<li><p>操控数据:</p>
+<pre class="prettyprint"><code>#include &lt;hidlmemory/mapping.h&gt;
+#include &lt;android/hidl/memory/1.0/IMemory.h&gt;
+
+using ::android::hidl::memory::V1_0::IMemory;
+
+sp&lt;IMemory&gt; memory = mapMemory(block);
+uint8_t* data =
+
+static_cast&lt;uint8_t*&gt;(static_cast&lt;void*&gt;(memory-&gt;getPointer()));
+</code></pre></li>
+<li><p>配置 <code>Android.bp</code>:</p>
+<pre class="prettyprint"><code>shared_libs: [
+        "[email protected]",
+
+        "[email protected]"
+
+        "[email protected]",
+        "libhidlbase",
+        "libhidlmemory",
+</code></pre></li>
+<li><p>查看流程,确定是否需要 <code>lockMemory</code>。</p>
+
+<p>通常,MemoryBlock 使用引用计数来维护共享的 <code>hidl_memory</code>:当其中有 <code>MemoryBlock</code> 首次被映射时,系统会对该内存执行 <code>mmap()</code> 操作;如果没有任何内容引用该内存,则系统会对其执行 <code>munmap()</code> 操作。为确保始终映射 <code>hidl_memory</code>,您可以使用 <code>lockMemory</code>,这是一种 RAII 样式的对象,可使相应的 <code>hidl_memory</code> 在整个锁定生命周期内保持映射状态。示例:</p>
+<pre class="prettyprint"><code>#include &lt;hidlmemory/mapping.h&gt;
+
+sp&lt;RefBase&gt; lockMemory(const sp&lt;IMemoryToken&gt; key);
+</code></pre></li>
+</ol>
+
+<h2 id="extended_usage">扩展用法</h2>
+
+<p>本部分详细介绍了 <code>MemoryBlock</code> 的扩展用法。</p>
+
+<h3 id="using_reference_count_to_manage_memoryblock">使用引用计数来管理 Memoryblock</h3>
+
+<p>在大多数情况下,要使用 MemoryBlock,最高效的方法是明确分配/解除分配。不过,在复杂应用中,使用引用计数进行垃圾回收可能会更好。要获得 MemoryBlock 的引用计数,您可以将 MemoryBlock 与 binder 对象绑定,这有助于对引用进行计数,并在计数降至零时解除 MemoryBlock 分配。</p>
+
+<h3 id="declaring_the_hal_2">声明 HAL</h3>
+
+<p>声明 HAL 时,请描述包含 MemoryBlock 和 IBase 的 HIDL 结构体:</p>
+<pre class="prettyprint"><code>import [email protected]::MemoryBlock;
+
+struct MemoryBlockAllocation {
+    MemoryBlock block;
+    IBase refcnt;
+};
+</code></pre>
+<p>使用 <code>MemoryBlockAllocation</code> 替换 <code>MemoryBlock</code> 并移除相应方法,以返回 <code>MemoryBlock</code>。该内存块将由引用计数功能通过 <code>MemoryBlockAllocation</code> 解除分配。示例:</p>
+<pre class="prettyprint"><code>interface IFoo {
+    allocateSome() generates(MemoryBlockAllocation allocation);
+};
+</code></pre>
+<h3 id="implementing_the_hal_2">实现 HAL</h3>
+
+<p>HAL 服务端实现示例:</p>
+<pre class="prettyprint"><code>class MemoryBlockRefCnt: public virtual IBase {
+   MemoryBlockRefCnt(uint64_t offset, sp&lt;MemoryDealer&gt; dealer)
+     : mOffset(offset), mDealer(dealer) {}
+   ~MemoryBlockRefCnt() {
+       mDealer-&gt;deallocate(mOffset);
+   }
+ private:
+   uint64_t mOffset;
+   sp&lt;MemoryDealer&gt; mDealer;
+};
+
+Return&lt;void&gt; Foo::allocateSome(allocateSome_cb _hidl_cb) {
+    MemoryBlockAllocation allocation;
+    allocation.block = memory_dealer-&gt;allocate(1024);
+    if(HidlMemoryDealer::isOk(block)){
+        allocation.refcnt= new MemoryBlockRefCnt(...);
+        _hidl_cb(allocation);
+</code></pre>
+<p>HAL 客户端实现示例:</p>
+<pre class="prettyprint"><code>ifoo-&gt;allocateSome([&amp;](const MemoryBlockAllocation&amp; allocation){
+    ...
+);
+</code></pre>
+<h3 id="attachingretrieving_metadata">附加/检索元数据</h3>
+
+<p>某些应用需要额外的数据才能与所分配的 <code>MemoryBlock</code> 绑定。您可以使用以下两种方法来附加/检索元数据:</p>
+
+<ul>
+<li><p>如果应用访问元数据的频率与访问内存块本身的频率相同,请附加元数据并以结构体的形式传递所有元数据。示例:</p>
+<pre class="prettyprint"><code>import [email protected]::MemoryBlock;
+
+struct MemoryBlockWithMetaData{
+    MemoryBlock block;
+    MetaDataStruct metaData;
+};
+</code></pre></li>
+<li><p>如果应用访问元数据的频率远低于访问内存块的频率,则使用接口被动传递元数据会更加高效。示例:</p>
+<pre class="prettyprint"><code>import [email protected]::MemoryBlock;
+
+struct MemoryBlockWithMetaData{
+    MemoryBlock block;
+    IMetaData metaData;
+};
+</code></pre>
+<p>接下来,使用 Memory Dealer 将元数据和 MemoryBlock 绑定在一起。示例:</p>
+<pre class="prettyprint"><code>MemoryBlockWithMetaData memory_block;
+memory_block.block = dealer-&gt;allocate(size);
+if(HidlMemoryDealer::isOk(block)){
+    memory_block.metaData = new MetaData(...);
+</code></pre></li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/hidl/services.html b/zh-cn/devices/architecture/hidl/services.html
index bccf7de..c177952 100644
--- a/zh-cn/devices/architecture/hidl/services.html
+++ b/zh-cn/devices/architecture/hidl/services.html
@@ -99,7 +99,7 @@
 <p>要简化内存所有权,方法调用和回调只能接受 <code>in</code> 参数,并且不支持 <code>out</code> 或 <code>inout</code> 参数。</p>
 
 <h3 id="limits">每事务限制</h3>
-<p>每事务限制可能会强制限制在 HIDL 方法和回调中发送的数据量。具体限制尚不确定,但可能小至 4K。超出这些限制的调用会立即返回失败。另一个限制是可供 HIDL 基础架构处理多个同时进行的事务的资源。由于多个线程或进程向一个进程发送调用或者接收进程未能快速处理多个 <code>oneway</code> 调用,因此多个事务可能会同时进行。</p>
+<p>每事务限制不会强制限制在 HIDL 方法和回调中发送的数据量。但是,每事务调用 4KB 以上的数据便被视为过度调用。如果发生这种情况,建议重新设计给定 HIDL 接口的架构。另一个限制是可供 HIDL 基础架构处理多个同时进行的事务的资源。由于多个线程或进程向一个进程发送调用或者接收进程未能快速处理多个 <code>oneway</code> 调用,因此多个事务可能会同时进行。默认情况下,所有并发事务可用的最大总空间为 1MB。</p>
 
 <p>在设计良好的接口中,不应出现超出这些资源限制的情况;如果超出的话,则超出资源的调用可能会阻塞,直到资源可用或发出传输错误的信号。每当因正在进行的总事务导致出现超出每事务限制或溢出 HIDL 实现资源的情况时,系统都会记录下来以方便调试。</p>
 
diff --git a/zh-cn/devices/architecture/hidl/types.html b/zh-cn/devices/architecture/hidl/types.html
index 6ff875d..ca597e5 100644
--- a/zh-cn/devices/architecture/hidl/types.html
+++ b/zh-cn/devices/architecture/hidl/types.html
@@ -171,7 +171,7 @@
 <p>当您调用传递(或返回)<code>hidl_handle</code> 对象(复合类型的顶级或一部分)的 HIDL 接口方法时,其中包含的文件描述符的所有权如下所述:</p>
 
 <ul>
-<li>将 <code>hidl_handle</code> 对象作为参数传递的<strong>调用程序</strong>会保留对其封装的 <code>native_handle_t</code> 中包含的文件描述符的所有权;在对这些文件描述符完成操作后,该调用程序必须将其关闭。</li>
+<li>将 <code>hidl_handle</code> 对象作为参数传递的<strong>调用程序</strong>会保留对它所封装的 <code>native_handle_t</code> 中包含的文件描述符的所有权;在对这些文件描述符完成操作后,该调用程序必须将其关闭。</li>
 <li>返回 <code>hidl_handle</code> 对象(通过将其传递到 <code>_cb</code> 函数)的<strong>进程</strong>会保留对相应对象封装的 <code>native_handle_t</code> 中包含的文件描述符的所有权;在对这些文件描述符完成操作后,该进程必须将其关闭。
 </li>
 <li>接收 <code>hidl_handle</code> 的 <strong>transport</strong> 拥有对相应对象封装的 <code>native_handle_t</code> 中的文件描述符的所有权;接收器可在事务回调期间按原样使用这些文件描述符,但如果想在回调完成后继续使用这些文件描述符,则必须克隆原生句柄。事务完成时,transport 将自动对文件描述符执行 <code>close()</code> 操作。</li>
diff --git a/zh-cn/devices/architecture/kernel/config.html b/zh-cn/devices/architecture/kernel/config.html
index 5c57a4a..3b256e9 100644
--- a/zh-cn/devices/architecture/kernel/config.html
+++ b/zh-cn/devices/architecture/kernel/config.html
@@ -4,6 +4,7 @@
     <meta name="book_path" value="/_book.yaml"/>
   </head>
   <body>
+
   <!--
       Copyright 2017 The Android Open Source Project
 
@@ -20,48 +21,85 @@
       limitations under the License.
   -->
 
-<p>您可以将以下配置设置用作 Android 内核配置的基础。设置会整理到 <code>android-base</code>、<code>android-base-&lt;arch&gt;</code> 和 <code>android-recommended</code>.cfg 文件中:</p>
+<p>
+  您可以将以下配置设置用作 Android 内核配置的基础。设置会整理到 <code>android-base</code>、<code>android-base-<var>ARCH</var></code> 和 <code>android-recommended</code> .cfg 文件中:
+</p>
 
 <ul>
-<li><code>android-base</code>。这些选项可实现核心 Android 功能,并且应配置为所有设备指定的选项。</li>
-<li><code>android-base-&lt;arch&gt;</code>。这些选项可实现核心 Android 功能,并且应配置为架构 &lt;arch&gt; 的所有设备指定的选项。并非所有架构都具有相应的特定于架构的必需选项文件。如果您的架构没有相应文件,则它没有任何额外特定于架构的 Android 内核配置要求。</li>
-<li><code>android-recommended</code>。这些选项可实现高级 Android 功能,设备可选择性启用。</li>
+  <li><code>android-base</code>。这些选项可实现核心 Android 功能,并且应配置为所有设备指定的选项。</li>
+  <li><code>android-base-<var>ARCH</var></code>。这些选项可实现核心 Android 功能,并且应配置为架构 ARCH 的所有设备指定的选项。并非所有架构都具有相应的特定于架构的必需选项文件。<var></var>如果您的架构没有相应文件,则它没有额外特定于架构的 Android 内核配置要求。</li>
+  <li><code>android-recommended</code>。这些选项可实现高级 Android 功能,设备可选择性启用。</li>
 </ul>
 
-<p>这些配置文件位于 <code><a href="https://android.googlesource.com/kernel/configs/" class="external">kernel/configs</a></code> repo 中。使用一组对应您正在使用的内核版本的配置文件。</p>
+<p>
+  这些配置文件位于 <code><a href="https://android.googlesource.com/kernel/configs/" class="external">kernel/configs</a></code> repo 中。使用一组对应您正在使用的内核版本的配置文件。
+</p>
 
-<p>如需详细了解已用于加强设备内核的控件,请参阅<a href="/security/overview/kernel-security.html">系统和内核安全</a>。如需详细了解必需的设置,请参阅 <a href="/compatibility/cdd.html">Android 兼容性定义文档 (CDD)</a>。</p>
+<p>
+  如需详细了解已用于加强设备内核的控件,请参阅<a href="/security/overview/kernel-security.html">系统和内核安全</a>。如需详细了解必需的设置,请参阅 <a href="/compatibility/cdd.html">Android 兼容性定义文档 (CDD)</a>。
+</p>
 
 <h2 id="generating">生成内核配置</h2>
-<p>对于具有极简 defconfig 的设备,您可以在内核树中使用 <code>merge_config.sh</code> 脚本来启用选项:</p>
+
+<p>
+  对于具有极简 <code>defconfig</code> 的设备,您可以在内核树中使用 <code>merge_config.sh</code> 脚本来启用选项:
+</p>
 
 <pre class="devsite-click-to-copy">
-ARCH=&lt;arch&gt; scripts/kconfig/merge_config.sh &lt;...&gt;/device_defconfig &lt;...&gt;/android-base.cfg &lt;...&gt;/android-base-&lt;arch&gt;.cfg &lt;...&gt;/android-recommended.cfg
+ARCH=<var>ARCH</var> scripts/kconfig/merge_config.sh &lt;...&gt;/device_defconfig &lt;...&gt;/android-base.cfg &lt;...&gt;/android-base-<var>ARCH</var>.cfg &lt;...&gt;/android-recommended.cfg
 </pre>
 
-<p>这会生成一个 <code>.config</code> 文件,您可以使用该文件来保存新的 defconfig 或编译一个启用 Android 功能的新内核。</p>
+<p>
+  这会生成一个 <code>.config</code> 文件,您可以使用该文件来保存新的 <code>defconfig</code> 或编译一个启用 Android 功能的新内核。
+</p>
+
+<h2 id="additional-kernel-reqs">其他内核配置要求</h2>
+
+<p>
+  在某些情况下,平台维护人员可以从多项内核功能中进行选择以满足 Android 依赖项的要求。此类依赖项不能在内核配置片段文件(如上所述)中表示,因为这些文件的格式不支持逻辑表达式。在 Android 9 中,<a href="/compatibility/cts/">兼容性测试套件 (CTS)</a> 和<a href="/compatibility/vts/">供应商测试套件 (VTS)</a> 会验证是否满足以下要求:
+</p>
+
+<ul>
+  <li><code>CONFIG_OF=y</code> 或 <code>CONFIG_ACPI=y</code></li>
+  <li>4.4 和 4.9 内核具有 <code>CONFIG_ANDROID_LOW_MEMORY_KILLER=y</code>,或同时具有 <code>CONFIG_MEMCG=y</code> 和 <code>CONFIG_MEMCG_SWAP=y</code>
+  </li>
+  <li><code>CONFIG_DEBUG_RODATA=y</code> 或 <code>CONFIG_STRICT_KERNEL_RWX=y</code></li>
+  <li><code>CONFIG_DEBUG_SET_MODULE_RONX=y</code> 或 <code>CONFIG_STRICT_MODULE_RWX=y</code></li>
+  <li>仅适用于 ARM64:<code>CONFIG_ARM64_SW_TTBR0_PAN=y</code> 或 <code>CONFIG_ARM64_PAN=y</code></li>
+</ul>
+
+<p>
+  此外,对于 Android 9 中的 4.9 内核,必须将 <code>CONFIG_INET_UDP_DIAG</code> 选项设置为 <code>y</code>。
+</p>
 
 <h2 id="usb">启用 USB 主机模式选项</h2>
 
-<p>对于 USB 主机模式音频,请启用以下选项:</p>
+<p>
+  对于 USB 主机模式音频,请启用以下选项:
+</p>
+
 <pre class="devsite-click-to-copy">
 CONFIG_SND_USB=y
 CONFIG_SND_USB_AUDIO=y
 # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
 </pre>
 
-<p>对于 USB 主机模式 MIDI,请启用以下选项:</p>
-<pre class="devsite-click-to-copy">
-CONFIG_SND_USB_MIDI=y
-</pre>
+<p>
+  对于 USB 主机模式 MIDI,请启用以下选项:
+</p>
+
+<pre class="devsite-click-to-copy">CONFIG_SND_USB_MIDI=y</pre>
 
 <h2 id="Seccomp-BPF-TSYNC">Seccomp-BPF 与 TSYNC</h2>
-<p>Seccomp-BPF 是一种内核安全技术,支持创建沙盒来限制进程可以进行的系统调用。TSYNC 功能可以实现从多线程程序中使用 Seccomp-BPF。这种能力仅限具有 seccomp 支持上游的架构:ARM、ARM64、x86 和 x86_64。</p>
+
+<p>
+  Seccomp-BPF 是一种内核安全技术,支持创建沙盒来限制进程可以进行的系统调用。TSYNC 功能可以实现从多线程程序中使用 Seccomp-BPF。这种能力仅限由上游提供 seccomp 支持的架构(ARM、ARM64、x86 和 x86_64)。
+</p>
 
 <h3 id="backport-ARM-32">用于 ARM-32、X86、X86_64 的内核 3.10 向后移植</h3>
 
-<p>确保已在 Kconfig 中启用 <code>CONFIG_SECCOMP_FILTER=y</code>(截至 Android 5.0 CTS 已验证),然后择优挑选来自 AOSP kernel/common:android-3.10 代码库的以下变更:<a href="https://android.googlesource.com/kernel/common/+log/9499cd23f9d05ba159
-fac6d55dc35a7f49f9ce76..a9ba4285aa5722a3b4d84888e78ba8adc0046b28" class="external"></a>
+<p>
+  确保已在 <code>Kconfig</code> 中启用 <code>CONFIG_SECCOMP_FILTER=y</code>(截至 Android 5.0 CTS 已验证),然后择优挑选来自 <a href="https://android.googlesource.com/kernel/common/+log/9499cd23f9d05ba159fac6d55dc35a7f49f9ce76..a9ba4285aa5722a3b4d84888e78ba8adc0046b28" class="external">AOSP kernel/common:android-3.10 代码库</a>的以下变更:
 </p>
 
 <ul>
@@ -88,8 +126,7 @@
 <li><a href="https://android.googlesource.com/kernel/common/+/f14a5db2398afed8f416d244e6da6b23940997c6" class="external">f14a5db
 seccomp: implement SECCOMP_FILTER_FLAG_TSYNC</a>(seccomp:实施 SECCOMP_FILTER_FLAG_TSYNC),作者:Kees Cook</li>
 <li><a href="https://android.googlesource.com/kernel/common/+/9ac860041db860a59bfd6ac82b31d6b6f76ebb52" class="external">9ac8600
-seccomp: Replace BUG(!spin_is_locked()) with assert_spin_lock</a>(seccomp:用 assert_spin_lock 替换 BUG(!spin_is_locked())),作者:Guenter
-Roeck</li>
+seccomp: Replace BUG(!spin_is_locked()) with assert_spin_lock</a>(seccomp:用 assert_spin_lock 替换 BUG(!spin_is_locked())),作者:Guenter Roeck</li>
 <li><a href="https://android.googlesource.com/kernel/common/+/900e9fd0d5d15c596cacfb89ce007c933cea6e1c" class="external">900e9fd
 seccomp: fix syscall numbers for x86 and x86_64</a>(seccomp:修复 x86 和 x86_64 的系统调用号),作者:Lee Campbell</li>
 <li><a href="https://android.googlesource.com/kernel/common/+/a9ba4285aa5722a3b4d84888e78ba8adc0046b28" class="external">a9ba428
@@ -97,7 +134,10 @@
 </ul>
 
 <h3 id="backport-ARM-64">用于 ARM-64 的内核 3.10 向后移植</h3>
-<p>确保 Kconfig 中已启用 <code>CONFIG_SECCOMP_FILTER=y</code>(截至 Android 5.0 CTS 已验证),然后择优挑选来自 AOSP kernel/common:android-3.10 存储区的以下变更:</p>
+
+<p>
+  确保已在 <code>Kconfig</code> 中启用 <code>CONFIG_SECCOMP_FILTER=y</code>(截至 Android 5.0 CTS 已验证),然后择优挑选来自 AOSP kernel/common:android-3.10 代码库的以下变更:</p>
+
 <ul>
 <li><a href="https://android.googlesource.com/kernel/common/+/cfc7e99e9e3900056028a7d90072e9ea0d886f8d" class="external">cfc7e99e9
 arm64: Add __NR_* definitions for compat syscalls</a>(arm64:为兼容性系统调用添加 __NR_* 定义),作者:JP Abgrall</li>
@@ -126,8 +166,7 @@
 <li><a href="https://android.googlesource.com/kernel/common/+/f14a5db2398afed8f416d244e6da6b23940997c6" class="external">f14a5db
 seccomp: implement SECCOMP_FILTER_FLAG_TSYNC</a>(seccomp:实施 SECCOMP_FILTER_FLAG_TSYNC),作者:Kees Cook</li>
 <li><a href="https://android.googlesource.com/kernel/common/+/9ac860041db860a59bfd6ac82b31d6b6f76ebb52" class="external">9ac8600
-seccomp: Replace BUG(!spin_is_locked()) with assert_spin_lock</a>(seccomp:用 assert_spin_lock 替换 BUG(!spin_is_locked())),作者:Guenter
-Roeck</li>
+seccomp: Replace BUG(!spin_is_locked()) with assert_spin_lock</a>(seccomp:用 assert_spin_lock 替换 BUG(!spin_is_locked())),作者:Guenter Roeck</li>
 <li><a href="https://android.googlesource.com/kernel/common/+/900e9fd0d5d15c596cacfb89ce007c933cea6e1c" class="external">900e9fd
 seccomp: fix syscall numbers for x86 and x86_64</a>(seccomp:修复 x86 和 x86_64 的系统调用号),作者:Lee Campbell</li>
 <li><a href="https://android.googlesource.com/kernel/common/+/a9ba4285aa5722a3b4d84888e78ba8adc0046b28" class="external">a9ba428
diff --git a/zh-cn/devices/architecture/kernel/modular-kernels.html b/zh-cn/devices/architecture/kernel/modular-kernels.html
index a072282..4655003 100644
--- a/zh-cn/devices/architecture/kernel/modular-kernels.html
+++ b/zh-cn/devices/architecture/kernel/modular-kernels.html
@@ -124,7 +124,7 @@
 <li>完整 Android 模式或充电模式所需的 SoC 供应商内核模块应该位于 <code>/vendor/lib/modules</code> 中。</li>
 <li>如果存在 ODM 分区,则完整 Android 模式或充电模式所需的 ODM 内核模块应该位于 <code>/odm/lib/modules</code> 中。如果不存在,则这些模块应该位于 <code>/vendor/lib/modules</code> 中。</li>
 <li>恢复模式所需的 SoC 供应商和 ODM 的内核模块应该位于 <code>/lib/modules</code> 下的恢复 <code>ramfs</code> 中。</li>
-<li>如果恢复模式和完整 Android 模式/充电模式都需要某个内核模块,则该模块应同时位于恢复 <code>rootfs</code> 和 <code>/vendor</code>/<code>/odm<strong> </strong></code>分区中(如上所述)。</li>
+<li>如果恢复模式和完整 Android 模式/充电模式都需要某个内核模块,则该模块应同时位于恢复 <code>rootfs</code> 和 <code>/vendor</code> 或 <code>/odm<strong> </strong></code> 分区中(如上所述)。</li>
 <li>恢复模式所用的内核模块不应依赖仅位于 <code>/vendor</code> 或 <code>/odm</code> 中的模块,因为这些分区在恢复模式下没有装载。</li>
 <li>SoC 供应商内核模块不应依赖 ODM 内核模块。</li>
 </ul>
@@ -198,7 +198,9 @@
 <ol>
 <li>设备节点路径必须在 <code>fstab</code> 和设备树条目中使用其 by-name 符号链接。<em></em>例如,确保对分区进行命名且设备节点为 <code>/dev/block/…./by-name/{system,vendor,odm}</code>,而不是使用 <code>/dev/block/mmcblk0pX</code> 指定分区。
 </li>
-<li>在产品的设备配置中(即 <code>device/<em>oem</em>/<em>project</em>/device.mk</code> 中)为 <code>PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION</code> 和 <code>CUSTOM_IMAGE_VERITY_BLOCK_DEVICE</code> 指定的路径必须与 <code>fstab</code>/设备树条目中指定 by-name 的相应块设备节点相匹配。<em></em>例如:
+<li>在产品的设备配置中(即 <code>device/<em>oem</em>/<em>project</em>/device.mk</code> 中)为 <code>PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION</code> 和 <code>CUSTOM_IMAGE_VERITY_BLOCK_DEVICE</code> 指定的路径必须与 <code>fstab</code>/设备树条目中相应块设备节点指定的 by-name 相匹配。<em></em>
+
+Ruby例如:
 <pre class="prettyprint">
 PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/…./by-name/system
 PRODUCT_VENDOR_VERITY_PARTITION := /dev/block/…./by-name/vendor
@@ -446,7 +448,7 @@
 <li>如有需要,将升级到 Android 8.x 或 9 的早期 Android 设备可以继续使用原来的基础内核版本。</li>
 </ul>
 
-<p>要详细了解 LTS 内核,请参阅<a href="/devices/architecture/kernel/releases#long-term-stable-kernels">长期稳定内核</a>和 <a href="https://source.android.com/devices/architecture/kernel/android-common">Android 通用内核</a></p>
+<p>要详细了解 LTS 内核,请参阅<a href="/devices/architecture/kernel/releases#long-term-stable-kernels">长期稳定的内核</a>和 <a href="https://source.android.com/devices/architecture/kernel/android-common">Android 通用内核</a></p>
 
 <h3 id="device-tree-support">设备树支持</h3>
 <p>内核中必须启用设备树支持,且引导加载程序必须将硬件描述以设备树的形式传递给内核(除非平台支持 ACPI)。设备树还必须可供 Android 读取,且能够将供应商/ODM 特有的参数传递给 Android。
diff --git a/zh-cn/devices/architecture/vintf/comp-matrices.html b/zh-cn/devices/architecture/vintf/comp-matrices.html
index 1b2ef54..e00725e 100644
--- a/zh-cn/devices/architecture/vintf/comp-matrices.html
+++ b/zh-cn/devices/architecture/vintf/comp-matrices.html
@@ -22,15 +22,15 @@
 
 <p>本部分介绍框架和设备兼容性矩阵以及<a href="#compatibility-matrix-schema">兼容性矩阵结构</a>。有关匹配规则,请参见<a href="/devices/architecture/vintf/match-rules.html">匹配规则</a>一文。</p>
 
-<h2 id="framework-compatibility-matrix">框架兼容性矩阵</h2>
-<p>框架兼容性矩阵说明了框架对运行它的设备的需求。矩阵文件与 Android 框架映像(位于 <code>system.img</code> 中)相关联。框架的兼容性矩阵的需求应通过设备清单来满足(在启动和 OTA 时需求是被强制执行的)。</p>
+<h2 id="framework-compatibility-matrix">框架兼容性矩阵 (FCM)</h2>
+<p>框架兼容性矩阵说明了框架对运行它的设备的要求。矩阵文件与 Android 框架映像(位于 <code>system.img</code> 中)相关联。FCM 的要求应通过设备清单来满足(在启动和 OTA 时要求是被强制执行的)。</p>
 
-<p>框架兼容性矩阵文件示例:</p>
+<p>示例 FCM 文件:</p>
 
 <pre class="prettyprint">
 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
 &lt;!-- Comments, Legal notices, etc. here --&gt;
-&lt;compatibility-matrix version="1.0" type="framework"&gt;
+&lt;compatibility-matrix version="1.0" type="framework" level="3"&gt;
     &lt;hal&gt;
         &lt;name&gt;android.hardware.camera&lt;/name&gt;
         &lt;version&gt;1.0&lt;/version&gt;
@@ -38,6 +38,7 @@
         &lt;interface&gt;
             &lt;name&gt;ICameraProvider&lt;/name&gt;
             &lt;instance&gt;default&lt;/instance&gt;
+            &lt;regex-instance&gt;[a-z_]+/[0-9]+&lt;/regex-instance&gt;
         &lt;/interface&gt;
     &lt;/hal&gt;
     &lt;hal&gt;
@@ -62,6 +63,16 @@
         &lt;version&gt;1.1&lt;/version&gt;
     &lt;/hal&gt;
     &lt;kernel version="3.18.51"&gt;
+        &lt;!-- common configs --&gt;
+    &lt;/kernel&gt;
+    &lt;kernel version="3.18.51"&gt;
+        &lt;!-- arm specific configs --&gt;
+        &lt;condition&gt;
+            &lt;config&gt;
+                &lt;key&gt;CONFIG_ARM&lt;/key&gt;
+                &lt;value type="tristate"&gt;y&lt;/value&gt;
+            &lt;/config&gt;
+        &lt;condition&gt;
         &lt;config&gt;
             &lt;key&gt;CONFIG_A&lt;/key&gt;
             &lt;value type="string"&gt;&lt;/value&gt;
@@ -72,6 +83,7 @@
         &lt;/config&gt;
     &lt;/kernel&gt;
     &lt;kernel version="4.1.22"&gt;
+        &lt;!-- common configs --&gt;
         &lt;config&gt;
             &lt;key&gt;CONFIG_A&lt;/key&gt;
             &lt;value type="string"&gt;foo&lt;/value&gt;
@@ -97,10 +109,12 @@
 &lt;/compatibility-matrix&gt;
 </pre>
 
-<h2 id="device-compatibility-matrix">设备兼容性矩阵</h2>
-<p>设备兼容性矩阵说明了设备期望框架满足的一组需求(在启动和 OTA 时需求是被强制执行的)。
+<p>有关详情,请参阅 <a href="/devices/architecture/vintf/fcm">FCM 生命周期</a>。</p>
+
+<h2 id="device-compatibility-matrix">设备兼容性矩阵 (DCM)</h2>
+<p>设备兼容性矩阵说明了设备期望框架满足的一组要求(在启动和 OTA 时要求是被强制执行的)。
 </p>
-<p>设备兼容性矩阵文件示例:</p>
+<p>示例 DCM 文件:</p>
 
 <pre class="prettyprint">
 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
@@ -138,19 +152,23 @@
             &lt;instance&gt;default&lt;/instance&gt;
         &lt;/interface&gt;
     &lt;/hal&gt;
-    &lt;xmlfile format="dtd" optional="false"&gt;
-        &lt;name&gt;sample_xml&lt;/name&gt;
-        &lt;version&gt;1.0&lt;/version&gt;
-    &lt;/xmlfile&gt;
+    &lt;vendor-ndk&gt;
+        &lt;version&gt;27&lt;/version&gt;
+    &lt;/vendor-ndk&gt;
+    &lt;system-sdk&gt;
+        &lt;version&gt;27&lt;/version&gt;
+    &lt;/system-sdk&gt;
 &lt;/compatibility-matrix&gt;
 </pre>
 
 <h2 id="compatibility-matrix-schema">兼容性矩阵结构</h2>
+<p>本部分介绍这些 XML 标记的含义。Android 源代码树中的源文件中可以缺少某些“必需”标记,这些标记会在编译时由 <code><a href="/devices/architecture/vintf/resources#assemble_vintf">assemble_vintf</a></code> 写入。设备上的相应文件中必须有“必需”标记。</p>
+
 <dl>
 <dt><code>?xml</code></dt>
 <dd>可选。它只向 XML 解析器提供信息。</dd>
 <dt><code>compatibility-matrix.version</code></dt>
-<dd>必需。该兼容性矩阵的版本。描述清单中预期的元素。与 XML 版本无关。</dd>
+<dd>必需。此兼容性矩阵的元版本。描述兼容性矩阵中预期的元素。与 XML 版本无关。</dd>
 <dt><code>compatibility-matrix.type</code></dt>
 <dd>必需。该兼容性矩阵的类型:
  <ul>
@@ -158,6 +176,8 @@
  <li><code>"framework"</code>:框架兼容性矩阵。</li>
  </ul>
 </dd>
+<dt><code>manifest.level</code></dt>
+<dd>框架兼容性矩阵的必需标记。指定此文件的框架兼容性矩阵版本(FCM 版本)。不应在设备对应的框架兼容性矩阵(即 <code>DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE</code>)中声明。</dd>
 <dt><code>compatibility-matrix.hal</code></dt>
 <dd>可选且可重复。列出兼容性矩阵(框架或设备)的所有者要求存在的单个 HAL(HIDL 或本机)。HAL 条目通过 <code>&lt;name&gt;</code> 元素来区分,可以有多个同名的 HAL 条目(暗示“和”条件)。
 </dd>
@@ -169,7 +189,7 @@
  </ul>
 </dd>
 <dt><code>compatibility-matrix.hal.optional</code></dt>
-<dd>属性是可选的,默认值为 false。指明该 HAL 对兼容性矩阵(框架或设备)的所有者来说是否为可选。如果将 <code>&amp;ltp;hal&gt;</code> 条目标记为可选,则表示在存在的情况下所有者可以使用该 HAL,但并非是必须存在。</dd>
+<dd>属性是可选的,默认值为 false。指明该 HAL 对兼容性矩阵(框架或设备)的所有者来说是否为可选。如果将 <code>&lt;hal&gt;</code> 条目标记为可选,则表示在存在的情况下所有者可以使用该 HAL,但并非是必须存在。</dd>
 <dt><code>compatibility-matrix.hal.name</code></dt>
 <dd>必需。该 HAL 的完整软件包名称。示例:
  <ul>
@@ -185,8 +205,16 @@
 <dd>必需。接口的名称。</dd>
 <dt><code>compatibility-matrix.hal.interface.instance</code></dt>
 <dd>可选且可重复。该接口的必需实例的列表。</dd>
+<dt><code>compatibility-matrix.hal.interface.regex-instance</code></dt>
+<dd>可选且可重复。该接口上的必需实例名称模式的列表。使用<a href="http://man7.org/linux/man-pages/man7/regex.7.html" class="external">扩展正则表达式</a>格式。</dd>
+<dt><code>compatibility-matrix.kernel</code></dt>
+<dd>可选且可重复。指定框架在每个内核版本上必需的内核配置的列表。<br />
+可以存在具有同一 <code>&lt;version&gt;</code> 的多个 <code>&lt;kernel&gt;</code>,暗含着“and”(与)的关系。每个 <code>&lt;kernel&gt;</code> 都是需求的一个“片段”,相应需求只有在满足 <code>&lt;conditions&gt;</code> 时才会得到支持。</dd>
 <dt><code>compatibility-matrix.kernel.version</code></dt>
-<dd>必需。内核版本。格式为 <code>{version}.{major-revision}.{minor-revision}</code>。版本和主要修订版本必须完全匹配,次要修订版本定义框架期望的内核的最低 LTS 版本。</dd>
+<dd>必需。内核版本。格式为 <code><var>VERSION</var>.<var>MAJOR_REVISION</var>.<var>MINOR_REVISION</var></code>。版本和主要修订版本必须完全匹配。次要修订版本定义框架期望的内核的最低 LTS 版本。</dd>
+<dt><code>compatibility-matrix.kernel.condition</code></dt>
+<dd>可选。对于每个版本的第一个 <code>&lt;kernel&gt;</code>,必须不存在。指定了条件列表。只有满足条件时才会支持此 <code>&lt;kernel&gt;</code> 片段中声明的需求。
+</dd>
 <dt><code>compatibility-matrix.kernel.config</code></dt>
 <dd>可选且可重复。列出该内核版本必须匹配的 <code>CONFIG</code> 项。每个 <code>CONFIG</code> 项是一个键值对,配置项通过键来区分。</dd>
 <dt><code>compatibility-matrix.kernel.config.key</code></dt>
@@ -217,6 +245,14 @@
 <dd>必需。声明框架支持的 <code>policydb</code> 版本。</dd>
 <dt><code>compatibility-matrix.avb.vbmeta-version</code></dt>
 <dd>可选,仅供框架兼容性矩阵使用。声明用于对 <code>system.img</code> 签名的 <a href="/devices/architecture/vintf/match-rules.html#avb-version">AVB 版本</a>。</dd>
+<dt><code>compatibility-matrix.vendor-ndk</code></dt>
+<dd>可选,仅供设备兼容性矩阵使用。声明 VNDK 供应商快照的要求。如果缺失,则系统映像对 VNDK 没有要求。</dd>
+<dt><code>compatibility-matrix.vendor-ndk.version</code></dt>
+<dd>必需。正整数,用于声明供应商映像所需的 VNDK 版本。</dd>
+<dt><code>compatibility-matrix.vendor-ndk.library</code></dt>
+<dd>可选且可重复。声明供应商映像所需的一组 VNDK 库。与 <code>manifest.vendor-ndk.library</code> 语义相同。</dd>
+<dt><code>compatibility-matrix.system-sdk.version</code></dt>
+<dd>可选且可重复,仅供设备兼容性矩阵使用。声明供应商应用对 System SDK 版本的要求。如果缺失,则系统映像对系统 SDK 没有要求。</dd>
 </dl>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/vintf/dm.html b/zh-cn/devices/architecture/vintf/dm.html
new file mode 100644
index 0000000..d067196
--- /dev/null
+++ b/zh-cn/devices/architecture/vintf/dm.html
@@ -0,0 +1,122 @@
+<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.
+  -->
+
+<p>在开发和发布新设备时,供应商可以在设备清单 (DM) 中定义和声明目标 FCM 版本。升级旧设备的供应商映像时,供应商可以选择实现新的 HAL 版本并递增目标 FCM 版本。</p>
+
+<aside class="note"><strong>注意</strong>:有关本页中所用术语的详细信息,请参阅<a href="/devices/architecture/vintf/fcm#terminology">术语</a>。
+</aside>
+
+<h2 id="develop-new-devices">开发新设备</h2>
+<p>在为新设备定义设备目标 FCM 版本时:</p>
+
+<ol>
+<li>不要定义 <code>DEVICE_MANIFEST_FILE</code> 和 <code>PRODUCT_ENFORCE_VINTF_MANIFEST</code>。</li>
+<li>为目标 FCM 版本实现 HAL。</li>
+<li>编写正确的设备清单文件。</li>
+<li>将目标 FCM 版本写入设备清单文件。</li>
+<li>设置 <code>DEVICE_MANIFEST_FILE</code>。</li>
+<li>将 <code>PRODUCT_ENFORCE_VINTF_MANIFEST</code> 设置为 <code>true</code>。</li>
+</ol>
+
+<h2 id="release-new-devices">发布新设备</h2>
+<p>发布新设备时,需要确定设备的初始目标 FCM 版本,并在设备清单中通过顶级 <code>&lt;manifest&gt;</code> 元素中的“<code>target-level</code>”属性予以声明。</p>
+
+<p>例如,搭载 Android 9 的设备的目标 FCM 版本必须为 3(目前已提供更高版本)。您可通过以下命令在设备清单中予以声明:</p>
+
+<pre class="prettyprint">
+&lt;manifest version="1.0" type="device" target-level="3"&gt;
+    &lt;!-- ... --&gt;
+&lt;/manifest&gt;
+</pre>
+
+<h2 id="upgrade-vendor-image">升级供应商映像</h2>
+<p>升级旧设备的供应商映像时,供应商可以选择实现新的 HAL 版本并递增目标 FCM 版本。</p>
+
+<h3 id="upgrade-hals">升级 HAL</h3>
+<p>在供应商映像升级期间,供应商可以实现新的 HAL 版本,前提是 HAL 名称、接口名称和实例名称均相同。例如:</p>
+
+<ul>
+<li>Google Pixel 2 和 Pixel 2 XL 设备发布时目标 FCM 版本为 2,实现了所需的音频 2.0 HAL <code>[email protected]::IDeviceFactory/default</code>。</li>
+<li>对于随 Android 9 发布的音频 4.0 HAL,Google Pixel 2 和 Pixel 2 XL 设备可以通过完整 OTA 升级至 4.0 HAL,其中实现了 <code>[email protected]::IDeviceFactory/default</code>。</li>
+<li>尽管 <code>compatibility_matrix.2.xml</code> 仅指定了音频 2.0,但由于 Android 9 框架(FCM 版本为 3)认为音频 4.0 在功能方面可以替代音频 2.0 HAL,因此对采用目标 FCM 版本 2 的供应商映像的要求已放宽。
+</li>
+</ul>
+
+<p>简而言之,鉴于 <code>compatibility_matrix.2.xml</code> 需要音频 2.0,而 <code>compatibility_matrix.3.xml</code> 需要音频 4.0,应遵循以下要求:</p>
+
+<table>
+<thead>
+<tr>
+<th>FCM 版本(系统)</th>
+<th>目标 FCM 版本(供应商)</th>
+<th>要求</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>2 (8.1)</td>
+<td>2 (8.1)</td>
+<td>音频 2.0</td>
+</tr>
+<tr>
+<td>3 (9)</td>
+<td>2 (8.1)</td>
+<td>音频 2.0 或 4.0</td>
+</tr>
+<tr>
+<td>3 (9)</td>
+<td>3 (9)</td>
+<td>音频 4.0</td>
+</tr>
+</tbody>
+</table>
+
+<h3 id="upgrade=target-fcm">升级目标 FCM 版本</h3>
+
+<p>在供应商映像升级期间,供应商还可以递增目标 FCM 版本,以指定可与升级后的供应商映像配合使用的目标 FCM 版本。要达到设备的目标 FCM 版本,供应商需要:</p>
+
+<ol>
+<li>为目标 FCM 版本实现所有需要的新 HAL 版本。</li>
+<li>在设备清单文件中修改 HAL 版本。</li>
+<li>在设备清单文件中修改目标 FCM 版本。</li>
+<li>移除已弃用的 HAL 版本。</li>
+<li>对于搭载版本 9 或更低版本的设备,先择优挑选以下 CL,然后再生成 OTA 更新程序包:
+  <ul>
+    <li><a href="https://android-review.googlesource.com/722283">CL 722283</a></li>
+    <li><a href="https://android-review.googlesource.com/722284">CL 722284</a></li>
+    <li><a href="https://android-review.googlesource.com/722345">CL 722345</a></li>
+  </ul>
+</li>
+</ol>
+
+<p>例如,Google Pixel 和 Pixel XL 设备搭载的是 Android 7.0,因此它们的目标 FCM 版本一定至少是旧版。不过,<a href="https://android.googlesource.com/device/google/marlin/+/0a276ad8b98fde395ed99a4b303434800c07049e/manifest.xml#1" class="external">设备清单</a>中声明了目标 FCM 版本为 2,这是因为供应商映像已更新,以符合 <code>compatibility_matrix.2.xml</code>:</p>
+
+<pre class="prettyprint">
+&lt;manifest version="1.0" type="device" target-level="2"&gt;
+</pre>
+
+<p>如果供应商未实现所有需要的新 HAL 版本或未移除弃用的 HAL 版本,则无法升级目标 FCM 版本。</p>
+
+<p>例如,Google Pixel 2 和 Pixel 2 XL 设备采用的是目标 FCM 版本 2。虽然它们实现了 <code>compatibility_matrix.3.xml</code> 所需的一些 HAL(例如音频 4.0、health 2.0 等),但未移除在 FCM 版本 3 (Android 9) 中弃用的 <code>[email protected]</code>。因此,这些设备无法将目标 FCM 版本升级至 3。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/vintf/fcm.html b/zh-cn/devices/architecture/vintf/fcm.html
new file mode 100644
index 0000000..a39e0eb
--- /dev/null
+++ b/zh-cn/devices/architecture/vintf/fcm.html
@@ -0,0 +1,277 @@
+<html devsite><head>
+    <title>FCM 生命周期</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.
+  -->
+
+<p>Android 框架版本具有多个框架兼容性矩阵 (FCM),每个矩阵对应一个可升级的目标 FCM 版本,用于定义框架可以使用哪些内容以及目标 FCM 版本要求。在 FCM 生命周期中,Android 会弃用并移除 HIDL HAL,然后修改 FCM 文件,以反映 <a href="#hal-version-status">HAL 版本</a>的状态。
+
+</p><p>要在自己的生态系统中启用仅针对框架的 OTA,扩展供应商接口的合作伙伴还应使用相同的方法弃用并移除 HIDL HAL。</p>
+
+<aside class="note"><strong>注意</strong>:要详细了解 HIDL HAL,请参阅<a href="/devices/architecture/vintf/comp-matrices">兼容性矩阵</a>、<a href="/devices/architecture/vintf/match-rules">匹配规则</a>和 <a href="/devices/architecture/hidl/versioning">HIDL HAL 版本编号</a>。</aside>
+
+<h2 id="terminology">术语</h2>
+
+<table>
+<tbody><tr>
+<th>框架兼容性矩阵 (FCM)</th>
+<td>一种 XML 文件,用于指定需要满足哪些框架要求才是合规的供应商实现。兼容性矩阵带有版本编号,对于每个框架版本,都会冻结一个新版本的兼容性矩阵。每个框架版本都包含多个 FCM。</td>
+</tr>
+<tr>
+<th>平台 FCM 版本 (S<sub>F</sub>)</th>
+<td>框架版本中所有 FCM 版本的集合。框架适用于所有符合其中一个 FCM 的供应商实现。</td>
+</tr>
+<tr>
+<th>FCM 版本 (F)</th>
+<td>在框架版本中,所有 FCM 中的最高版本。</td>
+</tr>
+<tr>
+<th>目标 FCM 版本 (V)</th>
+<td>供应商实现符合的目标 FCM 版本(S<sub>F</sub> 中的版本),已在设备清单中明确声明。必须针对已发布的 FCM 生成供应商实现,即使它可能在其设备清单中声明了更高的 HAL 版本,也是如此。</td>
+</tr>
+<tr>
+<th>HAL 版本</th>
+<td>HAL 版本采用 <code>[email protected]</code> 格式,其中 <code>foo</code> 是 HAL 名称,<code>x.y</code> 是具体版本;例如 <code>[email protected]</code>、<code>[email protected]</code>(本文档中省略了根前缀,例如 <code>android.hardware</code>。)</td>
+</tr>
+<tr>
+<th>设备清单</th>
+<td>一种 XML 文件,用于指定供应商映像提供了哪些 HAL 版本。设备清单的内容受设备的目标 FCM 版本限制,但可以列出与 V 对应的 FCM 相比更新的 HAL。</td>
+</tr>
+</tbody></table>
+
+<h2 id="develop-new-fcm">使用新 FCM 版本进行开发</h2>
+<p>Android 会针对每个框架版本递增 FCM 版本(如 Android 8、8.1 等)。在开发期间,会创建新的 <code>compatibility_matrix.current.xml</code> (<code>F</code>),且不再更改现有的 <code>compatibility_matrix.f.xml</code>(其中 <code>f</code> &lt; <code>F</code>)。</p>
+
+<p>要开始使用新 FCM 版本 <code>F</code> 进行开发,请执行以下操作:</p>
+
+<ol>
+<li>将最新的 <code>compatibility_matrix.&lt;F-1&gt;.xml</code> 复制到 <code>compatibility_matrix.current.xml</code>。</li>
+<li>将文件中的 <code>level</code> 属性更新为 <code>F</code>。</li>
+<li>添加相应的编译规则,以便将此兼容性矩阵安装到设备。</li>
+</ol>
+
+<h2 id="introduce-new-hal">引入新 HAL</h2>
+<p>在开发期间,为使用当前有效 FCM 版本 <code>F</code> 的 Android 引入新 HAL(WLAN、NFC 等)时,请将相应 HAL 添加到 <code>compatibility_matrix.current.xml</code>,并采用以下 <code>optional</code> 设置:</p>
+
+<ul>
+<li><code>optional="false"</code>(如果搭载 <code>V = F</code> 的设备必须附带此 HAL),<br />
+<br />
+或者
+<br />
+</li>
+<li><code>optional="true"</code>(如果搭载 <code>V = F</code> 的设备可以不附带此 HAL)。</li>
+</ul>
+
+<p>例如,Android 8.1 引入了 <code>[email protected]</code> 作为选用 HAL。搭载 Android 8.1 的设备无需实现此 HAL,因此将以下条目添加到了 <code>compatibility_matrix.current.xml</code>(Android 8.1 发布后已改名为 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.2.xml#74" class="external">compatibility_matrix.2.xml</a></code>)中:</p>
+
+<pre class="prettyprint">
+&lt;hal format="hidl" optional="true"&gt;
+    &lt;name&gt;android.hardware.cas&lt;/name&gt;
+    &lt;version&gt;1.0&lt;/version&gt;
+    &lt;interface&gt;
+        &lt;name&gt;IMediaCasService&lt;/name&gt;
+        &lt;instance&gt;default&lt;/instance&gt;
+    &lt;/interface&gt;
+&lt;/hal&gt;
+</pre>
+
+<h2 id="upgrade-hal-minor">升级 HAL (Minor)</h2>
+<p>开发期间,在当前有效 FCM 版本 <code>F</code> 下将 HAL 的 Minor 版本从 <code>x.z</code> 升级到 <code>x.(z+1)</code> 时,如果:</p>
+
+<ul>
+<li>搭载 <code>V = F</code> 的设备必须使用此版本,则 <code>compatibility_matrix.current.xml</code> 必须声明 <code>x.(z+1)</code> 和 <code>optional="false"</code>。</li>
+<li>搭载 <code>V = F</code> 的设备无需使用此版本,则 <code>compatibility_matrix.current.xml</code> 必须从 <code>compatibility_matrix.&lt;F-1&gt;.xml</code> 复制 <code>x.y-z</code> 和可选性,并将版本更改为 <code>x.w-(z+1)</code>(其中 <code>w &gt;= y</code>)。</li>
+</ul>
+
+<p>例如,Android 8.1 引入了 <code>[email protected]</code> 作为 1.0 HAL 的 Minor 版本升级。对于搭载 Android 8.0 的设备,较旧版本 <code>[email protected]</code> 是选用版本;对于搭载 Android 8.1 的设备,较新版本 <code>[email protected]</code> 是选用版本。在 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.1.xml#58" class="external">compatibility_matrix.1.xml</a></code> 中:</p>
+
+<pre class="prettyprint">
+&lt;hal format="hidl" optional="true"&gt;
+    &lt;name&gt;android.hardware.broadcastradio&lt;/name&gt;
+    &lt;version&gt;1.0&lt;/version&gt;
+    &lt;interface&gt;
+        &lt;name&gt;IBroadcastRadioFactory&lt;/name&gt;
+        &lt;instance&gt;default&lt;/instance&gt;
+    &lt;/interface&gt;
+&lt;/hal&gt;
+</pre>
+
+<p>此条目复制到了 <code>compatibility_matrix.current.xml</code>(Android 8.1 发布后已改名为 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.2.xml#58">compatibility_matrix.2.xml</a></code>),并进行了以下修改:</p>
+
+<pre class="prettyprint">
+&lt;hal format="hidl" optional="true"&gt;
+    &lt;name&gt;android.hardware.broadcastradio&lt;/name&gt;
+    &lt;version&gt;1.0-1&lt;/version&gt;
+    &lt;interface&gt;
+        &lt;name&gt;IBroadcastRadioFactory&lt;/name&gt;
+        &lt;instance&gt;default&lt;/instance&gt;
+    &lt;/interface&gt;
+&lt;/hal&gt;
+</pre>
+
+<h2 id="upgrade-hal-major">升级 HAL (Major)</h2>
+<p>在开发期间,当 HAL 有在当前有效 FCM 版本 <code>F</code> 下的 Major 版本升级时,新的 Major 版本 <code>x.0</code> 会添加到 <code>compatibility_matrix.current.xml</code>,并会采用以下 <code>optional</code> 设置:</p>
+
+<ul>
+<li><code>optional="false"</code> 且仅包含版本 <code>x.0</code>(如果搭载 <code>V = F</code> 的设备必须附带 <code>x.0</code>)。</li>
+<li><code>optional="false"</code>,但与较旧的 Major 版本位于同一个 <code>&lt;hal&gt;</code> 标记中(如果搭载 <code>V = F</code> 的设备必须附带此 HAL,但可以附带较旧的 Major 版本)。</li>
+<li><code>optional="true"</code>(如果搭载 <code>V = F</code> 的设备无需附带此 HAL)。</li>
+</ul>
+
+<p>例如,Android 9 引入了 <code>[email protected]</code> 作为 1.0 HAL 的 Major 版本升级,并弃用了 1.0 HAL。对于搭载 Android 8.0 和 Android 8.1 的设备,较旧版本 <code>[email protected]</code> 是选用版本。搭载 Android 9 的设备不得提供已弃用的 1.0 HAL,必须改为提供新的 2.0 版本。在 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.legacy.xml#150" class="external">compatibility_matrix.legacy.xml</a></code>、<code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.1.xml#150" class="external">compatibility_matrix.1.xml</a></code> 和 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.2.xml#158" class="external">compatibility_matrix.2.xml</a></code> 中:</p>
+
+<pre class="prettyprint">
+&lt;hal format="hidl" optional="true"&gt;
+    &lt;name&gt;android.hardware.health&lt;/name&gt;
+    &lt;version&gt;1.0&lt;/version&gt;
+    &lt;interface&gt;
+        &lt;name&gt;IHealth&lt;/name&gt;
+        &lt;instance&gt;default&lt;/instance&gt;
+    &lt;/interface&gt;
+&lt;/hal&gt;
+</pre>
+
+<p>此条目复制到了 <code>compatibility_matrix.current.xml</code>(在 Android 9 版本中已改名为 <code>compatibility_matrix.3.xml</code>),并进行了以下修改:</p>
+
+<pre class="prettyprint">
+&lt;hal format="hidl" optional="false"&gt;
+    &lt;name&gt;android.hardware.health&lt;/name&gt;
+    &lt;version&gt;2.0&lt;/version&gt;
+    &lt;interface&gt;
+        &lt;name&gt;IHealth&lt;/name&gt;
+        &lt;instance&gt;default&lt;/instance&gt;
+    &lt;/interface&gt;
+&lt;/hal&gt;
+</pre>
+
+<p>限制条件:</p>
+<ul>
+<li>由于 2.0 HAL 在 <code>compatibility_matrix.3.xml</code> 中且 <code>optional="false"</code>,因此搭载 Android 9 的设备必须附带 2.0 HAL。</li>
+<li>由于 1.0 HAL 不在 <code>compatibility_matrix.3.xml</code> 中,因此搭载 Android 9 的设备不得提供 1.0 HAL(因为此 HAL 会被视为已弃用)。</li>
+<li>由于 1.0 HAL 作为选用 HAL 存在于 legacy/1/2.xml(Android 9 可以支持的较旧 FCM 版本)中,因此 Android 9 框架仍可以支持 1.0 HAL(不会被视为已移除的 HAL 版本)。</li>
+</ul>
+
+<h2 id="new-fcm-versions">新 FCM 版本</h2>
+<p>FCM 版本的发布过程是在 AOSP 发布时由 Google 单独完成的,包含以下步骤:</p>
+
+<ol>
+<li>将 <code>compatibility_matrix.current.xml</code> 改名为 <code>compatibility_matrix.F.xml</code>。</li>
+<li>确保该文件具有属性 <code>level="F"</code>。</li>
+<li>修改相应<a href="https://android.googlesource.com/platform/hardware/interfaces/+/2d8442c76270b2c32816d1dac56bbd536b0bf790/compatibility_matrices/Android.mk" class="external">编译规则</a>,以反映文件名更改。</li>
+<li>确保所有设备都已编译并启动。</li>
+<li><a href="https://android.googlesource.com/platform/test/vts-testcase/hal/+/95e09aca7711cace6184077debc556b05335a8b1/treble/vintf/vts_treble_vintf_test.cpp#87" class="external">更新 VTS 测试</a>,确保附带最新框架(基于 Shipping API 级别)的设备搭载的目标 FCM 版本 <code>V &gt;= F</code>。</li>
+<li>将文件发布到 AOSP。</li>
+</ol>
+
+<p>此文件一经改名并发布,便<strong>无法</strong>更改。例如,在 Android 9 开发期间,针对 <code>hardware/interfaces/compatibility_matrices/</code> <a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/Android.mk" class="external">编译</a>了以下文件:</p>
+
+<ul>
+<li><code>compatibility_matrix.legacy.xml</code></li>
+<li><code>compatibility_matrix.1.xml</code></li>
+<li><code>compatibility_matrix.2.xml</code></li>
+<li><code>compatibility_matrix.current.xml</code></li>
+</ul>
+
+<p>Android 9 发布后,<code>compatibility_matrix.current.xml</code> 改名为 <code>compatibility_matrix.3.xml</code>,并针对 <code>hardware/interfaces/compatibility_matrices/</code> 编译了以下文件:</p>
+
+<ul>
+<li><code>compatibility_matrix.legacy.xml</code></li>
+<li><code>compatibility_matrix.1.xml</code></li>
+<li><code>compatibility_matrix.2.xml</code></li>
+<li><code>compatibility_matrix.3.xml</code></li>
+</ul>
+
+<p>
+<a href="https://android.googlesource.com/platform/test/vts-testcase/hal/+/95e09aca7711cace6184077debc556b05335a8b1/treble/vintf/vts_treble_vintf_test.cpp#435" class="external">VTS 测试</a>旨在确保搭载 Android 9 的设备的目标 FCM 版本 &gt;= 3。</p>
+
+<h2 id="hal-version-deprecation">HAL 版本弃用</h2>
+
+<p>是否弃用 HAL 版本由开发者决定(例如,是否弃用 AOSP HAL 由 Google 决定)。发布较高版本的 HAL(无论是 Minor 版本还是 Major 版本)时,可能需要做出此类决定。如果在 FCM 版本 <code>F</code> 下弃用指定 HAL <code>[email protected]</code>,则意味着任何搭载目标 FCM 版本 <code>V = F</code> 或更高版本的设备都不得在 <code>x.y</code> 或任何低于 <code>x.y</code> 的版本下实现 <code>foo</code>。框架仍支持已弃用的 HAL 版本,以便升级设备。</p>
+
+<p>FCM 版本 <code>F</code> 发布后,如果目标 FCM 版本 <code>V = F</code> 对应的最新 FCM 中未明确声明 HAL 版本 <code>[email protected]</code>,则该版本会被视为已弃用。对于搭载 <code>V</code> 的设备,以下条件之一为 true:</p>
+
+<ul>
+<li>框架需要较高版本(Major 版本或 Minor 版本);</li>
+<li>框架不再需要该 HAL。</li>
+</ul>
+
+<p>例如,Android 9 引入了 <code>[email protected]</code> 作为 1.0 HAL 的 Major 版本升级。<code>[email protected]</code> 从 <code>compatibility_matrix.3.xml</code> 中移除了,但存在于 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.legacy.xml#150" class="external">compatibility_matrix.legacy.xml</a></code>、<code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.1.xml#150" class="external">compatibility_matrix.1.xml</a></code> 和 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.2.xml#158" class="external">compatibility_matrix.2.xml</a></code> 中。因此,<code>[email protected]</code> 会被视为已弃用。</p>
+
+<h2 id="removal-of-support">取消对目标 FCM 版本的支持</h2>
+<p>当搭载某个目标 FCM 版本 <code>V</code> 的有效设备数量降至特定阈值以下时,应将该目标 FCM 版本从下一个框架版本的 S<sub>F</sub> 集中移除,方法是从编译规则中移除 <code>compatibility_matrix.V.xml</code>(以便它不再安装在系统映像中),并删除用于实现或依赖于已移除功能的所有代码。如果设备搭载的目标 FCM 版本不在指定框架版本的 S<sub>F</sub> 之内,则无法升级到该版本。</p>
+
+<h2 id="hal-version-status">HAL 版本状态</h2>
+<p>下文介绍了 HAL 版本的可能状态(按时间先后顺序)。</p>
+
+<h3 id="hal-unreleased">未发布</h3>
+<p>如果 HAL 版本不在任何公开且冻结的兼容性矩阵中,则被视为未发布且可能正在开发中。这包括仅在 <code>compatibility_matrix.current.xml</code> 中的 HAL 版本。示例:</p>
+
+<ul>
+<li>在 Android 9 开发期间(在 <code>compatibiility_matrix.current.xml</code> 改名为 <code>compatibility_matrix.3.xml</code> 之前),<code>[email protected]</code> HAL 被视为未发布的 HAL。</li>
+<li><code>[email protected]</code> HAL 不在任何已发布的兼容性矩阵中,也被视为未发布的 HAL。</li>
+</ul>
+
+<h3 id="hal-released-and-current">已发布且当前有效</h3>
+<p>如果 HAL 版本位于任何公开且冻结的兼容性矩阵中,则为已发布版本。例如,FCM 版本 3 冻结(当 <code>compatibiility_matrix.current.xml</code> 已改名为 <code>compatibility_matrix.3.xml</code> 时)并发布到 AOSP 后,<code>[email protected]</code> HAL 会被视为已发布且当前有效的 HAL 版本。
+</p>
+
+<p>如果 HAL 版本位于包含最高 FCM 版本的公开且冻结兼容性矩阵中(<code>compatibility_matrix.current.xml</code> 除外),则 HAL 版本为当前有效版本(即未弃用版本)。例如,如果现有 HAL 版本(例如,在 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.legacy.xml#198" class="external">compatibility_matrix.legacy.xml</a></code> 中引入的 <code>[email protected]</code>)继续存在于 <code>compatibility_matrix.3.xml</code> 中,则也会被视为已发布且当前有效的 HAL 版本。</p>
+
+<h3 id="hal-released-but-deprecated">已发布但已弃用</h3>
+<p>当且仅当存在以下情况时,HAL 版本会被视为已弃用:</p>
+
+<ul>
+<li>已发布;</li>
+<li>不在包含最高 FCM 版本的公开且冻结兼容性矩阵中;</li>
+<li>在框架仍支持的公开且冻结兼容性矩阵中。</li>
+</ul>
+
+<p>示例:</p>
+
+<ul>
+<li><code>[email protected]</code> HAL 在 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.legacy.xml#150" class="external">compatibility_matrix.legacy.xml</a></code>、<code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.1.xml#150" class="external">compatibility_matrix.1.xml</a></code> 和 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.2.xml#158" class="external">compatibility_matrix.2.xml</a></code> 中,但不在 <code>compatibility_matrix.3.xml</code> 中。因此,它在 Android 9 中被视为已弃用。</li>
+<li>电量 HAL 在 Android 9 中有 Minor 版本升级,但 <code>[email protected]</code> 仍在 <code>compatibility_matrix.3.xml</code> 中。
+<ul>
+<li><code>[email protected]</code> 在 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.legacy.xml#206" class="external">compatibility_matrix.legacy.xml</a></code>、<code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.1.xml#206" class="external">compatibility_matrix.1.xml</a></code> 和 <code><a href="https://android.googlesource.com/platform/hardware/interfaces/+/241e5aba9ebfe85a9599b333f89be51905148f81/compatibility_matrices/compatibility_matrix.2.xml#222" class="external">compatibility_matrix.2.xml</a></code> 中。</li>
+<li><code>compatibility_matrix.3.xml</code> 包含 <code>[email protected]</code>。</li>
+</ul>
+</li>
+</ul>
+
+<p>因此,在 Android 9 中,<code>[email protected]</code> 为当前有效版本,而<strong>不是</strong>已弃用版本。</p>
+
+<h3 id="hal-removed">已移除</h3>
+<p>当且仅当存在以下情况时,HAL 版本会被视为已移除:</p>
+
+<ul>
+<li>之前已发布;</li>
+<li>不在框架支持的任何公开且冻结兼容性矩阵中。</li>
+</ul>
+
+<p>不受框架支持的公开且冻结兼容性矩阵会保留在代码库中,以便指定已移除的 HAL 版本集,从而可以写入 VTS 测试,确保新设备上没有已移除的 HAL。
+</p>
+
+<h2>旧版 FCM</h2>
+<p>对于所有不支持 Treble 的设备,旧版目标 FCM 版本是一个特殊值。旧版 FCM <code>compatibility_matrix.legacy.xml</code> 列出了框架对旧版设备(即搭载 Android 8.0 之前版本的设备)的要求。
+</p>
+
+<p>如果版本为 <code>F</code> 的 FCM 具有此文件,则任何不支持 Treble 的设备均可升级到 <code>F</code>,但前提是其设备清单与此文件兼容。移除旧版 FCM 的程序与移除其他目标 FCM 版本对应的 FCM 的程序相同(在搭载 8.0 之前版本的有效设备数量降至特定阈值以下后移除)。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/vintf/match-rules.html b/zh-cn/devices/architecture/vintf/match-rules.html
index 81f40b4..3f944f8 100644
--- a/zh-cn/devices/architecture/vintf/match-rules.html
+++ b/zh-cn/devices/architecture/vintf/match-rules.html
@@ -3,6 +3,7 @@
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
+
   <body>
   <!--
       Copyright 2017 The Android Open Source Project
@@ -256,7 +257,7 @@
 </li>
 </ul>
 
-<p>引导加载程序或 Android 操作系统可能包含 <code>libavb</code> 库的两个副本,每个副本具有不同的 MAJOR 版本,用于升级设备和启动设备。<em></em><em></em>在这种情况下,可以共享同一个未签名的系统映像,但最终签名的系统映像是不同的(具有不同的 <code>avb.vbmeta-version</code>):</p>
+<p>引导加载程序或 Android 操作系统可能包含 <code>libavb</code> 库的两个副本,每个副本具有不同的 MAJOR 版本,用于升级设备和启动设备。<em></em><em></em>在这种情况下,可以共享同一个未签名的系统映像,但最终的签名系统映像则不同(它具有不同的 <code>avb.vbmeta-version</code>):</p>
 
 <img src="../images/treble_vintf_avb_o_p.png"/>
 <figcaption><strong>图 1. </strong>AVB 版本匹配(<code>/system</code> 为 P,其他所有分区均为 O)。</figcaption>
@@ -296,6 +297,27 @@
 ro.boot.vbmeta.avb_version       == 2.1 <font style="font-family: Roboto, Arial, Helvetica, sans-serif; background-color: green; color: white"> match </font>
 </pre>
 
+<h3 id="avb-version-ota">在 OTA 期间匹配 AVB 版本</h3>
+<p>对于搭载 Android 9 或更低版本的设备,在 OTA 期间,系统会将框架兼容性矩阵中的 AVB 版本要求与设备上的当前 AVB 版本进行匹配。如果 AVB 版本在 OTA 期间进行主要版本升级(例如,从 0.0 升级到 1.0),则 OTA 中的检查不会反映 OTA 之后的兼容性。</p>
+<p>为了缓解这个问题,原始设备制造商 (OEM) 可以在 OTA 软件包 (<code>compatibility.zip</code>) 中放置一个假 AVB 版本来通过检查。为此,请执行以下操作:</p>
+<ol>
+<li>择优挑选以下 CL 并将其添加到 Android 9 源代码树中:
+<ul>
+  <li><a href="https://android-review.googlesource.com/732261" class="external">CL 732261</a></li>
+  <li><a href="https://android-review.googlesource.com/732262" class="external">CL 732262</a></li>
+</ul>
+</li>
+<li>为设备定义 <code>BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE</code>。其值应该等于 OTA 之前的 AVB 版本,即设备启动时的 AVB 版本。</li>
+<li>重新构建 OTA 软件包。</li>
+</ol>
+<p>这些更改会自动将 <code>BOARD_OTA_FRAMEWORK_VBMETA_VERSION_OVERRIDE</code> 作为 <code>compatibility-matrix.avb.vbmeta-version</code> 放置在以下文件中:
+</p><ul>
+  <li>设备上的 <code>/system/compatibility_matrix.xml</code>(未在 Android 9 中使用)</li>
+  <li>OTA 软件包中 <code>compatibility.zip</code> 内的 <code>system_matrix.xml</code></li>
+</ul>
+这些更改不会影响其他框架兼容性矩阵,包括 <code>/system/etc/vintf/compatibility_matrix.xml</code>。在 OTA 之后,<code>/system/etc/vintf/compatibility_matrix.xml</code> 中的新值将用于进行兼容性检查。
+<p></p>
+
 <h2 id="vndk">VNDK 版本匹配</h2>
 <p>设备兼容性矩阵在 <code>compatibility-matrix.vendor-ndk.version</code> 中声明所需的 VNDK 版本。如果设备兼容性矩阵没有 <code>&lt;vendor-ndk&gt;</code> 标记,则系统不会实施任何要求,因此始终将其视为匹配项。</p>
 <p>如果设备兼容性矩阵具有 <code>&lt;vendor-ndk&gt;</code> 标记,则系统会从框架在框架清单中提供的 VNDK 供应商快照集中查找具有匹配 <code>&lt;version&gt;</code> 的 <code>&lt;vendor-ndk&gt;</code> 条目。如果不存在此类条目,则没有匹配项。</p>
diff --git a/zh-cn/devices/architecture/vintf/objects.html b/zh-cn/devices/architecture/vintf/objects.html
index b5d738d..6fd46c8 100644
--- a/zh-cn/devices/architecture/vintf/objects.html
+++ b/zh-cn/devices/architecture/vintf/objects.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>VINTF 对象数据</title>
+    <title>清单</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
@@ -20,18 +20,26 @@
       limitations under the License.
   -->
 
-<p>VINTF 对象会在<a href="#runtime-data">运行时</a>汇总来自<a href="#device-manifest-file">设备清单</a>和<a href="#framework-manifest-file">框架清单</a>文件 (XML) 以及设备本身的数据。这两个清单共用一种格式,不过并非所有元素都适用于两者(有关结构的详细信息,请参见<a href="#manifest-file-schema">清单文件结构</a>)。</p>
-
-<h2 id="device-manifest-file">设备清单文件</h2>
-<p>设备清单文件由设备提供。它在 Android 源代码树中位于 <code>device/${VENDOR}/${DEVICE}/manifest.xml</code>,在设备上位于 <code><a href="https://android.googlesource.com/platform/system/libhidl/+/master/vintfdata/manifest.xml" class="external">/vintfdata/manifest.xml</a></code>。
+<p>VINTF 对象会在系统<a href="#runtime-data">运行时</a>汇总<a href="#device-manifest-file">设备清单</a>和<a href="#framework-manifest-file">框架清单</a>文件 (XML) 中的数据以及设备本身的数据。这两个清单采用同一种格式,不过并非所有元素都适用于两者(有关架构方面的详细信息,请参阅<a href="#manifest-file-schema">清单文件架构</a>)。
 </p>
 
-<p>设备清单示例:</p>
+<h2 id="device-manifest-file">设备清单</h2>
+<p>设备清单(由设备提供)包含供应商清单和 ODM 清单:</p>
+
+<ul>
+<li>供应商清单会指定 SoC 通用的 HAL、VNDK 版本等信息。建议将其放置在 Android 源代码树的 <code>device/${VENDOR}/${DEVICE}/manifest.xml</code> 中,但可以使用多个片段文件。有关详情,请参阅<a href="/devices/architecture/vintf/resources.html#manifest-fragments">从片段生成设备清单</a>。
+</li>
+<li>ODM 清单会覆盖供应商清单,并列出产品专用的 HAL。</li>
+</ul>
+
+<p>此设置可让采用相同开发板的多个产品共用同一个供应商映像(用于提供通用 HAL),但具有不同的 ODM 映像(用于指定产品专用的 HAL)。</p>
+
+<p>供应商清单示例:</p>
 
 <pre class="prettyprint">
 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
 &lt;!-- Comments, Legal notices, etc. here --&gt;
-&lt;manifest version="1.0" type="device"&gt;
+&lt;manifest version="1.0" type="device" target-level="1"&gt;
     &lt;hal&gt;
         &lt;name&gt;android.hardware.camera&lt;/name&gt;
         &lt;transport&gt;hwbinder&lt;/transport&gt;
@@ -61,6 +69,21 @@
             &lt;instance&gt;default&lt;/instance&gt;
         &lt;/interface&gt;
     &lt;/hal&gt;
+    &lt;hal&gt;
+        &lt;name&gt;android.hardware.drm&lt;/name&gt;
+        &lt;transport&gt;hwbinder&lt;/transport&gt;
+        &lt;version&gt;1.0&lt;/version&gt;
+        &lt;interface&gt;
+            &lt;name&gt;ICryptoFactory&lt;/name&gt;
+            &lt;instance&gt;default&lt;/instance&gt;
+        &lt;/interface&gt;
+        &lt;interface&gt;
+            &lt;name&gt;IDrmFactory&lt;/name&gt;
+            &lt;instance&gt;default&lt;/instance&gt;
+        &lt;/interface&gt;
+        &lt;fqname&gt;@1.1::ICryptoFactory/clearkey&lt;/fqname&gt;
+        &lt;fqname&gt;@1.1::IDrmFactory/clearkey&lt;/fqname&gt;
+    &lt;/hal&gt;
     &lt;hal format="native"&gt;
         &lt;name&gt;EGL&lt;/name&gt;
         &lt;version&gt;1.1&lt;/version&gt;
@@ -77,10 +100,44 @@
 &lt;/manifest&gt;
 </pre>
 
-<h2 id="framework-manifest-file">框架清单文件</h2>
-<p>框架清单文件由 Google 提供,是手动生成的文件。它在 Android 源代码树中位于 <code>system/libhidl/manifest.xml</code>,在设备上位于 <code>/system/manifest.xml</code>。</p>
+<p>ODM 清单示例:</p>
 
-<p>框架清单(由 Google 提供)示例:</p>
+<pre class="prettyprint">
+&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;!-- Comments, Legal notices, etc. here --&gt;
+&lt;manifest version="1.0" type="device"&gt;
+    &lt;hal override="true"&gt;
+        &lt;name&gt;android.hardware.camera&lt;/name&gt;
+        &lt;transport&gt;hwbinder&lt;/transport&gt;
+        &lt;version&gt;3.5&lt;/version&gt;
+        &lt;interface&gt;
+            &lt;name&gt;ICameraProvider&lt;/name&gt;
+            &lt;instance&gt;legacy/0&lt;/instance&gt;
+        &lt;/interface&gt;
+    &lt;/hal&gt;
+    &lt;hal override="true"&gt;
+        &lt;name&gt;android.hardware.nfc&lt;/name&gt;
+        &lt;transport&gt;hwbinder&lt;/transport&gt;
+    &lt;/hal&gt;
+    &lt;hal&gt;
+        &lt;name&gt;android.hardware.power&lt;/name&gt;
+        &lt;transport&gt;hwbinder&lt;/transport&gt;
+        &lt;version&gt;1.1&lt;/version&gt;
+        &lt;interface&gt;
+            &lt;name&gt;IPower&lt;/name&gt;
+            &lt;instance&gt;default&lt;/instance&gt;
+        &lt;/interface&gt;
+    &lt;/hal&gt;
+&lt;/manifest&gt;
+</pre>
+
+有关详情,请参阅<a href="/devices/architecture/vintf/dm">制定设备清单</a>。
+
+<h2 id="framework-manifest-file">框架清单</h2>
+<p>框架清单文件(由 Google 提供)是手动生成的,位于 Android 源代码树的 <code><a href="https://android.googlesource.com/platform/system/libhidl/+/master/manifest.xml" class="external">/system/libhidl/manifest.xml</a></code> 中。
+</p>
+
+<p>框架清单示例:</p>
 
 <pre class="prettyprint">
 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
@@ -122,25 +179,41 @@
             &lt;instance&gt;default&lt;/instance&gt;
         &lt;/interface&gt;
     &lt;/hal&gt;
+    &lt;vendor-ndk&gt;
+        &lt;version&gt;27&lt;/version&gt;
+    &lt;/vendor-ndk&gt;
+    &lt;system-sdk&gt;
+        &lt;version&gt;27&lt;/version&gt;
+    &lt;/system-sdk&gt;
 &lt;/manifest&gt;
 </pre>
 
-<h2 id="manifest-file-schema">清单文件结构</h2>
+<h2 id="manifest-file-schema">清单文件架构</h2>
+<p>这一部分介绍了下列 XML 标记的含义。Android 源代码树中的源文件中可以缺少某些“必需”的标记,这些标记可以在编译时由 <code><a href="/devices/architecture/vintf/resources.html#assemble_vintf">assemble_vintf</a></code> 写入。设备上的相应文件中必须有“必需”的标记。</p>
+
 <dl>
 <dt><code>?xml</code></dt>
-<dd>可选。只向 XML 解析器提供信息。</dd>
+<dd>选用。只向 XML 解析器提供信息。</dd>
 <dt><code>manifest.version</code></dt>
-<dd>必需。<strong>该</strong>清单的版本。描述清单中预期的元素。与 XML 版本无关。</dd>
+<dd>必需。<strong>该</strong>清单的元版本。描述该清单中应该存在的元素。与 XML 版本无关。</dd>
 <dt><code>manifest.type</code></dt>
 <dd>必需。该清单的类型。对于设备清单文件,其值为 <code>device</code>;对于框架清单文件,其值为 <code>framework</code>。</dd>
+<dt><code>manifest.target-level</code></dt>
+<dd>对于设备清单而言是必需的。用于指定相应设备清单要兼容的框架兼容性矩阵版本(FCM 版本),也称为设备的 Shipping FCM 版本。</dd>
 <dt><code>manifest.hal</code></dt>
-<dd>可选且可重复。单个 HAL(HIDL 或本机,如 GL),具体取决于 <code>format</code> 属性。</dd>
+<dd>选用且可重复。单个 HAL(HIDL 或本机,如 GL),具体取决于 <code>format</code> 属性。</dd>
 <dt><code>manifest.hal.format</code></dt>
-<dd>可选。值可以是以下几项之一:<ul>
+<dd>选用。值可以是以下几项之一:<ul>
  <li><code>hidl</code>:HIDL HAL。这是默认值。
  </li><li><code>native</code>:本机 HAL。</li>
  </ul>
 </dd>
+<dt><code>manifest.hal.override</code></dt>
+<dd>选用。值可以是以下几项之一:<ul>
+ <li><code>true</code>:覆盖其他具有相同 <code>&lt;name&gt;</code> 和 Major 版本的 <code>&lt;hal&gt;</code> 元素。如果此 <code>&lt;hal&gt;</code> 元素中没有 <code>&lt;version&gt;</code> 和 <code>&lt;fqname&gt;</code>,则表示此 HAL 处于停用状态。</li>
+ <li><code>false</code>:不覆盖其他具有相同 <code>&lt;name&gt;</code> 和 Major 版本的 <code>&lt;hal&gt;</code> 元素。</li>
+ </ul>
+</dd>
 <dt><code>manifest.hal.name</code></dt>
 <dd>必需。HAL 的完全限定软件包名称。多个 HAL 条目可以使用相同的名称。示例:<ul>
  <li><code>android.hardware.camera</code> (HIDL HAL)</li>
@@ -157,55 +230,34 @@
 <dd>对于 <code>passthrough</code> 是必需的,对于 <code>hwbinder</code> 不得存在。描述正在提供的直通服务的位数。值可以是以下几项之一:<ul>
  <li><code>32</code>:32 位模式</li>
  <li><code>64</code>:64 位模式</li>
- <li><code>32+64</code>:两者兼有</li>
+ <li><code>32+64</code>:两者</li>
  </ul>
 </dd>
 <dt><code>manifest.hal.version</code></dt>
-<dd>必需且可重复。清单中 <code>hal</code> 标记的版本。格式为 <code><var>MAJOR</var>.<var>MINOR</var></code>。有关示例,请参阅 <code>hardware/interfaces</code>、<code>vendor/${VENDOR}/interfaces</code>、<code>framework/hardware/interfaces</code> 或 <code>
+<dd>选用且可重复。清单中 <code>hal</code> 标记的版本。格式为 <code><var>MAJOR</var>.<var>MINOR</var></code>。有关示例,请参阅 <code>hardware/interfaces</code>、<code>vendor/${VENDOR}/interfaces</code>、<code>framework/hardware/interfaces</code> 或 <code>
 system/hardware/interfaces</code>。
 <br /><br />
-HIDL 和本机 HAL 可以使用多个版本字段,前提是它们代表<strong>不同的主要版本</strong>,并且提供的每个主要版本只有一个次要版本。例如,3.1 和 3.2 不能共存,但 1.0 和 3.4 可以共存。这适用于所有同名的 <code>hal</code> 元素。</dd>
+HIDL 和本机 HAL 可以使用多个版本字段,前提是它们代表<strong>不同的 Major 版本</strong>,并且提供的每个 Major 版本只有一个 Minor 版本。例如,3.1 和 3.2 不能共存,但 1.0 和 3.4 可以共存。这适用于所有同名的 <code>hal</code> 元素,除非 <code>override="true"</code>。</dd>
 <dt><code>manifest.hal.interface</code></dt>
-<dd>必需,可以在不重名的情况下进行重复使用。指明软件包中具有实例名称的接口。一个 <code>&lt;hal&gt;</code> 中可以有多个 <code>&lt;interface&gt;</code> 元素,但名称必须不同。</dd>
+<dd>必需,可以在不重名的情况下重复。指明软件包中具有实例名称的接口。一个 <code>&lt;hal&gt;</code> 中可以有多个 <code>&lt;interface&gt;</code> 元素,但名称必须不同。</dd>
 <dt><code>manifest.hal.interface.name</code></dt>
 <dd>必需。接口的名称。</dd>
 <dt><code>manifest.hal.interface.instance</code></dt>
 <dd>必需且可重复。接口的实例名称。一个接口可以有多个实例,但不能有重复的 <code>&lt;instance&gt;</code> 元素。</dd>
+<dt><code>manifest.hal.fqname</code></dt>
+<dd>选用且可重复。为名称是 <code>manifest.hal.name</code> 的 HAL 指定实例的另一种方法。格式为 <code>@<var>MAJOR</var>.<var>MINOR</var>::<var>INTERFACE</var>/<var>INSTANCE</var></code>。对于从 Android 8.0 升级的设备,它不能用于声明兼容性矩阵所需的实例。</dd>
 <dt><code>manifest.sepolicy</code></dt>
 <dd>必需。包含所有与 sepolicy 相关的条目。</dd>
 <dt><code>manifest.sepolicy.version</code></dt>
-<dd>对于设备清单是必需的。用于声明 sepolicy 版本。格式为 SDK_INT.PLAT_INT。<var></var><var></var></dd>
+<dd>对设备清单而言是必需的。用于声明 SELinux 版本。格式为 <code><var>SDK_INT</var>.<var>PLAT_INT</var></code>。</dd>
+<dt><code>manifest.vendor-ndk</code></dt>
+<dd>必需且可重复;对框架清单而言是必需的。不得出现在设备清单中。多个 <code>&lt;vendor-ndk&gt;</code> 条目必须具有不同的 <code>&lt;version&gt;</code>。用于描述框架提供的一组 VNDK 快照。</dd>
+<dt><code>manifest.vendor-ndk.version</code></dt>
+<dd>必需。一个正整数,表示 VNDK 快照的版本。</dd>
+<dt><code>manifest.vendor-ndk.library</code></dt>
+<dd>选用,可以在不重名的情况下重复。用于描述框架为此 VNDK 供应商快照提供的一组 VNDK 库。值是库的文件名,例如 <code>libjpeg.so</code>,包含前缀 <code>lib</code> 和后缀 <code>.so</code>。不允许添加路径组件。</dd>
+<dt><code>manifest.system-sdk.version</code></dt>
+<dd>选用,可以在不重名的情况下重复;仅供框架清单使用。用于描述框架为供应商应用提供的一组系统 SDK 版本。</dd>
 </dl>
 
-<h2 id="runtime-data">运行时数据</h2>
-<p>设备清单所需的某些信息只能在运行时收集。信息通过 <code>::android::vintf::VintfObject::GetRuntimeInfo()</code> 获得,其中包含以下内容:</p>
-
-<ul>
-<li>内核信息,包括:<ul>
- <li><code>/proc/config.gz</code>:压缩的完整内核配置,该信息需要在运行时读取并转换为可查询的对象。</li>
- <li><code>/proc/version</code>:通过 <code>uname()</code> 系统调用获得的信息。</li>
- <li><code>/proc/cpuinfo</code>:对于 32 位和 64 位计算机,格式可能会不同。</li>
- <li>policydb 版本
-  <ul>
-  <li><code>/sys/fs/selinux/policyvers</code>(假设 <code>selinuxfs</code> 装载在 <code>/sys/fs/selinux</code> 处)。</li>
-  <li>来自 <code>libselinux</code> 的 <code>security_policyvers()</code> API 可提供相同的信息。</li>
-  </ul>
-  </li>
-  </ul>
-</li><li>静态 libavb 版本,包括:
- <ul>
- <li>引导加载程序系统属性:<code>ro.boot.vbmeta.avb_version</code></li>
- <li>init/fs_mgr 系统属性:<code>ro.boot.avb_version</code></li>
- </ul>
-</li>
-</ul>
-
-<h2 id="queryable-api">可查询的 API</h2>
-<p>当 <code>hwservicemanager</code>、OTA 更新服务、CTS <code>DeviceInfo</code> 以及其他组件需要从 VINTF 对象中获取信息时,该对象是作为系统 API 存在的。</p>
-
-<ul>
-<li>C++ 可查询的 API 位于 <a href="https://android.googlesource.com/platform/system/libvintf/+/master/include/vintf/VintfObject.h" class="external"><code>android::vintf::VintfObject</code></a></li>
-<li>Java 可查询 API 位于 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/os/VintfObject.java" class="external"><code>android.os.VintfObject</code></a>
-</li></ul>
-
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/vintf/resources.html b/zh-cn/devices/architecture/vintf/resources.html
index e9ba783..fcf4bb6 100644
--- a/zh-cn/devices/architecture/vintf/resources.html
+++ b/zh-cn/devices/architecture/vintf/resources.html
@@ -20,10 +20,10 @@
       limitations under the License.
   -->
 
-<p>以下资源提供了有关代码位置、工具、测试、许可和注意事项的详细信息。</p>
+<p>以下资源详细介绍了代码位置、工具、测试和许可信息。</p>
 
 <h2 id="query-api-code">可查询的代码位置</h2>
-<p>可查询的供应商接口对象的代码位于 <code><a href="https://android.googlesource.com/platform/system/libvintf/+/master#" class="external">system/libvintf</a></code>(请参见<a href="/devices/architecture/vintf/objects.html#queryable-api">可查询的 API</a>)。</p>
+<p>可查询的供应商接口对象的代码位于 <code><a href="https://android.googlesource.com/platform/system/libvintf/+/master#" class="external">system/libvintf</a></code>(请参阅<a href="/devices/architecture/vintf/objects.html#queryable-api">可查询的 API</a>)。</p>
 
 <h2 id="related-tools">工具</h2>
 <p>手写清单文件和兼容性矩阵可能很难。您可以使用以下工具来生成样板清单/兼容性矩阵,从其入手。</p>
@@ -37,8 +37,8 @@
 
 <p>请注意以下几点:</p>
 <ol>
-<li>如果既向 <code>hwservicemanager</code> 注册了某个软件包,又发现其作为直通 HAL,则将 <code>&lt;transport&gt;</code> 设置为 <code>hwbinder</code>。</li>
-<li>清单的末尾存在一个虚拟 <code>&lt;sepolicy&gt;<version>0.0</version>&lt;/sepolicy&gt;</code> 元素。它指明了该元素已被删除并将通过 <code>assemble_vintf</code> 将其注入(如下所述)。</li>
+<li>如果发现某个软件包既向 <code>hwservicemanager</code> 进行了注册,又发现其属于直通 HAL,则将 <code>&lt;transport&gt;</code> 设置为 <code>hwbinder</code>。</li>
+<li>没有任何 SELinux 版本写入清单中。建议通过 <code>assemble_vintf</code> 注入该元素(如下所述)。</li>
 <li>生成的 HAL 清单文件可能不准确。需要手动对比来更正设备清单与 <code>vendor.img</code> 实际提供的内容之间的不一致。</li>
 </ol>
 
@@ -54,32 +54,24 @@
 <h4><strong>示例:</strong>从框架清单文件生成<strong>设备兼容性矩阵</strong></h4>
 
 <pre class="devsite-terminal">
-assemble_vintf -m \
+assemble_vintf -m --hals-only \
     -i system/libhidl/manifest.xml \
     -o device/manufacturer/device_name/compatibility_matrix.xml
 </pre>
-<p>请注意以下几点:</p>
-<ul>
-<li>即使 <code>&lt;vndk&gt;</code> 条目在输出兼容性矩阵中,也应该将其删除,然后在构建时进行注入。</li>
-<li>所有 HAL 都设置为 <code>optional="true"</code>。</li>
-</ul>
+<p>请注意,所有 HAL 都设置为 <code>optional="true"</code>。</p>
 
 <h4><strong>示例:</strong>从设备清单文件生成骨架框架兼容性矩阵</h4>
 
 <pre class="devsite-terminal">
-BOARD_SEPOLICY_VERS=10000.0 assemble_vintf -m \
-    -i device/foo/bar/manifest.xml
+assemble_vintf -m --hals-only \
+    -i device/foo/bar/manifest.xml \
     -o path/to/place/output/compatibility_matrix.xml
 </pre>
-<p>请注意以下几点:</p>
-<ul>
-<li>即使 <code>&lt;sepolicy&gt;</code> 和 <code>&lt;avb&gt;</code> 在输出兼容性矩阵中,也应该将其删除,然后在构建时进行注入。</li>
-<li>所有 HAL 都设置为 <code>optional="true"</code>。</li>
-</ul>
+<p>请注意,所有 HAL 都设置为 <code>optional="true"</code>。</p>
 
 <h4><strong>示例:</strong>从变量生成 XML 文件</h4>
 
-<p>构建时,如果在 <code>device/manufacturer/device_name/BoardConfig.mk</code> 中定义了以下变量:</p>
+<p>编译时,如果在 <code>device/manufacturer/device_name/BoardConfig.mk</code> 中定义了以下变量:</p>
 
 <pre class="prettyprint">
 DEVICE_MANIFEST_FILE := \
@@ -88,38 +80,53 @@
     device/manufacturer/device_name/compatibility_matrix.xml
 </pre>
 
-<p>然后,执行以下命令(修改为省略实现详细信息)来生成所有 XML 文件:</p>
+<p>然后,执行以下命令(已在编译系统中修改为省略实现详细信息),以生成所有 XML 文件:</p>
 
 <pre class="prettyprint">
 # device manifest; only when DEVICE_MANIFEST_FILE is set
 BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
-    -i device/manufacturer/device_name/manifest.xml \
-    -o $(TARGET_OUT_VENDOR)/manifest.xml
+    $(addprefix,-i ,$(DEVICE_MANIFEST_FILE)) \
+    -o $(TARGET_OUT_VENDOR)/etc/vintf/manifest.xml
 
 # device compatibility matrix; only when DEVICE_MATRIX_FILE is set
 assemble_vintf \
-    -i device/manufacturer/device_name/compatibility_matrix.xml \
-    -o $(TARGET_OUT_VENDOR)/compatibility_matrix.xml
+    -i $(DEVICE_MATRIX_FILE) \
+    -o $(TARGET_OUT_VENDOR)/etc/vintf/compatibility_matrix.xml
 
 # framework manifest
 assemble_vintf
-    -i system/libhidl/manifest.xml \
+    $(addprefix,-i ,system/libhidl/manifest.xml $(DEVICE_FRAMEWORK_MANIFEST_FILE)) \
     -o $(TARGET_OUT)/manifest.xml \
-    -c $(TARGET_OUT_VENDOR)/compatibility_matrix.xml
+    -c $(TARGET_OUT_VENDOR)/etc/vintf/compatibility_matrix.xml
 
-# framework compatibility matrix
+# common framework compatibility matrix for each FCM version
 BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) \
 POLICYVERS=$(POLICYVERS) \
 BOARD_AVB_VBMETA_VERSION=$(BOARD_AVB_VBMETA_VERSION)
 assemble_vintf \
-    -i hardware/interfaces/compatibility_matrix.xml \
-    -o $(TARGET_OUT)/compatibility_matrix.xml \
-    -c $(TARGET_OUT_VENDOR)/manifest.xml \
+    $(addprefix,-i ,\
+        hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml \
+        $(DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE)) \
+    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.empty.xml
+
+# framework compatibility matrices at each FCM version
+assemble_vintf
+    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.{level}.xml \
+    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.{level}.xml \
+    --kernel=...
+
+# Final framework compatibility matrix to check with device manifest.
+# Each input matrix should have a unique "level" attribute.
+PRODUCT_ENFORCE_VINTF_MANIFEST=$(PRODUCT_ENFORCE_VINTF_MANIFEST) \
+assemble_vintf
+    -i $(TARGET_OUT)/etc/vintf/compatibility_matrix.*.xml
+    -o /tmp/compatibility_matrix.xml
+    -c $(TARGET_OUT_VENDOR)/manifest.xml
 </pre>
 
-<h4><strong>示例:</strong>从片段生成设备清单</h4>
+<h4 id="manifest-fragments"><strong>示例:</strong>从片段生成设备清单</h4>
 
-<p>多个设备清单片段可以在构建时捆绑。例如:</p>
+<p>多个设备清单片段可以在编译时捆绑。例如:</p>
 
 <pre class="prettyprint">
 &lt;!-- device/manufacturer/device_name/manifest_common.xml --&gt;
@@ -176,15 +183,4 @@
 <li><code>libvintf</code> 项目使用 Apache 2.0 许可证(具有适当的 MODULE_LICENSE_APACHE2 和 NOTICE 文件)。</li>
 </ul>
 
-<h2 id="caveats">注意事项</h2>
-<p>您也可以通过查询 <code>hwservicemanager</code>(就像 <code>lshal</code> 一样)在运行时确定 HAL。但是:</p>
-<ul>
-<li><code>hwservicemanager</code> 不会列出直通服务。</li>
-<li>如果服务刚刚崩溃并正在重新启动,则可能会在查询结果中缺失。</li>
-<li>不适用于可热插拔服务。</li>
-<li><code>hwservicemanager</code> 在恢复模式下不可用(请参见下文)。</li>
-</ul>
-
-<p>在恢复模式下,用于检索供应商接口对象的 API 必须仍然可用,以允许设备再次对照兼容性矩阵检查供应商接口。</p>
-
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/vndk/abi-stability.html b/zh-cn/devices/architecture/vndk/abi-stability.html
new file mode 100644
index 0000000..748d4a1
--- /dev/null
+++ b/zh-cn/devices/architecture/vndk/abi-stability.html
@@ -0,0 +1,803 @@
+<html devsite><head>
+    <title>ABI 稳定性</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.
+  -->
+
+<p>
+应用二进制接口 (ABI) 稳定性是进行仅针对框架的更新的前提条件,因为供应商模块可能依赖于系统分区中的供应商原生开发套件 (VNDK) 共享库。新编译的 VNDK 共享库必须与之前发布的 VNDK 共享库保持 ABI 兼容性,以便供应商模块可以与这些库协同工作,而无需重新编译,也不会出现运行时错误。
+</p>
+
+<p>
+为了确保实现 ABI 兼容性,Android 9 中添加了一个标头 ABI 检查工具,下文会对该工具进行介绍。
+
+</p><h2 id="about-vndk-abi-compliance">关于 VNDK 和 ABI 合规性</h2>
+
+<p>
+VNDK 是供应商模块可以关联到的一组受限库,用于实现仅针对框架的更新。ABI 合规性是指较新版本的共享库能够按预期与动态关联到它的模块协同工作(即像较旧版本的共享库那样正常工作)。<em></em>
+</p>
+
+<h3 id="about-exported-symbols">关于导出的符号</h3>
+
+<p>
+导出的符号(也称为全局符号)是指满足以下所有条件的符号:
+<em></em><em></em></p>
+
+<ul>
+  <li>通过共享库的公开标头导出。<em></em></li>
+  <li>显示在与共享库对应的 <code>.so</code> 文件的 <code>.dynsym</code> 表中。</li>
+  <li>具有 WEAK 或 GLOBAL 绑定。</li>
+  <li>可见性为 DEFAULT 或 PROTECTED。</li>
+  <li>区块索引不是 UNDEFINED。</li>
+  <li>类型为 FUNC 或 OBJECT。</li>
+</ul>
+
+<p>
+共享库的公开标头是指通过以下属性提供给其他库/二进制文件使用的标头<em></em>:与共享库对应的模块的 <code>Android.bp</code> 定义中的 <code>export_include_dirs</code>、<code>export_header_lib_headers</code>、<code>export_static_lib_headers</code>、<code>export_shared_lib_headers</code> 和 <code>export_generated_headers</code> 属性。
+</p>
+
+<h3 id="about-reachable-types">关于可到达类型</h3>
+
+<p>
+可到达类型是指可通过导出的符号直接或间接到达并且是通过公开标头导出的任何 C/C++ 内置类型或用户定义的类型。<em></em>例如,<code>libfoo.so</code> 具有函数 <code>Foo</code>,该函数是一个导出的符合,可在 <code>.dynsym</code> 表中找到。<code>libfoo.so</code> 库包含以下内容:
+</p>
+
+<table>
+  <tbody><tr>
+   <th>foo_exported.h</th>
+   <th>foo.private.h</th>
+  </tr>
+  <tr>
+   <td>
+<pre class="prettyprint">
+
+typedef struct foo_private foo_private_t;
+
+typedef struct foo {
+  int m1;
+  int *m2;
+  foo_private_t *mPfoo;
+} foo_t;
+
+typedef struct bar {
+  foo_t mfoo;
+} bar_t;
+
+bool Foo(int id, bar_t *bar_ptr);
+</pre>
+</td>
+
+<td>
+<pre class="prettyprint">
+
+typedef struct foo_private {
+  int m1;
+  float mbar;
+} foo_private_t;
+</pre>
+   </td>
+  </tr>
+</tbody></table>
+
+<table>
+  <tbody><tr>
+   <th>Android.bp</th>
+  </tr>
+  <tr>
+   <td>
+<pre class="prettyprint">
+
+cc_library {
+  name : libfoo,
+  vendor_available: true,
+  vndk {
+    enabled : true,
+  }
+  srcs : ["src/*.cpp"],
+  export_include_dirs : [
+    "include"
+  ],
+}
+</pre>
+   </td>
+  </tr>
+</tbody></table>
+
+<table>
+  <tbody><tr>
+   <th colspan="8">.dynsym 表</th>
+  </tr>
+  <tr>
+   <td><code>Num</code>
+   </td>
+   <td><code>Value</code>
+   </td>
+   <td><code>Size</code>
+   </td>
+   <td><code>Type</code>
+   </td>
+   <td><code>Bind</code>
+   </td>
+   <td><code>Vis</code>
+   </td>
+   <td><code>Ndx</code>
+   </td>
+   <td><code>Name</code>
+   </td>
+  </tr>
+  <tr>
+   <td><code>1</code>
+   </td>
+   <td><code>0</code>
+   </td>
+   <td><code>0</code>
+   </td>
+   <td><code>FUNC</code>
+   </td>
+   <td><code>GLOB</code>
+   </td>
+   <td><code>DEF</code>
+   </td>
+   <td><code>UND</code>
+   </td>
+   <td><code>dlerror@libc</code>
+   </td>
+  </tr>
+  <tr>
+   <td><code>2</code>
+   </td>
+   <td><code>1ce0</code>
+   </td>
+   <td><code>20</code>
+   </td>
+   <td><code>FUNC</code>
+   </td>
+   <td><code>GLOB</code>
+   </td>
+   <td><code>DEF</code>
+   </td>
+   <td><code>12</code>
+   </td>
+   <td><code>Foo</code>
+   </td>
+  </tr>
+</tbody></table>
+
+<p>
+以 <code>Foo</code> 为例,直接/间接可到达类型包括:
+</p>
+
+<table>
+  <tbody><tr>
+  <th>类型</th>
+  <th>说明</th>
+  </tr>
+  <tr>
+  <td><code>bool</code>
+  </td>
+  <td><code>Foo</code> 的返回值类型。
+  </td>
+  </tr>
+  <tr>
+  <td><code>int</code>
+  </td>
+  <td>第一个 <code>Foo</code> 参数的类型。
+  </td>
+  </tr>
+  <tr>
+  <td><code>bar_t *</code>
+  </td>
+  <td>第二个 Foo 参数的类型。<code>bar_t</code> 是经由 <code>bar_t *</code> 通过 <code>foo_exported.h</code> 导出的。
+  <br /><br />
+  <code>bar_t</code> 包含类型 <code>foo_t</code>(通过 <code>foo_exported.h</code> 导出)的一个成员 <code>mfoo</code>,这会导致导出更多类型:
+
+  <ul>
+    <li><code>int :</code> 是 <code>m1</code> 的类型。</li>
+    <li><code>int * :</code> 是 <code>m2</code> 的类型。</li>
+    <li><code>foo_private_t * : </code>是 <code>mPfoo</code> 的类型。</li>
+  </ul>
+  <br />
+不过,<code>foo_private_t</code> 不是可到达类型,因为它不是通过 <code>foo_exported.h</code> 导出的。(<code>foot_private_t *</code> 不透明,因此系统允许对 <code>foo_private_t</code> 进行更改)。
+  </td>
+  </tr>
+</tbody></table>
+
+<p>
+对于可通过基类指定符和模板参数到达的类型,也可给出类似解释。
+</p>
+
+<h2 id="ensuring-abi-compliance">确保 ABI 合规性</h2>
+
+<p>
+对于在对应的 <code>Android.bp</code> 文件中标有 <code>vendor_available: true</code> 和 <code>vndk.enabled: true</code> 的库,必须确保其 ABI 合规性。例如:
+</p>
+
+<pre class="prettyprint">
+cc_library {
+    name: "libvndk_example",
+    vendor_available: true,
+    vndk: {
+        enabled: true,
+    }
+}
+</pre>
+
+<p>
+对于可通过导出的函数直接或间接到达的数据类型,对库进行以下更改会破坏 ABI 合规性:
+</p>
+
+<table>
+  <tbody><tr>
+  <th>数据类型</th>
+  <th>说明</th>
+  </tr>
+  <tr>
+  <td>结构和类</td>
+  <td>
+  <ul>
+    <li>移除非静态数据成员。</li>
+    <li>会导致类/结构体大小发生变化的更改。</li>
+    <li>会导致虚表布局发生变化的更改。</li>
+    <li>添加/移除基类。</li>
+    <li>更改基类的顺序。</li>
+    <li>更改模板参数。</li>
+    <li>会导致数据成员的内存偏移发生变化的更改<sup>**</sup>。</li>
+    <li>更改成员的 const-volatile-restricted 限定符<sup>*</sup>。</li>
+    <li>对数据成员的访问权限指定符进行降级<sup>*</sup>。</li>
+  </ul>
+  </td>
+  </tr>
+  <tr>
+  <td>联合</td>
+  <td>
+  <ul>
+    <li>添加/移除字段。</li>
+    <li>会导致大小发生变化的更改。</li>
+    <li>更改字段顺序。</li>
+    <li>更改字段类型。</li>
+  </ul>
+   </td>
+  </tr>
+  <tr>
+  <td>枚举</td>
+  <td>
+  <ul>
+    <li>更改成员的值。</li>
+    <li>更改成员的名称。</li>
+    <li>更改基础类型。</li>
+  </ul>
+   </td>
+  </tr>
+  <tr>
+  <td>全局符号</td>
+  <td>
+  <ul>
+    <li>移除通过公开标头导出的符号。</li>
+    <li>对于类型 FUNC 的全局符号
+      <ul>
+      <li>添加/移除参数。</li>
+      <li>以任何方式更改任何参数的类型。</li>
+      <li>以任何方式更改返回值类型。</li>
+      <li>对访问权限指定符进行降级<sup>*</sup>。</li>
+    </ul>
+    </li>
+    <li>对于类型 OBJECT 的全局符号
+    <ul>
+      <li>以任何方式更改相应的 C/C++ 类型。</li>
+      <li>对访问权限指定符进行降级<sup>*</sup>。</li>
+    </ul>
+    </li>
+    </ul>
+   </td>
+  </tr>
+</tbody></table>
+
+<p>
+ <strong><sup>**</sup></strong>不限于对公开字段的偏移进行更改(因为内联函数可以在内部使用不公开字段)。
+</p>
+
+<p>
+  <strong><sup>*</sup></strong>虽然这些并不代表对类型的内存布局进行更改,但它们是语义差异,可能导致库无法按预期正常运行。
+</p>
+
+<h2 id="using-abi-compliance-tools">使用 ABI 合规性工具</h2>
+
+<p>
+编译 VNDK 库时,系统会将其 ABI 与所编译 VNDK 的版本对应的 ABI 参考进行比较。参考 ABI 转储位于以下位置:
+</p>
+
+<pre class="prettyprint">
+${ANDROID_BUILD_TOP}/prebuilts/abi-dumps/(v)ndk/&lt;${PLATFORM_VNDK_VERSION}&gt;/&lt;BINDER_BITNESS&gt;/&lt;ARCH_ARCH-VARIANT&gt;/source-based
+</pre>
+
+<p>
+例如,在为 VNDK 的 API 级别 27 编译 <code>libfoo</code> 时,系统会将 <code>libfoo</code> 的推断 ABI 与其参考进行比较,该参考位于以下位置:</p>
+
+<pre class="prettyprint">
+${ANDROID_BUILD_TOP}/prebuilts/abi-dumps/(v)ndk/27/64/&lt;ARCH_ARCH-VARIANT&gt;/source-based/libfoo.so.lsdump
+</pre>
+
+<h3 id="abit-breakage-error">ABI 损坏错误</h3>
+
+<p>
+当 ABI 损坏时,编译日志会显示警告,其中包含警告类型以及 abi-diff 报告所在的路径。例如,如果 <code>libbinder</code> 的 ABI 有不兼容的更改,则编译系统会抛出错误,并显示类似以下的消息:
+</p>
+
+<pre>
+*****************************************************
+error: VNDK library: libbinder.so's ABI has INCOMPATIBLE CHANGES
+Please check compatibility report at:
+out/soong/.intermediates/frameworks/native/libs/binder/libbinder/android_arm64_armv8-a_cortex-a73_vendor_shared/libbinder.so.abidiff
+******************************************************
+---- Please update abi references by running
+platform/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l libbinder ----
+</pre>
+
+<h3 id="building-vndk-lib-abi-checks">编译 VNDK 库时进行的 ABI 检查</h3>
+
+<p>
+编译 VNDK 库时:
+</p>
+
+<ol>
+  <li><code>header-abi-dumper</code> 会处理为了编译 VNDK 库(库本身的源文件以及通过静态传递依赖项沿用的源文件)而编译的源文件,以生成与各个源文件对应的 <code>.sdump</code> 文件。
+  <br />
+  <img src="../images/abi_check_sdump.png" alt="创建 sdump" title="创建 sdump"/>
+  <figcaption><strong>图 1.</strong> 创建 <code>.sdump</code> 文件</figcaption>
+  </li>
+
+  <li>然后,<code>header-abi-linker</code> 会处理 <code>.sdump</code> 文件(使用提供给它的版本脚本或与共享库对应的 <code>.so</code> 文件),以生成 <code>.lsdump</code> 文件,该文件用于记录与共享库对应的所有 ABI 信息。
+  <br />
+  <img src="../images/abi_check_lsdump.png" alt="创建 lsdump" title="创建 lsdump"/>
+  <figcaption><strong>图 2.</strong> 创建 <code>.lsdump</code> 文件</figcaption>
+  </li>
+
+  <li><code>header-abi-diff</code> 会将 <code>.lsdump</code> 文件与参考 <code>.lsdump</code> 文件进行比较,以生成差异报告,该报告中会简要说明两个库的 ABI 之间存在的差异。
+  <br />
+  <img src="../images/abi_check_abidiff.png" alt="创建 abi diff" title="创建 abi diff"/>
+  <figcaption><strong>图 3.</strong> 创建差异报告</figcaption>
+  </li>
+</ol>
+
+<h3 id="header-abi-dumper">header-abi-dumper</h3>
+
+<p>
+<code>header-abi-dumper</code> 工具会解析 C/C++ 源文件,并将从该源文件推断出的 ABI 转储到一个中间文件。编译系统会对所有已编译的源文件运行 <code>header-abi-dumper</code>,同时还会建立一个库,其中包含来自传递依赖项的源文件。
+</p>
+
+<p>
+目前,<code>.sdump</code> 文件采用 <a href="https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/TextFormat" class="external">Protobuf TextFormatted</a> 格式,我们无法保证该格式在未来版本中仍保持稳定。因此,<code>.sdump</code> 文件格式化应被视为编译系统的实现细节。
+</p>
+
+<p>
+例如,<code>libfoo.so</code> 具有以下源文件 <strong><code>foo.cpp</code></strong>:
+</p>
+
+<pre class="prettyprint">
+#include &lt;stdio.h&gt;
+#include &lt;foo_exported.h&gt;
+
+bool Foo(int id, bar_t *bar_ptr) {
+    if (id &gt; 0 &amp;&amp; bar_ptr-&gt;mfoo.m1 &gt; 0) {
+        return true;
+    }
+    return false;
+}</pre>
+
+<p>
+您可以使用 <code>header-abi-dumper</code> 生成中间 <code>.sdump</code> 文件,该文件代表源文件使用以下命令提供的 ABI:
+</p>
+
+<pre class="prettyprint">
+$ header-abi-dumper foo.cpp -I exported -o foo.sdump -- -x c++
+</pre>
+
+<p>
+该命令指示 <code>header-abi-dumper</code> 解析 <code>foo.cpp</code> 并发出 ABI 信息(显示在 <code>exported</code> 目录内的公开标头中)。下面是 <code>header-abi-dumper</code> 生成的 <strong><code>foo.sdump</code></strong> 中的一部分(并非完整内容):
+</p>
+
+<pre class="prettyprint">
+record_types {
+  type_info {
+    name: "foo"
+    size: 12
+    alignment: 4
+    referenced_type: "type-1"
+    source_file: "foo/include/foo_exported.h"
+    linker_set_key: "foo"
+    self_type: "type-1"
+  }
+  fields {
+    referenced_type: "type-2"
+    field_offset: 0
+    field_name: "m1"
+    access: public_access
+  }
+  fields {
+    referenced_type: "type-3"
+    field_offset: 32
+    field_name: "m2"
+    access: public_access
+  }
+  fields {
+    referenced_type: "type-5"
+    field_offset: 64
+    field_name: "mPfoo"
+    access: public_access
+  }
+  access: public_access
+  record_kind: struct_kind
+  tag_info {
+    unique_id: "_ZTS3foo"
+  }
+}
+record_types {
+  type_info {
+    name: "bar"
+    size: 12
+    alignment: 4
+    referenced_type: "type-6"
+…
+pointer_types {
+  type_info {
+    name: "bar *"
+    size: 4
+    alignment: 4
+    referenced_type: "type-6"
+    source_file: "foo/include/foo_exported.h"
+    linker_set_key: "bar *"
+    self_type: "type-8"
+  }
+}
+builtin_types {
+  type_info {
+    name: "int"
+    size: 4
+    alignment: 4
+    referenced_type: "type-2"
+    source_file: ""
+    linker_set_key: "int"
+    self_type: "type-2"
+  }
+  is_unsigned: false
+  is_integral: true
+}
+functions {
+  return_type: "type-7"
+  function_name: "Foo"
+  source_file: "foo/include/foo_exported.h"
+  parameters {
+    referenced_type: "type-2"
+    default_arg: false
+  }
+  parameters {
+    referenced_type: "type-8"
+    default_arg: false
+  }
+  linker_set_key: "_Z3FooiP3bar"
+  access: public_access
+}
+</pre>
+
+<p>
+  <code>foo.sdump</code> 包含源文件 <code>foo.cpp</code> 提供的 ABI 信息,例如:
+</p>
+
+<ul>
+  <li><code>record_types</code>:指通过公开标头提供的结构、联合或类。每个记录类型都包含其字段、大小、访问权限指定符、所在标头文件等相关信息。</li>
+  <li><code>pointer_types</code>:指通过公开标头提供的记录/函数直接/间接引用的指针类型,以及指针指向的类型(通过 <code>type_info</code> 中的 <code>referenced_type</code> 字段)。对于限定类型、内置 C/C++ 类型、数组类型以及左值和右值参考类型(有关类型的此类记录信息允许递归差异),系统会在 <code>.sdump</code> 文件中记录类似信息。</li>
+  <li><code>functions</code>:表示通过公开标头提供的函数。它们还包含函数的重整名称、返回值类型、参数类型、访问权限指定符等相关信息。</li>
+</ul>
+
+<aside class="tip">
+  <strong>提示</strong>:要获取 <code>header-abi-dumper</code> 工具方面的帮助,请运行 <code>header-abi-dumper --help</code>。
+</aside>
+
+<h3 id="header-abi-linker">header-abi-linker</h3>
+
+<p>
+<code>header-abi-linker</code> 工具会将 <code>header-abi-dumper</code> 生成的中间文件作为输入,然后关联以下文件:
+</p>
+
+<table>
+  <tbody><tr>
+   <th>输入</th>
+   <td>
+    <ul>
+    <li><code>header-abi-dumper</code> 生成的中间文件</li>
+    <li>版本脚本/映射文件(可选)</li>
+    <li>共享库的 .so 文件</li>
+  </ul>
+   </td>
+  </tr>
+  <tr>
+   <th>输出</th>
+   <td>用于记录共享库 ABI 的文件(例如,<code>libfoo.so.lsdump </code>表示 <code>libfoo</code> 的 ABI)。
+   </td>
+  </tr>
+</tbody></table>
+
+<p>
+该工具会将收到的所有中间文件中的类型图合并在一起,并会将不同转换单元之间的单一定义(完全限定名称相同的不同转换单元中由用户定义的类型可能在语义上有所不同)差异考虑在内。然后,该工具会解析版本脚本或解析共享库的 <code>.dynsym</code> 表(<code>.so</code> 文件),以创建导出符号列表。
+</p>
+
+<p>
+例如,当 <code>libfoo</code> 将 <code>bar.cpp</code> 文件(用于提供 C 函数 <code>bar</code>)添加到其编译时,系统可能会调用 <code>header-abi-linker</code>,以创建 <code>libfoo</code> 的完整关联 ABI 转储,如下所示:
+</p>
+
+<pre class="prettyprint">
+header-abi-linker -I exported foo.sdump bar.sdump \
+                  -o libfoo.so.lsdump \
+                  -so libfoo.so \
+                  -arch arm64 -api current
+</pre>
+
+<p>
+<strong><code>libfoo.so.lsdump</code></strong> 中的命令输出示例:
+</p>
+
+<pre class="prettyprint">
+record_types {
+  type_info {
+    name: "foo"
+    size: 24
+    alignment: 8
+    referenced_type: "type-1"
+    source_file: "foo/include/foo_exported.h"
+    linker_set_key: "foo"
+    self_type: "type-1"
+  }
+  fields {
+    referenced_type: "type-2"
+    field_offset: 0
+    field_name: "m1"
+    access: public_access
+  }
+  fields {
+    referenced_type: "type-3"
+    field_offset: 64
+    field_name: "m2"
+    access: public_access
+  }
+  fields {
+    referenced_type: "type-4"
+    field_offset: 128
+    field_name: "mPfoo"
+    access: public_access
+  }
+  access: public_access
+  record_kind: struct_kind
+  tag_info {
+    unique_id: "_ZTS3foo"
+  }
+}
+record_types {
+  type_info {
+    name: "bar"
+    size: 24
+    alignment: 8
+...
+builtin_types {
+  type_info {
+    name: "void"
+    size: 0
+    alignment: 0
+    referenced_type: "type-6"
+    source_file: ""
+    linker_set_key: "void"
+    self_type: "type-6"
+  }
+  is_unsigned: false
+  is_integral: false
+}
+functions {
+  return_type: "type-19"
+  function_name: "Foo"
+  source_file: "foo/include/foo_exported.h"
+  parameters {
+    referenced_type: "type-2"
+    default_arg: false
+  }
+  parameters {
+    referenced_type: "type-20"
+    default_arg: false
+  }
+  linker_set_key: "_Z3FooiP3bar"
+  access: public_access
+}
+functions {
+  return_type: "type-6"
+  function_name: "FooBad"
+  source_file: "foo/include/foo_exported_bad.h"
+  parameters {
+    referenced_type: "type-2"
+    default_arg: false
+  }
+parameters {
+    referenced_type: "type-7"
+    default_arg: false
+  }
+  linker_set_key: "_Z6FooBadiP3foo"
+  access: public_access
+}
+elf_functions {
+  name: "_Z3FooiP3bar"
+}
+elf_functions {
+  name: "_Z6FooBadiP3foo"
+}
+</pre>
+
+<p>
+<code>header-abi-linker</code> 工具将执行以下操作:
+</p>
+
+<ul>
+  <li>关联收到的 <code>.sdump</code> 文件(<code>foo.sdump</code> 和 <code>bar.sdump</code>),滤除位于 <code>exported</code> 目录的标头中不存在的 ABI 信息。</li>
+  <li>解析 <code>libfoo.so</code>,然后通过其 <code>.dynsym</code> 表收集通过库导出的符号的相关信息。</li>
+  <li>添加 <code>_Z3FooiP3bar</code> 和 <code>Bar</code>。</li>
+</ul>
+
+<p>
+  <code>libfoo.so.lsdump</code> 是最终生成的 <code>libfoo.so</code> ABI 转储。
+</p>
+
+<aside class="tip"><strong>提示</strong>:要获取 <code>header-abi-linker</code> 工具方面的帮助,请运行 <code>header-abi-linker --help</code>。
+</aside>
+
+<h3 id="header-abi-diff">header-abi-diff</h3>
+
+<p>
+<code>header-abi-diff</code> 工具会将代表两个库的 ABI 的两个 <code>.lsdump</code> 文件进行比较,并生成差异报告,其中会说明这两个 ABI 之间存在的差异。</p>
+
+<table>
+  <tbody><tr>
+  <th>输入</th>
+  <td>
+  <ul>
+  <li>表示旧共享库的 ABI 的 <code>.lsdump</code> 文件。</li>
+  <li>表示新共享库的 ABI 的 <code>.lsdump</code> 文件。
+  </li>
+  </ul>
+  </td>
+  </tr>
+  <tr>
+  <th>输出</th>
+  <td>差异报告,其中会说明在比较两个共享库提供的 ABI 之后发现的差异。
+  </td>
+  </tr>
+</tbody></table>
+
+<p>
+ABI 差异文件会尽可能详细且便于读懂。格式在未来版本中可能会发生变化。例如,您有两个版本的 <code>libfoo</code>:<code>libfoo_old.so</code> 和 <code>libfoo_new.so</code>。在 <code>libfoo_new.so</code> 中的 <code>bar_t</code> 内,您将 <code>mfoo</code> 的类型从 <code>foo_t</code> 更改为 <code>foo_t *</code>。由于 <code>bar_t</code> 是直接可到达类型,因此这应该由 <code>header-abi-diff</code> 标记为会破坏 ABI 的更改。
+</p>
+
+<p>
+要运行 <code>header-abi-diff</code>,请执行以下命令:
+</p>
+
+<pre class="prettyprint">
+header-abi-diff -old libfoo_old.so.lsdump \
+                -new libfoo_new.so.lsdump \
+                -arch arm64 \
+                -o libfoo.so.abidiff \
+                -lib libfoo
+</pre>
+
+<p>
+<strong><code>libfoo.so.abidiff</code></strong> 中的命令输出示例:
+</p>
+
+<pre class="prettyprint">
+lib_name: "libfoo"
+arch: "arm64"
+record_type_diffs {
+  name: "bar"
+  type_stack: "Foo-&gt; bar *-&gt;bar "
+  type_info_diff {
+    old_type_info {
+      size: 24
+      alignment: 8
+    }
+    new_type_info {
+      size: 8
+      alignment: 8
+    }
+  }
+  fields_diff {
+    old_field {
+      referenced_type: "foo"
+      field_offset: 0
+      field_name: "mfoo"
+      access: public_access
+    }
+    new_field {
+      referenced_type: "foo *"
+      field_offset: 0
+      field_name: "mfoo"
+      access: public_access
+    }
+  }
+}</pre>
+
+<p>
+<code>libfoo.so.abidiff</code> 包含一个报告,其中会注明 <code>libfoo</code> 中所有会破坏 ABI 的更改。<code>record_type_diffs</code> 消息表示记录发生了更改,并会列出不兼容的更改,其中包括:
+</p>
+
+<ul>
+  <li>记录大小从 <code>24</code> 个字节更改为 <code>8</code> 个字节。</li>
+  <li><code>mfoo</code> 的字段类型从 <code>foo</code> 更改为 <code>foo *</code>(去除了所有类型定义符)。</li>
+</ul>
+
+<p>
+<code>type_stack</code> 字段用于指示 <code>header-abi-diff</code> 如何到达已更改的类型 (<code>bar</code>)。该字段可作如下解释:<code>Foo</code> 是一个导出的函数,接受 <code>bar *</code> 作为参数,该参数指向已导出且发生变化的 <code>bar</code>。
+</p>
+
+<aside class="tip">
+  <strong>提示</strong>:要获取 <code>header-abi-diff</code> 工具方面的帮助,请运行 <code>header-abi-diff --help</code>。您也可以参阅 <code>development/vndk/tools/header-checker/README.md</code>。
+</aside>
+
+<h2 id="enforcing-abi-api">强制执行 ABI/API</h2>
+
+<p>
+要强制执行 VNDK 和 LLNDK 共享库的 ABI/API,必须将 ABI 参考签入到 <code>${ANDROID_BUILD_TOP}/prebuilts/abi-dumps/(v)ndk/</code> 中。要创建这些参考,请运行以下命令:
+</p>
+
+<pre class="prettyprint">
+${ANDROID_BUILD_TOP}/development/vndk/tools/header-checker/utils/create_reference_dumps.py
+</pre>
+
+<p>
+创建参考后,如果对源代码所做的任何更改导致 VNDK 或 LLNDK 库中出现不兼容的 ABI/API 更改,则这些更改现在会导致编译错误。
+</p>
+
+<p>
+要更新特定 VNDK 核心库的 ABI 参考,请运行以下命令:
+</p>
+
+<pre class="prettyprint">
+${ANDROID_BUILD_TOP}/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l &lt;lib1&gt; -l &lt;lib2&gt;
+</pre>
+
+<p>
+例如,要更新 <code>libbinder</code> ABI 参考,请运行以下命令:
+</p>
+
+<pre class="prettyprint">
+${ANDROID_BUILD_TOP}/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l libbinder
+</pre>
+
+<p>
+要更新特定 LLNDK 库的 ABI 参考,请运行以下命令:
+</p>
+
+<pre class="prettyprint">
+${ANDROID_BUILD_TOP}/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l &lt;lib1&gt; -l &lt;lib2&gt; --llndk
+</pre>
+
+<p>
+例如,要更新 <code>libm</code> ABI 参考,请运行以下命令:
+</p>
+
+<pre class="prettyprint">
+${ANDROID_BUILD_TOP}/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l libm --llndk
+</pre>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/vndk/build-system.html b/zh-cn/devices/architecture/vndk/build-system.html
index 6c88a0c..591669f 100644
--- a/zh-cn/devices/architecture/vndk/build-system.html
+++ b/zh-cn/devices/architecture/vndk/build-system.html
@@ -121,7 +121,7 @@
 
 <p>在 <code>Android.bp</code> 文件中,<code>cc_library</code>、<code>cc_library_static</code>、<code>cc_library_shared</code> 和 <code>cc_library_headers</code> 模块定义支持三个与 VNDK 相关的属性:<code>vendor_available</code>、<code>vndk.enabled</code> 和 <code>vndk.support_system_process</code>。</p>
 
-<p>如果 <code>vendor_available</code> 或 <code>vndk.enabled</code> 为 <code>true</code>,则可以编译两个变体(核心变体和供应商变体)。<em></em><em></em>核心变体应被视为框架模块,而供应商变体应被视为供应商模块。如果某些框架模块依赖于此模块,则会编译核心变体。如果某些供应商模块依赖于此模块,则会编译供应商变体。</p>
+<p>如果 <code>vendor_available</code> 或 <code>vndk.enabled</code> 为 <code>true</code>,则可以编译两种变体(核心变体和供应商变体)。<em></em><em></em>核心变体应被视为框架模块,而供应商变体应被视为供应商模块。如果某些框架模块依赖于此模块,则会编译核心变体。如果某些供应商模块依赖于此模块,则会编译供应商变体。</p>
 
 <p>编译系统会强制执行以下依赖性检查:</p>
 
@@ -132,12 +132,12 @@
 
  <li>供应商变体的所有依赖项(在 <code>header_libs</code>、<code>static_libs</code> 和/或 <code>shared_libs</code> 中指定)必须是 <code>llndk_library</code> 或具有 <code>vendor_available</code> 或 <code>vndk.enabled</code> 的模块。</li>
 
- <li>如果 <code>vendor_available</code> 为 <code>true</code>(Android 8.1 的唯一有效值),则所有供应商模块均可访问供应商变体。</li>
+ <li>如果 <code>vendor_available</code> 为 <code>true</code>,则供应商变体可供所有供应商模块访问。</li>
 
- <li>在 AOSP master 中,如果 <code>vendor_available</code> 为 <code>false</code>,则供应商变体只能供其他 VNDK 或 VNDK-SP 模块访问(即,具有 <code>vendor:true</code> 的模块无法与 <code>vendor_available:false</code> 模块相关联)。</li>
+ <li>如果 <code>vendor_available</code> 为 <code>false</code>,则供应商变体仅可供其他 VNDK 或 VNDK-SP 模块访问(即,具有 <code>vendor:true</code> 的模块无法与 <code>vendor_available:false</code> 模块相关联)。</li>
 </ul>
 
-<p><code>cc_library</code> 或 <code>cc_library_shared</code> 的默认安装路径由以下规则确定:</p>
+<p>系统将通过以下规则确定 <code>cc_library</code> 或 <code>cc_library_shared</code> 的默认安装路径:</p>
 
 <ul>
  <li>
@@ -157,11 +157,11 @@
 
     <ul>
      <li>
-      如果 <code>vndk.support_system_process</code> 为 <code>false</code>,则将供应商变体安装到 <code>/system/lib[64]/vndk</code> 中。
+      如果 <code>vndk.support_system_process</code> 为 <code>false</code>,则供应商变体将安装到 <code>/system/lib[64]/vndk-${VER}</code> 中。
      </li>
 
      <li>
-      反之,将供应商变体安装到 <code>/system/lib[64]/vndk-sp</code> 中。
+      否则,供应商变体将安装到 <code>/system/lib[64]/vndk-sp-${VER}</code> 中。
      </li>
     </ul>
    </li>
@@ -169,7 +169,7 @@
  </li>
 </ul>
 
-<p>下表对编译系统处理供应商变体的方式进行了总结:</p>
+<p>下表总结了编译系统如何处理供应商变体:</p>
 
 <table>
  <tbody><tr>
@@ -203,7 +203,7 @@
   <td><p><code>false</code></p></td>
   <td>
    <p>供应商变体是 VNDK<em></em>。</p>
-   <p>共享库将安装到 <code>/system/lib[64]/vndk</code> 中。</p>
+   <p>共享库将安装到 <code>/system/lib[64]/vndk-${VER}</code> 中。</p>
   </td>
  </tr>
 
@@ -211,7 +211,7 @@
   <td><p><code>true</code></p></td>
   <td>
    <p>供应商变体是 VNDK-SP<em></em>。</p>
-   <p>共享库将安装到 <code>/system/lib[64]/vndk-sp</code> 中。</p>
+   <p>共享库将安装到 <code>/system/lib[64]/vndk-sp-${VER}</code> 中。</p>
   </td>
  </tr>
 
@@ -231,49 +231,281 @@
   <td rowspan="2"><p><code>true</code></p></td>
   <td><p><code>false</code></p></td>
   <td>
-   <p>供应商变体是 VNDK-Indirect。<em></em></p>
-   <p>共享库将安装到 <code>/system/lib[64]/vndk</code> 中。</p>
-   <p>这些变体不得由供应商模块直接使用。</p>
-   <p>AOSP master(而非 Android 8.1)中的新设置。</p>
+   <p>供应商变体是 VNDK-Private<em></em>。</p>
+   <p>共享库将安装到 <code>/system/lib[64]/vndk-${VER}</code> 中。</p>
+   <p>供应商模块不得直接使用这些变体。</p>
   </td>
  </tr>
 
  <tr>
   <td><p><code>true</code></p></td>
   <td>
-   <p>供应商变体是 VNDK-SP-Indirect-Private。<em></em></p>
-   <p>共享库将安装到 <code>/system/lib[64]/vndk-sp</code> 中。</p>
-   <p>这些变体不得由供应商模块直接使用。</p>
-   <p>AOSP master(而非 Android 8.1)中的新设置。</p>
+   <p>供应商变体是 <em></em>VNDK-SP-Private。</p>
+   <p>共享库将安装到 <code>/system/lib[64]/vndk-sp-${VER}</code> 中。</p>
+   <p>供应商模块不得直接使用这些变体。</p>
   </td>
  </tr>
 </tbody></table>
 
-<aside class="note"><strong>注意</strong>:供应商可以为其模块设置 <code>vendor_available</code>。但是,供应商既不得设置 <code>vndk.enabled</code> 也不得设置 <code>vndk.support_system_process</code>,因为供应商模块无法在 GSI 中找到它们。</aside>
+<aside class="note"><strong>注意</strong>:供应商可以为其模块设置 <code>vendor_available</code>。不过,供应商不得设置 <code>vndk.enabled</code> 和 <code>vndk.support_system_process</code>,因为供应商模块无法在 GSI 中找到它们。</aside>
+
+<h3 id="vndk-extensions">VNDK 扩展</h3>
+
+<p>VNDK 扩展是具有额外 API 的 VNDK 共享库,将安装到 <code>/vendor/lib[64]/vndk[-sp]</code> 中(不含版本后缀),并在系统运行时替换原始的 VNDK 共享库。</p>
+
+<h4 id="defining-vndk-extensions">定义 VNDK 扩展</h4>
+
+<p>在 Android P 中,<code>Android.bp</code> 本身支持 VNDK 扩展。要编译 VNDK 扩展,请定义另一个具有 <code>vendor:true</code> 和 <code>extends</code> 属性的模块:</p>
+
+<pre class="prettyprint">
+cc_library {
+    name: "libvndk",
+    vendor_available: true,
+    vndk: {
+        enabled: true,
+    },
+}
+
+cc_library {
+    name: "libvndk_ext",
+    vendor: true,
+    vndk: {
+        enabled: true,
+        extends: "libvndk",
+    },
+}
+</pre>
+
+<p>具有 <code>vendor:true</code>、<code>vndk.enabled:true</code> 和 <code>extends</code> 属性的模块可定义 VNDK 扩展:</p>
+
+<ul>
+ <li><code>extends</code> 属性必须指定基础 VNDK 共享库名称(或 VNDK-SP 共享库名称)。</li>
+
+ <li>VNDK 扩展(或 VNDK-SP 扩展)以扩展时所基于的基础模块名称命名。例如,<code>libvndk_ext</code> 的输出二进制文件是 <code>libvndk.so</code>,而非 <code>libvndk_ext.so</code>。</li>
+
+ <li>VNDK 扩展将安装到 <code>/vendor/lib[64]/vndk</code> 中。</li>
+
+ <li>VNDK-SP 扩展将安装到 <code>/vendor/lib[64]/vndk-sp</code> 中。</li>
+
+ <li>基础共享库必须同时具有 <code>vndk.enabled:true</code> 和 <code>vendor_available:true</code>。</li>
+</ul>
+
+<p>VNDK-SP 扩展必须从 VNDK-SP 共享库进行扩展。也就是说,<code>vndk.support_system_process</code> 必须等于:</p>
+
+<pre class="prettyprint">
+cc_library {
+    name: "libvndk_sp",
+    vendor_available: true,
+    vndk: {
+        enabled: true,
+        support_system_process: true,
+    },
+}
+
+cc_library {
+    name: "libvndk_sp_ext",
+    vendor: true,
+    vndk: {
+        enabled: true,
+        extends: "libvndk_sp",
+        support_system_process: true,
+    },
+}
+</pre>
+
+<p>VNDK 扩展(或 VNDK-SP 扩展)可以依赖于其他供应商共享库:</p>
+
+<pre class="prettyprint">
+cc_library {
+    name: "libvndk",
+    vendor_available: true,
+    vndk: {
+        enabled: true,
+    },
+}
+
+cc_library {
+    name: "libvndk_ext",
+    vendor: true,
+    vndk: {
+        enabled: true,
+        extends: "libvndk",
+    },
+    shared_libs: [
+        "libvendor",
+    ],
+}
+
+cc_library {
+    name: "libvendor",
+    vendor: true,
+}
+</pre>
+
+<aside class="note"><strong>注意</strong>:与 SP-HAL-Dep 类似,VNDK-SP 扩展及其依赖项(包括供应商库)在 sepolicy 中必须标记为 <code>same_process_hal_file</code>。</aside>
+
+<h4 id="using-vndk-extensions">使用 VNDK 扩展</h4>
+
+<p>如果供应商模块依赖于由 VNDK 扩展定义的一些其他 API,则必须在其 <code>shared_libs</code> 属性中指定 VNDK 扩展的名称:</p>
+
+<pre class="prettyprint">
+// A vendor shared library example
+cc_library {
+    name: "libvendor",
+    vendor: true,
+    shared_libs: [
+        "libvndk_ext",
+    ],
+}
+
+// A vendor executable example
+cc_binary {
+    name: "vendor-example",
+    vendor: true,
+    shared_libs: [
+        "libvndk_ext",
+    ],
+}
+</pre>
+
+<p>如果供应商模块依赖于一些 VNDK 扩展,则这些 VNDK 扩展将自动安装到 <code>/vendor/lib[64]/vndk[-sp]</code> 中。</p>
+
+<p>如果某个模块不再依赖于 VNDK 扩展,请向 <code>CleanSpec.mk</code> 添加一个清理步骤,以移除共享库。例如:</p>
+
+<pre class="prettyprint">
+$(call add-clean-step, rm -rf $(TARGET_OUT_VENDOR)/lib/libvndk.so)
+</pre>
 
 <h3 id="conditional-compilation">条件编译</h3>
 
-<p>如果核心变体和供应商变体之间存在一些细微差异,您可以使用 <code>target.vendor</code> 为条件编译指定不同的选项。例如:</p>
+<p>本小节介绍了如何处理以下三个 VNDK 共享库之间的细微差异<em></em>(例如,为其中一个变体添加或移除某项功能):(1) 核心变体(例如 <code>/system/lib[64]/libexample.so</code>)、(2) 供应商变体(例如 <code>/system/lib[64]/vndk[-sp]-${VER}/libexample.so</code>)和 (3) VNDK 扩展(例如 <code>/vendor/lib[64]/vndk[-sp]/libexample.so</code>)。
+
+</p><h4 id="conditional-cflags">条件编译器标志</h4>
+
+<p>默认情况下,Android 编译系统会为供应商变体(包括 VNDK 扩展)定义 <code>__ANDROID_VNDK__</code>。您可以使用 C 预处理器防护程序来保护相应代码:</p>
+
+<pre class="prettyprint">
+void all() { }
+
+#if !defined(__ANDROID_VNDK__)
+void framework_only() { }
+#endif
+
+#if defined(__ANDROID_VNDK__)
+void vndk_only() { }
+#endif
+</pre>
+
+<p>除了 <code>__ANDROID_VNDK__</code>,还可以在 <code>Android.bp</code> 中指定不同的 <code>cflags</code> 或 <code>cppflags</code>。在 <code>target.vendor</code> 中指定的 <code>cflags</code> 或 <code>cppflags</code> 是专门针对供应商变体的。例如,以下代码是针对 <code>libexample</code> 和 <code>libexample_ext</code> 的 <code>Android.bp</code> 模块定义:</p>
+
+<pre class="prettyprint">
+cc_library {
+    name: "libexample",
+    srcs: ["example.c"],
+    vendor_available: true,
+    vndk: {
+        enabled: true,
+    },
+    target: {
+        vendor: {
+            cflags: ["-DLIBEXAMPLE_ENABLE_VNDK=1"],
+        },
+    },
+}
+
+cc_library {
+    name: "libexample_ext",
+    srcs: ["example.c"],
+    vendor: true,
+    vndk: {
+        enabled: true,
+        extends: "libexample",
+    },
+    cflags: [
+        "-DLIBEXAMPLE_ENABLE_VNDK=1",
+        "-DLIBEXAMPLE_ENABLE_VNDK_EXT=1",
+    ],
+}
+</pre>
+
+<p><code>example.c</code> 的代码清单:</p>
+
+<pre class="prettyprint">
+void all() { }
+
+#if !defined(LIBEXAMPLE_ENABLE_VNDK)
+void framework_only() { }
+#endif
+
+#if defined(LIBEXAMPLE_ENABLE_VNDK)
+void vndk() { }
+#endif
+
+#if defined(LIBEXAMPLE_ENABLE_VNDK_EXT)
+void vndk_ext() { }
+#endif
+</pre>
+
+<p>针对每个变体导出的符号如下:</p>
+
+<table>
+ <tbody><tr>
+  <th>安装路径</th>
+  <th>导出的符号</th>
+ </tr>
+
+ <tr>
+  <td><code>/system/lib[64]/libexample.so</code></td>
+  <td><code>all</code>、<code>framework_only</code></td>
+ </tr>
+
+ <tr>
+  <td><code>/system/lib[64]/vndk-${VER}/libexample.so</code></td>
+  <td><code>all</code>、<code>vndk</code></td>
+ </tr>
+
+ <tr>
+  <td><code>/vendor/lib[64]/vndk/libexample.so</code></td>
+  <td><code>all</code>、<code>vndk</code>、<code>vndk_ext</code></td>
+ </tr>
+</tbody></table>
+
+<!-- TODO: The paragraph below looks awkward. Refine this subsection to make
+this more fluent. -->
+
+<p>VNDK ABI 合规性检查工具会将 VNDK 和 VNDK 扩展的 ABI 同 <code>prebuilts/abi-dumps/vndk</code> 下的 ABI 转储进行比较:</p>
+
+<ul>
+ <li>通过原始 VNDK 共享库导出的符号必须与 ABI 转储中定义的符号相同(而不是后者的超集)。</li>
+
+ <li>通过 VNDK 扩展导出的符号必须是 ABI 转储中定义的符号的超集。</li>
+</ul>
+
+<h4 id="exclude-source-files-or-shared-libs">排除源文件或共享库</h4>
+
+<p>要从供应商变体中排除源文件,请将相应文件添加到 <code>exclude_srcs</code> 属性中。同样,要确保特定共享库未与供应商变体相关联,请将这些共享库添加到 <code>exclude_shared_libs</code> 属性中。例如:</p>
 
 <pre class="prettyprint">cc_library {
-    name: "libconditional_example",
+    name: "libcond_exclude_example",
     srcs: ["fwk.c", "both.c"],
     shared_libs: ["libfwk_only", "libboth"],
     target: {
         vendor: {
             exclude_srcs: ["fwk.c"],
             exclude_shared_libs: ["libfwk_only"],
-            cflags: ["-DVENDOR_VARIANT=1"],
-            cppflags: ["-DVENDOR_VARIANT=1"],
         },
     },
 }</pre>
 
-<p>在本示例中,<code>libconditional_example</code> 的核心变体包含 <code>fwk.c</code> 和 <code>both.c</code> 的代码,并且依赖于共享库 <code>libfwk_only</code> 和 <code>libboth</code>。</p>
+<p>在本示例中,<code>libcond_exclude_example</code> 的核心变体包含 <code>fwk.c</code> 和 <code>both.c</code> 中的代码,并且依赖于共享库 <code>libfwk_only</code> 和 <code>libboth</code>。</p>
 
-<p>另一方面,<code>libconditional_example</code> 的供应商变体仅包含 <code>both.c</code> 中的代码,因为 <code>fwk.c</code> 已被 <code>exclude_srcs</code> 属性排除。同样,<code>libconditional_example</code> 仅依赖于共享库 <code>libboth</code>,因为 <code>libfwk_only</code> 已被 <code>exclude_shared_libs</code> 属性排除。<code>cflags</code> 和 <code>cppflags</code> 也可以指定特定于供应商的选项。</p>
+<p>另一方面,<code>libcond_exclude_example</code> 的供应商变体仅包含 <code>both.c</code> 中的代码,因为 <code>fwk.c</code> 已被 <code>exclude_srcs</code> 属性排除。同样,<code>libcond_exclude_example</code> 仅依赖于共享库 <code>libboth</code>,因为 <code>libfwk_only</code> 已被<br /> <code>exclude_shared_libs</code> 属性排除。
 
-<h3 id="product-packages">产品包</h3>
+<!-- <h4 id="vndk-ext-header-guideline">VNDK extension header guidelines</h4> -->
+
+<!-- TODO: Add the guide line for VNDK extension headers. -->
+
+</p><h3 id="product-packages">产品包</h3>
 
 <p>在 Android 编译系统中,变量 <code>PRODUCT_PACKAGES</code> 指定应安装到设备中的可执行文件、共享库或软件包。指定模块的传递依赖项也会隐式安装到设备中。</p>
 
diff --git a/zh-cn/devices/architecture/vndk/index.html b/zh-cn/devices/architecture/vndk/index.html
index 8d8bd52..086c94b 100644
--- a/zh-cn/devices/architecture/vndk/index.html
+++ b/zh-cn/devices/architecture/vndk/index.html
@@ -32,20 +32,20 @@
 <li><strong>AOSP 库的扩展</strong>。Android 8.0 及更高版本要求所有 Android 设备在系统分区被替换为标准常规系统映像 (GSI) 时,都可以通过 CTS 测试。不过,当供应商扩展 AOSP 库以提高性能或为其 HIDL 实现添加额外的功能时,使用标准 GSI 来刷写系统分区可能会破坏供应商的 HIDL 实现(有关如何防止此类破坏的指南,请参阅 <a href="/devices/architecture/vndk/extensions.html">VNDK 扩展</a>)。</li>
 </ul>
 
-<p>为了克服这些挑战,Android 8.0 引入了几项技术,例如 VNDK(如本部分中所述)、<a href="/devices/architecture/hidl/index.html">HIDL</a>、hwbinder、<a href="/devices/architecture/dto/index.html">设备树叠加层</a>和 sepolicy 叠加层。</p>
+<p>为了克服这些挑战,Android 8.0 引入了一些技术,例如 VNDK(本部分对其进行了介绍)、<a href="/devices/architecture/hidl/index.html">HIDL</a>、hwbinder、<a href="/devices/architecture/dto/index.html">设备树叠加层</a>和 sepolicy 叠加层。</p>
 
 <h2 id="resources">VNDK 资源</h2>
 <p>本部分包含以下 VNDK 资源:</p>
 <ul>
-<li><em><a href="#vndk-concepts">VNDK 概念</a></em>(参见下文)介绍了框架共享库、Same-Process HAL (SP-HAL) 和 VNDK 术语。
+<li><em><a href="#vndk-concepts">VNDK 概念</a></em>:(请参阅下文)介绍了框架共享库、Same-Process HAL (SP-HAL) 和 VNDK 术语。
 </li>
-<li><em><a href="/devices/architecture/vndk/extensions.html">VNDK 扩展</a></em>对供应商专属更改进行了分类。例如,具有供应商模块所依赖的扩展功能的库必须复制到供应商分区中,但禁止进行 ABI 不兼容的更改。</li>
-<li><em><a href="/devices/architecture/vndk/build-system.html">VNDK 编译系统支持</a></em>介绍了与 VNDK 相关的编译系统配置和模块定义语法。</li>
-<li><em><a href="/devices/architecture/vndk/deftool.html">VNDK 定义工具</a></em>可帮助您将源代码树迁移到 Android 8.0 及更高版本。</li>
-<li><em><a href="/devices/architecture/vndk/linker-namespace.html">链接器命名空间</a></em>提供对共享库关联的精细控制。
+<li><em><a href="/devices/architecture/vndk/extensions.html">VNDK 扩展</a></em>:对专门针对供应商的更改进行了分类。例如,具有供应商模块所依赖的扩展功能的库必须复制到供应商分区中,但禁止进行 ABI 不兼容的更改。</li>
+<li><em><a href="/devices/architecture/vndk/build-system.html">VNDK 编译系统支持</a></em>:介绍了与 VNDK 相关的编译系统配置和模块定义语法。</li>
+<li><em><a href="/devices/architecture/vndk/deftool.html">VNDK 定义工具</a></em>:可协助您将源代码树迁移到 Android 8.0 及更高版本。</li>
+<li><em><a href="/devices/architecture/vndk/linker-namespace.html">链接器命名空间</a></em>:提供对共享库关联的精细控制。
 </li>
-<li><em><a href="/devices/architecture/vndk/dir-rules-sepolicy.html">目录、规则和 sepolicy</a></em> 定义了运行 Android 8.0 及更高版本的设备的目录布局,以及 VNDK 规则和关联的 sepolicy。</li>
-<li><em><a href="../images/vndk_design_android_o.pdf">Android O 中的 VDNK 设计</a></em>演示文稿阐述了 Android O 中使用的 VDNK 基本概念。</li>
+<li><em><a href="/devices/architecture/vndk/dir-rules-sepolicy.html">目录、规则和 sepolicy</a></em>:定义了搭载 Android 8.0 及更高版本的设备的目录结构,以及 VNDK 规则和关联的 sepolicy。</li>
+<li><em><a href="../images/vndk_design_android_o.pdf">Android O 中的 VDNK 设计</a></em>演示文稿:阐述了 Android O 中使用的 VDNK 基本概念。</li>
 </ul>
 
 <h2 id="concepts">VNDK 概念</h2>
@@ -66,9 +66,9 @@
 <p>根据共享库的特性不同,使用的方法也有差异。因此,框架共享库可分为以下三个子类别:</p>
 
 <ul>
-<li><em></em><em></em>LL-NDK 库是已知稳定的框架共享库。它们的开发者致力于保持其 API/ABI 的稳定性。
+<li><em></em><em></em>LL-NDK 库是已知稳定的框架共享库。它们的开发者致力于保持其 API/ABI 稳定性。
  <ul>
- <li>LL-NDK 包含以下库:<code>libEGL.so</code>、<code>libGLESv1_CM.so</code>、<code>libGLESv2.so</code>、<code>libGLESv3.so</code>、<code>libandroid_net.so</code>、<code>libc.so</code>、<code>libdl.so</code>、<code>liblog.so</code>、<code>libm.so</code>、<code>libnativewindow.so</code>、<code>libsync.so</code> 和 <code>libvndksupport.so</code>
+ <li>LL-NDK 包含以下库:<code>libEGL.so</code>、<code>libGLESv1_CM.so</code>、<code>libGLESv2.so</code>、<code>libGLESv3.so</code>、<code>libandroid_net.so</code>、<code>libc.so</code>、<code>libdl.so</code>、<code>liblog.so</code>、<code>libm.so</code>、<code>libnativewindow.so</code>、<code>libneuralnetworks.so</code>、<code>libsync.so</code>、<code>libvndksupport.so</code> 和 <code>libvulkan.so</code>。
 </li>
  </ul>
 </li>
@@ -113,7 +113,6 @@
 </p>
 
 <ul>
-<li><code>[email protected]</code></li>
 <li><code>[email protected]</code></li>
 <li><code>[email protected]</code></li>
 <li><code>[email protected]</code> (Renderscript)</li>
@@ -131,8 +130,10 @@
 </ul>
 
 <p>
-以下 VNDK-SP 依赖项 (VNDK-SP-Indirect) 对 SP-HAL 不可见:
-<em></em><em></em></p><ul>
+以下 VNDK-SP 依赖项 (VNDK-SP-Private) 对 SP-HAL 来说是不可见的:<em></em><em></em>
+</p>
+
+<ul>
 <li><code>libRSCpuRef.so</code> (Renderscript)</li>
 <li><code>libRSDriver.so</code> (Renderscript)</li>
 <li><code>libbacktrace.so</code></li>
@@ -142,12 +143,6 @@
 <li><code>libunwind.so</code></li>
 </ul>
 
-<p>以下私有 VNDK-SP 依赖项 (VNDK-SP-Indirect-Private) 对所有供应商模块均不可见:<em></em></p>
-
-<ul>
-<li><code>libcompiler_rt.so</code> (Renderscript)</li>
-</ul>
-
 <p>以下是具有 RS 例外的框架专用库 (FWK-ONLY-RS):<em></em></p>
 <ul>
 <li><code>libft2.so</code> (Renderscript)</li>
@@ -158,28 +153,87 @@
 <ul>
 <li><em></em><em></em><em></em>模块是指共享库或可执行文件。</li>
 <li><em></em><em></em>进程是指可执行文件产生的操作系统任务。</li>
-<li><em></em>以“框架”打头的术语是指与<strong>系统</strong>分区相关的概念。</li>
-<li><em></em>以“供应商”打头的术语是指与<strong>供应商</strong>分区相关的概念。</li>
+<li>以“框架”打头的术语是指与<strong>系统</strong>分区相关的概念。<em></em></li>
+<li>以“供应商”打头的术语是指与<strong>供应商</strong>分区相关的概念。<em></em></li>
 </ul>
 
 <p>例如:</p>
 <ul>
-<li><em></em>框架可执行文件是指 <code>/system/bin</code> 或 <code>/system/xbin</code> 中的可执行文件。</li>
-<li><em></em>框架共享库是指 <code>/system/lib[64]</code> 下的共享库。</li>
+<li>框架可执行文件是指 <code>/system/bin</code> 或 <code>/system/xbin</code> 中的可执行文件。<em></em></li>
+<li>框架共享库是指 <code>/system/lib[64]</code> 下的共享库。<em></em></li>
 <li><em></em><em></em><em></em>框架模块是指框架共享库和框架可执行文件。</li>
-<li><em></em><em></em>框架进程是指框架可执行文件(例如 <code>/system/bin/app_process</code>)产生的进程。</li>
-<li><em></em>供应商可执行文件是指 <code>/vendor/bin</code> 中的可执行文件。
-</li><li><em></em>供应商共享库是指 <code>/vendor/lib[64]</code> 下的共享库。</li>
+<li>框架进程是指从框架可执行文件衍生而来的进程(例如 <code>/system/bin/app_process</code>)。<em></em><em></em></li>
+<li>供应商可执行文件是指 <code>/vendor/bin</code> 中的可执行文件<em></em>。
+</li><li>供应商共享库是指 <code>/vendor/lib[64]</code> 下的共享库。<em></em></li>
 <li><em></em><em></em><em></em>供应商模块是指供应商可执行文件和供应商共享库。</li>
 <li><em></em><em></em>供应商进程是指供应商可执行文件(例如 </li>
 <code>/vendor/bin/[email protected]</code>)产生的进程。
 </ul>
 
-<aside class="note"><strong>注意</strong>:常规系统映像 (GSI) 代表根据相应分支(与版本分支类似,但修正了一些错误或进行了一些泛化)编译并由 Google 发布的标准 Android 系统映像。<em></em></aside>
+<aside class="note"><strong>注意</strong>:常规系统映像 (GSI) 是指根据相应分支(与版本分支类似,但更正了一些错误或进行了一些泛化)编译并由 Google 发布的标准 Android 系统映像。<em></em></aside>
+
+<h2 id="vndk-versioning">VNDK 版本编号</h2>
+
+<p>在 Android P 中,VNDK 共享库带有版本编号:</p>
+
+<ul>
+ <li><code>ro.vndk.version</code> 系统属性将自动添加到 <code>/vendor/default.prop</code>。</li>
+
+ <li>VNDK 共享库将安装到 <code>/system/lib[64]/vndk-${ro.vndk.version}</code> 中。</li>
+
+ <li>VNDK-SP 共享库将安装到 <code>/system/lib[64]/vndk-sp-${ro.vndk.version}</code> 中。</li>
+
+ <li>动态链接器配置文件将安装到 <code>/system/etc/ld.config.${ro.vndk.version}.txt</code> 中。</li>
+</ul>
+
+<p>系统将按以下算法选择 <code>ro.vndk.version</code> 的值:</p>
+
+<ul>
+ <li>如果 <code>BOARD_VNDK_VERSION</code> 不等于 <code>current</code>,则使用 <code>BOARD_VNDK_VERSION</code>。<em></em></li>
+
+ <li>如果 <code>BOARD_VNDK_VERSION</code> 等于 <code>current</code>:<em></em></li>
+
+ <ul>
+  <li>如果 <code>PLATFORM_VERSION_CODENAME</code> 为 <code>REL</code>,则使用 <code>PLATFORM_SDK_VERSION</code>(例如 <code>28</code>)。</li>
+
+  <li>否则使用 <code>PLATFORM_VERSION_CODENAME</code>(例如 <code>P</code>)。</li>
+ </ul>
+</ul>
+
+<h3 id="upgrading-devices">升级设备</h3>
+
+<p>如果 Android 8.x 设备停用了 VNDK 运行时增强功能(即,编译时未使用 <code>BOARD_VNDK_VERSION</code> 或使用了 <code>BOARD_VNDK_RUNTIME_DISABLE</code>),则在升级到 Android P 时,可能会将 <code>PRODUCT_USE_VNDK_OVERRIDE := false</code> 添加 <code>BoardConfig.mk</code>。</p>
+
+<p>如果 <code>PRODUCT_USE_VNDK_OVERRIDE</code> 为 <code>false</code>,则 <code>ro.vndk.lite</code> 属性将自动添加到 <code>/vendor/default.prop</code>,且其值将为 <code>true</code>。因此,动态链接器将加载 <code>/system/etc/ld.config.vndk_lite.txt</code> 中的链接器命名空间配置,这仅会隔离 SP-HAL 和 VNDK-SP。</p>
+
+<p>如果要将搭载 Android 7.0(或更低版本)的设备升级到 Android P,请将 <code>PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false</code> 添加到 <code>BoardConfig.mk</code>。</p>
+
+<h3 id="vendor-test-suite">供应商测试套件 (VTS)</h3>
+
+<p>Android P 供应商测试套件 (VTS) 强制要求存在非空 <code>ro.vndk.version</code> 属性。新发布的设备和升级设备都必须定义 <code>ro.vndk.version</code>。一些 VNDK 测试用例(例如 <code>VtsVndkFilesTest</code> 和 <code>VtsVndkDependencyTest</code>)依赖于 <code>ro.vndk.version</code> 属性来加载符合条件且匹配的 VNDK 库数据集。</p>
+
+<p>如果 <code>ro.product.first_api_level</code> 属性大于 27,则不能定义 <code>ro.vndk.lite</code> 属性。
+如果在新推出的 Android P 设备中定义了 <code>ro.vndk.lite</code>,则 <code>VtsTreblePlatformVersionTest</code> 将失败。</p>
 
 <h2 id="document-history">文档历史记录</h2>
 
-<p>本部分跟踪了对 VNDK 文档的更改。</p>
+<p>本部分跟踪了对 VNDK 文档进行的更改。</p>
+
+<h3 id="changes-p">Android P 的变化</h3>
+
+<ul>
+ <li>添加了“VNDK 版本编号”部分。</li>
+
+ <li>添加了“VTS”部分。</li>
+
+ <li>更改了部分 VNDK 类别的名称:</li>
+ <ul>
+  <li>LL-NDK-Indirect 已改名为 LL-NDK-Private。</li>
+  <li>VNDK-Indirect 已改名为 VNDK-Private。</li>
+  <li>VNDK-SP-Indirect-Private 已改名为 VNDK-SP-Private。</li>
+  <li>移除了 VNDK-SP-Indirect。</li>
+ </ul>
+</ul>
 
 <h3 id="changes-81">Android 8.1 的变化</h3>
 
diff --git a/zh-cn/devices/architecture/vndk/snapshot-design.html b/zh-cn/devices/architecture/vndk/snapshot-design.html
new file mode 100644
index 0000000..45c8adc
--- /dev/null
+++ b/zh-cn/devices/architecture/vndk/snapshot-design.html
@@ -0,0 +1,152 @@
+<html devsite><head>
+    <title>VNDK 快照设计</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.
+  -->
+
+<p>
+  系统映像可以使用 VNDK 快照为供应商映像提供正确的 VNDK 库,即使系统映像和供应商映像是基于不同版本的 Android 编译的也是如此。创建 VNDK 快照需要以快照形式捕获 VNDK 库,并使用版本号标记它们。供应商映像可以与特定的 VNDK 版本相关联,由此版本为供应商映像中的模块提供所需 ABI。不过,在同一 VNDK 版本内,VNDK 库必须具有<a href="/devices/architecture/hidl/hashing#abi-stability">稳定的 ABI</a>。
+</p>
+
+<p>
+  VNDK 快照设计包括用于执行以下两项操作的方法:从当前系统映像<a href="/devices/architecture/vndk/snapshot-generate.html">生成预编译的 VNDK 快照</a>和<a href="/devices/architecture/vndk/snapshot-generate.html#install-vndk-snapshot">将这些预编译的库安装</a>到更高 Android 版本的系统分区。
+</p>
+
+<h2 id="about-vndk-libs">VNDK 库简介</h2>
+
+<p>
+  Android 8.0 中引入的 <a href="/devices/architecture/index.html#hidl">HIDL-HAL</a> 支持单独升级系统分区和供应商分区。VNDK 定义了可与供应商代码相关联的库集(VNDK-core、VNDK-SP 和 LL-NDK),并阻止供应商使用不在 VNDK 集内的库。因此,如果将系统映像上合适的 VNDK 集提供给供应商映像,则可以编译并运行供应商映像。
+</p>
+
+<aside class="note"><strong>注意</strong>:有关这些库的详细信息,请参阅 <a href="/devices/architecture/vndk/index.html#concepts">VNDK 概念</a>。
+</aside>
+
+<h3 id="vndk-core">VNDK-core</h3>
+
+<p>
+  VNDK-core 库集安装在 <code>/system/lib[64]/vndk-${VER}</code> 中,<strong>仅</strong>适用于 API 级别为 <code>${VER}</code> 的供应商进程。系统进程不得使用这些库,而必须使用安装在 <code>/system/lib[64]</code> 中的库。由于每个进程都具有严格的命名空间限制,因此不会造成重复加载 VNDK-core 库。
+</p>
+
+<p>要在 VNDK-core 中添加库,请将以下内容添加到 <code>Android.bp</code> 中:
+</p>
+
+<pre class="prettyprint">
+vendor_available: true,
+vndk: {
+    enabled: true,
+},
+</pre>
+
+<aside class="note"><strong>注意</strong>:如果系统进程从 <code>system/lib</code> 加载库 <code>foo.so</code>,并从 <code>system/lib/vndk</code> 加载另一个 <code>foo.so</code>,这种情况就属于重复加载 <code>foo.so</code>。通常,在一个进程中两次加载同一个库是不安全的。
+</aside>
+
+<h3 id="vndk-sp">VNDK-SP</h3>
+
+<p>
+  VNDK-SP 库安装在 <code>/system/lib[64]/vndk-sp-${VER}</code> 中,适用于供应商进程和系统进程(通过安装在供应商分区中的 SP-HAL 库)。VNDK-SP 库可以重复加载。
+</p>
+
+<p>
+  要在 VNDK-SP 中添加库,请将以下内容添加到 <code>Android.bp</code> 中:
+</p>
+
+<pre class="prettyprint">
+vendor_available: true,
+vndk: {
+    enabled: true,
+    support_system_process: true,
+},
+</pre>
+
+<h3 id="ll-ndk">LL-NDK</h3>
+
+<p>
+  LL-NDK 库安装在 <code>/system/lib[64]</code> 中。供应商模块可以使用 LL-NDK 存根库访问 LL-NDK 库的预选符号。LL-NDK 库必须支持向后兼容且具有 ABI 稳定性,以便旧版供应商模块使用新版 LL-NDK 库。由于 LL-NDK 具有 ABI 稳定特性,VNDK 快照无需包含旧版供应商映像的 LL-NDK 库。
+</p>
+
+<h2 id="about-vndk-snapshots">VNDK 快照简介</h2>
+
+<p>
+  Android 8.1 包含<a href="/devices/architecture/vndk/build-system">根据源代码编译的 VNDK 库</a>。不过,对于更高版本的 Android,必须以快照形式捕获每个 VNDK 版本,并作为预编译版本提供,以便关联到较旧版本的供应商映像。
+</p>
+
+<p>
+  从 Android 9 开始,新版 Android 将在 Android 源代码中包含较低版本 Android 的 VNDK-core 和 VNDK-SP 目录的至少一个快照。编译时,所需快照将安装到 <code>/system/lib[64]/vndk-${VER}</code> 和 <code>/system/lib[64]/vndk-sp-${VER}</code>(供应商分区可以使用的目录),其中 <code>${VER}</code> 是表示 VNDK 快照版本名称的字符串变量。
+</p>
+
+<p>
+  由于每个 VNDK 版本的 VNDK 快照库可能各不相同,因此 VNDK 快照还包含按以下格式安装的链接器命名空间配置:<code>etc/ld.config.${VER}.txt</code>、<code>/etc/llndk.libraries.${VER}.txt</code> 和 <code>/etc/vndksp.libraries.${VER}.txt</code>。
+</p>
+
+<h3 id="example-upgrade-system-vendor">示例:升级系统映像和供应商映像</h3>
+
+<p>
+  无需快照;无需针对 VNDK 快照进行其他配置即可编译。
+</p>
+
+<h3 id="example-upgrade-system-only">示例:仅升级系统映像</h3>
+
+<p>
+  必须在系统映像中包含供应商映像的 VNDK 快照和链接器命名空间配置文件。系统会自动配置链接器命名空间配置文件,以在 <code>/system/lib[64]/vndk-${VER}</code> 和 <code>/system/lib[64]/vndk-sp-${VER}</code> 中搜索 VNDK 库。
+</p>
+
+<img src="/devices/architecture/images/vndk_snapshot_system_only.png"/>
+<figcaption><strong>图 1.</strong> 仅升级系统映像</figcaption>
+
+<h3 id="example-upgrade-system-minor-vendor">示例:升级系统映像,少量更改供应商映像</h3>
+
+<p>
+  根据 VNDK 快照编译供应商映像尚不受支持,因此您必须使用原始源代码单独编译供应商映像,然后按上一示例中所述升级系统映像。
+</p>
+
+<h2 id="vndk-snapshot-arch">VNDK 快照架构</h2>
+
+<p>
+  要使 Android 9 系统映像与 Android 8.1 供应商映像兼容,必须为 Android 9 系统映像提供与 Android 8.1 供应商映像匹配的 VNDK 快照,如下所示:</p>
+
+<img src="/devices/architecture/images/vndk_snapshot_arch.png"/>
+<figcaption><strong>图 2.</strong> VNDK 快照架构</figcaption>
+
+<p>VNDK 快照设计包括以下方法:</p>
+
+<ul>
+  <li><strong>为 VNDK-core 和 VNDK-SP 库生成快照</strong>。Android 9 包含一个脚本,您可以使用它来制作当前 VNDK 版本的快照。此脚本将 <code>/system/lib[64]/vndk-28</code> 和 <code>/system/lib[64]/vndk-sp-28</code> 中的所有库组合在一起,这些库是采用当前源代码以 VNDK 快照形式编译的,其中 <code>28</code> 是 Android 9 的 VNDK 版本。快照还包含链接器命名空间配置文件 <code>/etc/ld.config.28.txt</code>、<code>/etc/llndk.libraries.28.txt</code> 和 <code>/etc/vndksp.libraries.28.txt</code>。生成的快照将用于较新的 Android 版本(高于 Android 9 的版本)。
+  </li>
+  <li><strong>从快照安装预编译的 VNDK-core 和 VNDK-SP 库</strong>。在 Android 9 中,VNDK 快照具有一组预编译的 VNDK-core 库和一组 VNDK-SP 库,以及链接器命名空间配置文件。如果您提供了要安装的 VNDK 快照版本列表,系统映像会在编译时将 VNDK 快照库安装到 <code>/system/lib[64]/vndk-${VER}</code> 和 <code>/system/lib[64]/vndk-sp-${VER}</code> 目录,并将这些 VNDK 快照的链接器命名空间配置文件安装到 <code>/etc</code> 目录。</li>
+</ul>
+
+<h3 id="vndk-versioning">VNDK 版本控制</h3>
+
+<p>
+  每个 Android 版本都只有一个 VNDK 快照,并且 SDK 版本用作 VNDK 版本(这意味着 VNDK 版本必须采用整数,例如 Android 8.1 的 VNDK 版本为 27)。Android 版本发布时,VNDK 版本已确定。供应商分区使用的 VNDK 版本自动存储在 <code>ro.vndk.version</code> 属性中,可在运行时读取。然后,此版本用于识别一些库的供应商 VNDK 版本及命名空间配置的 VNDK 快照版本。
+</p>
+
+<h3 id="build-vndk-libs">编译 VNDK 库</h3>
+
+<p>
+  <code>make vndk</code> 命令可用于编译具有 <code>vndk:
+  { enabled: true, … }</code> 的库,包括依赖项和命名空间配置文件。如果设置了 <code>BOARD_VNDK_VERSION := current</code>,则可使用 <code>make</code> 命令编译这些库。
+</p><p>
+
+</p><p>
+  由于这种编译方法不会从快照安装 VNDK 库,安装的 VNDK 库不具有 ABI 稳定性。不过,Android 版本发布时,当前 VNDK 版本的 ABI 已确定。此时,任何 ABI 损坏都属于编译错误,因此 Android 版本的补丁程序不得更改 VNDK 库的 ABI。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/audio/debugging.html b/zh-cn/devices/audio/debugging.html
index 1f4187b..5f2c28d 100644
--- a/zh-cn/devices/audio/debugging.html
+++ b/zh-cn/devices/audio/debugging.html
@@ -35,7 +35,7 @@
 </p>
 
 <p>
-本节其余部分的说明适用于 Android 5.x 和 6.x。对于 Android 7.x,请将 <code>/data/misc/media</code> 替换为 <code>/data/misc/audioserver</code>。此外,您还必须使用 userdebug 或 eng 版本。如果您使用 userdebug 版本,请使用以下命令停用 verity:</p>
+本节其余部分的说明适用于 Android 7.x 及更高版本。对于 Android 5.x 和 6.x,请将 <code>/data/misc/audioserver</code> 替换为 <code>/data/misc/media</code>。此外,您还必须使用 userdebug 或 eng 版本。如果您使用 userdebug 版本,请使用以下命令停用 verity:</p>
 
 <pre class="devsite-terminal devsite-click-to-copy">
 adb root &amp;&amp; adb disable-verity &amp;&amp; adb reboot
@@ -60,7 +60,7 @@
 <br />确认输出是:<code>[ro.debuggable]: [1]</code>
 </li>
 <li><code class="devsite-terminal">adb shell</code></li>
-<li><code class="devsite-terminal">ls -ld /data/misc/media</code>
+<li><code class="devsite-terminal">ls -ld /data/misc/audioserver</code>
 <br />
 <p>
 确认输出是:</p>
@@ -70,8 +70,8 @@
 <p>
 如果目录不存在,请使用如下格式创建:</p>
 <pre class="devsite-click-to-copy">
-<code class="devsite-terminal">mkdir /data/misc/media</code>
-<code class="devsite-terminal">chown media:media /data/misc/media</code>
+<code class="devsite-terminal">mkdir /data/misc/audioserver</code>
+<code class="devsite-terminal">chown media:media /data/misc/audioserver</code>
 </pre>
 </li>
 <li><code class="devsite-terminal">echo af.tee=# &gt; /data/local.prop</code>
@@ -92,8 +92,7 @@
 </ul>
 
 <p>
-目前还没有针对深度缓冲区和常规混合器的位,不过您可以使用“4”获取类似结果。
-</p>
+目前还没有针对深度缓冲区和常规混合器的位,不过您可以使用“4”获取类似结果。</p>
 
 <h3 id="test">测试和获取数据</h3>
 
@@ -101,10 +100,10 @@
 <li>运行您的音频测试。</li>
 <li><code class="devsite-terminal">adb shell dumpsys media.audio_flinger</code></li>
 <li>在 <code>dumpsys</code> 输出中查找如下行:<br />
-<code>tee copied to /data/misc/media/20131010101147_2.wav</code>
+<code>tee copied to /data/misc/audioserver/20131010101147_2.wav</code>
 <br />这是一个 PCM .wav 文件。
 </li>
-<li>然后 <code>adb pull</code> 任何相关的 <code>/data/misc/media/*.wav</code> 文件;请注意,曲目专用的转储文件名不会显示在 <code>dumpsys</code> 输出中,但仍会在曲目关闭后保存到 <code>/data/misc/media</code>。
+<li>然后 <code>adb pull</code> 任何相关的 <code>/data/misc/audioserver/*.wav</code> 文件;请注意,曲目专用的转储文件名不会显示在 <code>dumpsys</code> 输出中,但仍会在曲目关闭后保存到 <code>/data/misc/audioserver</code>。
 </li>
 <li>在与其他人分享之前,请先查看转储文件是否涉及隐私权问题。</li>
 </ol>
@@ -133,7 +132,7 @@
 </li>
 <li><code class="devsite-terminal">adb shell</code></li>
 <li><code class="devsite-terminal">rm /data/local.prop</code></li>
-<li><code class="devsite-terminal">rm /data/misc/media/*.wav</code></li>
+<li><code class="devsite-terminal">rm /data/misc/audioserver/*.wav</code></li>
 <li><code class="devsite-terminal">reboot</code></li>
 </ol>
 
diff --git a/zh-cn/devices/audio/latency/loopback.html b/zh-cn/devices/audio/latency/loopback.html
index 78ea73b..81e080d 100644
--- a/zh-cn/devices/audio/latency/loopback.html
+++ b/zh-cn/devices/audio/latency/loopback.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>下面的示意图和照片展示的是<a href="http://en.wikipedia.org/wiki/Dongle">耳机连接器</a>的音频环回<a href="http://en.wikipedia.org/wiki/Phone_connector_(audio)">适配器</a>,我们称之为“Dr. Rick O'Rang 音频环回适配器”。Chrome 硬件团队设计了此电路和插头以进行功能测试,不过它还有许多其他用途。Android 音频团队根据拉尔森效应(反馈环)用其测量<a href="latency_measure.html#measuringRoundTrip">往返音频延迟</a>。
+<p>以下示意图和照片展示的是<a href="http://en.wikipedia.org/wiki/Phone_connector_(audio)">耳机连接器</a>的音频环回<a href="http://en.wikipedia.org/wiki/Dongle">适配器</a>,我们称之为“Dr. Rick O'Rang 音频环回适配器”。Android 音频团队根据拉尔森效应(反馈环)用其衡量<a href="measure.html#measuringRoundTrip">往返音频延迟</a>。
 </p>
 
 <h2 id="loopbackCircuit">电路</h2>
@@ -36,6 +36,7 @@
 
 <img src="/devices/audio/images/loopback_assembled.jpg" alt="完全组装" id="figure2"/>
 <p class="img-caption">
-  <strong>图 2. </strong> 组装完成图</p>
+  <strong>图 2. </strong> 组装完成图
+</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/audio/latency/measure.html b/zh-cn/devices/audio/latency/measure.html
index 4f918e5..320f7f8 100644
--- a/zh-cn/devices/audio/latency/measure.html
+++ b/zh-cn/devices/audio/latency/measure.html
@@ -63,6 +63,11 @@
 <h3 id="larsenTest">拉尔森测试</h3>
 <p>最简单的延迟测试之一是音频反馈(拉尔森效应)测试。该测试通过测定脉冲响应循环的时间来粗略衡量合并的输出和输入延迟。由于该测试的性质,它本身对于进行详细的分析并不是很有用,但对于校准其他测试以及确定上限来说会比较实用。</p>
 
+  <p>该方法不会分解组件时间,在输出延迟和输入延迟彼此独立的情况下,这一点非常重要。因此,单独测量精确的输出延迟或输入延迟值时,不建议使用该方法,但在确定粗略的估算值时,该方法可能有用。</p>
+
+  <p>设备扬声器的输出延迟可能会明显高于耳机连接器的输出延迟。这是因为扬声器有校正和保护机制。
+  </p>
+
 <p>要进行该测试,请执行以下操作:</p>
 <ol>
   <li>运行从麦克风捕获音频并立即通过扬声器播放捕获的数据的应用。</li>
@@ -70,13 +75,14 @@
   <li>测量反馈脉冲之间的时间间隔,以得出输出延迟、输入延迟和应用开销的总和。</li>
 </ol>
 
-  <p>该方法不会分解组件时间,在输出延迟和输入延迟彼此独立的情况下,这一点非常重要。因此,单独测量精确的输出延迟或输入延迟值时,不建议使用该方法,但在确定粗略的估算值时,该方法可能有用。</p>
+<p>您可以通过以下资源获取用于执行 Larsen 测试的应用:</p>
 
-  <p>设备上的扬声器的输出延迟可能明显高于耳机连接器的输出延迟。这是因为扬声器有校正和保护机制。
-  </p>
-
-<p>我们已经在 <a href="https://android.googlesource.com/platform/frameworks/wilhelm/+/master/tests/examples/slesTestFeedback.cpp">slesTestFeedback.cpp</a> 中发布了一个示例实现。它是一个命令行应用,使用平台构建环境构建而成;但是对其他环境来说,直接采用相关代码也应该很简单。此外您还需要 <code>audio_utils</code> 库中的<a href="avoiding_pi.html#nonBlockingAlgorithms">非阻塞</a> FIFO 代码。
-</p>
+<ul>
+<li>Dr. Rick O'Rang 环回应用是一款用于进行音频反馈测试的 Android 应用。您可以<a href="https://play.google.com/store/apps/details?id=org.drrickorang.loopback">从 Google Play 下载该应用</a>或<a href="https://www.google.com/url?q=https://github.com/gkasten/drrickorang/tree/master/LoopbackApp&sa=D&usg=AFQjCNFT8D7QTkhLdkZSNyvhmoU5yt_zvg">从 GitHub 获取其源代码</a>。
+</li>
+<li>我们还在 <a href="https://android.googlesource.com/platform/frameworks/wilhelm/+/master/tests/examples/slesTestFeedback.cpp">slesTestFeedback.cpp</a> 中发布了一个实现示例。它是一个命令行应用,使用平台构建环境构建而成;但是对其他环境来说,直接采用相关代码也应该很简单。此外您还需要使用 <code>audio_utils</code> 库中的 <a href="avoiding_pi.html#nonBlockingAlgorithms">non-blocking</a> FIFO 代码。
+</li>
+</ul>
 
 <h3 id="loopback">音频环回软件狗</h3>
 
@@ -127,7 +133,7 @@
   <code>systrace</code> 是一款出色的通用工具,用于诊断系统级别性能故障。
 </p>
 
-<p><code>dumpsys media.audio_flinger</code> 的输出中还包含一个称为“simple moving statistics”(简单的移动统计信息)的实用部分,其中包含每个混音和 I/O 周期如何随时间变化的摘要。理想情况下,所有的时间测量值都应该等于平均值或标称周期时间。如果您看到极小的最小值或极大的最大值,则表示存在问题,有可能是调度延迟过高或中断停用时间过长。输出的尾部部分特别有用,因为它突出显示了 +/- 3 标准偏差之外的变化。<i></i>
+<p><code>dumpsys media.audio_flinger</code> 的输出中还包含一个名为“simple moving statistics”(简单的移动统计信息)的部分,这个部分很有用,其中包含反映每个混音和 I/O 周期如何随时间变化的摘要。理想情况下,所有的时间测量值都应该等于平均值或标称周期时间。如果您看到极小的最小值或极大的最大值,则表示存在问题,有可能是调度延迟过高或中断停用时间过长。输出的结尾部分特别有用,因为它会突出显示超过 +/- 3 标准偏差的变化。<i></i>
 </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/audio/terminology.html b/zh-cn/devices/audio/terminology.html
index 7f23022..9cf44d3 100644
--- a/zh-cn/devices/audio/terminology.html
+++ b/zh-cn/devices/audio/terminology.html
@@ -70,7 +70,7 @@
 <dt>DSD</dt>
 <dd>
 直接数字流。基于<a href="http://en.wikipedia.org/wiki/Pulse-density_modulation">脉冲密度调制</a>的专有音频编码技术。脉冲编码调制 (PCM) 可将波形编码为多位的个体音频样本序列,而 DSD 可以非常高的采样率将波形编码为位数序列(不涉及样本这一概念)。
-PCM 和 DSD 均代表按独立序列划分的多个声道。由于我们很难将传统的数字信号处理 (DSP) 算法应用于 DSD,因此 DSD 更适合进行内容分发,而不适合作为内部表示法进行处理。DSD 用于<a href="http://en.wikipedia.org/wiki/Super_Audio_CD">超音频 CD (SACD)</a> 以及针对 USB 的 DoP (DSD over PCM)。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Direct_Stream_Digital">直接数字流</a>。
+PCM 和 DSD 均代表按独立序列划分的多个声道。由于我们很难将传统的数字信号处理 (DSP) 算法应用于 DSD,因此 DSD 更适合内容分发,而不适合作为内部表示法处理。DSD 用于<a href="http://en.wikipedia.org/wiki/Super_Audio_CD">超音频 CD (SACD)</a> 以及针对 USB 的 DoP (DSD over PCM)。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Direct_Stream_Digital">直接数字流</a>。
 </dd>
 
 <dt>闪避</dt>
@@ -232,7 +232,7 @@
 
 <dt>蓝牙</dt>
 <dd>
-近距离无线技术。要详细了解与音频相关的<a href="http://en.wikipedia.org/wiki/Bluetooth_profile">蓝牙规范</a>和<a href="http://en.wikipedia.org/wiki/Bluetooth_protocols">蓝牙协议</a>,请参阅 <a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Advanced_Audio_Distribution_Profile_.28A2DP.29">A2DP</a> 了解音乐方面的信息,参阅 <a href="http://en.wikipedia.org/wiki/Bluetooth_protocols#Synchronous_connection-oriented_.28SCO.29_link">SCO</a> 了解电话方面的信息,以及<a href="http://en.wikipedia.org/wiki/List_of_Bluetooth_profiles#Audio.2FVideo_Remote_Control_Profile_.28AVRCP.29">音频/视频远程控制规范 (AVRCP)</a>。
+近距离无线技术。要详细了解与音频相关的<a href="http://en.wikipedia.org/wiki/Bluetooth_profile">蓝牙规范</a>和<a href="http://en.wikipedia.org/wiki/Bluetooth_protocols">蓝牙协议</a>,请参阅 <a href="http://en.wikipedia.org/wiki/Bluetooth_profile#Advanced_Audio_Distribution_Profile_.28A2DP.29">A2DP</a> 来了解音乐方面的信息,参阅 <a href="http://en.wikipedia.org/wiki/Bluetooth_protocols#Synchronous_connection-oriented_.28SCO.29_link">SCO</a> 来了解电话方面的信息;另外还可以参阅<a href="http://en.wikipedia.org/wiki/List_of_Bluetooth_profiles#Audio.2FVideo_Remote_Control_Profile_.28AVRCP.29">音频/视频远程控制规范 (AVRCP)</a>。
 </dd>
 
 <dt>DisplayPort</dt>
@@ -328,8 +328,7 @@
 <li><a href="http://mipi.org/specifications/soundwire">SoundWire</a></li>
 </ul>
 
-<p>
-在 <a href="http://www.alsa-project.org/main/index.php/ASoC">ALSA 系统芯片 (ASoC)</a> 中,以上统称为<a href="https://www.kernel.org/doc/Documentation/sound/soc/dai.rst">数字音频接口</a> (DAI)。
+<p>在 <a href="http://www.alsa-project.org/main/index.php/ASoC">ALSA 系统芯片 (ASoC)</a> 中,以上各项统称为<a href="https://www.kernel.org/doc/Documentation/sound/soc/dai.rst">数字音频接口</a> (DAI)。
 </p>
 
 <h3 id="signalTerms">音频信号路径</h3>
@@ -437,7 +436,8 @@
 
 <dt>AudioEffect</dt>
 <dd>
-用于输出(处理后)音效与输入(处理前)音效的 API 和实现框架。该 API 在 <a href="http://developer.android.com/reference/android/media/audiofx/AudioEffect.html">android.media.audiofx.AudioEffect</a> 中进行了定义。
+用于输出(处理后)音效与输入(处理前)音效的 API 和实现框架。该 API 在
+<a href="http://developer.android.com/reference/android/media/audiofx/AudioEffect.html">android.media.audiofx.AudioEffect</a> 中定义。
 </dd>
 
 <dt>AudioFlinger</dt>
@@ -462,7 +462,8 @@
 
 <dt>AudioRecord</dt>
 <dd>
-用于从麦克风等音频输入设备接收数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在 <a href="http://developer.android.com/reference/android/media/AudioRecord.html">android.media.AudioRecord</a> 中进行了定义。
+用于从麦克风等音频输入设备接收数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在
+<a href="http://developer.android.com/reference/android/media/AudioRecord.html">android.media.AudioRecord</a> 中定义。
 </dd>
 
 <dt>AudioResampler</dt>
@@ -477,7 +478,8 @@
 
 <dt>AudioTrack</dt>
 <dd>
-用于向音响设备等音频输出设备发送数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在 <a href="http://developer.android.com/reference/android/media/AudioTrack.html">android.media.AudioTrack</a> 中进行了定义。
+用于向音响设备等音频输出设备发送数据的主要低级别客户端 API。相应数据通常为 PCM 格式。该 API 在
+<a href="http://developer.android.com/reference/android/media/AudioTrack.html">android.media.AudioTrack</a> 中定义。
 </dd>
 
 <dt>audio_utils</dt>
@@ -547,7 +549,8 @@
 
 <dt>SoundPool</dt>
 <dd>
-比 AudioTrack 级别更高的客户端 API,用于播放通过采样得到的音频片段。适用于触发界面反馈、游戏音效等。该 API 在 <a href="http://developer.android.com/reference/android/media/SoundPool.html">android.media.SoundPool</a> 中进行了定义。
+比 AudioTrack 级别更高的客户端 API,可播放通过采样得到的音频片段,适用于触发界面反馈、游戏音效等。该 API 在
+<a href="http://developer.android.com/reference/android/media/SoundPool.html">android.media.SoundPool</a> 中定义。
 </dd>
 
 <dt>Stagefright</dt>
@@ -567,7 +570,8 @@
 
 <dt>音频流类型</dt>
 <dd>
-表示音频输出使用情形的枚举。音频政策的实现用例会根据音频流类型以及其他参数来确定音量和路由决策。要查看音频流类型的列表,请参阅 <a href="http://developer.android.com/reference/android/media/AudioManager.html">android.media.AudioManager</a>。
+表示音频输出使用情形的枚举。音频政策的实现用例会根据音频流类型以及其他参数来确定音量和路由决策。要查看音频流类型的列表,请参阅
+<a href="http://developer.android.com/reference/android/media/AudioManager.html">android.media.AudioManager</a>。
 </dd>
 
 <dt>tee sink</dt>
@@ -597,7 +601,8 @@
 
 <dt>音量指数</dt>
 <dd>
-表示某个音频流的目标相对音量的整数(没有单位)。<a href="http://developer.android.com/reference/android/media/AudioManager.html">android.media.AudioManager</a> 的与音量相关的 API 在运行时采用音量指数(而非绝对的衰减因数)。
+表示某个音频流的目标相对音量的整数(没有单位)。
+<a href="http://developer.android.com/reference/android/media/AudioManager.html">android.media.AudioManager</a> 的音量相关 API 在运行时采用音量指数(而非绝对的衰减因数)。
 </dd>
 
 </dl>
diff --git a/zh-cn/devices/automotive/audio/audio-control.html b/zh-cn/devices/automotive/audio/audio-control.html
new file mode 100644
index 0000000..d5d0158
--- /dev/null
+++ b/zh-cn/devices/automotive/audio/audio-control.html
@@ -0,0 +1,395 @@
+<html devsite><head>
+    <title>实现 AudioControl HAL</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.
+  -->
+
+<p>
+Android 9 弃用了之前各版车载 HAL 中的 <code>AUDIO_*</code> 属性,并改为使用包含显式函数调用和已输入参数列表的专用音频控制 HAL。
+</p>
+
+<p>
+这个新的 HAL 提供了 <code>IAudioControl</code> 作为主接口对象,该对象负责提供出于配置和音量控制目的与车辆的音频引擎进行交互所需的入口点。系统可以包含该对象的一个实例,即 <code>CarAudioService</code> 启动时创建的实例。该对象是传统 Android 音频 HAL 的汽车扩展;在大多数实现中,发布音频 HAL 接口的进程还应发布 <code>IAudioControl interfaces</code>。
+</p>
+
+<h2 id="supported-interfaces">支持的接口</h2>
+
+<p>
+<code>AudioControl</code> HAL 支持以下接口:
+</p>
+
+<ul>
+  <li><code><strong>getBusforContext</strong></code>:在启动时针对每个上下文调用一次,以获取从 <code>ContextNumber</code> 到 <code>busAddress</code> 的映射。用法示例:
+
+<pre class="prettyprint">
+getBusForContext(ContextNumber contextNumber)
+    generates (uint32_t busNumber);
+</pre>
+
+使车辆能够针对每个上下文告诉框架将物理输出音频流路由到哪里。对于每个上下文,必须返回有效的总线编号(0 - 总线数-1)。如果遇到无法识别的 <code>contextNumber</code>,则应返回 -1。对于任何上下文,如果返回无效的 <code>busNumber</code>,都会路由到总线 0。
+<br /><br />
+任何通过此机制与同一个 <code>busNumber</code> 相关联的并发声音都会先通过 Android <code>AudioFlinger</code> 进行混音,然后才会作为单个音频流提供给音频 HAL。这会取代车载 HAL 属性 <code>AUDIO_HW_VARIANT</code> 和 <code>AUDIO_ROUTING_POLICY</code>。
+  </li>
+
+  <li><code><strong>setBalanceTowardRight</strong></code>:用于控制车载音响设备的右/左平衡设置。用法示例:
+
+<pre class="prettyprint">
+setBalanceTowardRight(float value);
+</pre>
+
+将音响设备音量调向汽车右侧 (+) 或左侧 (-)。0.0 表示在中间,+1.0 表示完全调到右侧,-1.0 表示完全调到左侧,如果值未在 -1 到 1 之间,则是错误的。
+  </li>
+
+  <li><code><strong>setFadeTowardFront</strong></code>:用于控制车载音响设备的前/后淡化设置。用法示例:
+
+<pre class="prettyprint">
+setFadeTowardFront(float value);
+</pre>
+
+将音响设备音量调向汽车前面 (+) 或后面 (-)。0.0 表示在中间,+1.0 表示完全调到前面,-1.0 表示完全调到后面,如果值未在 -1 到 1 之间,则是错误的。
+  </li>
+</ul>
+
+<h2 id="configure-volume">配置音量</h2>
+
+<p>
+Android Automotive 实现应使用硬件放大器(而非软件混音器)来控制音量。为避免产生副作用,请在 <code>device/generic/car/emulator/audio/overlay/frameworks/base/core/res/res/values/config.xml</code> 中将 <code>config_useFixedVolume</code> 标记设为 <code>true</code>(根据需要叠加):
+</p>
+
+<pre class="prettyprint">
+&lt;resources&gt;
+    &lt;!-- Car uses hardware amplifier for volume. --&gt;
+    &lt;bool name="config_useFixedVolume"&gt;true&lt;/bool&gt;
+&lt;/resources&gt;
+</pre>
+
+<p>
+<code>config_useFixedVolume</code> 标记未设置或设为 <code>false</code> 时,应用可以调用 <code>AudioManager.setStreamVolume()</code>,并在软件混音器中按音频流类型更改音量。用户可能不希望出现这种情况,因为这会对其他应用带来潜在影响,而且使用硬件放大器接收信号时,软件混音器中的音量衰减会导致信号中的可用有效位减少。
+</p>
+
+<h2 id="configure-volume-groups">配置音量组</h2>
+
+<p>
+  <code>CarAudioService</code> 使用 <code>packages/services/Car/service/res/xml/car_volume_group.xml</code> 中定义的音量组。您可以替换此文件,以便根据需要重新定义音量组。系统在运行时会按 XML 文件中的定义顺序来识别音量组。ID 介于 0 到 N-1 之间,其中 N 是音量组的数量。示例:
+</p>
+
+<pre class="prettyprint">
+&lt;volumeGroups xmlns:car="http://schemas.android.com/apk/res-auto"&gt;
+    &lt;group&gt;
+        &lt;context car:context="music"/&gt;
+        &lt;context car:context="call_ring"/&gt;
+        &lt;context car:context="notification"/&gt;
+        &lt;context car:context="system_sound"/&gt;
+    &lt;/group&gt;
+    &lt;group&gt;
+        &lt;context car:context="navigation"/&gt;
+        &lt;context car:context="voice_command"/&gt;
+    &lt;/group&gt;
+    &lt;group&gt;
+        &lt;context car:context="call"/&gt;
+    &lt;/group&gt;
+    &lt;group&gt;
+        &lt;context car:context="alarm"/&gt;
+    &lt;/group&gt;
+&lt;/volumeGroups&gt;
+</pre>
+
+<p>
+此配置中使用的属性在 <code>packages/services/Car/service/res/values/attrs.xml</code> 中定义。
+</p>
+
+<h2 id="handle-volumn-key-events">处理音量键事件</h2>
+
+<p>
+Android 定义了一些用于控制音量的键码,包括 <code>KEYCODE_VOLUME_UP</code>、<code>KEYCODE_VOLUME_DOWN</code> 和 <code>KEYCODE_VOLUME_MUTE</code>。默认情况下,Android 会将音量键事件路由到应用。Automotive 实现应强制将这些键事件路由到 <code>CarAudioService</code>,以便该服务可以根据情况适当地调用 <code>setGroupVolume</code> 或 <code>setMasterMute</code>。
+</p>
+
+<p>
+要强制实现此行为,请在 <code>device/generic/car/emulator/car/overlay/frameworks/base/core/res/res/values/config.xml</code> 中将 <code>config_handleVolumeKeysInWindowManager</code> 标记设为 <code>true</code>:
+</p>
+
+<pre class="prettyprint">
+&lt;resources&gt;
+    &lt;bool name="config_handleVolumeKeysInWindowManager"&gt;true&lt;/bool&gt;
+&lt;/resources&gt;
+</pre>
+
+<h2 id="caraudiomanager-api">CarAudioManager API</h2>
+
+<p>
+<code>CarAudioManager</code> 使用 <code>CarAudioService</code> 来配置和控制车载音频系统。该管理器对于系统中的大多数应用来说都是不可见的,但车辆专用组件(如音量控制器)可以使用 <code>CarAudioManager</code> API 与系统交互。
+</p>
+
+<p>
+下文介绍了 Android 9 对 <code>CarAudioManager API</code> 所做的更改。
+</p>
+
+<h3 id="deprecated-apis">弃用的 API</h3>
+
+<p>
+Android 9 通过现有的 <code>AudioManager</code> <code>getDeviceList</code> API 处理设备枚举,因此弃用并移除了以下车辆专用函数:
+</p>
+
+<ul>
+  <li><code>String[] getSupportedExternalSourceTypes()</code></li>
+  <li><code>String[] getSupportedRadioTypes()</code></li>
+</ul>
+
+<p>
+Android 9 使用 <code>AudioAttributes.AttributeUsage</code> 或基于音量组的入口点处理音量,因此移除了以下依赖于 <code>streamType</code> 的 API:
+</p>
+
+<ul>
+  <li><code>void setStreamVolume(int streamType, int index, int flags)</code>
+  </li>
+  <li><code>int getStreamMaxVolume(int streamType)</code></li>
+  <li><code>int getStreamMinVolume(int streamType)</code></li>
+  <li><code>void setVolumeController(IVolumeController controller)</code></li>
+</ul>
+
+<h3 id="new-apis">新增的 API</h3>
+
+<p>
+Android 9 添加了以下用于控制放大器硬件的新 API(明确基于音量组):
+</p>
+
+<ul>
+  <li><code>int getVolumeGroupIdForUsage(@AudioAttributes.AttributeUsage int
+  usage)</code></li>
+  <li><code>int getVolumeGroupCount()</code></li>
+  <li><code>int getGroupVolume(int groupId)</code></li>
+  <li><code>int getGroupMaxVolume(int groupId)</code></li>
+  <li><code>int getGroupMinVolume(int groupId)</code></li>
+</ul>
+
+<p>
+Android 9 还提供了以下全新的系统 API 供系统 GUI 使用:
+</p>
+
+<ul>
+  <li><code>void setGroupVolume(int groupId, int index, int flags)</code></li>
+  <li><code>void registerVolumeChangeObserver(@NonNull ContentObserver
+  observer)</code></li>
+  <li><code>void unregisterVolumeChangeObserver(@NonNull ContentObserver
+  observer)</code></li>
+  <li><code>void registerVolumeCallback(@NonNull IBinder binder)</code></li>
+  <li><code>void unregisterVolumeCallback(@NonNull IBinder binder)</code></li>
+  <li><code>void setFadeToFront(float value)</code></li>
+  <li><code>Void setBalanceToRight(float value)</code></li>
+</ul>
+
+<p>
+此外,Android 9 还添加了用于管理外部来源的新 API。这些 API 主要用于支持根据媒体类型将音频从外部来源路由到输出总线。借助这些 API,第三方应用还能够访问外部设备。
+</p>
+
+<ul>
+  <li><code>String[] getExternalSources()</code>:返回一个地址数组,这些地址用于识别系统中 <code>AUX_LINE</code>、<code>FM_TUNER</code>、<code>TV_TUNER</code> 和 <code>BUS_INPUT</code> 类型的可用音频端口。</li>
+  <li><code>CarPatchHandle createAudioPatch(String sourceAddress, int
+  carUsage)</code>:将来源地址路由到与所提供的 <code>carUsage</code> 关联的输出 <code>BUS</code>。</li>
+  <li><code>int releaseAudioPatch(CarPatchHandle patch)</code>:移除所提供的音频通路。如果 <code>CarPatchHandle</code> 的创建者意外终止,则由 <code>AudioPolicyService::removeNotificationClient()</code> 自动处理。</li>
+</ul>
+
+<h2 id="create-audio-patches">创建音频通路</h2>
+
+<p>
+您可以在两个音频端口(混音端口或设备端口)之间创建音频通路。通常,从混音端口到设备端口的音频通路用于播放音频,而从设备端口到混音端口的音频通路则用于捕获音频。</p>
+
+<p>
+例如,将音频样本直接从 <code>FM_TUNER</code> 来源路由到媒体接收器的音频通路会绕过软件混音器。因此,您必须使用硬件混音器为接收器将来自 Android 和 <code>FM_TUNER</code> 的音频样本进行混音。创建直接从 <code>FM_TUNER</code> 来源到媒体接收器的音频通路时:
+</p>
+
+<ul>
+  <li>音量控制会应用于媒体接收器,并且应该会影响 Android 和 <code>FM_TUNER</code> 音频。</li>
+  <li>用户应该能够通过简单的应用切换在 Android 和 <code>FM_TUNER</code> 音频之间进行切换(应该不需要必须选择显式媒体来源)。</li>
+</ul>
+
+<p>
+Automotive 实现可能还需要在两个设备端口之间创建音频通路。为此,您必须先在 <code>audio_policy_configuration.xml</code> 中声明设备端口和可能的路由,并将混音端口与这些设备端口相关联。
+</p>
+
+<h3 id="example-config">配置示例</h3>
+
+<p>
+另请参阅 <code>device/generic/car/emulator/audio/audio_policy_configuration.xml</code>。
+</p>
+
+<pre class="prettyprint">
+&lt;audioPolicyConfiguration&gt;
+    &lt;modules&gt;
+        &lt;module name="primary" halVersion="3.0"&gt;
+            &lt;attachedDevices&gt;
+                &lt;item&gt;bus0_media_out&lt;/item&gt;
+                &lt;item&gt;bus1_audio_patch_test_in&lt;/item&gt;
+            &lt;/attachedDevices&gt;
+            &lt;mixPorts&gt;
+                &lt;mixPort name="mixport_bus0_media_out" role="source"
+                        flags="AUDIO_OUTPUT_FLAG_PRIMARY"&gt;
+                    &lt;profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                            samplingRates="48000"
+                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/&gt;
+                &lt;/mixPort&gt;
+                &lt;mixPort name="mixport_audio_patch_in" role="sink"&gt;
+                    &lt;profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                           samplingRates="48000"
+                           channelMasks="AUDIO_CHANNEL_IN_STEREO"/&gt;
+                &lt;/mixPort&gt;
+            &lt;/mixPorts&gt;
+            &lt;devicePorts&gt;
+                &lt;devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS"
+                        address="bus0_media_out"&gt;
+                    &lt;profile balance="" format="AUDIO_FORMAT_PCM_16_BIT"
+                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/&gt;
+                    &lt;gains&gt;
+                        &lt;gain name="" mode="AUDIO_GAIN_MODE_JOINT"
+                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/&gt;
+                    &lt;/gains&gt;
+                &lt;/devicePort&gt;
+                &lt;devicePort tagName="bus1_audio_patch_test_in" type="AUDIO_DEVICE_IN_BUS" role="source"
+                        address="bus1_audio_patch_test_in"&gt;
+                    &lt;profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_STEREO"/&gt;
+                    &lt;gains&gt;
+                        &lt;gain name="" mode="AUDIO_GAIN_MODE_JOINT"
+                                minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/&gt;
+                    &lt;/gains&gt;
+                &lt;/devicePort&gt;
+            &lt;/devicePorts&gt;
+            &lt;routes&gt;
+                &lt;route type="mix" sink="bus0_media_out" sources="mixport_bus0_media_out,bus1_audio_patch_test_in"/&gt;
+                &lt;route type="mix" sink="mixport_audio_patch_in" sources="bus1_audio_patch_test_in"/&gt;
+            &lt;/routes&gt;
+        &lt;/module&gt;
+    &lt;/modules&gt;
+&lt;/audioPolicyConfiguration&gt;
+</pre>
+
+<h3 id="audio-driver-api">音频驱动程序 API</h3>
+
+<p>
+您可以使用 <code>getExternalSources()</code> 获取可用来源列表(按地址进行标识),然后按音频用法在这些来源和接收器端口之间创建音频通路。音频 HAL 上相应的入口点显示在 <code>IDevice.hal</code> 中:
+</p>
+
+<pre class="prettyprint">
+Interface IDevice {
+...
+/**
+* Creates an audio patch between several source and sink ports.  The handle
+* is allocated by the HAL and must be unique for this audio HAL module.
+*
+* @param sources patch sources.
+* @param sinks patch sinks.
+* @return retval operation completion status.
+* @return patch created patch handle.
+*/
+createAudioPatch(vec&lt;AudioPortConfig&gt; sources, vec&lt;AudioPortConfig&gt; sinks)
+       generates (Result retval, AudioPatchHandle patch);
+
+/**
+* Release an audio patch.
+*
+* @param patch patch handle.
+* @return retval operation completion status.
+*/
+releaseAudioPatch(AudioPatchHandle patch) generates (Result retval);
+...
+}
+</pre>
+
+<aside class="note"><strong>注意</strong>:这些 API 钩子从 AUDIO_DEVICE_API_VERSION_3_0 便已开始提供。如需了解更多详情,请参阅 <code>device/generic/car/emulator/audio/driver/audio_hw.c</code>。</aside>
+
+<h2 id="configure-volume-settings-ui">配置音量设置界面</h2>
+
+<p>
+Android 9 将音量设置界面从音量组配置(该配置可叠加,如“配置音量组”中所述)中分离出来。这种分离可确保将来音量组配置发生更改时,无需对音量设置界面进行任何更改。
+</p>
+
+<p>
+在汽车设置界面中,<code>packages/apps/Car/Settings/res/xml/car_volume_items.xml</code> 文件包含与每个定义的 <code>AudioAttributes.USAGE</code> 相关联的界面元素(标题和图标资源)。此文件通过使用与每个 VolumeGroup 中包含的首个识别出的用法相关联的资源,合理呈现已定义的 VolumeGroups。
+</p>
+
+<p>
+例如,以下示例将 VolumeGroup 定义为同时包含 <code>voice_communication</code> 和 <code>voice_communication_signalling</code>。汽车设置界面的默认实现使用与 <code>voice_communication</code> 相关联的资源呈现 VolumeGroup,因为它是文件中的首个匹配项。
+</p>
+
+<pre class="prettyprint">
+&lt;carVolumeItems xmlns:car="http://schemas.android.com/apk/res-auto"&gt;
+    &lt;item car:usage="voice_communication"
+          car:title="@*android:string/volume_call"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="voice_communication_signalling"
+          car:title="@*android:string/volume_call"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="media"
+          car:title="@*android:string/volume_music"
+          car:icon="@*android:drawable/ic_audio_media"/&gt;
+    &lt;item car:usage="game"
+          car:title="@*android:string/volume_music"
+          car:icon="@*android:drawable/ic_audio_media"/&gt;
+    &lt;item car:usage="alarm"
+          car:title="@*android:string/volume_alarm"
+          car:icon="@*android:drawable/ic_audio_alarm"/&gt;
+    &lt;item car:usage="assistance_navigation_guidance"
+          car:title="@string/navi_volume_title"
+          car:icon="@drawable/ic_audio_navi"/&gt;
+    &lt;item car:usage="notification_ringtone"
+          car:title="@*android:string/volume_ringtone"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="assistant"
+          car:title="@*android:string/volume_unknown"
+          car:icon="@*android:drawable/ic_audio_vol"/&gt;
+    &lt;item car:usage="notification"
+          car:title="@*android:string/volume_notification"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="notification_communication_request"
+          car:title="@*android:string/volume_notification"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="notification_communication_instant"
+          car:title="@*android:string/volume_notification"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="notification_communication_delayed"
+          car:title="@*android:string/volume_notification"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="notification_event"
+          car:title="@*android:string/volume_notification"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="assistance_accessibility"
+          car:title="@*android:string/volume_notification"
+          car:icon="@*android:drawable/ic_audio_ring_notif"/&gt;
+    &lt;item car:usage="assistance_sonification"
+          car:title="@*android:string/volume_unknown"
+          car:icon="@*android:drawable/ic_audio_vol"/&gt;
+    &lt;item car:usage="unknown"
+          car:title="@*android:string/volume_unknown"
+          car:icon="@*android:drawable/ic_audio_vol"/&gt;
+&lt;/carVolumeItems&gt;
+</pre>
+
+<p>
+上述配置中使用的属性和值在 <code>packages/apps/Car/Settings/res/values/attrs.xml</code> 中声明。音量设置界面使用以下基于 <code>VolumeGroup</code> 的 <code>CarAudioManager</code> API:
+</p>
+
+<ul>
+  <li><code>getVolumeGroupCount()</code>:用于了解应绘制多少个控件。</li>
+  <li><code>getGroupMinVolume()</code> 和 <code>getGroupMaxVolume()</code>:用于获取音量上限和下限。</li>
+  <li><code>getGroupVolume()</code>:用于获取当前音量。</li>
+  <li><code>registerVolumeChangeObserver()</code>:用于获取音量更改通知。</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/automotive/audio/index.html b/zh-cn/devices/automotive/audio/index.html
new file mode 100644
index 0000000..f362db2
--- /dev/null
+++ b/zh-cn/devices/automotive/audio/index.html
@@ -0,0 +1,239 @@
+<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.
+  -->
+
+<p>
+这一部分详细介绍了与汽车相关的 Android 实现采用的音频架构。实现汽车音频系统的原始设备制造商 (OEM) 和其他 Android 开发者除了查看主要<a href="/devices/audio/">音频</a>部分的内容外,还应仔细查看本部分中的所有内容。
+</p>
+
+<h2 id="key-concepts">主要概念</h2>
+
+<p>
+Android 负责信息娱乐声音(例如媒体、导航和通讯声音),但不直接负责具有严格可用性和时间要求的铃声和警告。外部声源由负责音频焦点的应用表示。不过,您不能依靠音频焦点来选择和混合声音。
+</p>
+
+<p>
+对于与汽车相关的音频支持,Android 9 进行了以下更改:
+</p>
+
+<ul>
+  <li>音频 HAL 上下文映射到 <code>AudioAttributes.usage</code> 以识别声音;音频 HAL 实现负责进行特定于上下文的混音/路由。</li>
+  <li>车辆负责定义用于车载音频系统的通用输出设备 (<code>AUDIO_DEVICE_OUT_BUS</code>);Android 支持一个上下文使用一个 <code>AUDIO_DEVICE_OUT_BUS</code>。</li>
+  <li><code>IAudioControl HAL</code> 向音频 HAL 提供车辆专用扩展;有关示例实现,请参阅 <code>device/generic/car/emulator/audio</code>。Android 9 不包含 <code>AUDIO_* VHAL</code> 属性。</li>
+</ul>
+
+<h2 id="android-sounds-streams">Android 声音和声音流</h2>
+
+<p>
+汽车音频系统可以处理以下声音和声音流:
+</p>
+
+<img src="/devices/automotive/images/audio_streams_all.png"/>
+<figcaption><strong>图 1.</strong> 以声音流为中心的架构图
+</figcaption>
+
+<p>
+Android 负责来自 Android 应用的声音,同时控制这些应用,并根据其声音类型将声音路由到 HAL 中的各个声音流:
+</p>
+
+<ul>
+  <li><strong>逻辑</strong>声音流:在核心音频命名法中称为声源,<em></em>使用<a href="/devices/audio/attributes">音频属性</a>进行标记。</li>
+  <li><strong>物理</strong>声音流:在核心音频命名法中称为设备,<em></em>在混音后没有上下文信息。</li>
+</ul>
+
+<p>
+为了确保可靠性,外部声音(来自独立声源,例如安全带警告铃声)在 Android 外部(HAL 下方,甚至是在单独的硬件中)进行管理。系统实现者必须提供一个混音器,用于接受来自 Android 的一个或多个声音输入流,然后以合适的方式将这些声音流与车辆所需的外部声源组合起来。外部声音流可始终处于开启状态,也可以通过 HAL 中的 <code>createAudioPatch</code> 入口点进行控制。
+</p>
+
+<p>
+HAL 实现和外部混音器负责确保对保障安全至关重要的外部声音能够被用户听到,而且负责在 Android 提供的声音流中进行混音,并将混音结果路由到合适的音响设备。
+</p>
+
+<h3 id="android-sounds">Android 声音</h3>
+
+<p>
+应用可以有一个或多个通过标准 Android API(如用于控制焦点的 <a href="https://developer.android.com/reference/android/media/AudioManager.html" class="external">AudioManager</a> 或用于流式播放的 <a href="https://developer.android.com/reference/android/media/MediaPlayer.html" class="external">MediaPlayer</a>)交互的播放器,以便发出一个或多个音频数据逻辑流。这些数据可能是单声道声音,也可能是 7.1 环绕声,但都会作为单个声源进行路由和处理。应用声音流与 <a href="/devices/audio/attributes">AudioAttributes</a>(可向系统提供有关如何表达音频的提示)相关联。
+</p>
+
+<p>
+逻辑声音流通过 <code>AudioService</code> 发送,并路由到一个(并且只有一个)可用的物理输出声音流,其中每个声音流都是混音器在 <code>AudioFlinger</code> 内的输出。<code>AudioAttributes</code> 在混合到物理声音流后将不再可用。
+</p>
+
+<p>
+然后,每个物理声音流都会传输到音频 HAL,以在硬件上呈现。在汽车应用中,呈现硬件可能是本地编解码器(类似于移动设备),也可能是车辆物理网络中的远程处理器。无论是哪种情况,音频 HAL 实现都需要提供实际样本数据并使其能被用户听见。
+</p>
+
+<h3 id="external-streams">外部声音流</h3>
+
+<p>
+如果声音流因认证或时间原因而不应经由 Android,则可以直接发送到外部混音器。在许多情况下,Android 都不需要知道这些声音的存在,因为外部混音器可以在 Android 声音之外混合它们。如果需要对某个声音进行闪避处理或需要将其路由到不同的音响设备,外部混音器可以通过 Android 不可见的方式进行此类操作。
+</p>
+
+<p>
+如果外部声音流是应与 Android 正在生成的声音环境交互的媒体源(例如,当外部调谐器处于开启状态时,停止 MP3 播放),则这些外部声音流应由 Android 应用表示。此类应用将请求获得音频焦点,并根据需要通过启动/停止外部声音源来响应焦点通知,以符合 Android 声音焦点政策规定。要控制此类外部设备,一种建议使用的机制是 <code>AudioManager.createAudioPatch()</code>。
+</p>
+
+<h3 id="audio-focus">音频焦点</h3>
+
+<p>
+在启动逻辑声音流之前,应用应使用将用于其逻辑声音流的同一个 <code>AudioAttributes</code> 来请求获得音频焦点。虽然我们建议发送此类焦点请求,但系统不会强制要求发送。有些应用可能会明确跳过发送请求的步骤,以实现特定行为(例如,在拨打电话时有意播放声音)。
+</p>
+
+<p>
+为此,您应将焦点视为间接控制媒体播放和消除媒体播放冲突的方式,而不是作为主要的音频控制机制;也就是说,车辆不应依赖于焦点系统来操作音频子系统。焦点感知功能<strong>不是 HAL 的一部分</strong>,<strong>不得用于影响音频路由</strong>。
+</p>
+
+<h3 id="output-bus">输出总线</h3>
+
+<p>
+在音频 HAL 级别,设备类型 <code>AUDIO_DEVICE_OUT_BUS</code> 提供用于车载音频系统的通用输出设备。总线设备支持可寻址端口(其中每个端口都是一个物理声音流的端点),并且应该是车辆内唯一受支持的输出设备类型。
+</p>
+
+<p>
+系统实现可以针对所有 Android 声音使用一个总线端口,在这种情况下,Android 会将所有声音混合在一起,并将混音结果作为一个声音流进行传输。此外,HAL 可以分别为每个上下文提供一个总线端口,以允许并发传输任何声音类型。这样一来,HAL 实现就可以根据需要混合或闪避不同的声音。</p>
+
+<p>
+将上下文分配到总线端口是通过音频控制 HAL 进行的,并会在上下文和总线端口之间创建多对一的关系。
+</p>
+
+<h2 id="mic-input">麦克风输入</h2>
+
+<p>
+在捕获音频时,音频 HAL 会收到 <code>openInputStream</code> 调用,其中包含指示应如何处理麦克风输入的 <code>AudioSource</code> 参数。</p>
+
+<p>
+  <code>VOICE_RECOGNITION</code>(尤其是 Google 助理)需要一个符合以下条件的立体声麦克风流:具有回声消除效果(如果有),但不应用任何其他处理。波束成形应由 Google 助理自行完成。
+</p>
+
+<h3 id="multi-channel-mic-input">多声道麦克风输入</h3>
+
+<p>
+要从具有两个以上声道(立体声)的设备捕获音频,请使用声道索引掩码,而不是定位索引掩码(例如 <code>CHANNEL_IN_LEFT</code>)。示例:
+</p>
+
+<pre class="prettyprint">
+final AudioFormat audioFormat = new AudioFormat.Builder()
+    .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+    .setSampleRate(44100)
+    .setChannelIndexMask(0xf /* 4 channels, 0..3 */)
+    .build();
+final AudioRecord audioRecord = new AudioRecord.Builder()
+    .setAudioFormat(audioFormat)
+    .build();
+audioRecord.setPreferredDevice(someAudioDeviceInfo);
+</pre>
+
+<p>
+如果 <code>setChannelMask</code> 和 <code>setChannelIndexMask</code> 均已设置,则 <code>AudioRecord</code> 仅使用由 <code>setChannelMask</code> 设置的值(最多两个声道)。
+</p>
+
+<h3 id="concurrent-capture">并发捕获</h3>
+
+<p>
+对于大多数输入音频设备类型,Android 框架都不允许执行并发捕获,但 <code>AUDIO_DEVICE_IN_BUS</code> 和 <code>AUDIO_DEVICE_IN_FM_TUNER</code> 例外,因为框架会将它们作为虚拟设备处理。这样做意味着,框架假定这些设备之间不存在资源竞争,因此允许在捕获某个常规输入设备(例如麦克风)的同时并发捕获任何/所有此类设备。如果这些设备之间存在对并发捕获的硬件限制,则此类限制必须由旨在使用这些输入设备的第一方应用中的自定义应用逻辑来处理。
+</p>
+
+<p>
+旨在与 <code>AUDIO_DEVICE_IN_BUS</code> 设备或辅助 <code>AUDIO_DEVICE_IN_FM_TUNER</code> 设备结合使用的应用必须依赖于以下功能:明确识别这些设备,以及使用 <code>AudioRecord.setPreferredDevice()</code> 绕过 Android 默认声源选择逻辑。
+</p>
+
+<h2 id="volume-and-groups">音量和音量组</h2>
+
+<p>
+Android 8.x 及更低版本支持三个音量组(响铃、媒体和闹钟)以及一个用于手机通话的隐藏组。可以根据输出设备将每个组设为不同的音量,例如为音响设备设置较高音量,为耳机设置较低音量。
+</p>
+
+<p>
+Android 9 添加了一个<em></em>语音音量组以及与汽车相关的上下文,如下所示:
+</p>
+
+<table>
+<thead>
+<tr>
+<th>音量组</th>
+<th>音频上下文</th>
+<th>说明</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>响铃</td>
+<td>CALL_RING_CONTEXT</td>
+<td>语音通话响铃</td>
+</tr>
+<tr>
+<td></td>
+<td>NOTIFICATION_CONTEXT</td>
+<td>通知</td>
+</tr>
+<tr>
+<td></td>
+<td>ALARM_CONTEXT</td>
+<td>Android 闹钟铃声</td>
+</tr>
+<tr>
+<td></td>
+<td>SYSTEM_SOUND_CONTEXT</td>
+<td>Android 系统声音</td>
+</tr>
+<tr>
+<td>媒体</td>
+<td>MUSIC_CONTEXT</td>
+<td>音乐播放</td>
+</tr>
+<tr>
+<td>电话</td>
+<td>CALL_CONTEXT</td>
+<td>语音通话</td>
+</tr>
+<tr>
+<td>语音</td>
+<td>NAVIGATION_CONTEXT</td>
+<td>导航指示</td>
+</tr>
+<tr>
+<td></td>
+<td>VOICE_COMMAND_CONTEXT</td>
+<td>语音指令会话</td>
+</tr>
+</tbody>
+</table>
+
+<p>
+音量组的值更新后,框架的 <code>CarAudioService</code> 会负责设置受影响物理声音流增益。车辆中的物理声音流音量基于音量组(而不是 stream_type),每个音量组包含一个或多个音频上下文。每个 <code>AudioAttributes.USAGE</code> 都会映射到 <code>CarAudioService</code> 中的一个音频上下文,并且可以配置为路由到输出总线(请参阅<a href="/devices/automotive/audio/audio-control.html#configure-volume">配置音量</a>和<a href="/devices/automotive/audio/audio-control.html#configure-volume-groups">配置音量组</a>)。
+</p>
+
+<p>
+Android 9 简化了对放大器中硬件音量的控制:
+</p>
+
+<ul>
+  <li>每个音量组都路由到一个或多个输出总线。可以使用汽车设置界面或通过外部生成的 <code>KEYCODE_VOLUME_DOWN</code> 或 <code>KEYCODE_VOLUME_UP</code> 按键事件更改特定组的音量。
+  </li>
+  <li>作为响应,<code>CarAudioService</code> 会调用 <code>AudioManager.setAudioPortGain()</code>,同时将音频设备端口绑定到目标音量组。在 HAL 中,这表现为一系列 <code>IDevice.setAudioPortConfig()</code> 调用(一次或多次调用),同时将每个物理输出声音流的音量增益值与目标音量组相关联。</li>
+</ul>
+
+<p>
+您可以在 <code>audio_policy_configuration.xml</code> 中为每个音频设备端口配置最大值、最小值和步进增益值。如需示例配置以及关于如何覆盖默认音量组集合的详细信息,请参阅<a href="/devices/automotive/audio/audio-hal.html#configure-audio-devices">配置音频设备。
+</a></p><a href="/devices/automotive/audio/audio-hal.html#configure-audio-devices">
+
+</a></body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/automotive/audio/interaction-sequences.html b/zh-cn/devices/automotive/audio/interaction-sequences.html
new file mode 100644
index 0000000..7da74b5
--- /dev/null
+++ b/zh-cn/devices/automotive/audio/interaction-sequences.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 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.
+  -->
+
+<p>
+  在下列汽车音响示例中,汽车音响主机运行 Android 9,其中安装有收音机应用和导航应用。此外,车辆调谐器在外部布线,并通过扬声器播放。在实际使用场景中,采用如下做法可能会大有好处:将调谐器处理为 Android 的输入,让收音机应用从调谐器中读取数据并将其写入 <code>AudioTrack</code> 对象。
+</p>
+
+<h2 id="user-starts-radio">用户启动收音机</h2>
+
+<p>
+  在此交互序列中,当用户对收音机应用中的某个预设频率按<strong>播放</strong>时,车辆内不播放任何媒体内容。收音机应用必须获得焦点,然后调谐器才能通过扬声器播放声音。
+</p>
+
+<p><img src="/devices/automotive/images/audio_auto_focus_radio.png"/></p>
+<figcaption><strong>图 1.</strong> 收音机获得焦点,然后调谐器通过扬声器播放声音</figcaption>
+
+<ol>
+  <li>收音机:“调到 FM 96.5。”</li>
+  <li>收音机:请求焦点 GAIN。</li>
+  <li>AudioManager:授予 GAIN。</li>
+  <li>收音机:<code>createAudioPatch()</code></li>
+  <li>收音机:“播放调谐器输出。”</li>
+  <li>外部布线的调谐器:混音器使调谐器音频路由到放大器。
+  </li>
+</ol>
+
+<h2 id="radio-ducks-nav-prompt">收音机闪避导航提示</h2>
+
+<p>
+  在此交互序列中,当导航应用为下一个转弯通知生成导航提示时,收音机正在播放内容。导航应用必须先从 <code>AudioManager</code> 获得瞬时焦点,然后才能播放导航提示。
+</p>
+
+<p><img src="/devices/automotive/images/audio_auto_radio_ducks.png"/></p>
+<figcaption><strong>图 2.</strong> 收音机播放闪避导航提示</figcaption>
+
+<ol>
+  <li value="5">收音机:“播放调谐器输出。”</li>
+  <li>外部布线的调谐器:混音器使调谐器音频路由到放大器。
+  </li>
+  <li>导航:从 <code>AudioManager</code> 请求焦点 GAIN TRANSIENT。
+  </li>
+  <li>AudioManager:向导航提供 GAIN TRANSIENT。</li>
+  <li>导航:打开数据流,发送数据包。
+    <ol>
+    <li>导航:在 bus1 上路由上下文 GUIDANCE。</li>
+    <li>混音器:闪避调谐器,以通过扬声器播放 bus1 GUIDANCE。</li>
+    </ol>
+  </li>
+  <li>导航:通知结束,关闭数据流。</li>
+  <li>导航:放弃焦点。</li>
+</ol>
+
+<p>
+  <code>AudioManager</code> 认为收音机播放可以闪避,并且通常会在不通知收音机应用的情况下对音乐流应用一个闪避因子。不过,通过叠加 <code>framework/base/core/res/res/values/config.xml</code> 并将 <code>config_applyInternalDucking</code> 设置为 <code>false</code>,框架闪避被绕过了,因此,外部调谐器会继续提供声音,并且收音机应用未发现任何变化。混音器(位于 HAL 下游)负责合并这两个输入,并且可以选择是闪避收音机播放,还是将收音机播放移至后置扬声器。
+</p>
+
+<p>
+  导航提示播放完毕后,导航应用将释放焦点,收音机播放将恢复。
+</p>
+
+<h2 id="user-launches-audio-book">用户启动有声读物应用</h2>
+
+<p>
+  在此交互序列中,用户启动有声读物应用,导致收音机播放停止(按流式传输音乐应用中的“播放”是类似的触发器)。
+</p>
+
+<p><img src="/devices/automotive/images/audio_auto_focus_book.png"/></p>
+<figcaption><strong>图 3.</strong> 有声读物从收音机播放处夺取焦点</figcaption>
+
+<ol>
+  <li value="12">有声读物:从 <code>AudioManager</code> 请求 GAIN 上下文 MEDIA。</li>
+  <li>收音机失去焦点:
+    <ol>
+    <li>AudioManager:LOSS。</li>
+    <li>收音机:<code>releaseAudioPatch()</code></li>
+    </ol>
+  </li>
+  <li>有声读物获得焦点:
+    <ol>
+    <li>授予 GAIN,在 bus0 上路由上下文 MEDIA</li>
+    <li>打开数据流,发送 MEDIA 数据包。</li>
+    </ol>
+  </li>
+</ol>
+
+<p>
+  有声读物应用发起的焦点请求不是瞬时的,因此上一个焦点持有者(收音机应用)将收到永久性焦点丢失信号;收音机应用会拆除连接到调谐器的补丁程序,以此作为响应。混音器停止接收调谐器信号,并开始处理通过音频 HAL 传输的音频(它还可以选择性地在从收音机过渡到有声读物的过程中执行交错淡出)。
+</p>
+
+<h2 id="nav-prompt-takes-focus">导航提示获得焦点</h2>
+
+<p>
+  在此交互序列中,当导航应用生成导航提示时,系统正在播放有声读物。
+</p>
+
+<p><img src="/devices/automotive/images/audio_auto_focus_nav.png"/></p>
+<figcaption><strong>图 4.</strong> 导航提示从有声读物处夺取焦点</figcaption>
+
+<ol>
+  <li value="15">有声读物:正在流式播放 MEDIA 数据包,焦点未并发。</li>
+  <li>导航:请求 GAIN TRANSIENT。</li>
+  <li>AudioManager:LOSS TRANSIENT。</li>
+  <li>有声读物:停止。</li>
+  <li>AudioManager:授予 GAIN TRANSIENT。</li>
+  <li>导航:打开数据流,发送数据包。
+    <ol>
+    <li>导航:在 bus1 上路由上下文 GUIDANCE。</li>
+    <li>混音器:播放 bus1 (GUIDANCE)。</li>
+    </ol>
+  </li>
+  <li>导航:通知结束,关闭数据流。</li>
+  <li>导航:放弃焦点。</li>
+  <li>有声读物:GAIN。</li>
+  <li>有声读物:重新启动。</li>
+</ol>
+
+<p>
+  由于有声读物应用的原始 <code>AudioFocusRequest</code>(在启动 <code>AudioTrack</code> 时发送)包含 <code>AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS</code> 标记,因此 <code>AudioManager</code> 发现无法对有声读物应用进行闪避处理。取而代之的是,<code>AudioManager</code> 会向有声读物应用发送一条 <code>AUDIOFOCUS_LOSS_TRANSIENT</code> 消息,有声读物应用应该通过暂停播放来进行响应。
+</p>
+
+<p>  导航应用现在可以不间断地播放导航提示。导航提示播放完毕后,有声读物将重新获得焦点并恢复播放。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/automotive/audio/multi-zone.html b/zh-cn/devices/automotive/audio/multi-zone.html
new file mode 100644
index 0000000..0ff29db
--- /dev/null
+++ b/zh-cn/devices/automotive/audio/multi-zone.html
@@ -0,0 +1,83 @@
+<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.
+  -->
+
+<p>
+虽然 Android 9 不支持多区音频,但 Android 音频团队探索了一些可能有助于实现多区音频的方法。本部分详细介绍了其中的一些方法,这些方法可能有助于系统实现者着手构建后座娱乐系统 (RSE) 解决方案。
+</p>
+
+<h2 id="user-cases">用例</h2>
+
+<ul>
+  <li>后座中的收音机与前座中的不同媒体源同时播放。</li>
+  <li>前座乘客与司机收听不同的媒体源(例如,乘客在自己的屏幕上玩游戏,而司机在主屏幕上查看导航)。</li>
+  <li>四个不同的独立音频区:驾驶座、副驾驶座、后座 1、后座 2。</li>
+</ul>
+
+<h2 id="limitations">限制</h2>
+
+<p>
+由于存在以下限制,Android 9 本身不支持多个音频堆栈(音频区)或不同的优先级:
+</p>
+
+<ul>
+  <li>Android 9 不提供可使应用定位到特定音频区的 API。取而代之的是,应用必须定位到音频类型(媒体、通知等),这需要从 Android 提供的预定义集内进行选择。例如,Android 目前不支持将目标<strong>音频区 2</strong> 的音频类型定义为<strong>媒体</strong>。</li>
+  <li>物理声音流(由 AudioFlinger/内部混音器提供)不会在混音后传输上下文信息(例如,在逻辑声音流内进行标记),这导致音频 HAL 无法将特定逻辑声音流路由到不同的音频区。</li>
+</ul>
+
+<h2 id="scenario-multiple-instances">方案:使用多个实例</h2>
+
+<p>
+此方案使用多个 Android 汽车实例来实现多区音频效果。
+</p>
+
+<ul>
+  <li>每个音频区都有自己的 Android 汽车实例,这些实例可独立管理音频区中的内容。HAL 下方的硬件可合并,并可协调多个实例的输出。</li>
+  <li>实例位于不同的硬件(例如,后座中的平板电脑)之上,或者通过管理程序共享物理硬件。</li>
+  <li>使用一个主音频区将输出静态分配到车载音响设备,或在 HAL 下进行动态分配。</li>
+  <li>第一方应用(安装在每个实例中)通过专有协议进行协作,从而协调各种声音并将其路由到特定音频区。或者,使用 ChromeCast 功能跨不同实例甚至是设备进行通信。</li>
+</ul>
+
+<h2 id="scenario-target-secondary-zones">方案:定位到辅助区</h2>
+
+<p>
+此方案使用第一方应用来明确定位到被 Android 忽略的辅助区。
+</p>
+
+<ul>
+  <li>原始设备制造商 (OEM) 在 <code>audio_policy_configuration.xml</code> 中定义额外的输出音频设备端口。</li>
+  <li>隐式了解车辆配置的第一方应用可以使用 <code>AudioTrack.setPrefereceDevice()</code> API 来枚举可用输出端口,并明确定位到其中任意一个端口。</li>
+</ul>
+
+<h2 id="scenario-audio-policy-rules">方案:使用音频政策规则</h2>
+
+<p>
+此方案使用音频政策规则向其他音频设备动态添加路由专用的 UID。
+</p>
+
+<ul>
+  <li>音频路由引擎根据发出请求的应用的 UID 来定义路由规则。</li>
+  <li>系统级服务或启动器添加相应规则,将特定应用 (UID) 的输出发送到与辅助音频区关联的特定设备。</li>
+  <li>除了为预定义音频上下文的路由提供的设备之外,还要定义这些特定设备。</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/bootloader/boot-image-header.html b/zh-cn/devices/bootloader/boot-image-header.html
new file mode 100644
index 0000000..2fd0343
--- /dev/null
+++ b/zh-cn/devices/bootloader/boot-image-header.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 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.
+  -->
+
+  <h2>启动映像标头版本编号</h2>
+
+  <p>从 Android 9 起,启动映像标头开始包含一个用于指示标头版本的字段。引导加载程序必须检查该标头版本字段,并相应地解析标头。通过对启动映像标头进行版本编号,可在将来对标头进行修改,同时保持向后兼容性。</p>
+
+  <p>所有搭载 Android 9 的设备都必须使用启动标头版本 1。</p>
+
+  <h2 id="boot-image-header-changes">启动映像标头更改</h2>
+
+  <p>对于搭载 Android 9 的设备,旧版启动映像标头(如下所示)中的 <code>unused</code> 字段将会转换为标头版本字段。</p>
+
+  <pre class="prettyprint">struct boot_img_hdr
+{
+    uint8_t magic[BOOT_MAGIC_SIZE];
+    uint32_t kernel_size;  /* size in bytes */
+    uint32_t kernel_addr;  /* physical load addr */
+
+    uint32_t ramdisk_size; /* size in bytes */
+    uint32_t ramdisk_addr; /* physical load addr */
+
+    uint32_t second_size;  /* size in bytes */
+    uint32_t second_addr;  /* physical load addr */
+
+    uint32_t tags_addr;    /* physical addr for kernel tags */
+    uint32_t page_size;    /* flash page size we assume */
+    uint32_t unused;
+    uint32_t os_version;
+    uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
+    uint8_t cmdline[BOOT_ARGS_SIZE];
+    uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
+    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
+};</pre>
+
+  <p>如果设备搭载 Android 9 之前的版本且使用旧版启动映像标头,则会被视为使用启动映像标头版本 0。所有搭载 Android 9 的设备都必须使用以下启动映像标头结构,同时标头版本设为 1。</p>
+
+  <pre class="prettyprint">struct boot_img_hdr
+{
+    uint8_t magic[BOOT_MAGIC_SIZE];
+    uint32_t kernel_size;  /* size in bytes */
+    uint32_t kernel_addr;  /* physical load addr */
+
+    uint32_t ramdisk_size; /* size in bytes */
+    uint32_t ramdisk_addr; /* physical load addr */
+
+    uint32_t second_size;  /* size in bytes */
+    uint32_t second_addr;  /* physical load addr */
+
+    uint32_t tags_addr;    /* physical addr for kernel tags */
+    uint32_t page_size;    /* flash page size we assume */
+    uint32_t header_version;
+    uint32_t os_version;
+    uint8_t name[BOOT_NAME_SIZE]; /* asciiz product name */
+    uint8_t cmdline[BOOT_ARGS_SIZE];
+    uint32_t id[8]; /* timestamp / checksum / sha1 / etc */
+    uint8_t extra_cmdline[BOOT_EXTRA_ARGS_SIZE];
+    uint32_t recovery_dtbo_size;   /* size of recovery dtbo image */
+    uint64_t recovery_dtbo_offset; /* offset in boot image */
+    uint32_t header_size;   /* size of boot image header in bytes */
+};</pre>
+
+  <p><code>header_size</code> 字段包含启动映像标头大小。如果启动映像标头版本设为 1,则除了内核、ramdisk 和 second 部分之外,ID 字段还包含启动映像 <code>recovery_dtbo</code> 部分的 SHA1 摘要。要详细了解 <code>recovery_dtbo_size</code> 和 <code>recovery_dtbo_offset</code> 字段,请参阅<em><a href="/devices/bootloader/recovery-image">在非 A/B 设备的恢复映像中添加 DTBO</a></em>。</p>
+
+  <h2 id="implementation">实现</h2>
+
+  <p>用于创建启动映像的 <code>mkbootimg</code> 工具添加了以下参数,以支持新的启动映像标头:</p>
+
+  <table>
+    <tbody><tr>
+      <td><strong>参数</strong>
+      </td>
+
+      <td><strong>说明</strong>
+      </td>
+    </tr>
+
+    <tr>
+      <td><code>header_version</code>
+      </td>
+
+      <td>设置启动映像标头版本。</td>
+    </tr>
+
+    <tr>
+      <td><code>recovery_dtbo</code>
+      </td>
+
+      <td>要添加到恢复映像的恢复 DTBO 映像的路径。</td>
+    </tr>
+  </tbody></table>
+
+  <p>设备 <code>BoardConfig.mk</code> 使用 <code>BOARD_MKBOOTIMG_ARGS</code> 配置,以便将 <code>header version</code> 添加到 <code>mkbootimg</code> 的其他专门针对主板的参数。例如:</p>
+
+  <pre class="prettyprint">
+  BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)</pre>
+
+  <p>Android 编译系统使用 BoardConfig 变量 <code>BOARD_PREBUILT_DTBOIMAGE</code>,以便在创建恢复映像期间设置 <code>mkbootimg</code> 工具的 <code>recovery_dtbo</code> 参数。</p>
+
+  <p>要详细了解 Android 开源项目 (AOSP) 的变化,请查看<a href="https://android-review.googlesource.com/q/topic:%22recovery_dtbo%22+(status:open%20OR%20status:merged)">与启动映像标头版本编号相关的更改列表</a>。</p>
+
+  <h2 id="validation">验证</h2>
+
+  <p>对于所有搭载 Android 9 的设备,<a href="/compatibility/vts/">供应商测试套件 (VTS)</a> 都会检查启动/恢复映像的格式,以确保启动映像标头使用版本 1。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/bootloader/boot-reason.html b/zh-cn/devices/bootloader/boot-reason.html
new file mode 100644
index 0000000..3e10333
--- /dev/null
+++ b/zh-cn/devices/bootloader/boot-reason.html
@@ -0,0 +1,203 @@
+<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.
+  -->
+
+<p>
+Android 9 对引导加载程序启动原因规范进行了以下更改。
+</p>
+
+<h2 id="about-boot-reasons">关于启动原因</h2>
+
+<p>
+引导加载程序使用专用的硬件和内存资源来确定设备重新启动的原因,然后将 <code>androidboot.bootreason=&lt;reason&gt;</code> 添加到用于启动设备的 Android 内核命令行中,以传达这一决定。然后,<code>init</code> 会转换此命令行,使其传播到 Android 属性 <code>bootloader_boot_reason_prop</code> (<code>ro.boot.bootreason</code>) 中。
+</p>
+
+<h2 id="about-boot-reason-specifications">关于启动原因规范</h2>
+
+<p>
+之前的 Android 版本中指定的启动原因格式如下:不使用空格,全部为小写字母,只有非常少的要求(例如报告 <code>kernel_panic</code>、<code>watchdog</code>、<code>cold</code>/<code>warm</code>/<code>hard</code>),并且允许其他特殊原因。这种宽松的规范导致出现了成百上千个自定义启动原因字符串(有时毫无意义),进而造成了无法管理的情况。到目前最新的 Android 版本发布之前,引导加载程序提交的近乎无法解析或毫无意义的内容急剧增加已经为 <code>bootloader_boot_reason_prop</code> 造成了合规性问题。
+</p>
+
+<p>
+在开发 Android 9 版本中,Android 团队发现旧的 <code>bootloader_boot_reason_prop</code> 中内容会急剧增加,并且无法在系统运行时重写。因此,要对启动原因规范进行任何改进,都必须与引导加载程序开发者进行互动交流,并对现有系统进行调整。为此,Android 团队采取了以下措施:
+</p>
+
+<ul>
+  <li>与引导加载程序开发者互动交流,鼓励他们:
+  <ul>
+    <li>向 <code>bootloader_boot_reason_prop</code> 提供规范、可解析且可识别的原因。</li>
+    <li>向 <code>system/core/bootstat/bootstat.cpp</code> <code>kBootReasonMap</code> 列表添加内容。</li>
+    </ul>
+  </li>
+  <li>添加受控且可在系统运行时重写的 <code>system_boot_reason_prop</code> (<code>sys.boot.reason</code>) 源代码。只有少量的系统应用(如 <code>bootstat</code> 和 <code>init</code>)可重写此属性,不过,所有应用都可以通过获得 sepolicy 权限来读取它。</li>
+  <li>将启动原因告知用户,让他们等到用户数据装载完毕后再信任系统启动原因属性 <code>system_boot_reason_prop</code> 中的内容。</li>
+</ul>
+
+<p>
+为什么要等这么久?虽然 <code>bootloader_boot_reason_prop</code> 在启动过程的早期阶段就已可用,但 Android 安全政策根据需要对其进行了屏蔽,因为它表示不准确、不可解析且不合规范的信息。大多数情况下,只有对启动系统有深入了解的开发者才需要访问这些信息。只有在用户数据装载完毕<strong>之后</strong>,才可以通过 <code>system_boot_reason_prop</code> 准确可靠地提取经过优化、可解析且合乎规范的启动原因 API。具体而言:
+</p>
+
+  <ul>
+    <li>在用户数据装载完毕<strong>之前</strong>,<code>system_boot_reason_prop</code> 将包含 <code>bootloader_boot_reasoon_prop</code> 中的值。</li>
+    <li>在用户数据装载完毕<strong>之后</strong>,可以更新 <code>system_boot_reason_prop</code>,以使其符合要求或报告更准确的信息。</li>
+  </ul>
+
+<p>
+出于上述原因,Android 9 延长了可以正式获取启动原因之前需要等待的时间段,将其从启动时立即准确无误的状态(使用 <code>bootloader_boot_reason_prop</code>)更改为仅在用户数据装载完毕之后才可用(使用 <code>system_boot_reason_prop</code>)。
+</p>
+
+<p>
+Bootstat 逻辑依赖于信息更丰富且合规的 <code>bootloader_boot_reason_prop</code>。当该属性使用可预测的格式时,能够提高所有受控重新启动和关机情况的准确性,从而优化和扩展 <code>system_boot_reason_prop</code> 的准确性和含义。
+</p>
+
+<h2 id="canonical-boot-reason-format">规范化启动原因格式</h2>
+
+<p>
+在 Android 9 中,<code>bootloader_boot_reason_prop</code> 的规范化启动原因格式使用以下语法:
+</p>
+
+<pre class="prettyprint">&lt;reason&gt;,&lt;subreason&gt;,&lt;detail&gt;…</pre>
+
+<p>
+格式设置规则如下:
+</p>
+
+<ul>
+  <li>小写</li>
+  <li>无空格(可使用下划线)</li>
+  <li>全部为可打印字符</li>
+  <li>以英文逗号分隔的 <code>reason</code>、<code>subreason</code>,以及一个或多个 <code>detail</code>。
+  <ul>
+    <li>必需的 <code>reason</code>,表示设备为什么必须重新启动或关机且优先级最高的原因。</li>
+    <li>选用的 <code>subreason</code>,表示设备为什么必须重新启动或关机的简短摘要(或重新启动设备/将设备关机的人员)。</li>
+    <li>一个或多个选用的 <code>detail</code> 值。<code>detail</code> 可以指向某个子系统,以协助确定是哪个具体系统导致了 <code>subreason</code>。您可以指定多个 <code>detail</code> 值,这些值通常应按照重要程度排序。不过,也可以报告多个具有同等重要性的 <code>detail</code> 值。</li>
+  </ul>
+  </li>
+</ul>
+
+<p>
+如果 <code>bootloader_boot_reason_prop</code> 为空值,则会被视为非法(因为这会允许其他代理在事后添加启动原因)。
+</p>
+
+<h3 id="reason-requirements">原因要求</h3>
+
+<p>
+为 <code>reason</code>(第一个跨度,位于终止符或英文逗号之前)指定的值必须是以下集合(分为内核原因、强原因和弱原因)之一:
+</p>
+
+<ul>
+  <li>内核集:
+  <ul>
+    <li>"<code>watchdog"</code></li>
+    <li><code>"kernel_panic"</code></li>
+  </ul>
+  </li>
+  <li>强集:
+  <ul>
+    <li><code>"recovery"</code></li>
+    <li><code>"bootloader"</code></li>
+  </ul>
+  </li>
+  <li>弱集:
+  <ul>
+    <li><code>"cold"</code>:通常表示完全重置所有设备,包括内存。</li>
+    <li><code>"hard"</code>:通常表示硬件重置了状态,并且 <code>ramoops</code> 应保留持久性内容。</li>
+    <li><code>"warm"</code>:通常表示内存和设备保持某种状态,并且 <code>ramoops</code>(请参阅内核中的 <code>pstore</code> 驱动程序)后备存储空间包含持久性内容。</li>
+    <li><code>"shutdown"</code></li>
+    <li><code>"reboot"</code>:通常意味着 <code>ramoops</code> 状态和硬件状态未知。该值是与 <code>cold</code>、<code>hard</code> 和 <code>warm</code> 一样的通用值,可提供关于设备重置深度的提示。</li>
+  </ul>
+  </li>
+</ul>
+
+<p>
+引导加载程序必须提供内核集或弱集 <code>reason</code>,强烈建议引导加载程序提供 <code>subreason</code>(如果可以确定的话)。例如,电源键长按(无论是否有 <code>ramoops</code> 备份)的启动原因为 <code>"reboot,longkey"</code>。
+</p>
+
+<p>
+第一个跨度 <code>reason</code> 不能是任何 <code>subreason</code> 或 <code>detail</code> 的组成部分。不过,由于用户空间无法产生内核集原因,因此可能会在弱集原因之后重复使用 <code>"watchdog"</code> 以及源代码的详细信息(例如 <code>"reboot,watchdog,service_manager_unresponsive"</code> 或 <code>"reboot,software,watchdog"</code>)。
+</p>
+
+<p>
+启动原因应该无需专家级内部知识即可解读,并且(或者)应该能让人看懂并提供直观报告。示例:<code>"shutdown,vbxd"</code>(糟糕)、<code>"shutdown,uv"</code>(较好)、<code>"shutdown,undervoltage"</code>(首选)。
+</p>
+
+<h3 id="reason-subreason-combinations">“原因-子原因”组合</h3>
+
+<p>
+Android 保留了一组 <code>reason</code>-<code>subreason</code> 组合,在正常使用情况下不应过量使用这些组合;不过,如果组合能准确反映相关状况,则可根据具体情况加以使用。保留组合的示例包括:
+</p>
+
+<ul>
+  <li><code>"reboot,userrequested"</code></li>
+  <li><code>"shutdown,userrequested"</code></li>
+  <li><code>"Shutdown,thermal"</code>(来自 <code>thermald</code>)</li>
+  <li><code>"shutdown,battery"</code></li>
+  <li><code>"Shutdown,battery,thermal"</code>(来自 <code>BatteryStatsService</code>)</li>
+  <li><code>"reboot,adb"</code></li>
+  <li><code>"reboot,shell"</code></li>
+  <li><code>"reboot,bootloader"</code></li>
+  <li><code>"reboot,recovery"</code></li>
+</ul>
+
+<p>
+如需更多详细信息,请参阅 <code>system/core/bootstat/bootstat.cpp</code> 中的 <code>kBootReasonMap</code> 以及 Android 源代码库中的关联 git 变更日志记录。
+</p>
+
+<h2 id="reporting-boot-reasons">报告启动原因</h2>
+
+<p>
+所有启动原因(无论是来自引导加载程序还是记录在规范化启动原因中)都必须记录在 <code>system/core/bootstat/bootstat.cpp</code> 的 <code>kBootReasonMap</code> 部分中。<code>kBootReasonMap</code> 列表包含各种合规原因和不合规的旧版原因。引导加载程序开发者应在此处仅登记新的合规原因(除非产品已发货且无法更改,否则不应登记不合规的原因)。
+</p>
+
+<aside class="note">
+  <strong>注意</strong>:虽然 <code>system/core/bootstat/bootstat.cpp</code> 包含一个 <code>kBootReasonMap</code> 部分,并且其中列出了大量旧版原因,但这些原因的存在并不意味着 <code>reason</code> 字符串已获准使用。该列表的一个子集内列出了合规原因;随着引导加载程序开发者不断登记更多合规原因并加以说明,这个子集预计将不断增大。
+</aside>
+
+<p>
+强烈建议使用 <code>system/core/bootstat/bootstat.cpp</code> 中现有的合规条目,如果要使用不合规字符串,要先对其加以限制。请参阅以下指导原则:
+</p>
+
+<ul>
+  <li><strong>允许</strong>从引导加载程序报告 <code>"kernel_panic"</code>,因为 <code>bootstat</code> 可以检查 <code>ramoops</code> 的 <code>kernel_panic signatures</code>,以便将子原因细化为规范化的 <code>system_boot_reason_prop</code>。</li>
+  <li><strong>不允许</strong>从引导加载程序以 <code>kBootReasonMap</code>(如 <code>"panic")</code>)的形式报告不合规的字符串,因为这最终将导致无法细化 <code>reason</code>。</li>
+</ul>
+
+<p>
+例如,如果 <code>kBootReasonMap</code> 包含 <code>"wdog_bark"</code>,则引导加载程序开发者应采取以下措施:
+</p>
+
+<ul>
+  <li>更改为 <code>"watchdog,bark"</code>,并将其添加到 <code>kBootReasonMap</code> 中的列表内。</li>
+  <li>考虑 <code>"bark"</code> 对于不熟悉该技术的人来说意味着什么,并确定是否存在更有意义的 <code>subreason</code>。</li>
+</ul>
+
+<h2 id="verifying-boot-reason-compliance">验证启动原因合规性</h2>
+
+<p>
+目前,对于引导加载程序可能提供的所有启动原因,Android 没有提供能够准确触发或检查这些原因的主动 CTS 测试;合作伙伴仍然可以尝试运行被动测试来确定兼容性。
+</p>
+
+<p>
+因此,要实现引导加载程序合规性,引导加载程序开发者需要自愿遵循上述规则和准则的精神。我们会敦促此类开发者为 AOSP(特别是 <code>system/core/bootstat/bootstat.cpp</code>)做贡献,并将这个机会作为一个讨论启动原因问题的论坛。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/bootloader/recovery-image.html b/zh-cn/devices/bootloader/recovery-image.html
new file mode 100644
index 0000000..7512ed2
--- /dev/null
+++ b/zh-cn/devices/bootloader/recovery-image.html
@@ -0,0 +1,115 @@
+<html devsite><head>
+  <title>在非 A/B 设备的恢复映像中添加 DTBO</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.
+  -->
+   为防止非 A/B 设备上出现 OTA 失败的情况,恢复分区必须“自给自足”,不得依赖于其他分区。
+
+  <p>启动到恢复模式时,引导加载程序必须加载与恢复映像兼容的 DTBO 映像。在执行 OTA 期间,如果在 DTBO 映像更新后(但在完成全部更新之前)出现问题,设备将尝试启动到恢复模式,以完成 OTA。不过,由于 DTBO 分区已更新,恢复映像(尚未更新)可能会出现不匹配的情况。</p>
+
+  <p>为防止出现这种情况,在 Android 9 中,恢复映像也必须包含来自 DTBO 映像的信息。非 A/B 设备的恢复映像还必须包含附加到内核的设备 DTB,以便在更新期间不依赖于 DTB 分区。</p>
+
+  <h2 id="boot-image-changes">启动映像更改</h2>
+
+  <p>要允许恢复映像包含恢复 DTBO,Android 9 中启动映像的格式应如下所示:</p>
+
+  <table>
+    <tbody><tr>
+      <td>启动标头(1 页)</td>
+    </tr>
+
+    <tr>
+      <td>内核(<em></em>l 页)</td>
+    </tr>
+
+    <tr>
+      <td>Ramdisk(<em></em>m 页)</td>
+    </tr>
+
+    <tr>
+      <td>第二阶段(<em></em>n 页)</td>
+    </tr>
+
+    <tr>
+      <td>恢复 DTBO(<em></em>o 页)</td>
+    </tr>
+  </tbody></table>
+
+  <p>此外,用于创建启动映像的 <code>mkbootimg</code> 工具包含下列新参数:</p>
+
+  <table>
+    <tbody><tr>
+      <th><strong>参数</strong>
+      </th>
+
+      <th><strong>说明</strong>
+      </th>
+    </tr>
+
+    <tr>
+      <td><code>header_version</code>
+      </td>
+
+      <td>设置启动映像标头版本。标头版本高于或等于 1 的启动映像支持恢复 DTBO 部分。</td>
+    </tr>
+
+    <tr>
+      <td><code>recovery_dtbo</code>
+      </td>
+
+      <td>恢复 DTBO 映像的路径。</td>
+    </tr>
+  </tbody></table>
+
+  <p>要详细了解对旧版启动映像标头的改动,请参阅 <em><a href="/devices/bootloader/boot-image-header">Android 9 中的启动映像标头版本控制</a></em>。</p>
+
+  <h2 id="implementation">实现</h2>
+
+  <p>虽然搭载 Android 9 的所有设备都必须使用新的启动映像标头(版本 1),但只有非 A/B 设备才必须填充恢复映像的 <code>recovery_dtbo</code> 部分。要在 <code>BoardConfig.mk</code> 设备的 <code>recovery.img</code> 中添加 <code>recovery_dtbo</code>,请执行以下操作:</p>
+
+  <ul>
+    <li>将 <code>BOARD_INCLUDE_RECOVERY_DTBO</code> 配置设置为 <code>true</code>:
+
+      <pre class="prettyprint">BOARD_INCLUDE_RECOVERY_DTBO := true</pre>
+    </li>
+  </ul>
+
+  <ul>
+    <li>扩展 <code>BOARD_MKBOOTIMG_ARGS</code> 变量以指定启动映像标头版本:
+
+      <pre class="prettyprint">
+      BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)</pre>
+    </li>
+  </ul>
+
+  <ul>
+    <li>确保将 <code>BOARD_PREBUILT_DTBOIMAGE</code> 变量设置为 DTBO 映像的路径。Android 编译系统会使用该变量在创建恢复映像时设置 mkbootimg 工具的 <code>recovery_dtbo</code> 参数。</li>
+  </ul>
+
+  <ul>
+    <li>如果变量 <code>BOARD_INCLUDE_RECOVERY_DTBO</code>、<code>BOARD_MKBOOTIMG_ARGS</code> 和 <code>BOARD_PREBUILT_DTBOIMAGE</code> 均正确设置,Android 编译系统会将变量 <code>BOARD_PREBUILT_DTBOIMAGE</code> 指定的 DTBO 添加到 <code>recovery.img</code> 中。</li>
+  </ul>
+
+  <h2 id="validation">验证</h2>
+
+  <p>对于搭载 Android 9 的所有设备,<a href="/compatibility/vts/">供应商测试套件 (VTS)</a> 会检查启动/恢复映像的格式,以确保启动映像标头使用版本 1。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/camera/external-usb-cameras.html b/zh-cn/devices/camera/external-usb-cameras.html
new file mode 100644
index 0000000..ca46ac5
--- /dev/null
+++ b/zh-cn/devices/camera/external-usb-cameras.html
@@ -0,0 +1,147 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="external_usb_cameras" class="page-title">外接 USB 摄像头</h1>
+
+<p>Android 平台支持使用即插即用的 USB 摄像头(例如网络摄像头),但前提是这些摄像头采用标准的 <a href="https://developer.android.com/reference/android/hardware/camera2/package-summary.html">Android Camera2 API</a> 和摄像头 <a href="/reference/hidl/android/hardware/camera/provider/2.4/ICameraProvider">HIDL</a> 接口。网络摄像头通常支持 <a href="https://en.wikipedia.org/wiki/USB_video_device_class">USB 视频类 (UVC)</a> 驱动程序,并且在 Linux 上,系统采用标准的 <a href="https://en.wikipedia.org/wiki/Video4Linux">Video4Linux (V4L)</a> 驱动程序控制 UVC 摄像头。</p>
+
+<p>如果系统支持网络摄像头,设备便可用于视频聊天和照片冲印机等轻量级用例。此功能并不是为了替代 Android 手机上典型的内部摄像头 HAL,也不是为了协助执行涉及高分辨率和高速流式传输、AR 以及手动 ISP/传感器/智能镜头控制的性能密集型复杂任务。</p>
+
+<p>全新的 USB 摄像头 HAL 进程是外接摄像头提供程序的一部分,该提供程序会监听 USB 设备可用性,并相应地枚举外接摄像头设备。该进程具有与内置摄像头 HAL 进程类似的权限和 SE 策略。直接与 USB 设备通信的第三方网络摄像头应用访问 UVC 设备时所需的摄像头权限与所有常规摄像头应用所需的权限相同。</p>
+
+<h2 id="examples_and_sources">示例和源代码</h2>
+
+<p>要详细了解如何实现 USB 摄像头,请参阅 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/provider/2.4/default/"><code>ExternalCameraProvider</code></a> 中的外接摄像头提供程序参考实现。外接摄像头设备和会话实现包含在 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/"><code>ExternalCameraDevice</code></a> 和 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/"><code>ExternalCameraDeviceSession</code></a> 中。Java 客户端 API 包含一个新的 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata?authuser=3#INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL"><code>EXTERNAL</code></a> 硬件级别。</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>实现必须支持 <a href="https://developer.android.com/guide/topics/connectivity/usb/host"><code>android.hardware.usb.host</code></a> 系统功能。</p>
+
+<p>此外,还必须启用对 UVC 设备的内核支持。您可以通过将以下内容添加到相应的内核 <code>deconfig</code> 文件来启用该支持。</p>
+<pre class="prettyprint"><code>+CONFIG_USB_VIDEO_CLASS=y
++CONFIG_MEDIA_USB_SUPPORT=y
+</code></pre><aside class="note"><strong>注意</strong>:<span>请确保您还针对 uvcvideo 安装了这个<a href="https://patchwork.kernel.org/patch/6874491/">补丁程序</a>。</span></aside>
+<p>要在相应的设备细分版本中启用外接摄像头提供程序,以便添加必要的 SELinux 权限、外接摄像头配置以及外接摄像头提供程序依赖项,请完成以下步骤:</p>
+
+<ul>
+<li><p>将外接摄像头配置文件和外接摄像头库添加到 <code>device.mk</code></p>
+<pre class="prettyprint"><code>+PRODUCT_PACKAGES += [email protected]
++PRODUCT_PACKAGES += [email protected]
+
++PRODUCT_COPY_FILES += \
++device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
+</code></pre></li>
+<li><p>将外接摄像头提供程序名称添加到设备 Treble HAL 清单</p>
+<pre class="prettyprint"><code>&lt;hal format="hidl"&gt;
+   &lt;name&gt;android.hardware.camera.provider&lt;/name&gt;
+   &lt;transport arch="32+64"&gt;passthrough&lt;/transport&gt;
+   &lt;impl level="generic"&gt;&lt;/impl&gt;
+   &lt;version&gt;2.4&lt;/version&gt;
+   &lt;interface&gt;
+       &lt;name&gt;ICameraProvider&lt;/name&gt;
+       &lt;instance&gt;legacy/0&lt;/instance&gt;
++       &lt;instance&gt;external/0&lt;/instance&gt;
+   &lt;/interface&gt;
+&lt;/hal&gt;
+</code></pre></li>
+<li><p>(选做)如果设备在 Treble 直通模式下运行,请更新 <code>sepolicy</code>,以便 <code>cameraserver</code> 可以访问 UVC 摄像头</p>
+<pre class="prettyprint"><code>+# for external camera
++allow cameraserver device:dir r_dir_perms;
++allow cameraserver video_device:dir r_dir_perms;
++allow cameraserver video_device:chr_file rw_file_perms;
+</code></pre></li>
+</ul>
+
+<p>以下是 <code>external_camera_config.xml</code> 的示例(省略了版权行)</p>
+<pre class="prettyprint"><code>&lt;ExternalCamera&gt;
+    &lt;Provider&gt;
+         &lt;!-- Internal video devices to be ignored by external camera HAL --&gt;
+            &lt;id&gt;0&lt;/id&gt; &lt;!-- No leading/trailing spaces --&gt;
+            &lt;id&gt;1&lt;/id&gt;
+
+    &lt;/Provider&gt;
+    &lt;!-- See ExternalCameraUtils.cpp for default values of Device configurations below --&gt;
+    &lt;Device&gt;
+        &lt;!-- Max JPEG buffer size in bytes--&gt;
+        &lt;MaxJpegBufferSize bytes="3145728"/&gt; &lt;!-- 3MB (~= 1080p YUV420) --&gt;
+        &lt;!-- Size of v4l2 buffer queue when streaming &gt;= 30fps --&gt;
+        &lt;!-- Larger value: more request can be cached pipeline (less janky)  --&gt;
+        &lt;!-- Smaller value: use less memory --&gt;
+        &lt;NumVideoBuffers count="4"/&gt;
+        &lt;!-- Size of v4l2 buffer queue when streaming &lt; 30fps --&gt;
+        &lt;NumStillBuffers count="2"/&gt;
+
+        &lt;!-- List of maximum fps for various output sizes --&gt;
+        &lt;!-- Any image size smaller than the size listed in Limit row will report
+            fps (as minimum frame duration) up to the fpsBound value. --&gt;
+        &lt;FpsList&gt;
+            &lt;!-- width/height must be increasing, fpsBound must be decreasing--&gt;
+            &lt;Limit width="640" height="480" fpsBound="30.0"/&gt;
+            &lt;Limit width="1280" height="720" fpsBound="15.0"/&gt;
+            &lt;Limit width="1920" height="1080" fpsBound="10.0"/&gt;
+            &lt;!-- image size larger than the last entry will not be supported--&gt;
+        &lt;/FpsList&gt;
+    &lt;/Device&gt;
+&lt;/ExternalCamera&gt;
+</code></pre>
+<h2 id="customization">自定义</h2>
+
+<p>您可以通过常规自定义选项或设备专用的优化来提升 Android 摄像头的性能。</p>
+
+<h3 id="general_customizations">常规自定义</h3>
+
+<p>您可以通过修改 <code>external_camera_config.xml</code> 文件来自定义外接摄像头提供程序。具体而言,客户可以自定义以下参数:</p>
+
+<ul>
+<li>内部摄像头的排除视频节点</li>
+<li>支持的图片大小和帧速率上限</li>
+<li>Inflight 缓冲区数量(在卡顿与内存之间进行权衡)</li>
+</ul>
+
+<p>除了这些参数之外,您还可以添加自己的参数或开发自己的配置。</p>
+
+<h3 id="device_specific_optimizations">设备专用的优化</h3>
+
+<p>您还可以通过添加设备专用的优化来提升性能。</p>
+
+<h4 id="buffer_copyscaling_and_jpeg_decodeencode">缓冲区复制/调整大小和 JPEG 解码/编码</h4>
+
+<p>通用实现使用的是 CPU (libyuv/libjpeg),但您可以将其替换为设备专用的优化。</p>
+
+<h4 id="hal_output_format">HAL 输出格式</h4>
+
+<p>通用实现采用以下输出格式:</p>
+
+<ul>
+<li>YUV_420_888:适用于视频 IMPLEMENTATION_DEFINED 缓冲区。</li>
+<li>YV12:适用于所有其他 IMPLEMENTATION_DEFINED 缓冲区。</li>
+</ul>
+
+<p>为了提升性能,您可以将输出格式替换为设备专用的高效格式。此外,您还可以在自定义的实现中支持其他格式</p>
+
+<h2 id="validation">验证</h2>
+
+<p>支持外接摄像头的设备必须通过摄像头 CTS 测试。在整个测试运行期间,外接 USB 网络摄像头必须始终插入到特定设备,否则某些测试用例会失败。</p>
+<aside class="note"><strong>注意</strong>:<span><code>media_profiles</code> 条目不适用于外接 USB 网络摄像头,因此没有 <a href="https://developer.android.com/reference/android/media/CamcorderProfile">camcorder 配置文件</a>。</span></aside>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/camera/index.html b/zh-cn/devices/camera/index.html
index d3d68b0..7a05302 100644
--- a/zh-cn/devices/camera/index.html
+++ b/zh-cn/devices/camera/index.html
@@ -36,7 +36,8 @@
   <dt>应用框架</dt>
   <dd>应用代码位于应用框架级别,它使用 <a href="https://developer.android.com/reference/android/hardware/camera2/package-summary">Camera 2</a> API 与相机硬件进行交互。在内部,这些代码会调用相应的 <a href="https://developer.android.com/reference/android/os/Binder.html">Binder</a> 接口,以访问与相机互动的原生代码。</dd>
   <dt>AIDL</dt>
-  <dd>与 CameraService 关联的 Binder 接口可在 <a href="https://android.googlesource.com/platform/frameworks/av/+/master/camera/aidl/android/hardware/ICameraService.aidl">frameworks/av/camera/aidl/android/hardware</a> 中找到。生成的代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice">CameraDevice</a> 并最终创建 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html">CameraCaptureSession</a> 对象的数据。</dd>
+  <dd>与 CameraService 关联的 Binder 接口可在 <a href="https://android.googlesource.com/platform/frameworks/av/+/master/camera/aidl/android/hardware/ICameraService.aidl">frameworks/av/camera/aidl/android/hardware</a> 中找到。
+生成的代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice">CameraDevice</a> 并最终创建 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html">CameraCaptureSession</a> 对象的数据。</dd>
   <dt>原生框架</dt><dt>
   </dt><dd>此框架位于 <code>frameworks/av/</code> 中,并提供相当于 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice">CameraDevice</a> 和 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession">CameraCaptureSession</a> 类的原生类。另请参阅 <a href="https://developer.android.com/ndk/reference/group/camera">NDK camera2 参考</a>。</dd>
   <dt>Binder IPC 接口</dt>
@@ -49,7 +50,7 @@
 </dl>
 
 <h2 id="implementing">实现 HAL</h2>
-<p>HAL 位于相机驱动程序和更高级别的 Android 框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。从 Android 8.0 开始,相机 HAL 接口是 Project <a href="/devices/architecture/treble">Treble</a> 的一部分,相应的 <a href="/devices/architecture/hidl/">HIDL</a> 接口在<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/">hardware/interfaces/camera</a>中定义。</p>
+<p>HAL 位于相机驱动程序和更高级别的 Android 框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。从 Android 8.0 开始,相机 HAL 接口是 Project <a href="/devices/architecture/treble">Treble</a> 的一部分,相应的 <a href="/devices/architecture/hidl/">HIDL</a> 接口在 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/">hardware/interfaces/camera</a> 中定义。</p>
 
 <p>典型的绑定式 HAL 必须实现以下 HIDL 接口:</p>
 <ul>
diff --git a/zh-cn/devices/camera/motion-tracking.html b/zh-cn/devices/camera/motion-tracking.html
new file mode 100644
index 0000000..7402102
--- /dev/null
+++ b/zh-cn/devices/camera/motion-tracking.html
@@ -0,0 +1,55 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="motion_tracking" class="page-title">运动跟踪</h1>
+
+<p>在 Android 9 中,摄像头设备可以支持<a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING">运动跟踪功能</a>。支持此功能的摄像头本身不会生成运动跟踪数据,而是供 ARCore 或图像稳定算法以及其他传感器用于进行场景分析。要支持此功能,设备必须支持 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#CONTROL_CAPTURE_INTENT_MOTION_TRACKING"><code>CONTROL_CAPTURE_INTENT_MOTION_TRACKING</code></a>。如果该 intent 是捕获请求的一部分,则摄像头必须将曝光时间限制为不超过 20 毫秒,以减少运动模糊。</p>
+
+<h2 id="examples_and_source">示例和源代码</h2>
+
+<p>HAL 端的参考运动跟踪实现是<a href="https://android.googlesource.com/platform/hardware/qcom/camera/+/master/msm8998/QCamera2/HAL3/QCamera3HWI.cpp">摄像头 HAL</a> 的一部分。</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>要在摄像头设备上启用运动跟踪功能,请确保:</p>
+
+<ul>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/"><code>ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING</code></a> 功能处于启用状态。</li>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/"><code>ANDROID_CONTROL_CAPTURE_INTENT_MOTION_TRACKING</code></a> intent 受支持,并且当该 intent 包含在捕获请求中时,将摄像头曝光时间限制为不超过 20 毫秒。</li>
+<li><p>在静态信息和动态元数据字段中准确报告以下列表中的镜头校准数据:</p>
+
+<ul>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#747"><code>ANDROID_LENS_POSE_ROTATION</code></a></li>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#753"><code>ANDROID_LENS_POSE_TRANSLATION</code></a></li>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#773"><code>ANDROID_LENS_INTRINSIC_CALIBRATION</code></a></li>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#780"><code>ANDROID_LENS_RADIAL_DISTORTION</code></a></li>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/"><code>ANDROID_LENS_POSE_REFERENCE</code></a></li>
+</ul></li>
+</ul>
+
+<h2 id="validation">验证</h2>
+
+<p>支持运动跟踪功能的摄像头设备必须通过<a href="/compatibility/cts/camera-hal#cts_tests">摄像头 CTS 测试</a>。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/camera/multi-camera.html b/zh-cn/devices/camera/multi-camera.html
index 27d5526..a202fee 100644
--- a/zh-cn/devices/camera/multi-camera.html
+++ b/zh-cn/devices/camera/multi-camera.html
@@ -34,11 +34,11 @@
 
 <h2 id="examples_and_sources">示例和来源</h2>
 
-<p>必须通过<a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA">逻辑多摄像头功能</a>播发多摄像头设备。</p>
+<p>必须通过<a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA" class="external">逻辑多摄像头功能</a>播发多摄像头设备。</p>
 
-<p>摄像头客户端可以通过调用 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#getPhysicalCameraIds()"><code>getPhysicalCameraIds()</code></a> 来查询构成特定逻辑摄像头的物理设备的摄像头 ID。随结果返回的 ID 之后会用于通过 <a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#setPhysicalCameraId(java.lang.String)"><code>setPhysicalCameraId()</code></a> 单独控制各个物理设备。可以通过调用 <a href="https://developer.android.com/reference/android/hardware/camera2/TotalCaptureResult.html#getPhysicalCameraResults()"><code>getPhysicalCameraResults()</code></a> 从完整结果中查询此类单个请求的结果。</p>
+<p>摄像头客户端可以通过调用 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#getPhysicalCameraIds()" class="external"><code>getPhysicalCameraIds()</code></a>,查询构成特定逻辑摄像头的物理设备的摄像头 ID。随结果返回的 ID 之后会用于通过 <a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#setPhysicalCameraId(java.lang.String)" class="external"><code>setPhysicalCameraId()</code></a> 单独控制各个物理设备。可以通过调用 <a href="https://developer.android.com/reference/android/hardware/camera2/TotalCaptureResult.html#getPhysicalCameraResults()" class="external"><code>getPhysicalCameraResults()</code></a> 从完整结果中查询此类单个请求的结果。</p>
 
-<p>单个物理摄像头请求可能仅支持有限的部分参数。要接收受支持参数的列表,开发者可以调用 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#getAvailablePhysicalCameraRequestKeys()"><code>getAvailablePhysicalCameraRequestKeys()</code></a>。</p>
+<p>单个物理摄像头请求可能仅支持有限的部分参数。要获得受支持参数的列表,开发者可以调用 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#getAvailablePhysicalCameraRequestKeys()" class="external"><code>getAvailablePhysicalCameraRequestKeys()</code></a>。</p>
 
 <p>只有非重新处理请求以及单色和 Bayer 传感器支持物理摄像头信息流。</p>
 
@@ -49,24 +49,24 @@
 <p>要在 HAL 端添加逻辑多摄像头设备,请执行以下操作:</p>
 
 <ul>
-<li>为由两个或两个以上物理摄像头(这些摄像头也会提供给应用)提供支持的任何逻辑摄像头设备添加 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#232"><code>ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA</code></a> 功能。</li>
-<li>使用物理摄像头 ID 列表填充静态 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#161"><code>ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS</code></a> 元数据字段。</li>
-<li>填充在物理摄像头信息流的像素之间建立关联所需的深度相关静态元数据:<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#747"><code>ANDROID_LENS_POSE_ROTATION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#753"><code>ANDROID_LENS_POSE_TRANSLATION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#773"><code>ANDROID_LENS_INTRINSIC_CALIBRATION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#780"><code>ANDROID_LENS_RADIAL_DISTORTION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#79"><code>ANDROID_LENS_POSE_REFERENCE</code></a></li>
-<li><p>将静态 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#167"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE</code></a> 元数据字段设置为:</p>
+<li>为由两个或两个以上物理摄像头(这些摄像头也会提供给应用)提供支持的任何逻辑摄像头设备添加 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#232" class="external"><code>ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA</code></a> 功能。</li>
+<li>使用物理摄像头 ID 列表填充静态 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#161" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS</code></a> 元数据字段。</li>
+<li>填充在物理摄像头信息流的像素之间建立关联所需的深度相关静态元数据:<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#747" class="external"><code>ANDROID_LENS_POSE_ROTATION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#753" class="external"><code>ANDROID_LENS_POSE_TRANSLATION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#773" class="external"><code>ANDROID_LENS_INTRINSIC_CALIBRATION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#780" class="external"><code>ANDROID_LENS_RADIAL_DISTORTION</code></a>、<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#79" class="external"><code>ANDROID_LENS_POSE_REFERENCE</code></a>。</li>
+<li><p>将静态 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#167" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE</code></a> 元数据字段设置为:</p>
 
 <ul>
-<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#256"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE</code></a>:对于主主模式下的传感器,不执行硬件快门/曝光同步。</li>
-<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#257"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED</code></a>:对于主从模式下的传感器,执行硬件快门/曝光同步。</li>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#256" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE</code></a>:对于主主模式下的传感器,不执行硬件快门/曝光同步。</li>
+<li><a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#257" class="external"><code>ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED</code></a>:对于主从模式下的传感器,执行硬件快门/曝光同步。</li>
 </ul></li>
-<li><p>使用各个物理摄像头支持的参数列表填充 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#106"><code>ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS</code></a>。如果逻辑设备不支持单个请求,则列表可以为空。</p></li>
-<li><p>如果支持单个请求,则处理并应用可以在捕获请求中到达的各个 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/3.4/types.hal#226"><code>physicalCameraSettings</code></a>,并相应地附加单个 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/3.4/types.hal#289"><code>physicalCameraMetadata</code></a>。</p></li>
+<li><p>使用各个物理摄像头支持的参数列表填充 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.3/types.hal#106" class="external"><code>ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS</code></a>。如果逻辑设备不支持单个请求,则列表可以为空。</p></li>
+<li><p>如果支持单个请求,则处理并应用可以在捕获请求中到达的各个 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/3.4/types.hal#226" class="external"><code>physicalCameraSettings</code></a>,并相应地附加单个 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/3.4/types.hal#289" class="external"><code>physicalCameraMetadata</code></a>。</p></li>
 </ul>
 
 <p>摄像头设备必须支持将一个逻辑 YUV/RAW 信息流替换为两个物理摄像头中大小(除 RAW 大小外)和格式相同的物理信息流。</p>
 
 <h3 id="stream_configuration_map">信息流配置映射</h3>
 
-<p>对于逻辑摄像头,特定硬件级别的摄像头设备的强制性信息流组合与 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html#createCaptureSession(java.util.List%3Candroid.view.Surface%3E,%20android.hardware.camera2.CameraCaptureSession.StateCallback,%20android.os.Handler)"><code>CameraDevice.createCaptureSession</code></a> 中所需的相同。信息流配置映射中的所有信息流都应该是融合/逻辑框架。</p>
+<p>对于逻辑摄像头,特定硬件级别的摄像头设备的强制性信息流组合与 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice.html#createCaptureSession(java.util.List%3Candroid.view.Surface%3E,%20android.hardware.camera2.CameraCaptureSession.StateCallback,%20android.os.Handler)" class="external"><code>CameraDevice.createCaptureSession</code></a> 中所需的相同。信息流配置映射中的所有信息流都应该是融合/逻辑框架。</p>
 
 <p>如果某些信息流组合无法融合,则不应包含在逻辑摄像头的信息流配置映射中。但是,应用可以查找单个物理摄像头的信息流配置映射,并使用物理摄像头 ID 配置信息流。</p>
 
@@ -76,7 +76,7 @@
 
 <h3 id="guaranteed_stream_combination">有保证的信息流组合</h3>
 
-<p>逻辑摄像头及其底层物理摄像头都必须保证其设备级别所需的<a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice#createcapturesession_4">强制性信息流组合</a>。</p>
+<p>逻辑摄像头及其底层物理摄像头都必须保证其设备级别所需的<a href="https://developer.android.com/reference/android/hardware/camera2/CameraDevice#createcapturesession_4" class="external">强制性信息流组合</a>。</p>
 
 <p>逻辑摄像头设备的运行方式应该与物理摄像头设备相同,具体取决于其硬件级别和功能。建议将其特征集设为单个物理摄像头的特征集的超集。</p>
 
@@ -117,20 +117,20 @@
 
 <h2 id="validation">验证</h2>
 
-<p>逻辑多摄像头设备必须像任何其他普通摄像头一样通过摄像头 CTS。可以在 <a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/src/android/hardware/camera2/cts/"><code>LogicalCameraDeviceTest</code></a> 模块中找到针对此类设备的测试用例。</p>
+<p>逻辑多摄像头设备必须像任何其他普通摄像头一样通过摄像头 CTS 测试。可以在 <a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/src/android/hardware/camera2/cts/" class="external"><code>LogicalCameraDeviceTest</code></a> 模块中找到针对此类设备的测试用例。</p>
 
 <p>以下三个 ITS 测试针对多摄像头系统,以便于正确融合图像:</p>
 
 <ul>
-<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/scene1/"><code>scene1/test_multi_camera_match.py</code></a></li>
-<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/scene4/"><code>scene4/test_multi_camera_alignment.py</code></a></li>
-<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/sensor_fusion/"><code>sensor_fusion/test_multi_camera_frame_sync.py</code></a></li>
+<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/scene1/" class="external"><code>scene1/test_multi_camera_match.py</code></a>  </li>
+<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/scene4/" class="external"><code>scene4/test_multi_camera_alignment.py</code></a>  </li>
+<li><a href="https://android.googlesource.com/platform/cts/+/master/apps/CameraITS/tests/sensor_fusion/" class="external"><code>sensor_fusion/test_multi_camera_frame_sync.py</code></a>  </li>
 </ul>
 
 <p>scene1 和 scene4 测试使用<a href="/compatibility/cts/camera-its-box">盒装 ITS</a> 测试装置运行。当两个摄像头都启用时,<code>test_multi_camera_match</code> 测试会声明图像中心的亮度匹配。<code>test_multi_camera_alignment</code> 测试会声明摄像头间距、方向和失真参数已正确加载。如果多摄像头系统包含广视野摄像头(大于 90o),则需要 rev2 版 ITS 包装盒。</p>
 
 <p><code>Sensor_fusion</code> 是另一个测试装置,它可以实现规定的重复手机动作,并声明陀螺仪和图像传感器时间戳匹配以及多摄像头帧保持同步。</p>
 
-<p>所有包装盒都由 AcuSpec, Inc.(<a href="http://www.acuspecinc.com">www.acuspecinc.com</a>,[email protected])和 MYWAY Manufacturing(<a href="http://www.myway.tw">www.myway.tw</a>,[email protected])提供。此外,rev1 ITS 包装盒可通过 West-Mark(<a href="http://www.west-mark.com">www.west-mark.com</a>,[email protected])购买。</p>
+<p>所有测试盒都由 AcuSpec, Inc.(<a href="http://www.acuspecinc.com" class="external">www.acuspecinc.com</a>,[email protected])和 MYWAY Manufacturing(<a href="http://www.myway.tw" class="external">www.myway.tw</a>,[email protected])提供。此外,rev1 ITS 测试盒可通过 West-Mark(<a href="http://www.west-mark.com" class="external">www.west-mark.com</a>,[email protected])购买。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/camera/session-parameters.html b/zh-cn/devices/camera/session-parameters.html
new file mode 100644
index 0000000..96e8751
--- /dev/null
+++ b/zh-cn/devices/camera/session-parameters.html
@@ -0,0 +1,61 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="session_parameters" class="page-title">会话参数</h1>
+
+<p>在捕获会话初始化阶段,会话参数功能使相机客户端可以主动配置一部分成本高昂的请求参数(即会话参数),从而减少延迟。借助此功能,您的 HAL 实现会在流配置阶段(而不是第一个捕获请求期间)接收客户端参数,并且可以根据它们的值更高效地准备和构建内部流水线。</p>
+
+<h2 id="examples_and_source">示例和来源</h2>
+
+<p>参考会话参数实现已经是 <a href="https://android.googlesource.com/platform/hardware/qcom/camera/+/master/msm8998/QCamera2/HAL3/QCamera3HWI.cpp">CameraHal</a> 的一部分。此 HAL 使用旧版 Hal API。实现 Camera HIDL API 的<a href="https://source.android.com/devices/architecture/hal-types">绑定式</a> CameraHal 必须使用相应的 HIDL <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/device/">sessionParams</a> 条目在流配置期间访问所有新的传入会话参数。</p>
+
+<p>相机客户端可以通过调用 <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics#getAvailableSessionKeys()"><code>getAvaiableSessionKeys()</code></a> 来查询所有受支持的会话参数的键,并最终通过 <a href="https://developer.android.com/reference/android/hardware/camera2/params/SessionConfiguration#setSessionParameters(android.hardware.camera2.CaptureRequest)"><code>setSessionParameters()</code></a> 设置它们的初始值。</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>您的 CameraHal 实现必须在相应的静态相机元数据中填充 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/"><code>ANDROID_REQUEST_AVAILABLE_SESSION_KEYS</code></a>,并提供一部分 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/camera/metadata/3.2/types.hal#1016"><code>ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS</code></a>(其中包含难以按帧应用的键的列表,如果在捕获会话生命周期内修改这些键,则可能会导致意外延迟)。</p>
+
+<p>典型示例包括:需要耗费时间重新配置硬件或更改内部相机流水线的参数。控制会话参数仍然可以在捕获请求中发挥作用,不过,客户端应意识到并预料到其应用会出现延迟。</p>
+
+<p>框架会监控所有传入请求,如果它检测到会话参数值发生变化,则会在内部重新配置相机。然后,已传递到 CameraHal 的新流配置中会包含更新后的会话参数值(用于更高效地配置相机流水线)。</p>
+
+<h2 id="customization">自定义</h2>
+
+<p>您可以在 CameraHal 端填充的可用会话参数列表中定义标记。如果 CameraHal 将可用会话参数列表留空,则此功能无效。</p>
+
+<h2 id="validation">验证</h2>
+
+<p>CTS 提供以下用于测试会话参数的新用例:</p>
+
+<ul>
+<li><a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/src/android/hardware/camera2/cts/CameraDeviceTest.java#795"><code>CameraDeviceTest#testSessionConfiguration</code></a></li>
+<li><a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/src/android/hardware/camera2/cts/CameraDeviceTest.java#1038"><code>CameraDeviceTest#testCreateSessionWithParameters</code></a></li>
+<li><a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/src/android/hardware/camera2/cts/CameraDeviceTest.java#870"><code>CameraDeviceTest#testSessionParametersStateLeak</code></a></li>
+<li><a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/libctscamera2jni/native-camera-jni.cpp#2140"><code>NativeCameraDeviceTest#testCameraDevicePreviewWithSessionParameters</code></a></li>
+</ul>
+
+<p>通常,一旦某个参数成为会话键列表的一部分,其当前值就会添加到在流配置期间在 HAL 层传递的会话参数中。</p>
+
+<p>选择会话参数时请务必谨慎。不应频繁更改流配置之间的会话参数值(如果有的话)。如果参数频繁更改(例如出于捕获目的),其适用性会非常低;如果将此类参数添加到会话参数列表中,则可能会因内部重新配置过多而导致 CTS 问题。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/camera/singleprod-multiconsum.html b/zh-cn/devices/camera/singleprod-multiconsum.html
new file mode 100644
index 0000000..85dce7e
--- /dev/null
+++ b/zh-cn/devices/camera/singleprod-multiconsum.html
@@ -0,0 +1,55 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="single_producer_multiple_consumer_camera_buffer_transport" class="page-title">“单个生产者-多个消费者”摄像头缓冲区传输</h1>
+
+<p>该功能引入了一组方法,当拍摄会话处于活动状态且摄像头流式传输正在进行时,摄像头客户端可通过该功能动态添加和移除输出 Surface。新的输出可以映射到用户选择的特定<a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration#enableSurfaceSharing()">共享摄像头</a>信息流。Surface 添加后,您可以随时将其移除。</p>
+
+<p>总的想法是,在多个输出 Surface 中共享与特定摄像头信息流关联的缓冲区。当缓冲区准备好在消费者端进行进一步处理时,内部引用计数器便开始跟踪缓冲区。当所有消费者完成各自的任务后,缓冲区便会离开队列,并可供摄像头使用。</p>
+
+<p><img src="/devices/camera/images/buffer-sharing.png" alt="缓冲区共享"/></p>
+
+<p><strong>图 1.</strong> 缓冲区共享</p>
+
+<p>图 1 描绘了一个示例场景:系统采用动态方式连接和分离由摄像头信息流 2 处理的缓冲区,并由摄像头服务内的专用共享输出流内部的信息流分流器组件对引用进行计数和管理。</p>
+
+<h2 id="examples_and_source">示例和源代码</h2>
+
+<p>可在 <a href="https://android.googlesource.com/platform/frameworks/av/+/master/services/camera/libcameraservice/device3/Camera3StreamSplitter.cpp"><code>Camera3StreamSplitter</code></a> 模块中找到该功能的核心实现,并可在面向开发者的参考资料中找到关于该功能的文档:</p>
+
+<ul>
+<li><a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.html#updateOutputConfiguration(android.hardware.camera2.params.OutputConfiguration)"><code>updateOutputConfiguration()</code></a></li>
+<li><a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration#addSurface(android.view.Surface)"><code>addSurface()</code></a></li>
+<li><a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration#removeSurface(android.view.Surface)"><code>removeSurface()</code></a></li>
+</ul>
+
+<h2 id="implementation">实现</h2>
+
+<p>摄像头 HAL 端不需要任何实现,因为该功能在框架端实现。</p>
+
+<h2 id="validation">验证</h2>
+
+<p>您的实现必须通过 <a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/src/android/hardware/camera2/cts/MultiViewTest.java">MultiViewTest</a> 模块中以及本机 API 的<a href="https://android.googlesource.com/platform/cts/+/master/tests/camera/libctscamera2jni/native-camera-jni.cpp">本机 JNI 库</a>中涵盖该功能的 CTS 测试。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/camera/versioning.html b/zh-cn/devices/camera/versioning.html
index 6a9004b..c37a21c 100644
--- a/zh-cn/devices/camera/versioning.html
+++ b/zh-cn/devices/camera/versioning.html
@@ -75,14 +75,16 @@
 
 <h3 id="camera_api2">Camera API2</h3>
 
-<p>Camera API2 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。有关详细信息,请观看 <a href="https://www.youtube.com/watch?v=92fgcUNCHic&feature=youtu.be&t=29m50s">Google I/O 视频概览</a>。</p>
+<p>Camera API2 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。有关详细信息,请观看 <a href="https://www.youtube.com/watch?v=92fgcUNCHic&feature=youtu.be&t=29m50s" class="external">Google I/O 视频概览</a>。</p>
 
 <p>Android 5.0 及更高版本提供 Camera API2;但是,运行 Android 5.0 及更高版本的设备可能并不支持所有 Camera API2 功能。应用可通过 Camera API2 接口查询 <code>android.info.supportedHardwareLevel</code> 属性。该属性会报告以下支持级别之一:</p>
 
 <ul>
 <li><code>LEGACY</code>(旧版)。这些设备通过 Camera API2 接口为应用提供功能,而且这些功能与通过 Camera API1 接口提供给应用的功能大致相同。旧版框架代码在概念上将 Camera API2 调用转换为 Camera API1 调用;旧版设备不支持 Camera API2 功能,例如每帧控件。</li>
-<li><code>FULL</code>(全面)。这些设备支持 Camera API2 的所有主要功能,并且必须使用 Camera HAL 3.2 或更高版本以及 Android 5.0 或更高版本。</li>
 <li><code>LIMITED</code>(有限)。这些设备支持部分(但不是全部)Camera API2 功能,并且必须使用 Camera HAL 3.2 或更高版本。</li>
+<li><code>FULL</code>(全面)。这些设备支持 Camera API2 的所有主要功能,并且必须使用 Camera HAL 3.2 或更高版本以及 Android 5.0 或更高版本。</li>
+<li><code>LEVEL_3</code>(级别 3):这些设备支持 YUV 重新处理和 RAW 图片捕获,以及其他输出流配置。</li>
+<li><code>EXTERNAL</code>(外部):这些设备类似于 <code>LIMITED</code> 设备,但有一些例外情况;例如,某些传感器或镜头信息可能未被报告或具有较不稳定的帧速率。此级别用于外部相机(如 USB 网络摄像头)。</li>
 </ul>
 
 <p>各项功能通过 Camera API2 接口中的 <code>android.request.availableCapabilities</code> 属性提供。<code>FULL</code> 设备需要具备 <code>MANUAL_SENSOR</code> 和 <code>MANUAL_POST_PROCESSING</code> 等功能。但即使是 <code>FULL</code> 设备,也并非必须实现 <code>RAW</code> 功能。
@@ -179,12 +181,13 @@
 </p>
 
 <p>
-有关其他详细信息,请参阅 <code><a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#enableSurfaceSharing()">enableSurfaceSharing</a></code> 开发者文档。</p>
+有关其他详细信息,请参阅 <code><a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#enableSurfaceSharing()" class="external">
+  enableSurfaceSharing</a></code> 开发者文档。</p>
 
 <h4 id="system-api-for-custom-camera-modes">适用于自定义相机模式的系统 API</h4>
 
 <p>
-公共相机 API 定义了两种操作模式:正常模式和受限高速录制模式。这两种模式的语义截然不同;高速模式受限于一次最多只能有两个具体输出等。各个原始设备制造商 (OEM) 已表现出极大的兴趣想要针对特定于硬件的功能定义其他自定义模式。说白了,该模式只是一个传递到 <code>configure_streams</code> 的整数。请参阅:<a href="https://source.android.com/reference/hidl/android/hardware/camera/device/3.2/ICameraDeviceSession#configurestreams"><code>hardware/camera/device/3.2/ICameraDeviceSession#configurestreams</code></a>
+公共相机 API 定义了两种操作模式:正常模式和受限高速录制模式。这两种模式的语义截然不同;高速模式受限于一次最多只能有两个具体输出等。各个原始设备制造商 (OEM) 已表现出极大的兴趣想要针对特定于硬件的功能定义其他自定义模式。说白了,该模式只是一个传递到 <code>configure_streams</code> 的整数。请参阅:<a href="/reference/hidl/android/hardware/camera/device/3.2/ICameraDeviceSession#configurestreams"><code>hardware/camera/device/3.2/ICameraDeviceSession#configurestreams</code></a>。
 </p>
 
 <p>
@@ -195,7 +198,9 @@
 要支持这一功能,OEM 只需将新模式添加到其 HAL 即可,传递至 HAL 的这一整数会在 configure_streams 上触发该模式,然后 OEM 就可以让其自定义相机应用使用系统 API。</p>
 
 <p>
-此方法的名称是 <code><a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.StateCallback.html#onCaptureQueueEmpty(android.hardware.camera2.CameraCaptureSession)">android.hardware.camera2.CameraDevice#createCustomCaptureSession</a></code>。请参阅:<a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/hardware/camera2/CameraDevice.java#805"><code>frameworks/base/core/java/android/hardware/camera2/CameraDevice.java#805</code></a></p>
+此方法的名称是 <code><a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.StateCallback.html#onCaptureQueueEmpty(android.hardware.camera2.CameraCaptureSession)" class="external">
+  android.hardware.camera2.CameraDevice#createCustomCaptureSession</a></code>。
+请参阅:<a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/hardware/camera2/CameraDevice.java#805" class="external"><code>frameworks/base/core/java/android/hardware/camera2/CameraDevice.java#805</code></a>。</p>
 
 <aside class="note"><strong>注意</strong>:在 Android 8.1 版本中,应用必须预安装到系统映像上才能访问此 API。
 </aside>
@@ -220,7 +225,8 @@
 <li>可用于 HALv3.2 或更高版本的常规元数据添加项:
   <ul>
   <li>
-  <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_3"><code>ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3</code>
+  <a href="https://developer.android.com/reference/android/hardware/camera2/CameraMetadata.html#INFO_SUPPORTED_HARDWARE_LEVEL_3" class="external">
+    <code>ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_3</code>
   </a>
   </li><li><code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST</code></li>
   <li><code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE</code></li>
diff --git a/zh-cn/devices/graphics/arch-vulkan.html b/zh-cn/devices/graphics/arch-vulkan.html
index 1295603..37b7db7 100644
--- a/zh-cn/devices/graphics/arch-vulkan.html
+++ b/zh-cn/devices/graphics/arch-vulkan.html
@@ -32,12 +32,12 @@
 <h2 id="vulkan_components">Vulkan 组件</h2>
 <p>Vulkan 支持包含以下组件:</p>
 <p><img src="/devices/graphics/images/ape_graphics_vulkan.png"/></p>
-<p class="img-caption">图 1:Vulkan 组件</p>
+<p class="img-caption"><strong>图 1.</strong> Vulkan 组件</p>
 
 <ul>
-<li><strong>Vulkan 验证层</strong>(在 Android NDK 中提供)。<em></em>这是开发者在开发 Vulkan 应用期间使用的一组库。图形供应商提供的 Vulkan 运行时库和 Vulkan 驱动程序不包含使 Vulkan 运行时保持高效的运行时错误检查功能,而是使用验证库(仅在开发过程中)来查找应用在使用 Vulkan API 时出现的错误。Vulkan 验证库在开发过程中关联到应用并执行此错误检查。在找出所有 API 使用问题之后,该应用将不再需要包含这些库。</li>
-<li><strong>Vulkan 运行时</strong>(由 Android 提供)。<em></em>这是一个原生库 (<code>(libvulkan.so</code>),提供称为 <a href="https://www.khronos.org/vulkan">Vulkan</a> 的新公共原生 API。大多数功能由 GPU 供应商提供的驱动程序实现;运行时会封装驱动程序、提供 API 拦截功能(针对调试和其他开发者工具)以及管理驱动程序与平台依赖项(如 BufferQueue)之间的交互。</li>
-<li><strong>Vulkan 驱动程序</strong>(由 SoC 提供)。<em></em>将 Vulkan API 映射到特定于硬件的 GPU 命令以及与内核图形驱动程序的交互。</li>
+<li><strong>Vulkan 验证层</strong><em></em>(在 Android NDK 中提供)。这是开发者在开发 Vulkan 应用期间使用的一组库。图形供应商提供的 Vulkan 运行时库和 Vulkan 驱动程序不包含使 Vulkan 运行时保持高效的运行时错误检查功能,而是使用验证库(仅在开发过程中)来查找应用在使用 Vulkan API 时出现的错误。Vulkan 验证库在开发过程中关联到应用并执行此错误检查。在找出所有 API 使用问题之后,该应用将不再需要包含这些库。</li>
+<li><strong>Vulkan 运行时</strong><em></em>(由 Android 提供)。这是一个原生库 (<code>(libvulkan.so</code>),提供称为 <a href="https://www.khronos.org/vulkan">Vulkan</a> 的新公共原生 API。大多数功能由 GPU 供应商提供的驱动程序实现;运行时会封装驱动程序、提供 API 拦截功能(针对调试和其他开发者工具)以及管理驱动程序与平台依赖项(如 BufferQueue)之间的交互。</li>
+<li><strong>Vulkan 驱动程序</strong><em></em>(由 SoC 提供)。将 Vulkan API 映射到特定于硬件的 GPU 命令以及与内核图形驱动程序的交互。</li>
 </ul>
 
 <h2 id="modified_components">已修改的组件</h2>
@@ -48,17 +48,17 @@
 <li><strong>Gralloc HAL</strong>:添加了一个新的可选接口,用于了解是否可将某种指定格式用于特定生产方/消费方组合,而无需实际分配缓冲区。</li>
 </ul>
 
-<p>有关这些组件的详情,请参阅 <a href="/devices/graphics/arch-bq-gralloc.html">BufferQueue 和 gralloc</a>(有关 <code>ANativeWindow</code> 的详情,请参阅 <a href="/devices/graphics/arch-egl-opengl.html">EGLSurface 和 OpenGL ES</a>)。
+<p>要详细了解这些组件,请参阅 <a href="/devices/graphics/arch-bq-gralloc.html">BufferQueue 和 gralloc</a>(要详细了解 <code>ANativeWindow</code>,请参阅 <a href="/devices/graphics/arch-egl-opengl.html">EGLSurface 和 OpenGLES</a>)。
 
 </p><h2 id="apis">Vulkan API</h2>
-<p>Android 平台包括来自 Khronos Group 的 <a href="https://www.khronos.org/vulkan/">Vulkan API 规范</a>的 <a href="https://developer.android.com/ndk/guides/graphics/index.html">Android 特定实现</a>。Android 应用必须使用 <a href="/devices/graphics/implement-vulkan.html#wsi">Window 系统集成 (WSI) 扩展程序</a>来输出其呈现内容。</p>
+<p>Android 平台包括来自 Khronos Group 的 <a href="https://www.khronos.org/vulkan/">Vulkan API 规范</a>的 <a href="https://developer.android.com/ndk/guides/graphics/index.html">Android 专属实现</a>。Android 应用必须使用 <a href="/devices/graphics/implement-vulkan.html#wsi">Window 系统集成 (WSI) 扩展程序</a>来输出其呈现内容。</p>
 
 <h2 id="resources">资源</h2>
 <p>通过以下资源详细了解 Vulkan:</p>
 <ul>
 
 <li>
-位于 <code>platform/frameworks/native/vulkan</code> 的 <a href="https://android.googlesource.com/platform/frameworks/native/+/master/vulkan/#">Vulkan 加载程序</a> (libvulkan.so):包含 Android 的 Vulkan 加载程序,以及一些对平台开发者十分有用的 Vulkan 相关工具。</li>
+位于 <code>platform/frameworks/native/vulkan</code> 的 <a href="https://android.googlesource.com/platform/frameworks/native/+/master/vulkan/#">Vulkan 加载程序 </a>(libvulkan.so)。包含 Android 的 Vulkan 加载程序,以及一些对平台开发者十分有用的 Vulkan 相关工具。</li>
 
 <li><a href="https://android.googlesource.com/platform/frameworks/native/+/master/vulkan/doc/implementors_guide/implementors_guide.html">Vulkan 实现人员指南</a>:旨在帮助 GPU IHV 编写适用于 Android 的 Vulkan 驱动程序,以及指导原始设备制造商 (OEM) 为特定设备集成这些驱动程序。该指南介绍了 Vulkan 驱动程序如何与系统进行交互、应如何安装特定于 GPU 的工具,以及特定于 Android 的要求。</li>
 
diff --git a/zh-cn/devices/graphics/build-tests.html b/zh-cn/devices/graphics/build-tests.html
index bd19ae5..6c6a016 100644
--- a/zh-cn/devices/graphics/build-tests.html
+++ b/zh-cn/devices/graphics/build-tests.html
@@ -58,7 +58,7 @@
 
 <h2 id="creating_target_build_file">创建目标编译文件</h2>
 
-<p>针对新目标的 deqp 编译系统使用目标编译文件进行配置。目标编译文件可定义平台支持哪些功能以及需要哪些库或其他包含路径。目标文件名遵循 <code>targets/<var>NAME</var>/<var>NAME</var>.cmake</code> 格式,且选择目标时会用到 <code>DEQP_TARGET</code> 编译参数。</p>
+<p>针对新目标的 deqp 编译系统使用目标编译文件进行配置。目标编译文件可定义平台支持哪些功能以及需要哪些库或其他包含路径。目标文件名遵循 <code>targets/<var>NAME</var>/<var>NAME</var>.cmake</code> 格式,且目标通过 <code>DEQP_TARGET</code> 编译参数进行选择。</p>
 
 <p>目标文件中的文件路径是相对于基本 <code>deqp</code> 目录(而非 <code>targets/<var>NAME</var></code> 目录)的路径。目标编译文件可以设置以下标准变量。</p>
 
diff --git a/zh-cn/devices/graphics/implement-vulkan.html b/zh-cn/devices/graphics/implement-vulkan.html
index 900b3b5..3b5a476 100644
--- a/zh-cn/devices/graphics/implement-vulkan.html
+++ b/zh-cn/devices/graphics/implement-vulkan.html
@@ -234,7 +234,7 @@
 <h2 id="validation">验证</h2>
 <p>OEM 可以使用 CTS 测试其 Vulkan 实现,其中包括:</p>
 <ul>
-<li><code>CtsDeqpTestCases</code> 模块中的 <a href="/devices/graphics/cts-integration.html">drawElements 质量计划 (dEQP)</a> 测试,其中包括针对 Vulkan 1.0 和 1.1 的功能 API 测试。</li>
+<li><code>CtsDeqpTestCases</code> 模块中的 <a href="/devices/graphics/cts-integration.html">drawElements Quality Program (dEQP)</a> 测试,其中包括针对 Vulkan 1.0 和 1.1 的功能 API 测试。</li>
 <li><code>CtsGraphicsTestCases</code> 模块,用于测试设备是否针对所支持的 Vulkan 功能进行了正确的配置。</li>
 </ul>
 
diff --git a/zh-cn/devices/input/index.html b/zh-cn/devices/input/index.html
index 5339d9e..7982e34 100644
--- a/zh-cn/devices/input/index.html
+++ b/zh-cn/devices/input/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/interaction/neural-networks.html b/zh-cn/devices/interaction/neural-networks.html
new file mode 100644
index 0000000..144dd99
--- /dev/null
+++ b/zh-cn/devices/interaction/neural-networks.html
@@ -0,0 +1,123 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="neural_networks_api_drivers" class="page-title">Neural Networks API 驱动程序</h1>
+
+<p>本文简要介绍了如何为 Android 9 实现 Neural Networks API 驱动程序。如需完整的详细信息,请参阅 HAL 定义文件 (<code>hardware/interfaces/neuralnetworks.</code>) 中的相关文档。您可以在 <code>frameworks/ml/nn/driver.</code> 中找到实用的代码,其中包括一个示例驱动程序。</p>
+
+<p>建议您先熟悉一下 <a href="https://developer.android.com/ndk/guides/neuralnetworks/" class="external">Neural Networks API 指南</a>,然后再阅读本文档。</p>
+
+<h2 id="changes_introduced_in_android">Android 9 中进行的更改</h2>
+
+<p>1.1 HAL 与 Android 8.1 中引入的 1.0 HAL 非常相似。前者包含以下 3 项明显变化:</p>
+
+<ul>
+<li><code>IDevice::prepareModel_1_1</code> 包含一个 <code>ExecutionPreference</code> 参数。驱动程序可以通过该参数了解应用是倾向于节约电量,还是将在快速连续调用中执行模型,从而调整其准备工作。</li>
+<li>增加了 9 个新运算:<code>BATCH_TO_SPACE_ND</code>、<code>DIV</code>、<code>MEAN</code>、<code>PAD</code>、<code>SPACE_TO_BATCH_ND</code>、<code>SQUEEZE</code>、<code>STRIDED_SLICE</code>、<code>SUB</code>、<code>TRANSPOSE</code>。</li>
+<li>通过将 <code>Model.relaxComputationFloat32toFloat16</code> 设为 <code>true</code>,应用可以指定可使用 16 位浮点范围和/或精度来运行 32 位浮点计算。<code>Capabilities</code> 结构体具有附加字段 <code>relaxedFloat32toFloat16Performance</code>,因此驱动程序可以向框架报告其放宽的性能。</li>
+</ul>
+
+<h2 id="overview">概览</h2>
+
+<p>神经网络 (NN) HAL 定义了各种加速器的抽象概念。这些加速器的驱动程序必须符合此 HAL。与从 Android 8.0 版本开始实现的所有驱动程序一样,接口在 HIDL 文件中指定。</p>
+
+<p>下面显示了框架和驱动程序之间的接口遵循的一般流程:</p>
+
+<p><img src="/devices/interaction/images/neural_networks_interface.png" alt="神经网络接口"/></p>
+
+<p><strong>图 1</strong>:神经网络流程</p>
+
+<h2 id="initialization">初始化</h2>
+
+<p>在进行初始化时,框架会向驱动程序查询其功能。比如加速器处理浮点和量化张量的速度有多快?加速器执行这些运算需要多少电量?框架会根据这些信息来确定在哪里执行模型。请参阅 <code>IDevice.hal</code> 中的 <code>IDevice::getCapabilities</code>。</p>
+
+<h2 id="request_compilation">编译请求</h2>
+
+<p>对于指定的应用请求,框架需要确定使用哪些加速器。</p>
+
+<p>在模型编译过程中,框架会通过调用 <code>IDevice::getSupportedOperations</code> 将模型发送到每个驱动程序。每个驱动程序都会返回一个布尔值数组,以指出支持模型的哪些运算。驱动程序可能会根据多种原因确定无法支持指定的运算,例如:</p>
+
+<ul>
+<li>不支持相应数据类型或运算;</li>
+<li>仅支持具有特定输入参数的运算,例如可以执行 3x3 和 5x5 卷积,但无法执行 7x7 卷积;</li>
+<li>内存限制导致无法处理大型图形或输入。</li>
+</ul>
+
+<p>框架会选择在可用处理器上运行模型的哪些部分,选择依据为处理器的性能特性以及应用指明的偏好,例如应用是倾向于速度还是能效。请参阅下面的“性能特性”部分。</p>
+
+<p>框架通过调用 <code>IDevice::prepareModel.</code> 指示每个所选驱动程序做好执行模型一部分的准备。 这会指示驱动程序编译请求。例如,驱动程序可以生成代码、创建重新排序的权重副本,等等。编译模型和执行请求之间可能会间隔很长时间,因此不应在此时分配宝贵的资源,如较大的设备内存区块。</p>
+
+<p>如有任何驱动程序在准备工作期间返回故障代码,框架都会在 CPU 上运行整个模型。一旦成功,系统将返回 <code>IPreparedModel</code> 句柄。</p>
+
+<p>驱动程序可能会希望将其编译结果缓存至持久性存储空间,以避免在每次启动应用时执行可能会非常冗长的编译步骤。目录 <code>frameworks/ml/nn/driver/cache</code> 中包含示例缓存代码。<code>nnCache</code> 子目录中包含持久性存储空间代码。驱动程序可以随意使用此实现或任何其他实现。如果缓存的项目不再有用,驱动程序会负责将其释放。</p>
+
+<h2 id="request_execution">执行请求</h2>
+
+<p>当应用要求框架执行请求时,框架会针对每个所选驱动程序调用 <code>IPreparedModel::execute</code>。传递到此函数的 <code>Request</code> 参数会列出执行请求所使用的输入和输出缓冲区。输入和输出缓冲区都会使用标准格式,请参阅“张量”部分。</p>
+
+<p>工作完成后,驱动程序会通过 <code>IExecutionCallback</code> 通知框架。</p>
+
+<p>对于涉及多个处理器的用户请求,框架负责预留中间内存,并按顺序执行对每个驱动程序的调用。</p>
+
+<p>可以在同一个 <code>IPreparedModel.</code> 上并行启动多个请求。驱动程序可以并行执行这些请求,也可以按顺序执行。</p>
+
+<p>此外,驱动程序还可能会被要求保留多个准备好的模型。例如,准备 m1,准备 m2,在 m1 上运行 r1,在 m2 上运行 r2,在 m1 上运行 r3,在 m2 上运行 r4,…删除 m1,删除 m2。</p>
+
+<p>为了避免首次执行速度缓慢(这可能会导致糟糕的用户体验,比如第一帧卡顿),建议驱动程序在编译阶段执行大部分初始化工作。首次执行时的初始化应仅限于过早执行会对系统运行状况产生负面影响的操作,例如预留较大的临时缓冲区或提高加速器的时钟频率。只能准备极少量并发模型的驱动程序也可能必须在首次执行时进行初始化。</p>
+
+<p>为了在快速连续执行时实现良好的性能,驱动程序可能需要保留临时缓冲区或提高时钟频率。我们建议创建一个监控线程,以便在经过固定的一段时间后仍未创建任何新请求时释放这些资源。</p>
+
+<p>当应用使用完准备的模型时,框架会释放对 <code>IPreparedModel</code> 对象的引用。过一会儿,<code>IPreparedModel</code> 对象将在创建它的驱动程序服务中被销毁。此时,在析构函数的实现中,可以重新获取模型专用的资源。</p>
+
+<h2 id="performance_characteristics">性能特性</h2>
+
+<p>为了确定如何将计算分配给可用的加速器,框架必须了解每个加速器的效率:加速器执行查询的速度以及加速器的能效。</p>
+
+<p>虽然可以通过在设备上运行示例工作负载来轻松测定性能,但耗电量较难测定。因此,对于加速器执行一些参考工作负载的速度和效率,在初始化时,驱动程序会提供标准化数据。</p>
+
+<p>这种方法并非万无一失。实际的运行时性能会受很多因素影响,比如数据类型、张量大小、运算符类型等等。</p>
+
+<p>在 Android 9 中,我们建议在确定驱动程序因应 <code>getCapabilities</code> 调用而必须返回的值<code>.</code>时,使用 MobileNets 量化数和 MobileNets 浮点数作为参考工作负载。应使用 MobileNets 浮点数模型来测定完整的 32 位浮点性能和放宽的 16 位浮点性能。</p>
+
+<p>谎报这些数据对驱动程序没有任何益处。这样做会导致框架无法做出理想的工作分配。在未来的版本中,这些数据可能需要由 VTS 进行验证。</p>
+
+<h2 id="cpu_usage">CPU 使用情况</h2>
+
+<p>驱动程序会使用 CPU 来设置计算。它们不应使用 CPU 来执行图计算,因为这可能会导致框架无法正确分配工作。驱动程序应仅向框架报告它无法处理的部分,并让框架处理其余部分。</p>
+
+<p>没有针对 CPU 的驱动程序。框架提供所有运算(OEM 运算除外)的基于 CPU 的实现。</p>
+
+<h2 id="testing">测试</h2>
+
+<p>Google 提供了一整套 VTS 测试。这些测试会试用每个 API,而且还会验证驱动程序支持的各个运算符是否都正常运行,并提供足够精确的结果。</p>
+
+<p>对于 Android 9,我们选择了以下临时精度要求:对于浮点数为 1e-5,对于量化数为差一。将来,我们希望根据对大量模型和实现的测试来制定更严格的精度要求。</p>
+
+<h2 id="security">安全</h2>
+
+<p>由于应用进程直接与驱动程序的进程通信,因此驱动程序代码必须验证所收到的调用的参数。此验证由 VTS 完成。有关验证代码,请参阅 <code>frameworks/ml/nn/include/ValidateHal.h</code>。</p>
+
+<p>此外,驱动程序应确保应用不会相互干扰,即使它们使用相同的加速器,也是如此。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/sensors/hal-interface.html b/zh-cn/devices/sensors/hal-interface.html
index 071cf32..994c55b 100644
--- a/zh-cn/devices/sensors/hal-interface.html
+++ b/zh-cn/devices/sensors/hal-interface.html
@@ -161,7 +161,7 @@
 <p><strong>flags</strong>:传感器的标记,用于定义传感器的报告模式以及传感器是否为唤醒传感器。例如,对于单次唤醒传感器,标记为 <code>flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP</code>。当前版本的 HAL 中未使用的标记位必须等于 0。</p>
 <p><strong>maxRange</strong>:传感器可报告的最大值,单位与已报告值单位相同。传感器必须能够报告 <code>[-maxRange; maxRange]</code> 范围内(未过载)的值。请注意,这意味着从常规意义上来说传感器的总范围是 <code>2*maxRange</code>。当传感器报告几条轴上的值时,该范围适用于每条轴。例如,“+/- 2g”加速度计会报告 <code>maxRange = 2*9.81 = 2g</code>。</p>
 <p><strong>resolution</strong>:传感器可测量出的最小差值。该字段通常基于 <code>maxRange</code> 和测量值的位数计算得出。</p>
-<p><strong>power</strong>:启用传感器的功耗成本,以毫安为单位。该字段值几乎始终大于底层传感器的相关数据表中报告的功耗。要了解详情,请参阅<a href="sensor-types.html#base_sensors_=_not_equal_to_physical_sensors">基础传感器不等于物理传感器</a>这篇文章;要详细了解如何测量传感器的功耗,请参阅<a href="power-use.html#power_measurement_process">功率测量过程</a>。如果传感器的功耗取决于设备是否正在移动,则 <code>power</code> 字段中报告的值是移动时的功耗。</p>
+<p><strong>power</strong>:启用传感器的功耗成本,以毫安为单位。该字段值几乎始终大于底层传感器的相关数据表中报告的功耗。要了解详情,请参阅<a href="sensor-types.html#base_sensors_=_not_equal_to_physical_sensors">基础传感器不等于物理传感器</a>这篇文章;要详细了解如何测量传感器的功耗,请参阅<a href="power-use.html#power_measurement_process">功耗测量过程</a>。如果传感器的功耗取决于设备是否正在移动,则 <code>power</code> 字段中报告的值是移动时的功耗。</p>
 <p><strong>minDelay</strong>:对于连续传感器,指对应于传感器支持的最快速率的采样周期(以微秒为单位)。要详细了解该值是如何使用的,请参阅 <a href="#sampling_period_ns">sampling_period_ns</a>。请注意,<code>minDelay</code> 以微秒为单位,而 <code>sampling_period_ns</code> 以纳秒为单位。对于变化和特殊报告模式传感器,除非另行指定,否则 <code>minDelay</code> 必须为 0。对于单次传感器,该值必须为 -1。</p>
 <p><strong>maxDelay</strong>:对于连续和变化模式传感器,指对应于传感器支持的最慢速率的采样周期(以微秒为单位)。要详细了解该值是如何使用的,请参阅 <a href="#sampling_period_ns">sampling_period_ns</a>。请注意,<code>maxDelay</code> 以微秒为单位,而 <code>sampling_period_ns</code> 以纳秒为单位。对于特殊和单次传感器,<code>maxDelay</code> 必须为 0。</p>
 <p><strong>fifoReservedEventCount</strong>:在硬件 FIFO 中为该传感器保留的事件数。如果该传感器具有专属的 FIFO,则 <code>fifoReservedEventCount</code> 是该专属 FIFO 的大小。如果该传感器与其他传感器共用 FIFO,则 <code>fifoReservedEventCount</code> 是为该传感器保留的 FIFO 部分的大小。对于大多数共享 FIFO 的系统以及没有硬件 FIFO 的系统,该值为 0。</p>
diff --git a/zh-cn/devices/sensors/sensor-types.html b/zh-cn/devices/sensors/sensor-types.html
index 82115e5..5845e43 100644
--- a/zh-cn/devices/sensors/sensor-types.html
+++ b/zh-cn/devices/sensors/sensor-types.html
@@ -196,7 +196,7 @@
   </tr>
   <tr>
     <td><a href="#glance_gesture">快览手势传感器</a> <img src="images/battery_icon.png" width="20" height="20" alt="低功耗传感器"/><p></p></td>
-    <td><p>交互类</p></td>
+    <td><p>互动类</p></td>
     <td><p>未定义</p></td>
     <td><p>单次模式</p></td>
   </tr>
@@ -232,14 +232,14 @@
   </tr>
   <tr>
     <td><p><a href="#pick_up_gesture">拿起手势传感器</a> <img src="images/battery_icon.png" width="20" height="20" alt="低功耗传感器"/></p></td>
-    <td><p>交互类</p></td>
+    <td><p>互动类</p></td>
     <td><p>未定义</p></td>
     <td><p>单次模式</p></td>
   </tr>
   <tr>
     <td><p><a href="#rotation_vector">旋转矢量传感器</a></p></td>
     <td><p>姿势类</p></td>
-    <td><p>加速度计、磁力计和“陀螺仪”(如有)<em></em></p></td>
+    <td><p>加速度计、磁力计和(如有)陀螺仪<em></em></p></td>
     <td><p>连续模式</p></td>
   </tr>
   <tr>
@@ -257,17 +257,17 @@
   <tr>
     <td><p><a href="#step_detector">步测器</a> <img src="images/battery_icon.png" width="20" height="20" alt="低功耗传感器"/></p></td> <td><p>运动类</p></td>
     <td><p>加速度计</p></td>
-    <td><p>特别</p></td>
+    <td><p>特殊模式</p></td>
   </tr>
   <tr>
     <td><p><a href="#tilt_detector">倾斜检测器</a> <img src="images/battery_icon.png" width="20" height="20" alt="低功耗传感器"/></p></td>
     <td><p>运动类</p></td>
     <td><p>加速度计</p></td>
-    <td><p>特别</p></td>
+    <td><p>特殊模式</p></td>
   </tr>
   <tr>
     <td><p><a href="#wake_up_gesture">唤醒手势传感器</a> <img src="images/battery_icon.png" width="20" height="20" alt="低功耗传感器"/></p></td>
-    <td><p>交互类</p></td>
+    <td><p>互动类</p></td>
     <td><p>未定义</p></td>
     <td><p>单次模式</p></td>
   </tr>
diff --git a/zh-cn/devices/storage/adoptable.html b/zh-cn/devices/storage/adoptable.html
index 077b207..d820da1 100644
--- a/zh-cn/devices/storage/adoptable.html
+++ b/zh-cn/devices/storage/adoptable.html
@@ -29,7 +29,7 @@
 
 <p>当合并外部存储媒介时,系统将对其进行格式化和加密处理,以便一次只在一台 Android 设备上使用。由于该媒介与合并它的 Android 设备紧密关联,因此可以安全地为所有用户存储应用和私密数据。</p>
 
-<p>当用户将新的存储媒介(如 SD卡)插入到可合并的位置时,Android 会询问他们想要如何使用该媒介。他们可以选择合并该媒介,这样的话,系统会对该媒介进行格式化和加密处理,或者也可以继续按原样将其用于简单的文件存储。如果他们选择合并媒介,平台会询问是否将主要共享存储内容(通常装载在 <code>/sdcard</code> 上)迁移到新合并的媒介上,从而腾出宝贵的内部存储空间。不同于因使用 <a href="https://en.wikipedia.org/wiki/Master_boot_record" class="external">MBR</a> 而限制为 2TB 的传统存储设备,可合并的存储设备使用 <a href="https://en.wikipedia.org/wiki/GUID_Partition_Table" class="external">GPT</a>,因而文件存储限制约为 9ZB。</p>
+<p>当用户将新的存储媒介(如 SD卡)插入到可合并的位置时,Android 会询问他们想要如何使用该媒介。他们可以选择合并该媒介,这样的话,系统会对该媒介进行格式化和加密处理,或者也可以继续按原样将其用于简单的文件存储。如果他们选择合并媒介,平台会询问是否将主要共享存储内容(通常装载在 <code>/sdcard</code> 上)迁移到新合并的媒介上,从而腾出宝贵的内部存储空间。不同于因使用 <a href="https://en.wikipedia.org/wiki/Master_boot_record" class="external">MBR</a> 而限制为 2TB 的传统存储设备,可合并的存储设备使用 <a href="https://en.wikipedia.org/wiki/GUID_Partition_Table" class="external">GPT</a>,因而文件存储空间上限约为 9ZB。</p>
 
 <p>只有当开发者通过 <code>android:installLocation</code> 属性指示提供支持时,才能将应用放置在合并的存储媒介上。新安装的受支持的应用将自动放置在具有最多可用空间的存储设备上,用户可以在“设置”应用中在存储设备之间移动支持的应用。<em></em>移动到已合并媒介的应用在媒介弹出时被记住,并在重新插入媒介时返回弹出前的状态。</p>
 
@@ -63,7 +63,7 @@
 
 <h3 id="fixing-double-encryption">修正双重加密</h3>
 
-<p>在 Android 8.x 及更低版本中,可合并的存储设备不支持 FBE。带有可合并的存储设备的所有现有设备都使用<a href="/security/encryption/full-disk">全盘加密</a> (FDE)。在 Android 9 中,可合并的存储设备支持 FBE,并使用<a href="/security/encryption/metadata">元数据加密</a>进行加密。但在默认情况下,文件内容已进行双重加密,因为可合并的存储设备具有 FDE 和 FBE 层。默认情况下,这两个层都会加密文件内容,这会降低设备性能。要解决双重加密问题并提高设备性能,请执行以下操作:
+<p>在 Android 8.x 及更低版本中,可合并的存储设备不支持 FBE。带有可合并的存储设备的所有现有设备都使用<a href="/security/encryption/full-disk">全盘加密</a> (FDE)。在 Android 9 中,可合并的存储设备支持 FBE。但在默认情况下,文件内容已进行双重加密,因为可合并的存储设备具有 FDE 和 FBE 层。默认情况下,这两个层都会加密文件内容,这会降低设备性能。要解决双重加密问题并提高设备性能,请执行以下操作:
 </p>
 <ol>
   <li>将<a href="https://android-review.googlesource.com/q/REQ_NOENCRYPT" class="external">这些补丁程序</a>添加到内核中。</li>
diff --git a/zh-cn/devices/tech/admin/enterprise-telephony.html b/zh-cn/devices/tech/admin/enterprise-telephony.html
index b544466..28e7bab 100644
--- a/zh-cn/devices/tech/admin/enterprise-telephony.html
+++ b/zh-cn/devices/tech/admin/enterprise-telephony.html
@@ -40,8 +40,8 @@
 <p>
 例如:
 </p><ul>
-<li><strong>为工作联系人添加标记</strong>:请参阅 <code>packages/apps/ContactsCommon</code> f3eb5a207bfe0ff3b4ed2350ae5865ed8bc59798<em></em>
-</li><li><strong>跨资料搜索</strong>:请参阅 <code>packages/apps/ContactsCommon</code> cd0b29ddbf3648e48f048196c62245d545bc6122<em></em></li>
+<li><strong>为工作联系人添加标记</strong>:请参阅 <code>packages/apps/ContactsCommon</code> <em>f3eb5a207bfe0ff3b4ed2350ae5865ed8bc59798</em>
+</li><li><strong>跨资料搜索</strong>:请参阅 <code>packages/apps/ContactsCommon</code> <em>cd0b29ddbf3648e48f048196c62245d545bc6122</em></li>
 </ul>
 
 <h2 id="implementation">实现</h2>
@@ -58,7 +58,7 @@
 <h3 id="work-profile-contact-badging">工作资料联系人标记</h3>
 
 <p>
-工作资料联系人标记可通过检查 <code>ContactsContract.Directory.isEntepriseDirectoryId()</code>(如果可用)或通过 <code><a href="http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#isEnterpriseContactId(long)">isEnterpriseContactId</a></code> 来实现。
+工作资料联系人标记可通过检查 <code>ContactsContract.Directory.isEntepriseDirectoryId()</code>(如果可用)或通过使用 <code><a href="http://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#isEnterpriseContactId(long)">isEnterpriseContactId</a></code> 来实现。
 </p>
 
 <h3 id="managed-profile-aware-connectionservice">可感知受管理资料的连接服务</h3>
diff --git a/zh-cn/devices/tech/admin/implement.html b/zh-cn/devices/tech/admin/implement.html
index 729be7d..3e90220 100644
--- a/zh-cn/devices/tech/admin/implement.html
+++ b/zh-cn/devices/tech/admin/implement.html
@@ -75,17 +75,34 @@
 <p>要确认这些 <code>uses-feature</code> 值已在设备上进行了定义,请运行:<code>adb shell pm list features</code>。</p>
 
 <h3 id="required_apps">仅限基本应用</h3>
-<p>默认情况下,在配置托管设备时,只能启用资料正确运行所必需的应用。原始设备制造商 (OEM) 必须通过修改以下文件确保托管资料或设备具有所有必需的应用:</p>
+<p>默认情况下,在配置托管设备时,只能启用资料正确运行所必需的应用。OEM 必须通过修改以下文件确保受管理资料或设备具有所有必需的应用:</p>
 
 <pre class="devsite-click-to-copy">
 vendor_required_apps_managed_profile.xml
 vendor_required_apps_managed_device.xml
+vendor_disallowed_apps_managed_profile.xml
+vendor_disallowed_apps_managed_device.xml
+/*
+ * The following are for Android 9 and higher only
+ */
+vendor_required_apps_managed_user.xml
+vendor_disallowed_apps_managed_user.xml
 </pre>
 
+<p>
+受管理用户需要的应用和不允许的应用将应用于通过 <code>DevicePolicyManager#createAndManageUser</code> 创建的次要用户。
+</p>
+
 <p>Nexus 设备的示例:</p>
 
+<p>Android 8.x 及更低版本</p>
 <pre class="devsite-click-to-copy">
-packages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_device.xml
+pacakages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_device.xml
+</pre>
+
+<p>Android 9 及更高版本</p>
+<pre class="devsite-click-to-copy">
+frameworks/base/core/res/res/values/vendor_required_apps_managed_device.xml
 </pre>
 
 <pre class="devsite-click-to-copy">
@@ -102,10 +119,16 @@
 &lt;/resources&gt;
 </pre>
 
+<p>Android 8.x 及更低版本</p>
 <pre class="devsite-click-to-copy">
 packages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_profile.xml
 </pre>
 
+<p>Android 9 及更高版本</p>
+<pre class="devsite-click-to-copy">
+frameworks/base/core/res/res/values/vendor_required_apps_managed_profile.xml
+</pre>
+
 <pre class="devsite-click-to-copy">
 &lt;resources&gt;
     &lt;!-- A list of apps to be retained in the managed profile. This includes any Google experience apps required. --&gt;
diff --git a/zh-cn/devices/tech/admin/managed-profiles.html b/zh-cn/devices/tech/admin/managed-profiles.html
index 57ae3c4..f78ab43 100644
--- a/zh-cn/devices/tech/admin/managed-profiles.html
+++ b/zh-cn/devices/tech/admin/managed-profiles.html
@@ -20,9 +20,9 @@
       limitations under the License.
   -->
 
-<p>“受管理资料”或“工作资料”是指在管理方式和视觉外观方面具有额外特殊属性的 Android <a href="multi-user.html">用户</a>。<em></em><em></em></p>
+<p><em></em><em></em>受管理资料或工作资料是指在管理方式和视觉外观方面具有额外特殊属性的 Android <a href="/devices/tech/admin/multi-user.html">用户</a>。</p>
 
-<p>受管理资料的主要目的是为受管理的数据(如企业数据)创建一个隔离且安全的存储空间。资料管理员可以全权控制数据的范围、入口、出口及其有效期。这些政策可以赋予极高的权限,因此需由受管理资料(而非设备管理员)负责执行。</p>
+<p>受管理资料的主要目的是为受管理数据(如企业数据)创建一个隔离的安全存储空间。资料管理员可以全权控制数据的范围、入口、出口及其有效期。这些政策可以赋予极高的权限,因此需由受管理资料(而非设备管理员)负责执行。</p>
 
 <ul>
   <li><strong>创建</strong>:受管理资料可由主用户中的任何应用创建。用户在创建之前会收到受管理资料行为和政策执行的通知。</li>
@@ -40,7 +40,9 @@
 
 <h3 id="accounts">帐号</h3>
 
-<p>受管理资料中的帐号与主用户截然不同。这些帐号无法跨越资料-用户边界访问凭据。只有在各自环境中的应用才能访问其各自的帐号。</p>
+<p>
+受管理资料中的帐号与主用户截然不同。这些帐号无法跨越资料-用户边界来获取凭据。只有在各自环境中的应用才能访问其各自的帐号。
+</p>
 
 <h3 id="intents">Intent</h3>
 
@@ -50,13 +52,15 @@
 
 <p>在通常情况下,设置的执行范围限定到受管理资料,但锁定屏幕和加密设置除外,它们的范围依然是整个设备且会在主用户和受管理资料之间共享。在其他情况下,资料所有者在受管理资料之外没有任何设备管理员权限。</p>
 
-<p>受管理资料按以下原则被实现为一种新的次要用户:</p>
+<p>
+受管理资料会实现为一种新的次要用户,以达到以下目的:
+</p>
 
 <pre class="devsite-click-to-copy">
 uid = 100000 * userid + appid
 </pre>
 
-<p>与常规用户一样,它们具有独立的应用数据:</p>
+<p>与常规用户一样,它们具有单独的应用数据:</p>
 
 <pre class="devsite-click-to-copy">
 /data/user/&lt;userid&gt;
@@ -115,4 +119,152 @@
 
 <p>Android 5.0 及更高版本大幅改进了 DevicePolicyManager,其中包含数十个新的 API,可同时支持企业所有和自带设备 (BYOD) 的管理用例。示例包括应用限制、证书静默安装和跨资料共享 intent 访问控制。可以从示例 Device Policy Client (DPC) 应用 <a href="https://developer.android.com/samples/BasicManagedProfile/index.html" class="external">BasicManagedProfile.apk</a> 着手使用。有关详情,请参阅<a href="https://developer.android.com/training/enterprise/work-policy-ctrl.html" class="external">构建工作政策控制器</a>。</p>
 
+<h2 id="user-experience">受管理资料用户体验</h2>
+
+  <p>
+Android 9 在受管理资料和平台之间建立了更紧密的集成,使用户可以在其设备上更轻松地将工作信息和个人信息隔离开来。这些受管理资料用户体验变化会体现在启动器中。通过实现这些变化,可在受管理设备间打造一致的用户体验。
+  </p>
+
+  <h3 id="ux-changes-app-try">具有应用托盘的设备上的用户体验变化</h3>
+
+    <p>
+Android 9 中 Launcher 3 的受管理资料用户体验变化有助于用户维护单独的个人资料和受管理资料。应用抽屉提供了一个标签式视图,用于区分个人资料应用。当用户首次查看受管理资料标签时,系统会显示一个指导视图,以协助用户浏览受管理资料。用户还可以使用启动器工作标签中的切换开关来开启和关闭受管理资料。
+    </p>
+
+    <h4 id="tabbed-profile-views">标签式资料视图</h4>
+
+      <p>
+在 Android 9 中,用户可以通过受管理资料在应用抽屉中的个人应用列表和受管理应用列表之间切换。受管理资料处于启用状态时,应用视图会分成两个由 <a href="https://developer.android.com/reference/android/support/v4/view/ViewPager.html" class="external"><code>ViewPager</code></a> 管理的不同 <a href="https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html" class="external"><code>RecyclerViews</code></a>。用户可以使用应用抽屉顶部的资料标签在不同资料的应用视图之间切换。<code>PersonalWorkSlidingTabStrip</code> 类提供标签式资料指示器的参考实现。标签式视图作为 Launcher3 类 <a href="https://android.googlesource.com/platform/packages/apps/Launcher3/+/master/src/com/android/launcher3/allapps/AllAppsContainerView.java" class="external"><code>AllAppsContainerView</code></a> 的一部分实现。
+      </p>
+
+      <table>
+        <tbody><tr>
+          <td width="50%">
+            <img src="/devices/tech/admin/images/Work-profile0.png" width alt="个人标签视图" title="image_tooltip"/>
+          </td>
+          <td width="50%">
+            <img src="/devices/tech/admin/images/Work-profile1.png" width alt="受管理资料切换开关" title="image_tooltip"/>
+          </td>
+        </tr>
+        <tr>
+          <td><strong>图 1.</strong> 个人标签视图</td>
+          <td><strong>图 2.</strong> 屏幕底部带有受管理资料切换开关的工作标签视图
+          </td>
+        </tr>
+      </tbody></table>
+
+    <h4 id="educational-view">指导视图</h4>
+
+      <p>
+当用户首次打开工作标签时,Launcher3 还提供在屏幕底部显示指导视图(如<strong>图 3</strong> 所示)的选项。您可以通过指导视图向用户介绍工作标签的用途,以及如何使工作应用更易于访问。
+      </p>
+
+      <p>
+指导视图在 Android 9 及更高版本中由 <code>BottomUserEducationView</code> 类定义,相应布局由 <code>work_tab_tottom_user_education_view.xml</code> 控制。在 <code>BottomUserEducationView</code> 中,<code>KEY_SHOWED_BOTTOM_USER_EDUCATION</code> 布尔值默认设为 <code>false</code>。当用户关闭指导视图时,该布尔值将设为 <code>true</code>。
+      </p>
+
+      <p>
+        <img src="/devices/tech/admin/images/Work-profile2.png" width="50%" alt="指导视图" title="image_tooltip"/>
+        </p><p class="img-caption">
+          <strong>图 3.</strong> 工作标签中的指导视图
+        </p>
+      <p></p>
+
+    <h4 id="toggle-to-enable-disable">
+在启用/停用受管理资料之间切换
+    </h4>
+
+      <p>
+在工作标签中,受管理设备管理员可以在页脚视图中显示切换开关,以便用户启用或停用受管理资料,如上面的<strong>图 2</strong> 所示。从 Android 9 开始,切换开关的源代码可以在 <code>WorkFooterContainer</code> 中找到。受管理资料的启用和停用是异步完成的,并且会应用于所有有效的用户资料。在 Android 9 中,此过程由 <code>WorkModeSwitch</code> 类控制。
+      </p>
+
+  <h3 id="ux-changes-without-an-app-tray">
+没有应用托盘的设备上的用户体验变化
+  </h3>
+
+    <p>
+对于没有应用托盘的启动器,建议继续将受管理资料应用的快捷方式放置在工作文件夹中。
+    </p>
+
+    <p>
+如果工作文件夹无法正确填充,并且新安装的应用未添加到该文件夹,请在 <a href="https://android.googlesource.com/platform/packages/apps/Launcher3/+/master/src/com/android/launcher3/util/ManagedProfileHeuristic.java" class="external"><code>ManagedProfileHeuristic</code></a> 类中的 <code>onAllAppsLoaded</code> 方法内应用以下更改:
+    </p>
+
+<pre class="prettyprint">for (LauncherActivityInfo app : apps) {
+        // Queue all items which should go in the work folder.
+        if (app.getFirstInstallTime() &lt; Long.MAX_VALUE) {
+                InstallShortcutReceiver.queueActivityInfo(app, context);
+        }
+}</pre>
+
+  <h3 id="validating-ux-changes">验证用户体验变化</h3>
+
+    <p>
+请使用 TestDPC 应用测试受管理资料用户体验实现。
+    </p>
+
+    <ol>
+      <li>从 Google Play 商店安装 <a href="https://play.google.com/store/apps/details?id=com.afwsamples.testdpc" class="external">TestDPC</a> 应用。
+      </li>
+      <li>打开启动器或应用抽屉,然后选择<strong>设置 TestDPC</strong> 图标。
+      </li>
+      <li>按照屏幕上的说明设置受管理资料。</li>
+      <li>打开启动器或应用抽屉,并验证其中是否有工作标签。
+      </li>
+      <li>验证工作标签下是否有受管理资料页脚。
+      </li>
+      <li>验证是否可以开启和关闭受管理资料开关。受管理资料应相应地启用和停用。
+      </li>
+    </ol>
+
+    <table>
+      <tbody><tr>
+        <td width="33%">
+          <img src="/devices/tech/admin/images/Work-profile3.png" width alt="TestDPC 资料设置" title="image_tooltip"/>
+        </td>
+        <td width="33%">
+          <img src="/devices/tech/admin/images/Work-profile4.png" width alt="TestDPC 添加帐号" title="image_tooltip"/>
+        </td>
+        <td width="33%">
+          <img src="/devices/tech/admin/images/Work-profile5.png" width alt="TestDPC 设置完成" title="image_tooltip"/>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <strong>图 4.</strong> 在<strong>设置 TestDPC</strong> 中设置受管理资料
+        </td>
+        <td>
+          <strong>图 5.</strong> 在<strong>设置 TestDPC</strong> 中添加帐号
+        </td>
+        <td>
+          <strong>图 6.</strong> 设置完成
+        </td>
+      </tr>
+    </tbody></table>
+
+    <table>
+      <tbody><tr>
+        <td width="50%">
+          <img src="/devices/tech/admin/images/Work-profile6.png" width alt="应用抽屉工作标签切换开关处于开启状态" title="image_tooltip"/>
+        </td>
+        <td width="50%">
+          <img src="/devices/tech/admin/images/Work-profile7.png" width alt="应用抽屉工作标签切换开关处于关闭状态" title="image_tooltip"/>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <strong>图 7.</strong> 带有工作标签的应用抽屉。受管理资料页脚开关处于<strong>开启</strong>状态,相应受管理资料已启用。
+        </td>
+        <td>
+          <strong>图 8.</strong> 带有工作标签的应用抽屉。受管理资料页脚开关处于<strong>关闭</strong>状态,相应受管理资料已停用。
+        </td>
+      </tr>
+    </tbody></table>
+
+  <h3 id="managed-profile-app-badge">受管理资料应用徽章</h3>
+
+  <p>
+为确保无障碍性,Android 9 中工作徽章的颜色从橙色改成了蓝色 (#1A73E8)。
+  </p>
+
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/admin/ota-updates.html b/zh-cn/devices/tech/admin/ota-updates.html
index b1dbf81..8226555 100644
--- a/zh-cn/devices/tech/admin/ota-updates.html
+++ b/zh-cn/devices/tech/admin/ota-updates.html
@@ -24,13 +24,22 @@
 <a href="https://source.android.com/compatibility/android-cdd#11_updatable_software">Android 兼容性定义文档 (CDD) 可更新软件</a>要求设备实现 <a href="https://developer.android.com/reference/android/app/admin/SystemUpdatePolicy.html" class="external"><code>SystemUpdatePolicy</code></a> 类。<code>SystemUpdatePolicy</code> 可让设备所有者 (DO) 应用(如果存在)控制系统更新的安装。
     </p>
 
-    <p>
-Android 9 允许设备所有者推迟无线 (OTA) 更新最多 90 天,增强了设备所有者控制更新的能力。此功能专注于企业所有、单一用途 (COSU) 解决方案,可让所有者在重要时段(如节假日)暂停在设备上运行的操作系统版本。
-    </p>
+    <h2 id="notify-do">通知设备所有者</h2>
+
+      <p>
+无线下载 (OTA) 客户端必须使用系统 API 将传入的 OTA 更新通知给设备所有者应用。OTA 客户端还必须包含时间戳,记录何时 OTA 更新开始可用。OTA 客户端可以通过调用 <code>DevicePolicyManager.notifyPendingSystemUpdate(long updateReceivedTime, boolean isSecurityPatch)</code> 通知设备所有者应用。如果 OTA 客户端不知道更新是否为安全补丁程序,则可回退至使用 <code>DevicePolicyManager.notifyPendingSystemUpdate(long updateReceivedTime)</code>。
+      </p>
+
+      <p>
+如果当前没有可用的更新,OTA 客户端可通过将 <code>updateReceivedTime</code> 参数设置为 <code>-1</code> 来报告此情况。我们建议每当 OTA 客户端对 OTA 服务器进行轮询或向客户端推送 OTA 时都发送通知。您还可以在更多的时间节点发送通知。
+      </p>
 
     <h2 id="system-update-policy">系统更新政策</h2>
 
       <p>
+Android 9 允许设备所有者将 OTA 更新最多推迟 90 天,增强了设备所有者<a href="https://developer.android.com/work/dpc/system-updates">控制更新</a>的能力。此功能主要适用于专用设备(之前称为 COSU)解决方案,可让所有者在重要时段(如节假日)暂停在设备上运行的操作系统版本。
+      </p>
+      <p>
 为遵守 CDD 的要求,OTA 客户端必须实施行为政策。DO 可以设置下列政策,设备系统更新子系统必须遵守这些政策:</p>
 
       <ul>
@@ -45,12 +54,16 @@
         </li>
       </ul>
 
+      <p>
+设备所有者还可以通过<a href="https://developer.android.com/work/dpc/system-updates#freeze-periods">设置冻结时段</a>(在 Android 9 或更高版本中),在重要时段(如节假日或其他繁忙时段)冻结操作系统版本。系统在冻结时段不会安装 OTA 更新。我们建议使用 <code>SystemUpdatePolicy.InstallationOption</code>(请参见下一节);不过,OTA 客户端还可以通过调用 <a href="https://developer.android.com/reference/android/app/admin/SystemUpdatePolicy#getFreezePeriods()"><code>SystemUpdatePolicy.getFreezePeriods()</code></a> 了解设备是否处于冻结时段。
+      </p>
+
     <h2 id="implementing-installation-options">
 实现安装选项</h2>
 
       <p>
 Android 9 引入了专为系统更新客户端设计的 @SystemApi <code>SystemUpdatePolicy.InstallationOption</code>。
-        <code>SystemUpdatePolicy.InstallationOption</code> 会充当政策的封装容器类。根据当前系统更新政策,某个安装选项会告知客户端如何针对传入的系统更新执行操作,以及相应操作的有效时长。安装选项可以是下列项之一:</p>
+        <code>SystemUpdatePolicy.InstallationOption</code> 充当政策和冻结时段的封装容器类。根据当前系统更新政策或任何可能设定的冻结时段,安装选项会告知客户端如何针对传入的系统更新执行操作,以及相应操作的有效时长。安装选项可以是下列项之一:</p>
 
       <ul>
         <li>
@@ -65,7 +78,7 @@
       </ul>
 
       <p>
-系统更新客户端可以使用 <code>SystemUpdatePolicy.getInstallationOptionAt(long <var>when</var>)</code> 查询 <code>SystemUpdatePolicy.InstallationOption</code>,其中“when”表示查询安装选项的时间(从公元纪年开始计算的毫秒数)。<var></var>系统更新客户端可以使用 <code>SystemUpdatePolicy.getInstallationOptionAt(long <var>when</var>)</code> 方法,在有效时间结束前针对返回的选项执行操作。在返回的选项失效后,客户端可以使用新的时间戳为最近的选项执行另一次查询。
+系统更新客户端可以查询 <code>SystemUpdatePolicy.InstallationOption</code>,方法是使用 <code>SystemUpdatePolicy.getInstallationOptionAt(long <var>when</var>)</code>,其中“when”表示查询安装选项的时间(从公元纪年开始计算的毫秒数)。<var></var>系统更新客户端可以使用 <code>SystemUpdatePolicy.getInstallationOptionAt(long <var>when</var>)</code> 方法,在有效时间结束前针对返回的选项执行操作。在返回的选项失效后,客户端可以使用新的时间戳为最近的选项执行另一次查询。
       </p>
 
     <p>
diff --git a/zh-cn/devices/tech/config/carrierid.html b/zh-cn/devices/tech/config/carrierid.html
new file mode 100644
index 0000000..699ec09
--- /dev/null
+++ b/zh-cn/devices/tech/config/carrierid.html
@@ -0,0 +1,41 @@
+<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.
+  -->
+
+    <p>
+运行 Android 9 及更高版本的设备可以识别订阅运营商信息,以提供相应 ID 和运营商名称。Android 维护着一个运营商 ID 数据库,该数据库采用针对每个运营商及其专属运营商 ID 的匹配规则。AOSP 在 <a href="https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/master/assets/carrier_list.textpb" class="external"><code>android/packages/providers/TelephonyProvider/assets/carrier_list.textpb</code></a> 文件中包含运营商 ID 数据库的内容。统一的数据库有助于最大限度地减少需要识别运营商的应用内的重复逻辑,并限制暴露可用于识别运营商的属性。
+    </p>
+
+    <p>
+为了更准确地识别更多运营商,Android 支持带外运营商 ID 表更新。每个更新版本都会有一个版本号,并会发布到 AOSP。
+    </p>
+
+    <h2 id="implementation">实现</h2>
+
+      <p>
+想要实现带外更新的用户可以从 AOSP 下载 <a href="https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/master/assets/carrier_list.pb" class="external"><code>carrier_list.pb</code></a> 二进制文件。要查看该表的可读懂格式,请参阅 <a href="https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/master/assets/carrier_list.textpb" class="external"><code>carrier_list.txtpb</code></a>。
+      </p>
+
+      <p>
+请将更新后的运营商 ID 表放到 <code>/data/misc/carrierid/</code> 数据分区中。如果更新后的版本高于安装的版本,设备会将该表保留到<a href="https://developer.android.com/reference/android/provider/Telephony.CarrierId" class="external">运营商 ID 数据库</a>中。公共 API <a href="https://developer.android.com/reference/android/telephony/TelephonyManager#getSimCarrierId()" class="external"><code>getSimCarrierId()</code></a> 和 <a href="https://developer.android.com/reference/android/telephony/TelephonyManager#getSimCarrierIdName()" class="external"><code>getSimCarrierIdName()</code></a> 将获取运营商 ID 数据库中的最新信息。
+      </p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/config/filesystem.html b/zh-cn/devices/tech/config/filesystem.html
index bcf1c50..f53bf50 100644
--- a/zh-cn/devices/tech/config/filesystem.html
+++ b/zh-cn/devices/tech/config/filesystem.html
@@ -189,7 +189,7 @@
 <h2 id="usage-examples">用法示例</h2>
 
 <p>
-  以下示例详细介绍了如何定义和使用 OEM AID,以及如何启用文件系统权能。OEM AID 名称 (<strong>[AID_</strong>name<strong></strong><em></em><strong>]</strong>) 必须以值“<strong>vendor_</strong>”开头,以确保它们不会与未来的 AOSP 名称发生冲突。
+  以下示例详细介绍了如何定义和使用 OEM AID,以及如何启用文件系统权能。OEM AID 名称 (<strong>[AID_</strong><em>name<strong></strong></em><strong>]</strong>) 必须以值“<strong>vendor_</strong>”开头,以确保它们不会与未来的 AOSP 名称发生冲突。
 </p>
 
 <h3 id="defining-oem-aid-name">定义 OEM AID 名称</h3>
diff --git a/zh-cn/devices/tech/connect/rtt.html b/zh-cn/devices/tech/connect/rtt.html
new file mode 100644
index 0000000..37e3331
--- /dev/null
+++ b/zh-cn/devices/tech/connect/rtt.html
@@ -0,0 +1,163 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="implementing_real_time_text" class="page-title">实现实时信息</h1>
+
+<p>本页介绍如何在 Android 9 中实现实时信息 (RTT)。RTT 这项功能面向失聪用户或听障用户提供,可替代文本电话 (TTY) 技术。借助此功能,设备可以使用同一电话号码进行语音通话和 RTT 通话,即时传输信息(信息是逐个字符输入的),支持拨打 911,并且向后兼容 TTY。</p>
+
+<p>在 RTT 通话中,来电者和接听者均能知晓自己正在进行 RTT 通话。建立连接后,双方都会进入 RTT 通话,此时信息输入和键盘将启用。信息在输入时将会显示,同时逐个字符发送。</p>
+
+<h2 id="examples_and_source">示例和源代码</h2>
+
+<p>AOSP 的 <a href="https://developer.android.com/reference/android/telecom/Call.RttCall">Call.RttCall</a> 和 <a href="https://developer.android.com/reference/android/telecom/Connection.RttTextStream">Connection.RttTextStream</a> 中提供框架组件。IMS/调制解调器组件是专有的,应由 IMS/调制解调器供应商提供。您还可以使用拨号器 RTT 的参考实现。</p>
+
+<p>RTT 的 AOSP 拨号器代码:</p>
+
+<ul>
+<li>通话中:<a href="https://android.googlesource.com/platform/packages/apps/Dialer/+/master/java/com/android/incallui/rtt">/java/com/android/incallui/rtt</a></li>
+<li>通话记录:<a href="https://android.googlesource.com/platform/packages/apps/Dialer/+/master/java/com/android/dialer/rtt">/java/com/android/dialer/rtt</a></li>
+</ul>
+
+<h2 id="implementation">实现</h2>
+
+<p>要实现 RTT,您应该与调制解调器/SoC 提供商合作,因为您需要用到支持 RTT 的调制解调器。您可以升级到 Android 9,也可以将一系列电话框架补丁程序向后移植到 Android 8.0 中。添加到 Android 8.0 AOSP 中的 API 将无法运行。</p>
+
+<p>此功能使用 AOSP 的 <code>android.telecom</code> 中的公共 API,以及 <code>android.telephony.ims</code> 中带 @SystemApis 标记的 API。所有界面都位于 <code>com.android.phone</code> 和 AOSP 拨号器中。</p>
+
+<p>要实现 RTT,请导入 AOSP 代码,并提供为 RTT 实现 IMS 端 @SystemApis 的 IMS 堆栈。这需要:</p>
+
+<ul>
+<li>通过 <code>ImsConfig#setProvisionedValue(RTT_SETTING_ENABLED)</code> 来开启/关闭 RTT</li>
+<li>通过 <code>ImsStreamMediaProfile#mRttMode</code> 来指示通话的 RTT 状态</li>
+<li><p>支持在 <code>ImsCallSession</code> 中使用以下方法:</p>
+
+<ul>
+<li><code>sendRttMessage</code></li>
+<li><code>sendRttModifyRequest</code></li>
+<li><code>sendRttModifyResponse</code></li>
+</ul></li>
+<li><p>支持在 <code>ImsCallSessionListener</code> 中调用以下方法:</p>
+
+<ul>
+<li><code>callSessionRttModifyRequestReceived</code></li>
+<li><code>callSessionRttModifyResponseReceived</code></li>
+<li><code>callSessionRttMessageReceived</code></li>
+</ul></li>
+</ul>
+
+<h2 id="customization">自定义</h2>
+
+<p>您可以启用或停用此功能,方法是使用 <code>packages/services/Telephony</code> 的设备配置叠加层中的设备配置 <code>config_support_rtt</code>,以及运营商配置文件中的运营商配置标记 <code>CarrierConfigManager.RTT_SUPPORTED_BOOL</code>。根据配置,该功能可通过“无障碍功能”设置提供,也可以不通过该设置提供。您可以使用设备配置来更改默认设置。默认情况下,该功能设置为关闭。</p>
+
+<h2 id="validation">验证</h2>
+
+<p>要验证 RTT 实现,请运行 CTS 测试,并执行拨号器 RTT 测试。</p>
+
+<h3 id="cts_testing">CTS 测试</h3>
+
+<p>CTS 测试 (<code>android.cts.telecom.RttOperationsTest</code>) 涵盖了实现的 AOSP 部分。对于实现的 IMS 堆栈部分,您必须提供自己的测试。</p>
+
+<h3 id="dialer_rtt_testing">拨号器 RTT 测试</h3>
+
+<table>
+<thead>
+<tr>
+<th><strong>场景说明</strong></th>
+<th><strong>界面模拟</strong></th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><p>如果设备停用 RTT,则会显示一条有关 RTT 的横幅。系统会显示“了解详情”选项,该选项会定向到 Google 帮助中心文章页面,其中含有关于 RTT 的更多信息。</p>
+<p>系统显示包含号召性内容的横幅。</p></td>
+<td><p><img src="/devices/tech/connect/images/rtt-banner.png" width="250px" alt="RTT 横幅"/></p>
+
+</td>
+</tr>
+<tr>
+<td>在拨号器设置中,“设置”&gt;“无障碍功能”下显示“实时信息”屏幕,其中提供了用于启用“RTT 模式”的选项。系统会显示介绍该模式的描述性文本:“在通话期间收发文本消息,而不是说和听”。</td>
+<td><p><img src="/devices/tech/connect/images/rtt-accessibility.png" width="250px" alt="RTT 无障碍"/></p>
+
+</td>
+</tr>
+<tr>
+<td>默认情况下 RTT 处于启用状态时,<br />
+<ul>
+<li>在拨打电话时,系统显示标准的通话中拨号界面。</li>
+<li>建立通话连接后,系统显示 RTT 模式视图。如果接听用户未默认进入 RTT 模式,则在用户等待响应时,系统将显示一条表明已请求 RTT 模式的横幅。</li>
+</ul>
+</td>
+<td><p><img src="/devices/tech/connect/images/rtt-in-call-ui.png" width="250px" alt="RTT 通话中界面"/></p>
+
+</td>
+</tr>
+<tr>
+<td>如果设备停用了 RTT:<br />
+<ul>
+<li>来电屏幕显示标准接听器和标准通话标签。</li>
+</ul>
+</td>
+<td><p><img src="/devices/tech/connect/images/rtt-standard-call-ui.png" width="250px" alt="RTT 标准通话界面"/></p>
+
+</td>
+</tr>
+<tr>
+<td>如果设备上启用了 RTT 并且 RTT 默认设置为以 RTT 形式接听所有通话:<br />
+<ul>
+<li>来电屏幕显示 RTT 接听器和相关的通话标签。</li>
+<li>如果用户接听电话,则系统会加载 RTT 模式视图,同时启用键盘。</li>
+</ul>
+</td>
+<td><p><img src="/devices/tech/connect/images/rtt-mode-view.png" width="250px" alt="RTT 模式视图"/></p>
+
+</td>
+</tr>
+<tr>
+<td>RTT 的通话中界面提供了多个选项,以允许用户控制语音通话的状态以及获得 RTT 用法方面的一般性帮助。<br />
+<ul>
+<li>开启和关闭麦克风。</li>
+<li>开启和关闭扬声器。</li>
+<li>将音频路由到外部音频设备(如果有)。</li>
+</ul>
+</td>
+<td><p><img src="/devices/tech/connect/images/rtt-in-call-ui-options.png" width="250px" alt="RTT 通话中界面相关选项"/></p>
+
+</td>
+</tr>
+<tr>
+<td>在“通话详情”屏幕中,将显示 RTT 对话记录中的一小段内容。<br />
+<ul>
+<li>内容片段的长度不超过一行。如果 RTT 会话没有任何对话内容,则系统会显示一则表明未存储任何内容的通知。</li>
+<li>内容片段包含表示 RTT 通话的 RTT 图标。</li>
+<li>选择“查看全部”链接可显示包含 RTT 会话全文的完整对话视图。系统将显示时间戳。用户可以使用“返回”按钮返回“通话详情”屏幕。</li>
+</ul>
+</td>
+<td><p><img src="/devices/tech/connect/images/rtt-call-details.png" width="250px" alt="RTT 通话详情"/></p>
+
+</td>
+</tr>
+</tbody>
+</table>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/connect/wifi-mac-randomization.html b/zh-cn/devices/tech/connect/wifi-mac-randomization.html
new file mode 100644
index 0000000..16817a3
--- /dev/null
+++ b/zh-cn/devices/tech/connect/wifi-mac-randomization.html
@@ -0,0 +1,83 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="privacy_mac_randomization" class="page-title">隐私:随机选择 MAC 地址</h1>
+
+<p>从 Android 8.0 开始,Android 设备在未连接到网络的情况下探测新网络时会使用随机 MAC 地址。</p>
+
+<p>在 Android 9 中,您可以启用开发者选项(默认处于<strong>停用</strong>状态),使设备在连接到 WLAN 网络时使用随机选择的 MAC 地址。系统会对每个 SSID 使用随机选择的 MAC 地址。</p>
+
+<p>随机选择 MAC 地址可防止监听器使用 MAC 地址来生成设备活动的历史记录,从而加强对用户隐私的保护。</p>
+
+<p>此外,随机选择 MAC 地址也是 <a href="/devices/tech/connect/wifi-aware">WLAN 感知</a>和 <a href="/devices/tech/connect/wifi-rtt">WLAN RTT</a> 操作的一部分。</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>要在设备上实现随机选择 MAC 地址,请执行以下操作:</p>
+
+<ol>
+<li><p>与 WLAN 芯片供应商合作实现 <code>IWifiStaIface.setMacAddress()</code> HAL 方法。</p>
+
+<ul>
+<li>AOSP 参考实现会关闭接口、更改 MAC 地址并备份接口。这种参考实现行为可能不适用于某些芯片供应商。
+</li>
+</ul></li>
+<li><p>在“设置”<code>config.xml</code> 中,将 <a href="https://android.googlesource.com/platform/packages/apps/Settings/+/master/res/values/config.xml#49"><code>config_wifi_support_connected_mac_randomization</code></a> 设置为 <strong>true</strong>(该步骤可在设备自定义叠层中完成)。</p>
+
+<ul>
+<li>此标记用于控制参考“设置”实现的开发者选项中是否显示“连接时随机选择 MAC 网址”切换开关。<em></em>如果设置为 <strong>true</strong>,则显示该切换开关;如果设置为 <strong>false</strong>,则不显示该切换开关。</li>
+</ul></li>
+<li><p>使用<a href="#validation">验证</a>中所述的方法测试实现。</p></li>
+</ol>
+
+<p>系统界面必须:</p>
+
+<ul>
+<li>在开发者菜单中有一项可启用或停用该功能的设置。</li>
+<li>如果启用了随机选择 MAC 地址功能,则在系统显示 WLAN 接口 MAC 地址时显示生成的随机 MAC 地址。</li>
+</ul>
+
+<p>使用设置界面的<a href="https://android.googlesource.com/platform/packages/apps/Settings/+/master/src/com/android/settings/development/">参考实现</a>来实现新提示。</p>
+
+<h2 id="validation">验证</h2>
+
+<p>要验证该功能是否如期正常运行,请同时运行集成测试 (ACTS) 和手动测试。</p>
+
+<p>要运行集成测试,请使用位于 <code>tools/test/connectivity/acts/tests/google/wifi</code> 中的 ACTS 文件 <code>WifiConnectedMacRandomizationTest.py</code>,验证设备是否使用随机选择的 MAC 地址,以及是否正确存储为每个网络随机选择的 MAC 地址。</p>
+
+<p>要运行手动测试,请执行以下操作:</p>
+
+<ol>
+<li>开启该功能并验证设备是否能够连接到 WLAN 网络。</li>
+<li>验证 WLAN 设置中显示的 MAC 地址是否与设备正在使用的 MAC 地址(通过 ifconfig 确定)相符。</li>
+<li>执行数据包捕获来验证设备是否使用随机选择的 MAC 地址(而非出厂 MAC 地址)。</li>
+<li>检查设备是否会在连接到同一网络时使用同一 MAC 地址,验证设备是否存储了基于网络随机选择的 MAC 地址。</li>
+<li>验证忘记网络并重新连接到同一 SSID 后是否会生成新的随机 MAC 地址。</li>
+</ol>
+
+<p>在连接到网络时,您可能会遇到长达 3 秒的延迟,这是因为只要设置了新的 MAC 地址,系统就会清除扫描结果。在连接到网络并验证互联网连接时,也可能会出现其他延迟。</p>
+
+<p>如果 WLAN 驱动程序或固件未正确同步 MAC 地址状态与主机内核,则互联网连接检查将会失败。如果出现这种情况,请咨询您的芯片合作伙伴,确保驱动程序或固件已根据新的 MAC 地址进行了相应更新。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/connect/wifi-passpoint.html b/zh-cn/devices/tech/connect/wifi-passpoint.html
new file mode 100644
index 0000000..1247d85
--- /dev/null
+++ b/zh-cn/devices/tech/connect/wifi-passpoint.html
@@ -0,0 +1,188 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="passpoint_r1" class="page-title">Passpoint R1</h1>
+
+<p>自从 Android 6.0 支持从网络下载包含配置文件和凭据信息的特殊文件来配置 Passpoint R1(第 1 版)凭据,Android 就一直支持 Passpoint R1。客户端会自动启动用于 WLAN 信息的特殊安装程序,并允许用户先查看各部分信息,然后再决定接受或拒绝内容。</p>
+
+<p>文件中包含的配置文件信息用于与从已启用 Passpoint R1 的接入点检索到的数据进行匹配,并且系统会自动将凭据应用于任何匹配的网络。</p>
+
+<p>Android 参考实现支持 EAP-TTLS、EAP-TLS、EAP-SIM、EAP-AKA 和 EAP-AKA'。</p>
+
+<h2 id="download_mechanism">下载机制</h2>
+
+<p>wifi-config 文件必须托管在网络服务器上,而且应使用 TLS (HTTPS) 进行保护,因为其中可能包含明文密码或私钥数据。内容由经过封装的多部分 MIME 文本(以 UTF-8 表示)组成,并按照 RFC-2045 第 6.8 节所述以 base64 编码形式进行编码。</p>
+
+<p>客户端使用以下 HTTP 标头字段在设备上自动启动 WLAN 安装程序:</p>
+
+<ul>
+<li><code>Content-Type</code> 必须设置为 <code>application/x-wifi-config</code></li>
+<li><code>Content-Transfer-Encoding</code> 必须设置为 <code>base64</code></li>
+<li>不得设置 <code>Content-Disposition</code></li>
+</ul>
+
+<p>用于检索文件的 HTTP 方法必须为 GET。只要浏览器中的 HTTP GET 收到包含以上 MIME 标头的响应,系统就会启动安装应用。必须通过点按按钮(不支持指向下载网址的自动重定向)等 HTML 元素来触发下载。此行为仅适用于 Google Chrome;其他网络浏览器不一定会提供类似功能。</p>
+
+<h2 id="file_composition">文件组成</h2>
+
+<p>以 base64 编码的内容必须由 <code>Content-Type</code> 为 <code>multipart/mixed</code> 的 MIME 多部分内容组成。以下部分构成了多部分内容的各个部分:</p>
+
+<table>
+<thead>
+<tr>
+<th><strong>部分</strong></th>
+<th><strong>内容类型(较少引用)</strong></th>
+<th><strong>是否必需</strong></th>
+<th><strong>说明</strong></th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>配置文件</td>
+<td><code>
+application/x-passpoint-profile
+</code>
+
+</td>
+<td>始终必需</td>
+<td>采用 OMA-DM SyncML 格式的负载,包含用于 <code>HomeSP</code> 和 <code>Credential</code> 且采用 Passpoint R1 <code>PerProviderSubscription</code> 格式的 MO。</td>
+</tr>
+<tr>
+<td>信任证书</td>
+<td><code>
+application/x-x509-ca-cert
+</code>
+
+</td>
+<td>可选(针对 EAP-TLS 和 EAP-TTLS)</td>
+<td>一个以 base64 编码的 X.509v3 证书负载。</td>
+</tr>
+<tr>
+<td>EAP-TLS 密钥</td>
+<td><code>
+application/x-pkcs12
+</code>
+
+</td>
+<td>必需(针对 EAP-TLS)</td>
+<td>以 base64 编码的 PKCS #12 ASN.1 结构,包含一个客户端证书链,其中至少具有客户端证书和关联私钥。PKCS 12 容器以及私钥和证书必须都是明文,没有密码。</td>
+</tr>
+</tbody>
+</table>
+
+<p>“配置文件”部分必须以 base64 编码、UTF-8 编码的 XML 文本形式进行传输,这些文本会指定 Passpoint R2 技术规范版本 1.0.0 第 9.1 节中 <code>HomeSP</code> 和 <code>Credential</code> 子树的部分。</p>
+<aside class="note"><strong>注意</strong>:<span>Android 中用于 Passpoint R1 的配置文件 XML 格式借用了 Passpoint R2 格式,但不一定符合 R2 标准。这是一种设计上的选择,并非 Passpoint R1 的要求。</span></aside>
+<p>顶级节点必须是 <code>MgmtTree</code>,而直接子节点必须是 <code>PerProviderSubscription</code>。下面的附录中显示了一个示例 XML 文件。</p>
+
+<p>以下子树节点在 <code>HomeSP</code> 下使用:</p>
+
+<ul>
+<li><code>FriendlyName</code>:必须设置;用作显示文本</li>
+<li><code>FQDN</code>:必需</li>
+<li><code>RoamingConsortiumOI</code></li>
+</ul>
+
+<p>以下子树节点在 <code>Credential</code> 下使用:</p>
+
+<ul>
+<li><code>Realm</code>:必须为非空字符串</li>
+<li><p><code>UsernamePassword</code>:对于具有以下节点集的 EAP-TTLS 是必需的:</p>
+
+<ul>
+<li><code>Username</code></li>
+<li><code>Password</code></li>
+<li><code>EAPMethod/EAPType</code>:必须设置为 <code>21</code></li>
+<li><code>EAPMethod/InnerMethod</code>:必须设置为 <code>PAP</code>、<code>CHAP</code>、<code>MS-CHAP</code> 或 <code>MS-CHAP-V2</code> 中的一个</li>
+</ul></li>
+<li><p><code>DigitalCertificate</code>:对于 EAP-TLS 是必需的。必须设置以下节点:</p>
+
+<ul>
+<li><code>CertificateType</code> 设置为 <code>x509v3</code></li>
+<li><code>CertSHA256Fingerprint</code> 设置为 EAP-TLS 密钥 MIME 部分中客户端证书的正确 SHA-256 摘要。</li>
+</ul></li>
+<li><p><code>SIM</code>:对于 EAP-SIM、EAP-AKA 和 EAP-AKA' 是必需的。<code>EAPType</code> 字段必须设置为适当的 EAP 类型,而 <code>IMSI</code> 必须与进行配置时设备中已安装的 SIM 卡之一的 IMSI 相匹配。IMSI 字符串可以完全由十进制数字组成以强制执行完全对等匹配,也可以包含零个或更多个十进制数字,后跟星号 (*) 以将 IMSI 匹配要求放宽为仅匹配前缀。例如,IMSI 字符串 123* 将匹配 IMSI 以 123 开头的任何 SIM 卡。</p></li>
+</ul>
+
+<h1 id="example_profile_oma_dm_xml" class="page-title">示例配置文件 OMA-DM XML</h1>
+<pre class="prettyprint lang-xml"><code>&lt;MgmtTree xmlns="syncml:dmddf1.2"&gt;
+  &lt;VerDTD&gt;1.2&lt;/VerDTD&gt;
+  &lt;Node&gt;
+    &lt;NodeName&gt;PerProviderSubscription&lt;/NodeName&gt;
+    &lt;RTProperties&gt;
+      &lt;Type&gt;
+        &lt;DDFName&gt;urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0&lt;/DDFName&gt;
+      &lt;/Type&gt;
+    &lt;/RTProperties&gt;
+    &lt;Node&gt;
+      &lt;NodeName&gt;i001&lt;/NodeName&gt;
+      &lt;Node&gt;
+        &lt;NodeName&gt;HomeSP&lt;/NodeName&gt;
+        &lt;Node&gt;
+          &lt;NodeName&gt;FriendlyName&lt;/NodeName&gt;
+          &lt;Value&gt;Century House&lt;/Value&gt;
+        &lt;/Node&gt;
+        &lt;Node&gt;
+          &lt;NodeName&gt;FQDN&lt;/NodeName&gt;
+          &lt;Value&gt;mi6.co.uk&lt;/Value&gt;
+        &lt;/Node&gt;
+        &lt;Node&gt;
+          &lt;NodeName&gt;RoamingConsortiumOI&lt;/NodeName&gt;
+          &lt;Value&gt;112233,445566&lt;/Value&gt;
+        &lt;/Node&gt;
+      &lt;/Node&gt;
+      &lt;Node&gt;
+        &lt;NodeName&gt;Credential&lt;/NodeName&gt;
+        &lt;Node&gt;
+          &lt;NodeName&gt;Realm&lt;/NodeName&gt;
+          &lt;Value&gt;shaken.stirred.com&lt;/Value&gt;
+        &lt;/Node&gt;
+        &lt;Node&gt;
+          &lt;NodeName&gt;UsernamePassword&lt;/NodeName&gt;
+          &lt;Node&gt;
+            &lt;NodeName&gt;Username&lt;/NodeName&gt;
+            &lt;Value&gt;james&lt;/Value&gt;
+          &lt;/Node&gt;
+          &lt;Node&gt;
+            &lt;NodeName&gt;Password&lt;/NodeName&gt;
+            &lt;Value&gt;Ym9uZDAwNw==&lt;/Value&gt;
+          &lt;/Node&gt;
+          &lt;Node&gt;
+            &lt;NodeName&gt;EAPMethod&lt;/NodeName&gt;
+            &lt;Node&gt;
+              &lt;NodeName&gt;EAPType&lt;/NodeName&gt;
+              &lt;Value&gt;21&lt;/Value&gt;
+            &lt;/Node&gt;
+            &lt;Node&gt;
+              &lt;NodeName&gt;InnerMethod&lt;/NodeName&gt;
+              &lt;Value&gt;MS-CHAP-V2&lt;/Value&gt;
+            &lt;/Node&gt;
+          &lt;/Node&gt;
+        &lt;/Node&gt;
+      &lt;/Node&gt;
+    &lt;/Node&gt;
+  &lt;/Node&gt;
+&lt;/MgmtTree&gt;
+</code></pre>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/dalvik/gc-debug.html b/zh-cn/devices/tech/dalvik/gc-debug.html
index 6d9861f..2ed7840 100644
--- a/zh-cn/devices/tech/dalvik/gc-debug.html
+++ b/zh-cn/devices/tech/dalvik/gc-debug.html
@@ -22,7 +22,7 @@
 
 <p>本文档介绍如何调试 Android 运行时 (ART) 垃圾回收 (GC) 的正确性和性能问题,并解释了如何使用 GC 验证选项、确定 GC 验证失败的解决方案,以及测量并解决 GC 性能问题。</p>
 
-<p>有关处理 ART 的说明,请参阅 <a href="index.html">ART 和 Dalvik</a>、<a href="dex-format.html">Dalvik 可执行格式</a>以及此 <a href="index.html">ART 和 Dalvik</a> 部分的其他页面。有关验证应用行为的其他帮助信息,请参阅<a href="http://developer.android.com/guide/practices/verifying-apps-art.html">在 Android 运行时 (ART) 上验证应用行为</a>。</p>
+<p>有关处理 ART 的说明,请参阅 <a href="index.html">ART 和 Dalvik</a>、<a href="dex-format.html">Dalvik 可执行文件格式</a>以及此 <a href="index.html">ART 和 Dalvik</a> 部分的其他页面。有关验证应用行为的其他帮助信息,请参阅<a href="http://developer.android.com/guide/practices/verifying-apps-art.html">在 Android Runtime (ART) 上验证应用行为</a>。</p>
 
 <h2 id="art_gc_overview">ART GC 概述</h2>
 
@@ -36,7 +36,8 @@
 
 <ul>
   <li>与 Dalvik 相比,暂停次数从 2 次减少到 1 次。Dalvik 的第一次暂停主要是为了进行根标记,即在 ART 中进行并发标记,让线程标记自己的根,然后马上恢复运行。
-  </li><li>与 Dalvik 类似,ART GC 在清除过程开始之前也会暂停 1 次。两者在这方面的主要差异在于:在此暂停期间,某些 Dalvik 环节在 ART 中并发进行。这些环节包括 <code>java.lang.ref.Reference</code> 处理、系统弱清除(例如,jni 弱全局等)、重新标记非线程根和卡片预清理。在 ART 暂停期间仍进行的阶段包括扫描脏卡片以及重新标记线程根,这些操作有助于缩短暂停时间。
+  </li><li>与 Dalvik 类似,ART GC 在清除过程开始之前也会暂停 1 次。
+两者在这方面的主要差异在于:在此暂停期间,某些 Dalvik 环节在 ART 中并发进行。这些环节包括 <code>java.lang.ref.Reference</code> 处理、系统弱清除(例如,jni 弱全局等)、重新标记非线程根和卡片预清理。在 ART 暂停期间仍进行的阶段包括扫描脏卡片以及重新标记线程根,这些操作有助于缩短暂停时间。
   </li><li>相对于 Dalvik,ART GC 改进的最后一个方面是粘性 CMS 回收器增加了 GC 吞吐量。不同于普通的分代 GC,粘性 CMS 不移动。系统会将年轻对象保存在一个分配堆栈(基本上是 <code>java.lang.Object</code> 数组)中,而非为其设置一个专属区域。这样可以避免移动所需的对象以维持低暂停次数,但缺点是容易在堆栈中加入大量复杂对象图像而使堆栈变长。
 </li></ul>
 
diff --git a/zh-cn/devices/tech/datausage/ebpf-traffic-monitor.html b/zh-cn/devices/tech/datausage/ebpf-traffic-monitor.html
new file mode 100644
index 0000000..dfec87f
--- /dev/null
+++ b/zh-cn/devices/tech/datausage/ebpf-traffic-monitor.html
@@ -0,0 +1,112 @@
+<html devsite><head>
+
+  <meta name="book_path" value="/_book.yaml"/>
+
+  <meta name="project_path" value="/_project.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.
+-->
+
+<h1 id="ebpf_traffic_monitoring" class="page-title">eBPF 流量监控</h1>
+
+<h2 id="introduction">简介</h2>
+
+<p>eBPF 网络流量工具可结合使用内核与用户空间实现来监控设备自上次启动以来的网络使用情况,而且还提供了一些额外的功能,例如套接字标记、分离前台/后台流量,以及可根据手机状态阻止应用访问网络的 per-UID 防火墙。从该工具收集的统计数据存储在称为 <code>eBPF maps</code> 的内核数据结构中,并且相应结果可供 <code>NetworkStatsService</code> 等服务用于提供自设备上次启动以来的持久流量统计数据。</p>
+
+<h2 id="examples-and-source">示例和源代码</h2>
+
+<p>对用户空间进行的更改主要在 <code>system/netd</code> 和 <code>framework/base</code> 项目中。开发工作在 AOSP 中完成,因此 AOSP 代码将始终保持最新状态。源代码主要位于 <a href="https://android.googlesource.com/platform/system/netd/+/master/server/TrafficController.cpp" class="external"><code>system/netd/server/TrafficController*</code></a>、<a href="https://android.googlesource.com/platform/system/netd/+/master/bpfloader/" class="external"><code>system/netd/bpfloader</code></a> 和 <a href="https://android.googlesource.com/platform/system/netd/+/master/libbpf/" class="external"><code>system/netd/libbpf/</code></a> 中。另外,对框架进行的一些必要更改也在 <code>framework/base/</code> 和 <code>system/core</code> 中。</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>从 Android 9 开始,内核版本为 4.9 或更高且最初搭载了 Android P 版本的 Android 设备必须使用基于 eBPF 的网络流量监控记帐模块,而不是 <code>xt_qtaguid</code>。新的基础架构更灵活且更易于维护,并且不需要任何外部内核代码。</p>
+
+<p>旧版流量监控和 eBPF 流量监控之间的主要设计差异如图 1 所示。</p>
+
+<p><img src="/devices/images/ebpf-net-monitor.png" alt="旧版流量监控和 eBPF 流量监控的设计差异"/></p>
+
+<p><strong>图 1.</strong> 旧版流量监控(左)和 eBPF 流量监控(右)的设计差异</p>
+
+<p>新的 <code>trafficController</code> 设计基于 per-<code>cgroup</code> eBPF 过滤器以及内核中的 <code>xt_bpf</code> netfilter 模块。当数据包 tx/rx 通过 eBPF 过滤器时,系统会对其应用相应过滤器。<code>cgroup</code> eBPF 过滤器位于传输层中,负责根据套接字 UID 和用户空间设置对正确的 UID 计算流量。<code>xt_bpf</code> netfilter 连接在 <code>bw_raw_PREROUTING</code> 和 <code>bw_mangle_POSTROUTING</code> 链上,负责对正确的接口计算流量。</p>
+
+<p>在设备启动时,用户空间进程 <code>trafficController</code> 会创建用于收集数据的 eBPF 映射,并将所有映射作为虚拟文件固定在 <code>sys/fs/bpf</code>。然后,特权进程 <code>bpfloader</code> 将预编译的 eBPF 程序加载到内核中,并将其附加到正确的 <code>cgroup</code>。所有流量都对应于同一个根 <code>cgroup</code>,因此默认情况下,所有进程都应包含在该 <code>cgroup</code> 中。</p>
+
+<p>在系统运行时,<code>trafficController</code> 可以通过写入到 <code>traffic_cookie_tag_map</code> 和 <code>traffic_uid_counterSet_map</code>,对套接字进行标记/取消标记。<code>NetworkStatsService</code> 可以从 <code>traffic_tag_stats_map</code>、<code>traffic_uid_stats_map</code> 和 <code>traffic_iface_stats_map</code> 中读取流量统计数据。除了流量统计数据收集功能外,<code>trafficController</code> 和 <code>cgroup</code> eBPF 过滤器还负责根据手机设置屏蔽来自特定 UID 的流量。基于 UID 的网络流量屏蔽功能取代了内核中的 <code>xt_owner</code> 模块,详细模式可以通过写入到 <code>traffic_powersave_uid_map</code>、<code>traffic_standby_uid_map</code> 和 <code>traffic_dozable_uid_map</code> 来进行配置。</p>
+
+<p>新实现遵循旧版 <code>xt_qtaguid</code> 模块实现,因此 <code>TrafficController</code> 和 <code>NetworkStatsService</code> 将使用旧版实现或新实现运行。如果应用使用公共 API,则无论后台使用 <code>xt_qtaguid</code> 还是 eBPF 工具,都不应受到任何影响。</p>
+
+<p>如果设备内核基于 Android 通用内核 4.9(SHA39c856663dcc81739e52b02b77d6af259eb838f6 或以上版本),则实现新的 eBPF 工具时无需修改 HAL、驱动程序或内核代码。</p>
+
+<h2 id="requirements">要求</h2>
+
+<ol>
+<li><p>内核配置必须开启以下配置:</p>
+
+<ol>
+<li><code>CONFIG_CGROUP_BPF=y</code></li>
+<li><code>CONFIG_BPF=y</code></li>
+<li><code>CONFIG_BPF_SYSCALL=y</code></li>
+<li><code>CONFIG_NETFILTER_XT_MATCH_BPF=y</code></li>
+</ol>
+
+<p>验证是否已开启正确配置时,<a href="https://android.googlesource.com/platform/test/vts-testcase/kernel/+/master/config/VtsKernelConfigTest.py" class="external">VTS 内核配置测试</a>非常有用。</p></li>
+<li><p>设备 <code>MEM_LOCK</code> 资源限制必须设为 8 MB 或更多。</p></li>
+</ol>
+
+<h2 id="legacy-xt_qtaguid-deprecation-process">旧版 xt_qtaguid 弃用过程</h2>
+
+<p>新的 eBPF 工具将取代 <code>xt_qtaguid</code> 模块以及它所基于的 <code>xt_owner</code> 模块。我们将开始从 Android 内核中移除 <code>xt_qtaguid</code> 模块,并停用不必要的配置。</p>
+
+<p>在 Android 9 版本中,<code>xt_qtaguid</code> 模块在所有设备上都处于开启状态,不过,直接读取 <code>xt_qtaguid</code> 模块 proc 文件的所有公共 API 都将移至 <code>NetworkManagement</code> 服务中。根据设备内核版本和首个 API 级别,<code>NetworkManagement</code> 服务能够知道 eBPF 工具是否处于开启状态,并选择正确的模块来获取每个应用的网络使用情况统计数据。sepolicy 会阻止 SDK 级别为 28 及以上的应用访问 <code>xt_qtaguid</code> proc 文件。</p>
+
+<p>从 Android 9 之后的下一个版本起,我们将完全阻止应用访问这些 <code>xt_qtaguid</code> proc 文件,并开始从新的 Android 通用内核中移除 <code>xt_qtaguid</code> 模块。移除该模块后,我们将更新相应内核版本的 Android 基础配置,以明确关闭 <code>xt_qtaguid</code> 模块。当 Android 版本的最低内核版本要求为 4.9 或更高时,我们将彻底弃用 <code>xt_qtaguid</code> 模块。</p>
+
+<p>在 Android 9 版本中,只有搭载 Android 9 版本的设备才需要具备新的 eBPF 功能。如果设备搭载的内核可以支持 eBPF 工具,我们建议在升级到 Android 9 版本时,将设备更新到采用新的 eBPF 功能。没有旨在强制执行该更新的 CTS 测试。</p>
+
+<h2 id="validation">验证</h2>
+
+<p>您应该定期从 Android 通用内核和 Android AOSP 主代码库获取补丁程序。请确保您的实现通过适用的 VTS 和 CTS 测试、<code>netd_unit_test</code> 以及 <code>libbpf_test</code>。</p>
+
+<h3 id="testing">测试</h3>
+
+<p><a href="https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py" class="external">内核 net_tests</a> 旨在确保您已开启必要的功能,并向后移植了必要的内核补丁程序。这些测试已集成到 Android 9 版本 VTS 测试中。<code>system/netd/</code> 中有一些单元测试(<a href="https://android.googlesource.com/platform/system/netd/+/master/server/TrafficControllerTest.cpp" class="external"><code>netd_unit_test</code></a> 和 <a href="https://android.googlesource.com/platform/system/netd/+/master/libbpf/BpfNetworkStatsTest.cpp" class="external"><code>libbpf_test</code></a>)。<code>netd_integration_test</code> 中有一些旨在验证新工具整体行为的测试。</p>
+
+<h4 id="cts-and-cts-verifier">CTS 和 CTS 验证程序</h4>
+
+<p>由于 Android 9 版本支持这两种流量监控模块,因此没有旨在强制在所有设备上实现新模块的 CTS 测试。不过,对于内核版本高于 4.9 且最初搭载了 Android 9 版本(即首个 API 级别 &gt;= 28)的设备,GSI 上提供了一些旨在验证新模块是否已正确配置的 CTS 测试。旧的 CTS 测试(如 <code>TrafficStatsTest</code>、<code>NetworkUsageStatsTest</code> 和 <code>CtsNativeNetTestCases</code>)可用于验证新模块的行为是否与旧的 UID 模块一致。</p>
+
+<h4 id="manual-testing">手动测试</h4>
+
+<p><code>system/netd/</code> 中有一些单元测试(<a href="https://android.googlesource.com/platform/system/netd/+/master/server/TrafficControllerTest.cpp" class="external"><code>netd_unit_test</code></a>、<a href="https://android.googlesource.com/platform/system/netd/+/master/tests/bpf_base_test.cpp" class="external"><code>netd_integration_test</code></a> 和 <a href="https://android.googlesource.com/platform/system/netd/+/master/libbpf/BpfNetworkStatsTest.cpp" class="external"><code>libbpf_test</code></a>)。系统支持 dumpsys,以便手动检查状态。命令 <strong><code>dumpsys netd</code></strong> 可显示 <code>trafficController</code> 模块的基本状态以及 eBPF 是否已正确开启。如果 eBPF 处于开启状态,命令 <strong><code>dumpsys netd trafficcontroller</code></strong> 会显示每个 eBPF 映射的详细内容,包括带标记套接字信息、每个标记的统计数据、UID 和 iface,以及所有者 UID 匹配项。</p>
+
+<h3 id="test-locations">测试所在位置</h3>
+
+<p>CTS 测试位于以下位置:</p>
+
+<ul>
+<li class="external"><a href="https://android.googlesource.com/platform/cts/+/master/tests/tests/net/src/android/net/cts/TrafficStatsTest.java">https://android.googlesource.com/platform/cts/+/master/tests/tests/net/src/android/net/cts/TrafficStatsTest.java</a></li>
+<li class="external"><a href="https://android.googlesource.com/platform/cts/+/master/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java">https://android.googlesource.com/platform/cts/+/master/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java</a></li>
+<li class="external"><a href="https://android.googlesource.com/platform/system/netd/+/master/tests/bpf_base_test.cpp">https://android.googlesource.com/platform/system/netd/+/master/tests/bpf_base_test.cpp</a></li>
+</ul>
+
+<p>VTS 测试位于以下位置:<a href="https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py" class="external">https://android.googlesource.com/kernel/tests/+/master/net/test/bpf_test.py</a>。</p>
+
+<p>单元测试位于以下位置:</p>
+
+<ul>
+<li class="external"><a href="https://android.googlesource.com/platform/system/netd/+/master/libbpf/BpfNetworkStatsTest.cpp">https://android.googlesource.com/platform/system/netd/+/master/libbpf/BpfNetworkStatsTest.cpp</a></li>
+<li class="external"><a href="https://android.googlesource.com/platform/system/netd/+/master/server/TrafficControllerTest.cpp">https://android.googlesource.com/platform/system/netd/+/master/server/TrafficControllerTest.cpp</a></li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/datausage/kernel-overview.html b/zh-cn/devices/tech/datausage/kernel-overview.html
index 3ce0517..d63bb05 100644
--- a/zh-cn/devices/tech/datausage/kernel-overview.html
+++ b/zh-cn/devices/tech/datausage/kernel-overview.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>
@@ -25,7 +25,7 @@
 
 <aside class="note"><b>注意</b>:我们将从 Android 9 版本开始分阶段取消对 <code>xt_qtaguid</code> 的支持。有关详情,请参阅 <a href="ebpf-traffic-monitor">eBPF 流量监控</a>。</aside>
 
-<p><code>quota2</code> netfilter 模块(最初是属于 <code>xtables-addons</code>)为设置具有指定名称的配额限制提供了功能支持;此外,经过扩展后,该模块还可支持在达到特定配额限制时通知用户空间。一旦达到配额限制,<code>quota2</code> 模块将丢弃所有的后续网络流量。该框架还可以指定额外的规则来限制应用的后台数据流量(请参阅 <code>com.android.server.NetworkManagementSocketTagger.setKernelCounterSet</code> 和 <code>android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND</code>)。</p>
+<p><code>quota2</code> netfilter 模块(最初是属于 <code>xtables-addons</code>)为设置具有指定名称的配额限制提供了功能支持;此外,经过扩展后,该模块还可支持在达到特定配额限制时通知用户空间。一旦达到配额限制,<code>quota2</code> 模块将丢弃所有的后续网络流量。框架还可以指定额外的规则来限制应用的后台数据流量(请参阅 <code>com.android.server.NetworkManagementSocketTagger.setKernelCounterSet</code> 和 <code>android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND</code>)。</p>
 <h1 id="how-does-it-work">工作原理</h1>
 <p><code>qtaguid</code> netfilter 模块使用应用的专属 UID,按套接字对每个应用的网络流量进行跟踪。系统中有两个标记组件与套接字相关联。第一个是 UID,用来明确标识进行数据传输的应用(Linux 允许将每个网络套接字的所有权与调用应用的 UID 相关联)。第二个标记组件用于支持附加于流量上的开发者指定的类别描述。应用可使用这些应用级标记,将流量归类到若干子类别。</p>
 <p>当应用以服务(如下载管理器、媒体流式传输服务等)的方式传输网络数据时,可通过调用 <code>TrafficStats.setThreadStatsUid()</code> 函数将传输作业的所有权与发出请求的应用的 UID 相关联。调用程序必须具备“<code>android.permission.MODIFY_NETWORK_ACCOUNTING</code>”权限才能重新分配网络流量的所有权。</p>
diff --git a/zh-cn/devices/tech/debug/asan.html b/zh-cn/devices/tech/debug/asan.html
index 8b8d625..7a010b4 100644
--- a/zh-cn/devices/tech/debug/asan.html
+++ b/zh-cn/devices/tech/debug/asan.html
@@ -53,7 +53,7 @@
 
 <p>根据 ASan 的工作原理,不是通过 ASan 编译的可执行文件将无法使用通过 ASan 编译的库。</p>
 
-<p class="note"><strong>注意</strong>:在运行时,如果将 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>
 
@@ -107,7 +107,7 @@
 
 <p>AddressSanitizer 无法检查 Java 代码,但可以检测 JNI 库中的错误。为此,您需要使用 ASan 编译可执行文件(在这种情况下是 <code>/system/bin/app_process(<em>32|64</em>)</code>)。这将在设备上的所有应用中同时启用 ASan,因而会给设备带来一些压力,但 2GB RAM 的设备可以从容处理这种情况。</p>
 
-<p>向 <code>LOCAL_SANITIZE:=address</code> 中的 app_process 编译规则添加常规的 <code>frameworks/base/cmds/app_process</code>。暂时忽略同一个文件中的 <code>app_process__asan</code> 目标(如果在您阅读该文件时这个目标仍存在于其中)。在 <code>system/core/rootdir/init.zygote(<em>32|64</em>).rc</code>).rc 中修改 Zygote 记录,以添加以下行:</p>
+<p>向 <code>LOCAL_SANITIZE:=address</code> 中的 app_process 编译规则添加常规的 <code>frameworks/base/cmds/app_process</code>。暂时忽略同一个文件中的 <code>app_process__asan</code> 目标(如果在您阅读该文件时这个目标仍存在于其中)。在 <code>system/core/rootdir/init.zygote(<em>32|64</em>).rc</code> 中修改 Zygote 记录,以添加以下行:</p>
 
 <pre class="devsite-click-to-copy">
 setenv LD_LIBRARY_PATH /system/lib/asan:/system/lib
diff --git a/zh-cn/devices/tech/debug/fuzz-sanitize.html b/zh-cn/devices/tech/debug/fuzz-sanitize.html
index f24e41f..0319b0d 100644
--- a/zh-cn/devices/tech/debug/fuzz-sanitize.html
+++ b/zh-cn/devices/tech/debug/fuzz-sanitize.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>
@@ -19,17 +19,11 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
+
+  <p>本部分从安全角度总结了实用的动态分析和调试工具,其中包括一些用于模糊测试、排错和预先缓解攻击的工具。有关常规调试,请参阅<a href="/devices/tech/debug/">调试部分</a>。</p>
+
 <p>
-模糊测试(仅仅是将可能无效的数据、异常数据或随机数据输入到程序中)是在大型软件系统中查找错误的一种非常有效的方法,也是软件开发生命周期的重要组成部分。
-</p>
-<p>
-LLVM 是用于编译 Android 的编译器基础架构,它包含可执行静态和动态分析的多个组件,其中排错程序可用于消除错误和改进 Android。
-</p>
-<p>
-尽管 Android 的多个版本都支持模糊测试工具,但 Android 8.0 可提供更多模糊测试方面的支持,并可在 Android 编译系统中提供更紧密的模糊测试工具,还能针对 Android 内核提供更有力的动态分析支持。
-</p>
-<p>
-本部分介绍了如何设置和使用各种模糊测试和排错工具。
+Android 的多个版本都支持模糊测试工具,不过,Android 8.0 及更高版本中提供了模糊测试方面的更多支持,在 Android 编译系统中实现了更紧密的模糊测试工具集成,还针对 Android 内核提供了更有力的动态分析支持。
 </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/debug/intsan.html b/zh-cn/devices/tech/debug/intsan.html
new file mode 100644
index 0000000..c8fcb65
--- /dev/null
+++ b/zh-cn/devices/tech/debug/intsan.html
@@ -0,0 +1,152 @@
+<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
+
+          //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 7.0 中添加了 Clang 的 <a href="https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html">UndefinedBehaviorSanitizer</a> (UBSan) 有符号和无符号整数溢出排错程序,以<a href="https://android-developers.googleblog.com/2016/05/hardening-media-stack.html">强化媒体框架</a>。在 Android 9 中,我们<a href="https://android-developers.googleblog.com/2018/06/compiler-based-security-mitigations-in.html">将 UBSan 扩展为涵盖更多组件</a>,并改进了对它的编译系统支持。
+</p>
+<p>
+如果发生有符号或无符号整数溢出,溢出排错功能可以检测可能溢出的算术指令,从而安全地中止进程。这些排错程序可以缓解根本原因是整数溢出的各种内存损坏和信息披露漏洞问题,例如原始 Stagefright 漏洞。
+</p>
+<h2 id="examples-and-source">示例和源代码</h2>
+<p>
+整数溢出排错功能 (IntSan) 由编译器提供,可在编译期间将 Instrumentation 添加到二进制文件中,以便检测算法溢出。在整个平台的各个组件(例如 <a href="https://android.googlesource.com/platform/external/libnl/+/master/Android.bp#64"><code>/platform/external/libnl/Android.bp</code></a>)中,该功能会默认处于启用状态。
+</p>
+
+<h2 id="implementation">实现</h2>
+<p>
+IntSan 使用了 UBSan 的有符号和无符号整数溢出排错程序。该缓解功能是在各个模块级别启用,有助于确保 Android 关键组件的安全性,因此不应停用。
+</p>
+<p>
+强烈建议您为更多组件启用整数溢出排错功能。理想的候选组件是特权原生代码或可解析不可信用户输入的原生代码。系统会产生一小笔与排错程序关联的性能开销,具体取决于代码的使用情况和算术运算的普遍性。预计开销所占的百分比会较小,您可以测试性能是否存在问题。
+</p>
+<h3 id="intsan-in-makefiles">在 Makefile 中支持 IntSan</h3>
+<p>
+要在 Makefile 中启用 IntSan,请添加以下代码:
+</p>
+
+<pre class="prettyprint">LOCAL_SANITIZE := integer_overflow
+# Optional features
+LOCAL_SANITIZE_DIAG := integer_overflow
+LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt</pre>
+<ul>
+  <li><code>LOCAL_SANITIZE</code> 会收到一个以英文逗号分隔的排错程序列表,其中 <code>integer_overflow</code> 是一组预封装的选项,用于各个有符号和无符号整数溢出排错程序,且具有<a href="https://android.googlesource.com/platform/build/soong/+/master/cc/config/integer_overflow_blacklist.txt">默认黑名单</a>。</li>
+  <li><code>LOCAL_SANITIZE_DIAG</code> 用于为排错程序启用诊断模式。请仅在测试期间使用诊断模式,因为它不会在溢出发生时中止,而这会完全抹杀缓解功能的安全优势。如需更多详细信息,请参阅<a href="#troubleshooting">问题排查</a>。</li>
+  <li><code>LOCAL_SANITIZE_BLACKLIST</code> 用于指定黑名单文件,以防止函数和源文件成为排错对象。如需更多详细信息,请参阅<a href="#troubleshooting">问题排查</a>。</li>
+</ul>
+<p>
+如果您想要进行更精细的控制,请使用一个或两个标志逐个启用排错程序:
+</p>
+
+<pre class="prettyprint">LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
+LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow</pre>
+
+<aside class="caution"><strong>注意</strong>:<strong>必须</strong>按照上文所述为静态二进制文件/库指定各个排错程序;<code>integer_overflow</code> 标志不支持静态二进制文件/库。在逐个指定时,请同时使用有符号和无符号排错程序。</aside>
+
+<h3 id="intsan-in-bp">在蓝图文件中支持 IntSan</h3>
+<p>
+要在蓝图文件(例如 <a href="https://android.googlesource.com/platform/external/libnl/+/master/Android.bp#64"><code>/platform/external/libnl/Android.bp</code></a>)中启用整数溢出排错功能,请添加以下代码:
+</p>
+
+<pre class="prettyprint">   sanitize: {
+      integer_overflow: true,
+      diag: {
+          integer_overflow: true,
+      },
+      blacklist: "modulename_blacklist.txt",
+   },</pre>
+<p>
+与 Makefile 一样,<code>integer_overflow</code> 属性是一组预封装的选项,用于各个有符号和无符号整数溢出排错程序,且具有<a href="https://android.googlesource.com/platform/build/soong/+/master/cc/config/integer_overflow_blacklist.txt">默认黑名单</a>。
+</p>
+<p>
+<code>diag</code> 属性集用于为排错程序启用诊断模式。请仅在测试期间使用诊断模式。诊断模式不会在溢出发生时中止,而这会完全抹杀用户细分版本中缓解功能的安全优势。如需更多详细信息,请参阅<a href="#troubleshooting">问题排查</a>。
+</p>
+<p>
+<code>blacklist</code> 属性用于指定黑名单文件,以便开发者防止函数和源文件成为排错对象。如需更多详细信息,请参阅<a href="#troubleshooting">问题排查</a>。
+</p>
+<p>
+要逐个启用排错程序,请使用以下代码:
+</p>
+
+<pre class="prettyprint">   sanitize: {
+      misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
+      diag: {
+          misc_undefined: ["signed-integer-overflow",
+                           "unsigned-integer-overflow",],
+      },
+      blacklist: "modulename_blacklist.txt",
+   },</pre>
+<aside class="caution"><strong>注意</strong>:在 Android 9 中,<strong>必须</strong>按照上文所述为静态二进制文件/库指定各个排错程序;<code>integer_overflow</code> 标志不支持静态二进制文件/库。在逐个指定时,请同时使用有符号和无符号排错程序。</aside>
+
+<h3 id="troubleshooting">问题排查</h3>
+<p>
+如果要在新组件中启用整数溢出排错功能,或者依赖于启用了整数溢出排错功能的平台库,则可能会遇到良性整数溢出导致进程中止的一些问题。您应测试启用了排错功能的组件,以确保可以发现良性溢出。
+</p>
+<p>
+要查找由用户细分版本中的排错功能导致的进程中止,请搜索带 Abort 消息(指示 UBSan 捕获了溢出)的 <code>SIGABRT</code> 崩溃,例如:
+</p>
+
+<pre class="prettyprint">pid: ###, tid: ###, name: Binder:###  &gt;&gt;&gt; /system/bin/surfaceflinger &lt;&lt;&lt;
+signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
+Abort message: 'ubsan: sub-overflow'</pre>
+
+<p>
+堆栈轨迹应包括导致进程中止的函数,不过,内联函数中发生的溢出在堆栈轨迹中可能不明显。
+</p>
+<p>
+为了更轻松地确定根本原因,请在触发中止的库中启用诊断功能,尝试重现错误。<strong>启用诊断功能后,进程将不会中止</strong>,而是会继续运行。进程不中止有助于最大限度增加特定执行路径中良性溢出的数量,而无需在更正每个错误后重新进行编译。诊断功能会生成一条错误消息,其中包含导致进程中止的行号和源文件信息:
+</p>
+
+<pre class="prettyprint">frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')</pre>
+<p>
+一旦找到存在问题的算术运算,请确保溢出是良性的且符合预期(例如没有安全隐患)。您可以通过以下方式解决排错程序中止问题:
+</p>
+<ul>
+<li>重构代码以避免溢出(<a href="https://android-review.googlesource.com/c/platform/frameworks/av/+/572808">示例</a>)
+</li><li>通过 Clang 的 <a href="https://clang.llvm.org/docs/LanguageExtensions.html#checked-arithmetic-builtins">__builtin_*_overflow</a> 函数实现显式溢出(<a href="https://android-review.googlesource.com/c/platform/frameworks/av/+/588160">示例</a>)
+</li><li>通过属性来禁止对函数进行排错(<a href="https://android-review.googlesource.com/c/platform/frameworks/base/+/531720">示例</a>)
+</li><li>通过黑名单文件来禁止对函数或源文件进行排错(<a href="https://android-review.googlesource.com/c/platform/frameworks/base/+/574222">示例</a>)
+</li></ul>
+<p>
+您应尽可能使用最精细的解决方案。例如,如果某大型函数具有多个算术运算和单个溢出运算,则应对单个溢出运算进行重构,而不是将整个函数列入黑名单。
+</p>
+<p>
+可能导致良性溢出的常见模式包括:
+</p><ul>
+<li>在转换为有符号类型之前发生无符号溢出的隐式类型转换(<a href="https://android-review.googlesource.com/c/platform/frameworks/av/+/574011">示例</a>)
+</li><li>删除关联的列表,且删除时循环索引会递减(<a href="https://android-review.googlesource.com/c/platform/frameworks/base/+/588158">示例</a>)
+</li><li>将无符号类型指定为 -1,作为最大值的简写形式(<a href="https://android-review.googlesource.com/c/platform/frameworks/native/+/574088/1/services/surfaceflinger/Layer.cpp">示例</a>)
+</li><li>在条件中使无符号整数递减的循环(<a href="https://android-review.googlesource.com/c/platform/frameworks/native/+/573763/1/services/inputflinger/InputReader.cpp">示例</a>、<a href="https://android-review.googlesource.com/c/platform/frameworks/rs/+/572756">示例</a>)</li></ul>
+<p>
+在停用排错功能之前,开发者最好是确保排错程序检测到的溢出确实是良性的,并且没有意外的副作用或安全隐患。
+</p>
+<h3 id="disabling-intsan">停用 IntSan</h3>
+<p>
+您可以使用黑名单或函数属性来停用 IntSan。请仅在重构代码不合理或者存在有问题的性能开销时,谨慎停用 IntSan。
+</p>
+<p>
+要详细了解如何使用<a href="https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#disabling-instrumentation-with-attribute-no-sanitize-undefined">函数属性</a>和<a href="https://clang.llvm.org/docs/SanitizerSpecialCaseList.html">黑名单文件格式设置</a>停用 IntSan,请参阅上游 Clang 文档。应将黑名单的作用范围限定为特定的排错程序,方法是使用区块名称指定目标排错程序,以免影响其他排错程序。
+</p>
+<h2 id="validation">验证</h2>
+<p>目前没有专门针对整数溢出排错功能的 CTS 测试。因此请确保 CTS 测试在启用或未启用 IntSan 的情况下均能通过,以证明它不会给设备带来影响。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/debug/sanitizers.html b/zh-cn/devices/tech/debug/sanitizers.html
index 6568f93..da390a9 100644
--- a/zh-cn/devices/tech/debug/sanitizers.html
+++ b/zh-cn/devices/tech/debug/sanitizers.html
@@ -37,7 +37,7 @@
   <li>释放后再使用</li>
 </ul>
 <p>
-Android 允许在完整编译级别和在<a href="/devices/tech/debug/asan#addresssanitizer_in_the_apps">应用级别</a>通过 asanwrapper 进行 <a href="/devices/tech/debug/asan">ASan 插桩</a>。
+Android 允许在完整编译级别和在<a href="/devices/tech/debug/asan">应用级别</a>通过 asanwrapper 进行 <a href="/devices/tech/debug/asan#addresssanitizer_in_the_apps">ASan 插桩</a>。
 </p>
 <p>
 AddressSanitizer 对所有与内存相关的函数调用(包括 alloca、malloc 和 free)进行插桩,并使用被读取或写入时会触发 ASan 回调的内存填充所有变量和已分配的内存区域。
diff --git a/zh-cn/devices/tech/display/night-light.html b/zh-cn/devices/tech/display/night-light.html
index 14965a1..43fa9aa 100644
--- a/zh-cn/devices/tech/display/night-light.html
+++ b/zh-cn/devices/tech/display/night-light.html
@@ -24,7 +24,7 @@
 研究表明,屏幕的蓝光会对睡眠质量造成不良影响。Android 7.1.1 具备一种称为“夜间模式”的功能,可减少设备显示屏发出的蓝光量,以便达到更接近用户当前时间和地点的自然光效果。Android 8.0 提供一项功能,可让用户更好地控制夜间模式效果的强度。
 </p>
 <p>
-夜间模式需要实现 <a href="/devices/graphics/implement-hwc.html">Hardware Composer HAL 2.0</a> (HWC 2),它可根据传递到 <code>setColorTransform</code> 的矩阵来进行着色,而不会影响耗电量、性能和应用兼容性。
+夜间模式需要实现 <a href="/devices/graphics/implement-hwc.html">Hardware Composer HAL 2.0</a> (HWC 2),它可根据传递到 <code>setColorTransform</code> 的矩阵进行着色,而不会影响耗电量、性能和应用兼容性。
 </p>
 <h2 id="implementation">实现</h2>
 <p>
diff --git a/zh-cn/devices/tech/ota/nonab/inside_packages.html b/zh-cn/devices/tech/ota/nonab/inside_packages.html
index cdef290..251a989 100644
--- a/zh-cn/devices/tech/ota/nonab/inside_packages.html
+++ b/zh-cn/devices/tech/ota/nonab/inside_packages.html
@@ -73,14 +73,14 @@
 <p>支持特殊语法将 MTD(内存技术设备)分区的内容作为文件处理,以便为引导分区这样的原始分区打补丁。由于 MTD 分区没有文件结束标记,因此要读取该分区,您必须知道您要读取的数据量。您可以使用字符串“MTD:partition:size_1:sha1_1:size_2:sha1_2”作为文件名来读取给定的分区。<i></i><i></i><i></i><i></i><i></i>您必须至少指定一个 (size, sha-1) 对;如果您希望读取的内容有多种可能,则可以指定多个对。<i></i></p></dd>
 <dt><code>apply_patch_check(<i>filename</i>, <i>sha1</i>[, <i>sha1</i>, ...])
 </code></dt>
-<dd>如果 filename 的内容或缓存分区中的临时副本(如果存在)中的内容具有与指定的 sha1 值之一相等的 SHA1 校验和,则返回 True。sha1 值指定为 40 位十六进制数字。<i></i><i></i><i></i>该函数不同于 <code>sha1_check(read_file(<i>filename</i>),
+<dd>如果 filename 的内容或缓存分区中临时副本(如果存在)的内容具有与指定的 sha1 值之一相等的 SHA1 校验和,则返回 True。sha1 值指定为 40 位十六进制数字。<i></i><i></i><i></i>该函数不同于 <code>sha1_check(read_file(<i>filename</i>),
 <i>sha1</i> [, ...])</code>,因为它知道要检查缓存分区副本,因此即使文件被中断的 <code>apply_patch() update</code> 损坏,<code>apply_patch_check()</code> 也将成功。</dd>
 <dt><code>apply_patch_space(<i>bytes</i>)</code></dt>
-<dd>如果至少有 bytes 个字节的暂存空间可用于打二进制补丁程序,则返回 True。<i></i></dd>
+<dd>如果至少有 bytes 个字节的暂存空间可用于应用二进制补丁程序,则返回 True。<i></i></dd>
 <dt><code>concat(<i>expr</i>[, <i>expr</i>, ...])</code></dt>
 <dd>评估每个表达式并将它们连接起来。在只有两个参数的特殊情况下,+ 运算符就是该函数的语法糖(但该函数形式可以包含任意数量的表达式)。表达式必须为字符串;该函数不能连接 Blob。</dd>
 <dt><code>file_getprop(<i>filename</i>, <i>key</i>)</code></dt>
-<dd>读取给定的 filename,将其解释为属性文件(例如:<code>/system/build.prop</code>),并返回给定 key 的值,如果 key 不存在,则返回空字符串。<i></i><i></i><i></i></dd>
+<dd>读取给定的 filename,将其解释为属性文件(例如:<code>/system/build.prop</code>/system/build.prop),并返回给定 key 的值,如果 key 不存在,则返回空字符串。<i></i><i></i><i></i></dd>
 <dt><code>format(<i>fs_type</i>, <i>partition_type</i>, <i>location</i>, <i>
 fs_size</i>, <i>mount_point</i>)</code></dt>
 <dd>重新格式化给定的分区。支持的分区类型如下:
@@ -122,7 +122,7 @@
 <dt><code>set_progress(<i>frac</i>)</code></dt>
 <dd>在最近的 <code>show_progress()</code> 调用所定义的块内设置进度条的位置。frac 必须在 [0.0, 1.0] 范围内。<i></i>进度条从不向后移动;向后移动的尝试会被忽略。</dd>
 <dt><code>sha1_check(<i>blob</i>[, <i>sha1</i>])</code></dt>
-<dd>blob 参数是 <code>
+<dd>blob 参数是<code>
 read_file()</code> 返回的 blob 类型或 <code>package_extract_file()
 </code> 的单参数形式 blob。<i></i>在没有 sha1 参数的情况下,此函数返回 blob 的 SHA1 哈希值(作为 40 位十六进制字符串)。<i></i>在提供了一个或多个 sha1 参数的情况下,如果 SHA1 哈希值等于其中一个参数,则该函数返回此 SHA1 哈希值;如果与任何一个参数都不相等,则返回空字符串。<i></i></dd>
 <dt><code>show_progress(<i>frac</i>, <i>secs</i>)</code></dt>
diff --git a/zh-cn/devices/tech/ota/reduce_size.html b/zh-cn/devices/tech/ota/reduce_size.html
index 458ac07..70a2bc6 100644
--- a/zh-cn/devices/tech/ota/reduce_size.html
+++ b/zh-cn/devices/tech/ota/reduce_size.html
@@ -118,7 +118,7 @@
 
 <h2 id="the_build_diff_tool">使用编译 diff 工具</h2>
 
-<p>对于无法消除与编译相关的文件变更的情况,AOSP 纳入了编译 diff 工具 <code><a href="https://android.googlesource.com/platform/build/+/master/tools/releasetools/target_files_diff.py" class="external">target_files_diff.py</a></code>,以用于比较两个文件包。该工具会在两个编译之间执行递归 diff,从而排除常见的编译相关文件变更,例如:</p>
+<p>由于有些情况下无法避免与编译相关的文件变更,为此 AOSP 纳入了编译 diff 工具 <code><a href="https://android.googlesource.com/platform/build/+/master/tools/releasetools/target_files_diff.py" class="external">target_files_diff.py</a></code>,以用于比较两个文件包。该工具会在两个编译之间执行递归 diff,从而排除常见的编译相关文件变更,例如:</p>
 
 <ul>
   <li>编译输出中的预期变更(例如,由于版本号变更所导致)。</li>
diff --git a/zh-cn/devices/tech/ota/sign_builds.html b/zh-cn/devices/tech/ota/sign_builds.html
index 76e0b9f..95f7763 100644
--- a/zh-cn/devices/tech/ota/sign_builds.html
+++ b/zh-cn/devices/tech/ota/sign_builds.html
@@ -119,8 +119,9 @@
 </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="devsite-click-to-copy">
 build/target/product/security/testkey  = dir/releasekey
diff --git a/zh-cn/devices/tech/settings/index.html b/zh-cn/devices/tech/settings/index.html
index b4bc43a..0055c10 100644
--- a/zh-cn/devices/tech/settings/index.html
+++ b/zh-cn/devices/tech/settings/index.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>“设置”菜单</title>
+    <title>设计 Android 设置</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
@@ -20,6 +20,6 @@
       limitations under the License.
   -->
 
-<p>本部分的几页中介绍了如何运用 Android 的“设置”菜单中提供的最新功能。</p>
+<p>本部分的页面中介绍了如何设计一致的设置界面。使用顶部的横向菜单可以打开具体的子标签和部分。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/settings/info-architecture.html b/zh-cn/devices/tech/settings/info-architecture.html
index 6deb57e..7d30891 100644
--- a/zh-cn/devices/tech/settings/info-architecture.html
+++ b/zh-cn/devices/tech/settings/info-architecture.html
@@ -1,9 +1,10 @@
 <html devsite><head>
-    <title>已更新的信息架构</title>
+    <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
 
@@ -21,7 +22,9 @@
   -->
 
 <p>
-Android 8.0 为“设置”应用引入了全新的信息架构。新信息架构的目标是简化设置的整理方式,便于用户快速查找自定义 Android 设备所需的设置。
+Android 8.0 为“设置”应用引入了全新的信息架构,以便简化设置组织方式,让用户更轻松地快速找到自定义 Android 设备所需的设置。
+
+Android 9 引入了一些改进,以提供更多设置功能并简化实现。
 </p>
 
 <h2 id="examples-and-source">示例和源代码</h2>
@@ -31,92 +34,83 @@
 </p>
 
 <p>
-重要组件的文件路径如下所示:
+下面列出了重要组件的文件路径:
 </p>
 
-<h3 id="categorykey">CategoryKey</h3>
-
-<code>packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java</code>
-
-<h3 id="dashboardfragmentregistry">DashboardFragmentRegistry</h3>
-
-<code>packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java</code>
-
-<h3 id="dashboardfragment">DashboardFragment</h3>
-
-<code>packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java</code>
-
-<h3 id="preferencecontrollers">AbstractPreferenceController 和 PreferenceController</h3>
-
-<code>frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java</code>
-
-<code>packages/apps/Settings/src/com/android/settings/core/PreferenceController.java</code>
+<ul>
+<li><strong>CategoryKey</strong>:<code>packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java</code></li>
+<li><strong>DashboardFragmentRegistry</strong>:<code>packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java</code></li>
+<li><strong>DashboardFragment</strong>:<code>packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java</code></li>
+<li><strong>AbstractPreferenceController</strong>:<code>frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
+</code></li>
+<li><strong>BasePreferenceController</strong>(已在 Android 9 中引入):<code>packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java</code></li>
+</ul>
 
 <h2 id="implementation">实现</h2>
 
 <p>
-建议设备制造商调整现有的“设置”信息架构,并根据需要插入其他设置页面以适应合作伙伴的特定功能。将偏好设置从旧页面(实现为 SettingsPreferencePage)移到新页面(使用 DashboardFragment 实现)可能很复杂。旧页面的偏好设置在实现时可能没有创建 PreferenceController。
+建议设备制造商调整现有的“设置”信息架构,并根据需要插入其他设置页面以容纳合作伙伴专用功能。将偏好设置从旧版页面(作为 <code>SettingsPreferencePage</code> 实现的页面)移到新页面(使用 <code>DashboardFragment</code> 实现的页面)可能很复杂。旧版页面中的偏好设置在实现时很可能没有创建 <code>PreferenceController</code>。
 </p>
 
 <p>
-因此将偏好设置移到 DashboardFragment 中时,合作伙伴需要创建一个 PreferenceController,并且先将代码移到控制器中,然后在新的 DashboardFragment 中对偏好设置实例化。重构过程相当简单,因为大部分操作只是移动现有代码。
+因此,将偏好设置从旧版页面移到新页面时,您需要先创建一个 <code>PreferenceController</code>,并将代码移到该控制器中,然后才能在新的 <code>DashboardFragment</code> 中对其进行实例化。<code>PreferenceController</code> 所需的 API 会在其名称中加以说明并记录在 Javadoc 中。
 </p>
 
 <p>
-完成重构后,原始设备制造商 (OEM) 应提交带有测试的补丁程序 CL 以将其更改合并到上游。
+强烈建议为每个 <code>PreferenceController</code> 添加单元测试。如果更改要提交到 AOSP,则需要有单元测试。要详细了解如何编写基于 Robolectric 的测试,请参阅 readme 文件 <code>packages/apps/Settings/tests/robotests/README.md</code>。
 </p>
 
-<h3 id="plugin">插件样式信息架构</h3>
+<h3 id="plugin">插件式信息架构</h3>
 
 <p>
 每个设置项都作为偏好设置进行实现。可以轻松地将偏好设置从一个页面移到另一个页面。
 </p>
 
 <p>
-为了方便移动多个设置,Android O 引入了包含设置项的插件样式托管方片段。设置项被建模为插件样式控制器。因此,设置页面由单个托管方片段和多个设置控制器构成。
+为了更轻松地移动多个设置,Android 8.0 引入了包含设置项的插件式托管方片段。设置项被建模为插件式控制器。因此,设置页面由单个托管方片段和多个设置控制器构成。
 </p>
 
 <h3 id="dashboard-fragment">DashboardFragment</h3>
 
 <p>
-这是插件样式偏好设置控制器的托管方。该片段继承自 PreferenceFragment,并具有用于放大和更新静态偏好设置列表与动态偏好设置列表的钩子。
+<code>DashboardFragment</code> 是插件式偏好设置控制器的托管方。该片段继承自 <code>PreferenceFragment</code>,并具有用于扩大和更新静态偏好设置列表与动态偏好设置列表的钩子。
 </p>
 
 <h3 id="static-preferences">静态偏好设置</h3>
 
 <p>
-静态偏好设置列表在 XML 中使用<preference>
-标记定义。DashboardFragment 实现使用 getPreferenceScreenResId() 方法来定义哪个 XML 文件包含要显示的偏好设置静态列表。
-</preference></p>
+静态偏好设置列表在 XML 中使用 <code>&lt;Preference&gt;</code> 标记定义。<code>DashboardFragment</code> 实现使用 <code>getPreferenceScreenResId()</code> 方法定义哪个 XML 文件包含要显示的静态偏好设置列表。
+</p>
 
 <h3 id="dynamic-preferences">动态偏好设置</h3>
 
 <p>
-动态项表示具有 intent 的图块,会引向外部或内部 Activity。通常,intent 会引向不同的设置页面。例如,“设置”首页中的“Google”设置项就是一个动态项。动态项在 AndroidManifest 中定义(参见下文),并通过 FeatureProvider(定义为 DashboardFeatureProvider)加载。
+动态项表示具有 intent 的图块,会引向外部或内部 Activity。通常,intent 会引向不同的设置页面。例如,“设置”首页中的“Google”设置项就是一个动态项。动态项在 <code>AndroidManifest</code> 中定义(请参见下文),并通过 <code>FeatureProvider</code>(定义为 <code>
+DashboardFeatureProvider</code>)加载。
 </p>
 
 <p>
-请注意,动态设置的负载高于静态配置的设置,因此通常开发者应将设置实现为静态设置。但是,在以下任一情况下,动态设置非常有用:
+与静态配置的设置相比,动态设置更耗费资源,因此开发者通常应将设置实现为静态设置。不过在以下任一情况下,动态设置可能非常有用:
 </p>
 
 <ul>
 <li>设置未在“设置”应用中直接实现(例如,注入由 OEM/运营商应用实现的设置)。</li>
 <li>设置应显示在“设置”首页上。</li>
-<li>您已具有设置的 Activity,不想要实现额外的静态配置。</li>
+<li>您已有相应设置的 Activity,不想实现额外的静态配置。</li>
 </ul>
 
 <p>
-要将 Activity 配置为动态设置,您需要执行以下操作:
+要将 Activity 配置为动态设置,请执行以下操作:
 </p>
 
 <ul>
-<li>将该 Activity 标记为动态设置。为此,只需将 intent 过滤器添加到该 Activity 即可。</li>
-<li>告诉“设置”应用其所属的类别。该类别是在 <strong>CategoryKey</strong> 中定义的常量。</li>
-<li>可选:显示设置时,添加总结文本。</li>
+<li>向 Activity 添加 Intent 过滤器,将其标记为动态设置。</li>
+<li>将其所属的类别告诉“设置”应用。类别是一个常量,在 <code>CategoryKey</code> 中定义。</li>
+<li>选做:系统显示设置时,添加摘要文字。</li>
 </ul>
 
 <p>
-以下是从“设置”应用的 DisplaySettings 中摘取的示例。
+以下是从“设置”应用中提取的 <code>DisplaySettings</code> 示例。
 </p>
 
 <pre class="prettyprint">
@@ -137,25 +131,55 @@
 </pre>
 
 <p>
-在呈现时,片段将请求在 AndroidManifest 中定义的静态 XML 和动态设置偏好设置列表。无论在哪个来源中加载设置,DashboardFragment 都通过 PreferenceController 管理每个设置的处理逻辑(参见下文)。<strong></strong>然后,它们将以混合列表的形式显示在界面上。
+在呈现时,片段会请求提供在 <code>AndroidManifest</code> 中定义的静态 XML 和动态设置中的偏好设置列表。无论 <code>PreferenceController</code> 是在 Java 代码中还是在 XML 中定义的,<code>DashboardFragment</code> 都通过 <code>PreferenceController</code> 管理每个设置的处理逻辑(请参见下文)。然后,它们将以混合列表的形式显示在界面中。
 </p>
 
 <h3 id="preference-controller">PreferenceController</h3>
 
+<p>如本部分所述,在 Android 9 中和在 Android 8.x 中实现 <code>PreferenceController</code> 有一些不同。</p>
+
+<h4>Android 9 版本中的 PreferenceController</h4>
+
+<p><code>PreferenceController</code> 包含与偏好设置进行交互所需的所有逻辑,包括显示、更新、编入搜索索引等。</p>
+
+<p><code>PreferenceController</code> 的接口被定义为 <code>BasePreferenceController</code>。例如,请参阅 <code>packages/apps/Settings/src/com/android/settings/core/
+BasePreferenceController.java</code> 中的代码</p>
+
+<p><code>BasePreferenceController</code> 有多个子类,每个子类都分别映射到“设置”应用默认支持的一个特定界面样式。例如,<code>TogglePreferenceController</code> 包含的某个 API 直接映射到用户应如何与基于切换开关的偏好设置界面进行交互。</p>
+
+<p><code>BasePreferenceController</code> 具有 <code>getAvailabilityStatus()</code>、<code>displayPreference()</code>、<code>handlePreferenceTreeClicked(),</code> 等 API。有关每个 API 的详细文档位于相应的接口类中。</p>
+
+<p>实现 <code>BasePreferenceController</code>(及其子类,例如 <code>TogglePreferenceController</code>)时的一个限制是,构造函数签名必须与以下一项匹配:</p>
+
+<ul>
+<li><code>public MyController(Context context, String key) {}</code></li>
+<li><code>public MyController(Context context) {}</code></li>
+</ul>
+
+<p>在为片段安装偏好设置时,信息中心会提供一种在显示之前附加 <code>PreferenceController</code> 的方法。在安装时,控制器会连接到片段,以便将来的所有相关事件均发送到控制器。</p>
+
+<code>DashboardFragment</code> 会在屏幕中保留 <code>PreferenceController</code> 的列表。在片段的 <code>onCreate()</code> 中,将为 <code>getAvailabilityStatus()</code> 方法调用所有控制器,如果它返回 true,则会调用 <code>displayPreference()</code> 来处理显示逻辑。
+<code>getAvailabilityStatus()</code> 也很重要,用于在搜索期间告诉“设置”框架哪些项可用。<p></p>
+
+<h4>Android 8.x 版本中的 PreferenceController</h4>
+
 <p>
-PreferenceController 包含与偏好设置互动的所有逻辑,包括显示/更新/编入搜索索引等。
+<code>PreferenceController</code> 包含与偏好设置进行交互所需的所有逻辑,包括显示、更新、编入搜索索引等。
 </p>
 
 <p>
-相应地,PreferenceController 的接口具有 isAvailable()、displayPreference()、handlePreferenceTreeClicked() 等的 API。有关每个 API 的详细文档可以在相应接口类中找到。
+与偏好设置交互相对应,<code>
+PreferenceController</code> 的接口具有 <code>isAvailable()</code>、<code>
+displayPreference()</code>、<code>handlePreferenceTreeClicked()</code> 等 API。有关每个 API 的详细文档位于相应的接口类中。
 </p>
 
 <p>
-在为片段安装偏好设置时,信息中心会提供一种在显示之前附加 PreferenceController 的方法。在安装时,控制器将连接到片段,以便将来的所有相关事件均发送到控制器。
+在为片段安装偏好设置时,信息中心会提供一种在显示之前附加 <code>PreferenceController</code> 的方法。在安装时,控制器会连接到片段,以便将来的所有相关事件均发送到控制器。
 </p>
 
 <p>
-DashboardFragment 将在屏幕中保留 PreferenceController 的列表。在片段的 onCreate() 中,将为 isAvailable() 方法调用所有控制器,如果其返回 true,将调用 displayPreference() 来处理显示逻辑。
+<code>DashboardFragment</code> 会在屏幕中保留 <code>PreferenceControllers
+</code> 的列表。在片段的 <code>onCreate()</code> 中,将为 <code>isAvailable()</code> 方法调用所有控制器,如果它返回 true,则会调用 <code>displayPreference()</code> 来处理显示逻辑。
 </p>
 
 <h2 id="using-dashboardfragment">使用 DashboardFragment</h2>
@@ -163,62 +187,99 @@
 <h3 id="moving-preference">将偏好设置从页面 A 移到页面 B</h3>
 
 <p>
-如果偏好设置静态地列在原始页面的偏好设置 XML 文件中,请遵循下面的<strong>静态</strong>路径。否则,请遵循<strong>动态</strong>路径。
+如果偏好设置以静态方式列在原始页面的偏好设置 XML 文件中,请按照下面适用于您的 Android 版本的<strong>静态</strong>移动程序进行操作。否则,请按照适合您的 Android 版本的<strong>动态</strong>移动程序进行操作。
 </p>
 
-<h4 id="static-move">静态</h4>
+<h4 id="static-move-p">Android 9 中的静态移动</h4>
 
 <ol>
-<li>查找原始页面和目标页面的偏好设置 XML 文件。</li>您可以从页面的 getPreferenceScreenResId() 方法中找到此信息。
-<li>移除原始页面的 XML 中的偏好设置。</li>
+<li>查找原始页面和目标页面的偏好设置 XML 文件。您可以从页面的 <code>getPreferenceScreenResId()</code> 方法中找到此信息。</li>
+<li>从原始页面的 XML 中移除偏好设置。</li>
 <li>将偏好设置添加到目标页面的 XML 中。</li>
-<li>在原始页面的 Java 实现中移除此偏好设置的 PreferenceController。通常它在 getPreferenceController() 中。</li>
-<strong>注意</strong>:偏好设置可能没有 PreferenceController。
-<li>在目标页面的 getPreferenceController() 中实例化 PreferenceController。</li>
+<li>从原始页面的 Java 实现中移除该偏好设置的 <code>PreferenceController</code>。它通常位于 <code>createPreferenceControllers()</code> 中。控制器可能是在 XML 中直接声明的。
+<p><strong>注意</strong>:偏好设置可能没有 <code>PreferenceController</code>。</p></li>
+<li>在目标页面的 <code>createPreferenceControllers()</code> 中实例化 <code>PreferenceController</code>。如果 <code>PreferenceController</code> 是在旧版页面的 XML 中定义的,则还要在新页面的 XML 中定义它。</li>
 </ol>
 
-<h4 id="dynamic-move">动态</h4>
+<h4 id="dynamic-move">Android 9 中的动态移动</h4>
 
 <ol>
 <li>查找原始页面和目标页面托管的类别。您可以在 <code>DashboardFragmentRegistry</code> 中找到此信息。</li>
-<li>打开包含您需要移动的设置的 <code>AndroidManifest.xml</code> 文件,并找到表示此设置的 Activity 条目。</li>
-<li>更改该 Activity 的“com.android.settings.category”元数据值,将值设置为新页面的类别键。</li>
+<li>打开您需要移动的设置所在的 <code>AndroidManifest.xml</code> 文件,并找到代表此设置的 Activity 条目。</li>
+<li>将该 Activity 的 <code>com.android.settings.category</code> 元数据值设为新页面的类别键。</li>
+</ol>
+
+<h4 id="static-move-8">Android 8.x 版本中的静态移动</h4>
+
+<ol>
+<li>查找原始页面和目标页面的偏好设置 XML 文件。</li>
+您可以从页面的 <code>getPreferenceScreenResId()
+</code> 方法中找到此信息。
+<li>从原始页面的 XML 中移除偏好设置。</li>
+<li>将偏好设置添加到目标页面的 XML 中。</li>
+<li>在原始页面的 Java 实现中移除该偏好设置的 <code>PreferenceController</code>。它通常位于 <code>getPreferenceControllers()</code> 中。</li>
+<p><strong>注意</strong>:偏好设置可能没有 <code>PreferenceController</code>。</p>
+<li>在目标页面的 <code>getPreferenceControllers()</code> 中实例化 <code>PreferenceController</code>。</li>
+</ol>
+
+<h4 id="dynamic-move">Android 8.x 版本中的动态移动</h4>
+
+<ol>
+<li>查找原始页面和目标页面托管的类别。您可以在 <code>DashboardFragmentRegistry</code> 中找到此信息。</li>
+<li>打开您需要移动的设置所在的 <code>AndroidManifest.xml</code> 文件,并找到代表此设置的 Activity 条目。</li>
+<li>更改该 Activity 的 <code>com.android.settings.category</code> 元数据值,将值设为指向新页面的类别键。</li>
 </ol>
 
 <h3 id="creating-a-new-preference">在页面中创建新的偏好设置</h3>
 
 <p>
-如果偏好设置静态地列在原始页面的偏好设置 XML 文件中,请遵循下面的<strong>静态</strong>路径。否则,请遵循<strong>动态</strong>路径。
+如果偏好设置以静态方式列在原始页面的偏好设置 XML 文件中,请按照下面的<strong>静态</strong>程序进程操作。否则,请按照<strong>动态</strong>程序进行操作。
 </p>
 
-<h4 id="static-create">静态</h4>
+<h4 id="static-create">创建静态偏好设置</h4>
 
 <ol>
 <li>找到页面的偏好设置 XML 文件。您可以从页面的 getPreferenceScreenResId() 方法中找到此信息。</li>
-<li>在 XML 中添加一个新的偏好设置项。确保其具有独特的 android:key。</li>
-<li>在页面的 getPreferenceControllers() 方法中为此偏好设置实例化一个 PreferenceController。</li>如果该偏好设置已存在于其他地方,则表示其可能已具有 PreferenceController。您可以重新使用该 PreferenceController,无需构建新的 PreferenceController。
+<li>在 XML 中添加一个新的偏好设置项。确保它具有独一无二的 <code>android:key</code>。</li>
+<li>在页面的 <code>getPreferenceControllers()</code> 方法中为该偏好设置定义一个 <code>PreferenceController</code>。
+<ul>
+<li>在 Android 8.x 和 Android 9(选做)内,在页面的 <code>createPreferenceControllers()</code> 方法中为该偏好设置实例化一个 <code>PreferenceController</code>。
+
+<p>如果该偏好设置已存在于其他地方,则可能已具有针对它的 <code>PreferenceController</code>。您可以重复使用该 <code>PreferenceController</code>,而无需构建新的。</p>
+</li>
+<li>从 Android 9 开始,您可以选择在偏好设置旁的 XML 中声明 <code>PreferenceController</code>。例如:
+<pre class="prettyprint">
+&lt;Preference
+        android:key="reset_dashboard"
+        android:title="@string/reset_dashboard_title"
+        <b>settings:controller="com.android.settings.system.ResetPreferenceController"/&gt;</b>
+</pre>
+</li>
+</ul>
+</li>
 </ol>
 
-<h4 id="dynamic-create">动态</h4>
+<h4 id="dynamic-create">创建动态偏好设置</h4>
 
 <ol>
 <li>查找原始页面和目标页面托管的类别。您可以在 <code>DashboardFragmentRegistry</code> 中找到此信息。</li>
-<li>在 AndroidManifest 中创建一个新的 Activity,并添加必要的元数据来定义设置。将“com.android.settings.category”的元数据值设置为与第 1 步中定义的值相同。</li>
+<li>在 <code>AndroidManifest</code> 中创建一个新的 Activity。</li>
+<li>向新 Activity 添加必要的元数据,以定义设置。将 <code>com.android.settings.category</code> 的元数据值设为第 1 步中定义的相同值。</li>
 </ol>
 
-<h3 id="create-new-page">新建页面</h3>
+<h3 id="create-new-page">创建新页面</h3>
 <ol>
-<li>创建一个继承自 DashboardFragment 的新片段。</li>
+<li>创建一个继承自 <code>DashboardFragment</code> 的新片段。</li>
 <li>在 <code>DashboardFragmentRegistry</code> 中定义其类别。
 <p class="note"><strong>注意</strong>:此步骤是可选的。如果您在此页面中不需要任何动态偏好设置,则不需要提供类别键。</p></li>
-<li>遵循添加此页面所需设置的步骤进行操作。</li>
+<li>按照为此页面添加所需设置的步骤进行操作。要了解详情,请参阅<a href="#implementation">实现</a>部分。</li>
 </ol>
 
 <h2 id="validation">验证</h2>
 
 <ul>
-<li>在“设置”中运行 robolectric 测试,所有现有测试和新测试都应通过。
-</li><li>编译并安装“设置”,手动打开正在被修改的页面;该页面应立即更新。</li>
+<li>在“设置”部分运行 robolectric 测试。应通过所有现有测试和新测试。
+</li><li>编译并安装“设置”,然后手动打开正在修改的页面。该页面应立即更新。</li>
 </ul>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/settings/patterns-components.html b/zh-cn/devices/tech/settings/patterns-components.html
index c57937a..13f72f1 100644
--- a/zh-cn/devices/tech/settings/patterns-components.html
+++ b/zh-cn/devices/tech/settings/patterns-components.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>
@@ -82,7 +82,7 @@
   <ul>
   <li>相关示例和代码可以在以下位置找到:<br />
 <code>packages/apps/Settings/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java</code>
-<p class="note"><strong>注意</strong>:此组件必须与 DashboardFragment 一起使用。(请在<a href="information-architecture.html">已更新的信息架构</a>中查看有关 DashboardFragment 的更多详情。)</p>
+<p class="note"><strong>注意</strong>:此组件必须与 DashboardFragment 一起使用。(请在<a href="info-architecture.html">已更新的信息架构</a>中查看有关 DashboardFragment 的更多详情。)</p>
   </li>
   </ul>
 </li><li>默认应用选择器
@@ -116,14 +116,14 @@
   <li>allowDividerAfterLastItem</li>
   </ul>
 </li>
-<li>ActionBar 主题背景颜色。Activity 应使用 <code>Theme.DeviceDefault.Settings</code> 作为其主题背景,或使用 <code>Theme.DeviceDefault.Settings</code> 作为父级来创建自定义主题背景。
+<li>ActionBar 主题背景颜色。Activity 应使用 <code>Theme.DeviceDefault.Settings</code> 作为其主题背景,或使用 <code>Theme.DeviceDefault.Settings</code> 创建自定义主题背景作为父级。
 </li>
 <li>应用标头微件。在 AppHeaderController 中使用设置器来自定义每个字段,并在设置所有字段后调用 build()。
 </li>
 <li>展开按钮:
   <ul>
   <li>要完全停用该功能,请替换 ProgressiveDisclosureMixin 的构造函数,并将 keepExpanded 设为 true。</li>
-  <li>要自定义最初显示的项目数量,请在片段的 <code>onAttach(Context)</code> 方法中调用 <code>ProgressiveDisclosureMixin.setTileLimit()</code> 方法。</li>
+  <li>要自定义最开始显示多少个项目,请在片段的 <code>onAttach(Context)</code> 方法中调用 <code>ProgressiveDisclosureMixin.setTileLimit()</code> 方法。</li>
   </ul>
 </li>
 </ul>
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 566e080..7667589 100644
--- a/zh-cn/devices/tech/test_infra/tradefed/full_example.html
+++ b/zh-cn/devices/tech/test_infra/tradefed/full_example.html
@@ -71,7 +71,7 @@
     &lt;test class="com.android.tradefed.example.HelloWorldTest" /&gt;
 &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>
@@ -92,7 +92,7 @@
 05-12 13:19:36 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
 Hello, TF World!
 </pre>
-<p>您应该可以在终端看到“Hello, TF World!”输出内容。</p>
+<p>您应该可以在终端上看到“Hello, TF World!”输出。</p>
 
 <h2 id="addconfig">将配置文件添加到类路径(D、I、R)</h2>
 <p>为了方便部署,您还可以将配置文件捆绑到 tradefed JAR 文件自身中。Tradefed 将自动识别类路径下的“config”文件夹中存放的所有配置。<em></em></p>
@@ -180,7 +180,7 @@
 }
 </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>
+<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>
@@ -343,7 +343,7 @@
     --log-level-display  the minimum log level to display on stdout. Must be one of verbose, debug, info, warn, error, assert. Default: error.
 </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>为了减少选项帮助的混乱情况,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>
diff --git a/zh-cn/security/advisory/index.html b/zh-cn/security/advisory/index.html
index 74f02ed..1c617e6 100644
--- a/zh-cn/security/advisory/index.html
+++ b/zh-cn/security/advisory/index.html
@@ -39,8 +39,8 @@
       <a href="/security/advisory/2016-03-18.html?hl=ja">日本語</a> /
       <a href="/security/advisory/2016-03-18.html?hl=ko">한국어</a> /
       <a href="/security/advisory/2016-03-18.html?hl=ru">ру́сский</a> /
-      <a href="/security/advisory/2016-03-18.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/advisory/2016-03-18.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/advisory/2016-03-18.html?hl=zh-cn">中文(中国)</a>/
+      <a href="/security/advisory/2016-03-18.html?hl=zh-tw">中文(台灣)</a>
     </td>
     <td>2016 年 3 月 18 日</td>
  </tr>
diff --git a/zh-cn/security/bulletin/2018-08-01.html b/zh-cn/security/bulletin/2018-08-01.html
index d4c8038..9307b3c 100644
--- a/zh-cn/security/bulletin/2018-08-01.html
+++ b/zh-cn/security/bulletin/2018-08-01.html
@@ -70,8 +70,7 @@
   <tr>
     <td>CVE-2018-9445</td>
     <td>
-    <a href="https://android.googlesource.com/platform/external/e2fsprogs/+/9a2d95e4ed9ec5ab76998654b1c2fba9cc139e50">A-80436257</a> [<a href="https://android.googlesource.com/platform/system/vold/+/940a1ff70cfc5f2e4de83da9ad84cd9734faadf6">2</a>]
-    </td>
+    <a href="https://android.googlesource.com/platform/external/e2fsprogs/+/9a2d95e4ed9ec5ab76998654b1c2fba9cc139e50">A-80436257</a> [<a href="https://android.googlesource.com/platform/system/vold/+/940a1ff70cfc5f2e4de83da9ad84cd9734faadf6">2</a>]</td>
     <td>EoP</td>
     <td>高</td>
     <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
@@ -79,8 +78,7 @@
   <tr>
     <td>CVE-2018-9438</td>
     <td>
-<a href="https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/b552ebf70913cc79085bcc4212235ea45e036d3b">A-78644887</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/e3854655e75d97552140d77cca5d20c121a17ef9">2</a>] [<a href="https://android.googlesource.com/platform/frameworks/opt/telephony/+/d1ce32b059bed774b41f11413c1d83a1bc412964">3</a>] [<a href="https://android.googlesource.com/platform/frameworks/base/+/97e1cd61d3040dd366ac9e25cdb6f134c7490846">4</a>]
-</td>
+<a href="https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/b552ebf70913cc79085bcc4212235ea45e036d3b">A-78644887</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/e3854655e75d97552140d77cca5d20c121a17ef9">2</a>] [<a href="https://android.googlesource.com/platform/frameworks/opt/telephony/+/d1ce32b059bed774b41f11413c1d83a1bc412964">3</a>] [<a href="https://android.googlesource.com/platform/frameworks/base/+/97e1cd61d3040dd366ac9e25cdb6f134c7490846">4</a>]</td>
     <td>DoS</td>
     <td>高</td>
     <td>8.1</td>
@@ -97,8 +95,7 @@
   <tr>
     <td>CVE-2018-9451</td>
     <td>
-<a href="https://android.googlesource.com/platform/frameworks/base/+/a409aa1214d6483efe129a4966f09aa4fdc097ad">A-79488511</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/1de25074adb5d9ed572d6a85e77d3df5ac3a7e9e">2</a>]
-</td>
+<a href="https://android.googlesource.com/platform/frameworks/base/+/a409aa1214d6483efe129a4966f09aa4fdc097ad">A-79488511</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/1de25074adb5d9ed572d6a85e77d3df5ac3a7e9e">2</a>]</td>
     <td>ID</td>
     <td>高</td>
     <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
@@ -125,8 +122,7 @@
   <tr>
     <td>CVE-2018-9427</td>
     <td>
-<a href="https://android.googlesource.com/platform/frameworks/av/+/08d392085c095e227c029f64644bc08ef5a544de">A-77486542</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/c9909e5a980f941a5b72477755e09fb4dc57c478">2</a>]
-</td>
+<a href="https://android.googlesource.com/platform/frameworks/av/+/08d392085c095e227c029f64644bc08ef5a544de">A-77486542</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/c9909e5a980f941a5b72477755e09fb4dc57c478">2</a>]</td>
     <td>RCE</td>
     <td>严重</td>
     <td>8.0、8.1</td>
@@ -222,8 +218,7 @@
   <tr>
     <td>CVE-2018-9448</td>
     <td>
-<a href="https://android.googlesource.com/platform/system/bt/+/13294c70a66347c9e5d05b9f92f8ceb6fe38d7f6">A-79944113</a> [<a href="https://android.googlesource.com/platform/system/bt/+/f1f1c3e00f8d1baad0215b057e6d894517eeaddb">2</a>]
-   </td>
+<a href="https://android.googlesource.com/platform/system/bt/+/13294c70a66347c9e5d05b9f92f8ceb6fe38d7f6">A-79944113</a> [<a href="https://android.googlesource.com/platform/system/bt/+/f1f1c3e00f8d1baad0215b057e6d894517eeaddb">2</a>]</td>
     <td>ID</td>
     <td>高</td>
     <td>8.0、8.1</td>
diff --git a/zh-cn/security/bulletin/2018-10-01.html b/zh-cn/security/bulletin/2018-10-01.html
index 0f97e60..323d6c6 100644
--- a/zh-cn/security/bulletin/2018-10-01.html
+++ b/zh-cn/security/bulletin/2018-10-01.html
@@ -67,8 +67,7 @@
   </tr>
   <tr>
    <td>CVE-2018-9490</td>
-   <td><a href="https://android.googlesource.com/platform/external/chromium-libpac/+/948d4753664cc4e6b33cc3de634ac8fd5f781382">A-111274046</a>
-      [<a href="https://android.googlesource.com/platform/external/v8/+/a24543157ae2cdd25da43e20f4e48a07481e6ceb">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/external/chromium-libpac/+/948d4753664cc4e6b33cc3de634ac8fd5f781382">A-111274046</a> [<a href="https://android.googlesource.com/platform/external/v8/+/a24543157ae2cdd25da43e20f4e48a07481e6ceb">2</a>]</td>
    <td>EoP</td>
    <td>严重</td>
    <td>7.0、7.1.1、7.1.2、8.0、8.1、9</td>
@@ -89,17 +88,14 @@
   </tr>
   <tr>
    <td>CVE-2018-9493</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/462aaeaa616e0bb1342e8ef7b472acc0cbc93deb">A-111085900</a>
-      [<a href="https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/e7364907439578ce5334bce20bb03fef2e88b107">2</a>]
-      [<a href="https://android.googlesource.com/platform/frameworks/base/+/ebc250d16c747f4161167b5ff58b3aea88b37acf">3</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/462aaeaa616e0bb1342e8ef7b472acc0cbc93deb">A-111085900</a> [<a href="https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/e7364907439578ce5334bce20bb03fef2e88b107">2</a>] [<a href="https://android.googlesource.com/platform/frameworks/base/+/ebc250d16c747f4161167b5ff58b3aea88b37acf">3</a>]</td>
    <td>ID</td>
    <td>高</td>
    <td>7.0、7.1.1、7.1.2、8.0、8.1、9</td>
   </tr>
   <tr>
    <td>CVE-2018-9452</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/54f661b16b308cf38d1b9703214591c0f83df64d">A-78464361</a>
-       [<a href="https://android.googlesource.com/platform/frameworks/base/+/3b6f84b77c30ec0bab5147b0cffc192c86ba2634">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/54f661b16b308cf38d1b9703214591c0f83df64d">A-78464361</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/3b6f84b77c30ec0bab5147b0cffc192c86ba2634">2</a>]</td>
    <td>DoS</td>
    <td>中</td>
    <td>7.0、7.1.1、7.1.2、8.0、8.1、9</td>
@@ -205,18 +201,14 @@
   </tr>
   <tr>
    <td>CVE-2018-9502</td>
-   <td><a href="https://android.googlesource.com/platform/system/bt/+/92a7bf8c44a236607c146240f3c0adc1ae01fedf">A-111936792</a>
-      [<a href="https://android.googlesource.com/platform/system/bt/+/d4a34fefbf292d1e02336e4e272da3ef1e3eef85">2</a>]
-      [<a href="https://android.googlesource.com/platform/system/bt/+/9fe27a9b445f7e911286ed31c1087ceac567736b">3</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/system/bt/+/92a7bf8c44a236607c146240f3c0adc1ae01fedf">A-111936792</a> [<a href="https://android.googlesource.com/platform/system/bt/+/d4a34fefbf292d1e02336e4e272da3ef1e3eef85">2</a>] [<a href="https://android.googlesource.com/platform/system/bt/+/9fe27a9b445f7e911286ed31c1087ceac567736b">3</a>]</td>
    <td>ID</td>
    <td>高</td>
    <td>7.0、7.1.1、7.1.2、8.0、8.1、9</td>
   </tr>
   <tr>
    <td>CVE-2018-9503</td>
-   <td><a href="https://android.googlesource.com/platform/system/bt/+/92a7bf8c44a236607c146240f3c0adc1ae01fedf">A-80432928</a>
-      [<a href="https://android.googlesource.com/platform/system/bt/+/d4a34fefbf292d1e02336e4e272da3ef1e3eef85">2</a>]
-      [<a href="https://android.googlesource.com/platform/system/bt/+/9fe27a9b445f7e911286ed31c1087ceac567736b">3</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/system/bt/+/92a7bf8c44a236607c146240f3c0adc1ae01fedf">A-80432928</a> [<a href="https://android.googlesource.com/platform/system/bt/+/d4a34fefbf292d1e02336e4e272da3ef1e3eef85">2</a>] [<a href="https://android.googlesource.com/platform/system/bt/+/9fe27a9b445f7e911286ed31c1087ceac567736b">3</a>]</td>
    <td>ID</td>
    <td>高</td>
    <td>7.0、7.1.1、7.1.2、8.0、8.1、9</td>
diff --git a/zh-cn/security/bulletin/index.html b/zh-cn/security/bulletin/index.html
index 13e4121..298e7e3 100644
--- a/zh-cn/security/bulletin/index.html
+++ b/zh-cn/security/bulletin/index.html
@@ -56,14 +56,8 @@
  </tr>
  <tr>
     <td><a href="/security/bulletin/2018-10-01.html">2018 年 10 月</a></td>
-    <td>即将发布<!--
-     <a href="/security/bulletin/2018-10-01.html">English</a>&nbsp;/
-     <a href="/security/bulletin/2018-10-01.html?hl=ja">日本語</a>&nbsp;/
-     <a href="/security/bulletin/2018-10-01.html?hl=ko">한국어</a>&nbsp;/
-     <a href="/security/bulletin/2018-10-01.html?hl=ru">ру́сский</a>&nbsp;/
-     <a href="/security/bulletin/2018-10-01.html?hl=zh-cn">中文&nbsp;(中国)</a>&nbsp;/
-     <a href="/security/bulletin/2018-10-01.html?hl=zh-tw">中文&nbsp;(台灣)</a>
-     -->
+    <td>
+     <a href="/security/bulletin/2018-10-01.html">English</a> / <a href="/security/bulletin/2018-10-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-10-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-10-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-10-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-10-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 10 月 1 日</td>
     <td>2018-10-01<br />2018-10-05</td>
@@ -71,12 +65,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-09-01.html">2018 年 9 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-09-01.html">English</a> /
-     <a href="/security/bulletin/2018-09-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-09-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-09-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-09-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-09-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-09-01.html">English</a> / <a href="/security/bulletin/2018-09-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-09-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-09-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-09-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-09-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 9 月 4 日</td>
     <td>2018-09-01<br />2018-09-05</td>
@@ -84,12 +73,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-08-01.html">2018 年 8 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-08-01.html">English</a> /
-     <a href="/security/bulletin/2018-08-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-08-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-08-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-08-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-08-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-08-01.html">English</a> / <a href="/security/bulletin/2018-08-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-08-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-08-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-08-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-08-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 8 月 6 日</td>
     <td>2018-08-01<br />2018-08-05</td>
@@ -97,12 +81,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-07-01.html">2018 年 7 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-07-01.html">English</a> /
-     <a href="/security/bulletin/2018-07-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-07-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-07-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-07-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-07-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-07-01.html">English</a> / <a href="/security/bulletin/2018-07-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-07-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-07-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-07-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-07-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 7 月 2 日</td>
     <td>2018-07-01<br />2018-07-05</td>
@@ -110,12 +89,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-06-01.html">2018 年 6 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-06-01.html">English</a> /
-     <a href="/security/bulletin/2018-06-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-06-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-06-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-06-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-06-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-06-01.html">English</a> / <a href="/security/bulletin/2018-06-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-06-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-06-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-06-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-06-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 6 月 4 日</td>
     <td>2018-06-01<br />2018-06-05</td>
@@ -123,12 +97,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-05-01.html">2018 年 5 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-05-01.html">English</a> /
-     <a href="/security/bulletin/2018-05-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-05-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-05-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-05-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-05-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-05-01.html">English</a> / <a href="/security/bulletin/2018-05-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-05-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-05-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-05-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-05-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 5 月 7 日</td>
     <td>2018-05-01<br />2018-05-05</td>
@@ -136,12 +105,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-04-01.html">2018 年 4 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-04-01.html">English</a> /
-     <a href="/security/bulletin/2018-04-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-04-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-04-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-04-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-04-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-04-01.html">English</a> / <a href="/security/bulletin/2018-04-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-04-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-04-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-04-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-04-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 4 月 2 日</td>
     <td>2018-04-01<br />2018-04-05</td>
@@ -149,12 +113,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-03-01.html">2018 年 3 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-03-01.html">English</a> /
-     <a href="/security/bulletin/2018-03-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-03-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-03-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-03-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-03-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-03-01.html">English</a> / <a href="/security/bulletin/2018-03-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-03-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-03-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-03-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-03-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 3 月 5 日</td>
     <td>2018-03-01<br />2018-03-05</td>
@@ -162,12 +121,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-02-01.html">2018 年 2 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-02-01.html">English</a> /
-     <a href="/security/bulletin/2018-02-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-02-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-02-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-02-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-02-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-02-01.html">English</a> / <a href="/security/bulletin/2018-02-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-02-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-02-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-02-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-02-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 2 月 5 日</td>
     <td>2018-02-01<br />2018-02-05</td>
@@ -175,12 +129,7 @@
  <tr>
     <td><a href="/security/bulletin/2018-01-01.html">2018 年 1 月</a></td>
     <td>
-     <a href="/security/bulletin/2018-01-01.html">English</a> /
-     <a href="/security/bulletin/2018-01-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2018-01-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2018-01-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2018-01-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2018-01-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2018-01-01.html">English</a> / <a href="/security/bulletin/2018-01-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2018-01-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2018-01-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2018-01-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2018-01-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2018 年 1 月 2 日</td>
     <td>2018-01-01<br />2018-01-05</td>
@@ -188,12 +137,7 @@
  <tr>
     <td><a href="/security/bulletin/2017-12-01.html">2017 年 12 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-12-01.html">English</a> /
-     <a href="/security/bulletin/2017-12-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-12-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-12-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-12-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-12-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-12-01.html">English</a> / <a href="/security/bulletin/2017-12-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-12-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-12-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-12-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-12-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 12 月 4 日</td>
     <td>2017-12-01<br />2017-12-05</td>
@@ -201,12 +145,7 @@
  <tr>
     <td><a href="/security/bulletin/2017-11-01.html">2017 年 11 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-11-01.html">English</a> /
-     <a href="/security/bulletin/2017-11-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-11-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-11-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-11-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-11-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-11-01.html">English</a> / <a href="/security/bulletin/2017-11-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-11-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-11-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-11-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-11-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 11 月 6 日</td>
     <td>2017-11-01<br />2017-11-05<br />2017-11-06</td>
@@ -214,12 +153,7 @@
  <tr>
     <td><a href="/security/bulletin/2017-10-01.html">2017 年 10 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-10-01.html">English</a> /
-     <a href="/security/bulletin/2017-10-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-10-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-10-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-10-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-10-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-10-01.html">English</a> / <a href="/security/bulletin/2017-10-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-10-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-10-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-10-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-10-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 10 月 2 日</td>
     <td>2017-10-01<br />2017-10-05</td>
@@ -227,12 +161,7 @@
  <tr>
     <td><a href="/security/bulletin/2017-09-01.html">2017 年 9 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-09-01.html">English</a> /
-     <a href="/security/bulletin/2017-09-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-09-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-09-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-09-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-09-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-09-01.html">English</a> / <a href="/security/bulletin/2017-09-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-09-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-09-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-09-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-09-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 9 月 5 日</td>
     <td>2017-09-01<br />2017-09-05</td>
@@ -240,12 +169,7 @@
  <tr>
     <td><a href="/security/bulletin/2017-08-01.html">2017 年 8 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-08-01.html">English</a> /
-     <a href="/security/bulletin/2017-08-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-08-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-08-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-08-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-08-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-08-01.html">English</a> / <a href="/security/bulletin/2017-08-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-08-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-08-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-08-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-08-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 8 月 7 日</td>
     <td>2017-08-01<br />2017-08-05</td>
@@ -253,12 +177,7 @@
  <tr>
     <td><a href="/security/bulletin/2017-07-01.html">2017 年 7 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-07-01.html">English</a> /
-     <a href="/security/bulletin/2017-07-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-07-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-07-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-07-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-07-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-07-01.html">English</a> / <a href="/security/bulletin/2017-07-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-07-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-07-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-07-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-07-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 7 月 5 日</td>
     <td>2017-07-01<br />2017-07-05</td>
@@ -266,12 +185,7 @@
  <tr>
     <td><a href="/security/bulletin/2017-06-01.html">2017 年 6 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-06-01.html">English</a> /
-     <a href="/security/bulletin/2017-06-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-06-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-06-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-06-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-06-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-06-01.html">English</a> / <a href="/security/bulletin/2017-06-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-06-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-06-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-06-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-06-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 6 月 5 日</td>
     <td>2017-06-01<br />2017-06-05</td>
@@ -279,60 +193,35 @@
  <tr>
     <td><a href="/security/bulletin/2017-05-01.html">2017 年 5 月</a></td>
     <td>
-     <a href="/security/bulletin/2017-05-01.html">English</a> /
-     <a href="/security/bulletin/2017-05-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-05-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-05-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-05-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-05-01.html?hl=zh-tw">中文 (台灣)</a>
+     <a href="/security/bulletin/2017-05-01.html">English</a> / <a href="/security/bulletin/2017-05-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-05-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-05-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-05-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-05-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 5 月 1 日</td>
     <td>2017-05-01<br />2017-05-05</td>
  </tr>
  <tr>
     <td><a href="/security/bulletin/2017-04-01.html">2017 年 4 月</a></td>
-    <td><a href="/security/bulletin/2017-04-01.html">English</a> /
-     <a href="/security/bulletin/2017-04-01.html?hl=ja">日本語</a> /
-     <a href="/security/bulletin/2017-04-01.html?hl=ko">한국어</a> /
-     <a href="/security/bulletin/2017-04-01.html?hl=ru">ру́сский</a> /
-     <a href="/security/bulletin/2017-04-01.html?hl=zh-cn">中文 (中国)</a> /
-     <a href="/security/bulletin/2017-04-01.html?hl=zh-tw">中文 (台灣)</a>
+    <td><a href="/security/bulletin/2017-04-01.html">English</a> / <a href="/security/bulletin/2017-04-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-04-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-04-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-04-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-04-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 4 月 3 日</td>
     <td>2017-04-01<br />2017-04-05</td>
  </tr>
  <tr>
     <td><a href="/security/bulletin/2017-03-01.html">2017 年 3 月</a></td>
-    <td><a href="/security/bulletin/2017-03-01.html">English</a> /
-      <a href="/security/bulletin/2017-03-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2017-03-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2017-03-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2017-03-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2017-03-01.html?hl=zh-tw">中文 (台灣)</a>
+    <td><a href="/security/bulletin/2017-03-01.html">English</a> / <a href="/security/bulletin/2017-03-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-03-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-03-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-03-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-03-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 3 月 6 日</td>
     <td>2017-03-01<br />2017-03-05</td>
  </tr>
  <tr>
     <td><a href="/security/bulletin/2017-02-01.html">2017 年 2 月</a></td>
-    <td><a href="/security/bulletin/2017-02-01.html">English</a> /
-      <a href="/security/bulletin/2017-02-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2017-02-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2017-02-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2017-02-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2017-02-01.html?hl=zh-tw">中文 (台灣)</a>
+    <td><a href="/security/bulletin/2017-02-01.html">English</a> / <a href="/security/bulletin/2017-02-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-02-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-02-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-02-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-02-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 2 月 6 日</td>
     <td>2017-02-01<br />2017-02-05</td>
  </tr>
  <tr>
     <td><a href="/security/bulletin/2017-01-01.html">2017 年 1 月</a></td>
-    <td><a href="/security/bulletin/2017-01-01.html">English</a> /
-      <a href="/security/bulletin/2017-01-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2017-01-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2017-01-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2017-01-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2017-01-01.html?hl=zh-tw">中文 (台灣)</a>
+    <td><a href="/security/bulletin/2017-01-01.html">English</a> / <a href="/security/bulletin/2017-01-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2017-01-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2017-01-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2017-01-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2017-01-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2017 年 1 月 3 日</td>
     <td>2017-01-01<br />2017-01-05</td>
@@ -340,12 +229,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-12-01.html">2016 年 12 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-12-01.html">English</a> /
-      <a href="/security/bulletin/2016-12-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-12-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-12-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-12-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-12-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-12-01.html">English</a> / <a href="/security/bulletin/2016-12-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-12-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-12-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-12-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-12-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 12 月 5 日</td>
     <td>2016-12-01<br />2016-12-05</td>
@@ -353,12 +237,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-11-01.html">2016 年 11 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-11-01.html">English</a> /
-      <a href="/security/bulletin/2016-11-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-11-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-11-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-11-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-11-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-11-01.html">English</a> / <a href="/security/bulletin/2016-11-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-11-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-11-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-11-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-11-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 11 月 7 日</td>
     <td>2016-11-01<br />2016-11-05<br />2016-11-06</td>
@@ -366,12 +245,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-10-01.html">2016 年 10 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-10-01.html">English</a> /
-      <a href="/security/bulletin/2016-10-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-10-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-10-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-10-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-10-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-10-01.html">English</a> / <a href="/security/bulletin/2016-10-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-10-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-10-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-10-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-10-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 10 月 3 日</td>
     <td>2016-10-01<br />2016-10-05</td>
@@ -379,12 +253,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-09-01.html">2016 年 9 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-09-01.html">English</a> /
-      <a href="/security/bulletin/2016-09-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-09-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-09-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-09-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-09-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-09-01.html">English</a> / <a href="/security/bulletin/2016-09-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-09-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-09-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-09-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-09-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 9 月 6 日</td>
     <td>2016-09-01<br />2016-09-05<br />2016-09-06</td>
@@ -392,12 +261,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-08-01.html">2016 年 8 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-08-01.html">English</a> /
-      <a href="/security/bulletin/2016-08-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-08-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-08-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-08-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-08-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-08-01.html">English</a> / <a href="/security/bulletin/2016-08-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-08-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-08-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-08-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-08-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 8 月 1 日</td>
     <td>2016-08-01<br />2016-08-05</td>
@@ -405,12 +269,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-07-01.html">2016 年 7 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-07-01.html">English</a> /
-      <a href="/security/bulletin/2016-07-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-07-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-07-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-07-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-07-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-07-01.html">English</a> / <a href="/security/bulletin/2016-07-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-07-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-07-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-07-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-07-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 7 月 6 日</td>
     <td>2016-07-01<br />2016-07-05</td>
@@ -418,12 +277,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-06-01.html">2016 年 6 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-06-01.html">English</a> /
-      <a href="/security/bulletin/2016-06-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-06-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-06-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-06-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-06-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-06-01.html">English</a> / <a href="/security/bulletin/2016-06-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-06-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-06-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-06-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-06-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 6 月 6 日</td>
     <td>2016-06-01</td>
@@ -431,12 +285,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-05-01.html">2016 年 5 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-05-01.html">English</a> /
-      <a href="/security/bulletin/2016-05-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-05-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-05-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-05-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-05-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-05-01.html">English</a> / <a href="/security/bulletin/2016-05-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-05-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-05-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-05-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-05-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 5 月 2 日</td>
     <td>2016-05-01</td>
@@ -444,12 +293,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-04-02.html">2016 年 4 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-04-02.html">English</a> /
-      <a href="/security/bulletin/2016-04-02.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-04-02.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-04-02.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-04-02.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-04-02.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-04-02.html">English</a> / <a href="/security/bulletin/2016-04-02.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-04-02.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-04-02.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-04-02.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-04-02.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 4 月 4 日</td>
     <td>2016-04-02</td>
@@ -457,12 +301,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-03-01.html">2016 年 3 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-03-01.html">English</a> /
-      <a href="/security/bulletin/2016-03-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-03-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-03-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-03-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-03-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-03-01.html">English</a> / <a href="/security/bulletin/2016-03-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-03-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-03-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-03-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-03-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 3 月 7 日</td>
     <td>2016-03-01</td>
@@ -470,12 +309,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-02-01.html">2016 年 2 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-02-01.html">English</a> /
-      <a href="/security/bulletin/2016-02-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-02-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-02-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-02-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-02-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-02-01.html">English</a> / <a href="/security/bulletin/2016-02-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-02-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-02-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-02-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-02-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 2 月 1 日</td>
     <td>2016-02-01</td>
@@ -483,12 +317,7 @@
  <tr>
     <td><a href="/security/bulletin/2016-01-01.html">2016 年 1 月</a></td>
     <td>
-      <a href="/security/bulletin/2016-01-01.html">English</a> /
-      <a href="/security/bulletin/2016-01-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2016-01-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2016-01-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2016-01-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2016-01-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-01-01.html">English</a> / <a href="/security/bulletin/2016-01-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2016-01-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2016-01-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2016-01-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2016-01-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2016 年 1 月 4 日</td>
     <td>2016-01-01</td>
@@ -496,12 +325,7 @@
  <tr>
     <td><a href="/security/bulletin/2015-12-01.html">2015 年 12 月</a></td>
     <td>
-      <a href="/security/bulletin/2015-12-01.html">English</a> /
-      <a href="/security/bulletin/2015-12-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2015-12-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2015-12-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2015-12-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2015-12-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2015-12-01.html">English</a> / <a href="/security/bulletin/2015-12-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2015-12-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2015-12-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2015-12-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2015-12-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2015 年 12 月 7 日</td>
     <td>2015-12-01</td>
@@ -509,12 +333,7 @@
 <tr>
     <td><a href="/security/bulletin/2015-11-01.html">2015 年 11 月</a></td>
     <td>
-      <a href="/security/bulletin/2015-11-01.html">English</a> /
-      <a href="/security/bulletin/2015-11-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2015-11-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2015-11-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2015-11-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2015-11-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2015-11-01.html">English</a> / <a href="/security/bulletin/2015-11-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2015-11-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2015-11-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2015-11-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2015-11-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2015 年 11 月 2 日</td>
     <td>2015-11-01</td>
@@ -522,12 +341,7 @@
  <tr>
     <td><a href="/security/bulletin/2015-10-01.html">2015 年 10 月</a></td>
     <td>
-      <a href="/security/bulletin/2015-10-01.html">English</a> /
-      <a href="/security/bulletin/2015-10-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2015-10-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2015-10-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2015-10-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2015-10-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2015-10-01.html">English</a> / <a href="/security/bulletin/2015-10-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2015-10-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2015-10-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2015-10-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2015-10-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2015 年 10 月 5 日</td>
     <td>2015-10-01</td>
@@ -535,12 +349,7 @@
  <tr>
     <td><a href="/security/bulletin/2015-09-01.html">2015 年 9 月</a></td>
     <td>
-      <a href="/security/bulletin/2015-09-01.html">English</a> /
-      <a href="/security/bulletin/2015-09-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2015-09-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2015-09-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2015-09-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2015-09-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2015-09-01.html">English</a> / <a href="/security/bulletin/2015-09-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2015-09-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2015-09-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2015-09-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2015-09-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2015 年 9 月 9 日</td>
     <td>无</td>
@@ -548,12 +357,7 @@
  <tr>
     <td><a href="/security/bulletin/2015-08-01.html">2015 年 8 月</a></td>
     <td>
-      <a href="/security/bulletin/2015-08-01.html">English</a> /
-      <a href="/security/bulletin/2015-08-01.html?hl=ja">日本語</a> /
-      <a href="/security/bulletin/2015-08-01.html?hl=ko">한국어</a> /
-      <a href="/security/bulletin/2015-08-01.html?hl=ru">ру́сский</a> /
-      <a href="/security/bulletin/2015-08-01.html?hl=zh-cn">中文 (中国)</a> /
-      <a href="/security/bulletin/2015-08-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2015-08-01.html">English</a> / <a href="/security/bulletin/2015-08-01.html?hl=ja">日本語</a> / <a href="/security/bulletin/2015-08-01.html?hl=ko">한국어</a> / <a href="/security/bulletin/2015-08-01.html?hl=ru">ру́сский</a> / <a href="/security/bulletin/2015-08-01.html?hl=zh-cn">中文 (中国)</a> / <a href="/security/bulletin/2015-08-01.html?hl=zh-tw">中文 (台灣)</a>
     </td>
     <td>2015 年 8 月 13 日</td>
     <td>无</td>
diff --git a/zh-cn/security/bulletin/pixel/2018-04-01.html b/zh-cn/security/bulletin/pixel/2018-04-01.html
index e4ed484..37fb9ff 100644
--- a/zh-cn/security/bulletin/pixel/2018-04-01.html
+++ b/zh-cn/security/bulletin/pixel/2018-04-01.html
@@ -25,7 +25,7 @@
 <p>
 本 Pixel/Nexus 安全公告详细介绍了会影响<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">受支持的 Google Pixel 和 Nexus 设备</a>(Google 设备)的安全漏洞和功能改进。对于 Google 设备,如果安全补丁程序级别是 2018-04-05 或更新,则意味着已解决本公告以及 <a href="/security/bulletin/2018-04-01">2018 年 4 月的 Android 安全公告</a>中所述的所有问题。要了解如何查看设备的安全补丁程序级别,请参阅<a href="https://support.google.com/pixelphone/answer/4457705">查看并更新 Android 版本</a>。</p>
 <p>
-所有受支持的 Google 设备都将会收到 2018-04-05 补丁程序级别的更新。我们建议所有用户都在自己的设备上接受这些更新。
+所有受支持的 Google 设备都将会收到 2018-04-05 补丁程序级别的更新。建议所有用户都在自己的设备上接受这些更新。
 </p>
 <p class="note">
 <strong>注意</strong>:可在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上找到 Google 设备固件映像。
@@ -36,7 +36,7 @@
 
 <h2 id="security-patches">安全补丁程序</h2>
 <p>
-漏洞列在所影响的组件下,内容包括问题描述和一个表,该表中包含 CVE、相关参考内容、<a href="#type">漏洞类型</a>、<a href="https://source.android.com/security/overview/updates-resources.html#severity">严重程度</a>和已更新的 Android 开源项目 (AOSP) 版本(如果适用)。如果有解决相应问题的公开更改记录(例如 AOSP 代码更改列表),我们会将 Bug ID 链接到该记录。如果某个 Bug 有多条相关的代码更改记录,我们还会通过 Bug ID 后面的数字链接到更多参考内容。
+漏洞列在所影响的组件下,不但含有问题描述,而且在一张表中列出 CVE、相关参考内容、<a href="#type">漏洞类型</a>、<a href="https://source.android.com/security/overview/updates-resources.html#severity">严重程度</a>和已更新的 Android 开源项目 (AOSP) 版本(如果适用)。如果有解决相应问题的公开更改记录(例如 AOSP 代码更改列表),我们会将 Bug ID 链接到该记录。如果某个 Bug 有多条相关的代码更改记录,我们还会通过 Bug ID 后面的数字链接到更多参考内容。
 </p>
 
 <h3 id="framework">框架</h3>
@@ -56,8 +56,7 @@
   </tr>
   <tr>
     <td>CVE-2017-13294</td>
-    <td><a href="https://android.googlesource.com/platform/packages/apps/Email/+/c3e0aba2a604ce7c3807d65df1e6a2b848287019">A-71814449</a>
-       [<a href="https://android.googlesource.com/platform/packages/apps/UnifiedEmail/+/e00598532bbfc8618b7c051cbf6bd15491f61f27">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/packages/apps/Email/+/c3e0aba2a604ce7c3807d65df1e6a2b848287019">A-71814449</a> [<a href="https://android.googlesource.com/platform/packages/apps/UnifiedEmail/+/e00598532bbfc8618b7c051cbf6bd15491f61f27">2</a>]</td>
     <td>ID</td>
     <td>中</td>
     <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
@@ -160,8 +159,7 @@
   </tr>
   <tr>
     <td>CVE-2017-13301</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/384689934d293acf532e3fea3e72ef78df4f2d1e">A-66498711</a>
-      [<a href="https://android.googlesource.com/platform/frameworks/base/+/d52b215f82e464705373d794748325298f0a1f9a">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/384689934d293acf532e3fea3e72ef78df4f2d1e">A-66498711</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/d52b215f82e464705373d794748325298f0a1f9a">2</a>]</td>
    <td>DoS</td>
    <td>中</td>
    <td>8.0</td>
@@ -337,9 +335,7 @@
   <tr>
     <td>CVE-2018-5825</td>
     <td>A-72957269<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=5ae227670444cf8ea7b8a8d98eab41404a03332f">QC-CR#2151146</a>
-       [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=cf0f031ffbb6a8e08e517f653045c3f81d7f2663">2</a>]
-       [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=09a34b7878a732187f9138900667d8abb2b1c39c">3</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=5ae227670444cf8ea7b8a8d98eab41404a03332f">QC-CR#2151146</a> [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=cf0f031ffbb6a8e08e517f653045c3f81d7f2663">2</a>] [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=09a34b7878a732187f9138900667d8abb2b1c39c">3</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>IPA 驱动程序</td>
@@ -347,8 +343,7 @@
   <tr>
     <td>CVE-2018-5824</td>
     <td>A-72957235<br />
-        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=b34f6f3afe229e32a32418f75889279f6e00d157">QC-CR#2149399</a>
-       [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=d3a92a1656a3ee2fc44d4ff98614a4f5b70f1893">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=b34f6f3afe229e32a32418f75889279f6e00d157">QC-CR#2149399</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=d3a92a1656a3ee2fc44d4ff98614a4f5b70f1893">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>WLAN</td>
@@ -411,8 +406,7 @@
   <tr>
     <td>CVE-2018-3567</td>
     <td>A-72956997<br />
-        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=f2627fca43bc4403a445c2b84481383ac0249364">QC-CR#2147119</a>
-       [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=25c131e8a807894e04f95bdeb1cbd0376eda3bea">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=f2627fca43bc4403a445c2b84481383ac0249364">QC-CR#2147119</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=25c131e8a807894e04f95bdeb1cbd0376eda3bea">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>WLAN</td>
@@ -463,9 +457,7 @@
   <tr>
     <td>CVE-2017-14880</td>
     <td>A-68992477<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=cbf3702ae1c5e2cacd6f15a5eb7a799e2f1ed96f">
-QC-CR#2078734</a>
-       [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=d72e444dce0b9d20fdcdc4daeb6227e3536eebf7">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=cbf3702ae1c5e2cacd6f15a5eb7a799e2f1ed96f">QC-CR#2078734</a> [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=d72e444dce0b9d20fdcdc4daeb6227e3536eebf7">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>IPA WAN 驱动程序</td>
@@ -613,11 +605,7 @@
    <td>Pixel、Pixel XL</td>
   </tr>
   <tr>
-   <td>A-68150449<br />
-       A-68059359<br />
-       A-69797741<br />
-       A-69378640<br />
-       A-68824279</td>
+   <td>A-68150449<br />A-68059359<br />A-69797741<br />A-69378640<br />A-68824279</td>
    <td>稳定性</td>
    <td>改进 Pixel 2 手机的 WLAN 稳定性</td>
    <td>Pixel 2、Pixel 2 XL</td>
@@ -653,9 +641,7 @@
    <td>所有</td>
   </tr>
   <tr>
-    <td>A-68923696<br />
-       A-68922470<br />
-       A-68940490</td>
+    <td>A-68923696<br />A-68922470<br />A-68940490</td>
    <td>证书</td>
    <td>升级证书以确保服务的持续性。</td>
    <td>Nexus 5X、Pixel、Pixel XL、Pixel 2、Pixel 2 XL</td>
@@ -679,13 +665,7 @@
    <td>Pixel 2、Pixel 2 XL</td>
   </tr>
   <tr>
-   <td>A-69017578<br />
-       A-68138080<br />
-       A-68205105<br />
-       A-70731000<br />
-       A-69574837<br />
-       A-68474108<br />
-       A-70406781</td>
+   <td>A-69017578<br />A-68138080<br />A-68205105<br />A-70731000<br />A-69574837<br />A-68474108<br />A-70406781</td>
    <td>连接、性能</td>
    <td>改进部分运营商网络的连接性和性能</td>
    <td>Pixel、Pixel XL、Pixel 2、Pixel 2 XL</td>
@@ -709,16 +689,13 @@
    <td>Pixel 2</td>
   </tr>
   <tr>
-   <td>A-69238007<br />
-       A-68202289<br />
-       A-69334308</td>
+   <td>A-69238007<br />A-68202289<br />A-69334308</td>
    <td>连接</td>
    <td>调整 APN 设置</td>
    <td>Nexus 5X、Pixel、Pixel XL、Pixel 2、Pixel 2 XL</td>
   </tr>
   <tr>
-   <td>A-69261367<br />
-       A-70512352</td>
+   <td>A-69261367<br />A-70512352</td>
    <td>短信</td>
    <td>改进部分运营商的彩信性能</td>
    <td>Nexus 5X、Pixel、Pixel XL、Pixel 2、Pixel 2 XL</td>
@@ -748,8 +725,7 @@
    <td>Pixel 2、Pixel 2 XL</td>
   </tr>
   <tr>
-   <td>A-69848394<br />
-       A-68275646</td>
+   <td>A-69848394<br />A-68275646</td>
    <td>性能</td>
    <td>改进免安装应用的性能</td>
    <td>所有</td>
@@ -767,8 +743,7 @@
    <td>Pixel 2、Pixel 2 XL</td>
   </tr>
   <tr>
-   <td>A-70094083<br />
-       A-70094701</td>
+   <td>A-70094083<br />A-70094701</td>
    <td>电池</td>
    <td>改进 Pixel 2 和 Pixel 2 XL 的电池性能</td>
    <td>Pixel 2、Pixel 2 XL</td>
@@ -798,9 +773,7 @@
    <td>Nexus 5X、Pixel、Pixel XL、Pixel 2、Pixel 2 XL</td>
   </tr>
   <tr>
-   <td>A-70580873<br />
-       A-70912923<br />
-       A-71497259</td>
+   <td>A-70580873<br />A-70912923<br />A-71497259</td>
    <td>连接</td>
    <td>改进部分运营商的通话性能</td>
    <td>Pixel、Pixel XL、Pixel 2、Pixel 2 XL</td>
@@ -836,8 +809,7 @@
    <td>所有</td>
   </tr>
   <tr>
-   <td>A-72797728<br />
-       A-71599119</td>
+   <td>A-72797728<br />A-71599119</td>
    <td>日志记录</td>
    <td>改进内部问题排查工具</td>
    <td>所有</td>
diff --git a/zh-cn/security/bulletin/pixel/2018-05-01.html b/zh-cn/security/bulletin/pixel/2018-05-01.html
index 72765ac..87703d9 100644
--- a/zh-cn/security/bulletin/pixel/2018-05-01.html
+++ b/zh-cn/security/bulletin/pixel/2018-05-01.html
@@ -245,8 +245,7 @@
   <tr>
     <td>CVE-2018-5851</td>
     <td>A-72957505<br />
-        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=103f385783f368cc5cd3c125390e6dfd43c36096">QC-CR#2146869</a>
-[<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=a9068fbb6bad55c9ecc80b9c3935969c8820c425">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=103f385783f368cc5cd3c125390e6dfd43c36096">QC-CR#2146869</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=a9068fbb6bad55c9ecc80b9c3935969c8820c425">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>WLAN</td>
@@ -254,8 +253,7 @@
   <tr>
     <td>CVE-2018-5842</td>
     <td>A-72957257<br />
-        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=f05883b3d442a7eb9df46a6bde08f1d5cdfc8133">QC-CR#2113219</a>
-[<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=21b91d4faa275d7b1ae58ad6a549cfa801066dfe">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=f05883b3d442a7eb9df46a6bde08f1d5cdfc8133">QC-CR#2113219</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=21b91d4faa275d7b1ae58ad6a549cfa801066dfe">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>WLAN</td>
@@ -263,8 +261,7 @@
   <tr>
     <td>CVE-2018-5848</td>
     <td>A-72957178<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=6e5a9b32503d37a202fccc5d24b189ae6107a256">
-QC-CR#2126062</a></td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=6e5a9b32503d37a202fccc5d24b189ae6107a256">QC-CR#2126062</a></td>
     <td>EoP</td>
     <td>中</td>
     <td>WIGIG</td>
@@ -279,8 +276,7 @@
   <tr>
     <td>CVE-2018-5843</td>
     <td>A-71501685<br />
-        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=ea4459a044783649b1695653f848647c68bee69d">
-QC-CR#2113385</a></td>
+        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=ea4459a044783649b1695653f848647c68bee69d">QC-CR#2113385</a></td>
     <td>EoP</td>
     <td>中</td>
     <td>调制解调器驱动程序</td>
@@ -288,8 +284,7 @@
   <tr>
     <td>CVE-2018-5844</td>
     <td>A-71501682<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=f8ed842bb3f4620eafa2669e0f534ce4c3ac6f07">
-QC-CR#2118860</a></td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=f8ed842bb3f4620eafa2669e0f534ce4c3ac6f07">QC-CR#2118860</a></td>
     <td>EoP</td>
     <td>中</td>
     <td>视频设备</td>
@@ -297,8 +292,7 @@
   <tr>
     <td>CVE-2018-5847</td>
     <td>A-71501681<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=3ddf48ce0377d71c86ff09d199f0307dad39fdd5">
-QC-CR#2120955</a></td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=3ddf48ce0377d71c86ff09d199f0307dad39fdd5">QC-CR#2120955</a></td>
     <td>EoP</td>
     <td>中</td>
     <td>Snapdragon 显示引擎</td>
@@ -314,8 +308,7 @@
   <tr>
     <td>CVE-2018-3581</td>
     <td>A-72957725<br />
-        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=becb9c5aaa05137ce1002f77f8a7d9e7e0799268">QC-CR#2150359</a>
-       [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=43c8a7f083c56b2f6aeac6d77721f5a70bdba99c">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=becb9c5aaa05137ce1002f77f8a7d9e7e0799268">QC-CR#2150359</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=43c8a7f083c56b2f6aeac6d77721f5a70bdba99c">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>WLAN</td>
@@ -323,8 +316,7 @@
   <tr>
     <td>CVE-2018-3576</td>
     <td>A-72957337<br />
-        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=bdf6936cd49a1e43184c7ff1635126fca946a995">
-QC-CR#2128512</a></td>
+        <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=bdf6936cd49a1e43184c7ff1635126fca946a995">QC-CR#2128512</a></td>
     <td>EoP</td>
     <td>中</td>
     <td>WLAN</td>
@@ -332,8 +324,7 @@
   <tr>
     <td>CVE-2018-3572</td>
     <td>A-72957724<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=b11e3a50197e73e397c36d335d56d905b99eb02c">QC-CR#2145996</a>
-       [<a href="https://source.codeaurora.org/quic/la/platform/vendor/opensource/audio-kernel/commit/?id=fbf66aa0c6ae84db64bdf0b8f3c3a32370c70c67">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=b11e3a50197e73e397c36d335d56d905b99eb02c">QC-CR#2145996</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/opensource/audio-kernel/commit/?id=fbf66aa0c6ae84db64bdf0b8f3c3a32370c70c67">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>音频</td>
@@ -341,8 +332,7 @@
   <tr>
     <td>CVE-2018-3571</td>
     <td>A-72957527<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=db41c9cc35d82238a4629e5ff29ba0c6b80b2cd6">
-QC-CR#2132332</a></td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-4.9/commit/?id=db41c9cc35d82238a4629e5ff29ba0c6b80b2cd6">QC-CR#2132332</a></td>
     <td>EoP</td>
     <td>中</td>
     <td>KGSL</td>
@@ -380,8 +370,7 @@
   <tr>
     <td>CVE-2017-15843</td>
     <td>A-72956941<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a549abd08f3a52593d9602128c63c1212e90984b">QC-CR#2032076</a>
-[<a href="https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=e05adec18cbc3c9213cc293441a2be8683339b4a">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a549abd08f3a52593d9602128c63c1212e90984b">QC-CR#2032076</a> [<a href="https://source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=e05adec18cbc3c9213cc293441a2be8683339b4a">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>Floor_vote 驱动程序</td>
@@ -389,8 +378,7 @@
   <tr>
     <td>CVE-2017-15842</td>
     <td>A-72957040<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=c4ab75dfc22f644fb5ee70bd515aaf633761cd3b">QC-CR#2123291</a>
-        [<a href="https://source.codeaurora.org/quic/la/platform/vendor/opensource/audio-kernel/commit/?id=6d42b0e51ed7f8e51397d89af66c1453beba51cd">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=c4ab75dfc22f644fb5ee70bd515aaf633761cd3b">QC-CR#2123291</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/opensource/audio-kernel/commit/?id=6d42b0e51ed7f8e51397d89af66c1453beba51cd">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
     <td>Qdsp6v2</td>
diff --git a/zh-cn/security/bulletin/pixel/2018-10-01.html b/zh-cn/security/bulletin/pixel/2018-10-01.html
index a95d2ef..a9412a7 100644
--- a/zh-cn/security/bulletin/pixel/2018-10-01.html
+++ b/zh-cn/security/bulletin/pixel/2018-10-01.html
@@ -32,7 +32,7 @@
 <strong>注意</strong>:可在 <a href="https://developers.google.com/android/images" class="external">Google Developers 网站</a>上找到 Google 设备固件映像。
 </p>
 
-<h2 id="announcements">通知</h2>
+<h2 id="announcements">通告</h2>
 
 <p>2018 年 10 月的 Pixel/Nexus 安全公告中没有 Pixel 或 Nexus 安全补丁程序。
 </p>
diff --git a/zh-cn/security/overview/acknowledgements.html b/zh-cn/security/overview/acknowledgements.html
index e19025a..28b1e22 100644
--- a/zh-cn/security/overview/acknowledgements.html
+++ b/zh-cn/security/overview/acknowledgements.html
@@ -25,6 +25,142 @@
 <h2 id="2018">2018 年</h2>
 <p>2018 年的安全致谢信息将按月列出。过去几年的致谢信息是列在一起的。</p>
 
+<h4 id="oct-2018">10 月</h4>
+
+<table>
+  <tbody><tr>
+   <th>研究人员</th>
+   <th>CVE</th>
+  </tr>
+  <tr>
+   <td>Abhishek Sidharthan(Amrita 工程学院)和 Pratheesh P Narayanan(Sree Narayana Gurukulam 工程学院)</td>
+   <td>CVE-2018-9452</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司成都安全响应中心的 Chong Wang (<a href="weibo.com/csddl">weibo.com/csddl</a>)</td>
+   <td>CVE-2018-9503、CVE-2018-9505</td>
+  </tr>
+  <tr>
+   <td>IOActive 高级安全顾问 Daniel Kachakil</td>
+   <td>CVE-2018-9493、CVE-2018-9546</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司 Alpha 团队的龚广</td>
+   <td>CVE-2018-9490</td>
+  </tr>
+  <tr>
+   <td>Google Project Zero 的 Jann Horn</td>
+   <td>CVE-2018-9514、CVE-2018-9515</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司 Alpha 团队的戴建军 (<a href="https://twitter.com/jioun_dai">@Jioun_dai</a>) 和龚广 (<a href="https://twitter.com/oldfresher">@oldfresher</a>)</td>
+   <td>CVE-2017-13283</td>
+  </tr>
+  <tr>
+   <td><a href="https://github.com/michalbednarski">Michał Bednarski</a></td>
+   <td>CVE-2018-9492</td>
+  </tr>
+  <tr>
+   <td>Niky1235 (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>)</td>
+   <td>CVE-2018-9473</td>
+  </tr>
+  <tr>
+   <td>华为移动安全实验室的丁鹏飞</td>
+   <td>CVE-2018-9506、CVE-2018-9507</td>
+  </tr>
+  <tr>
+   <td><a href="https://linkedin.com/in/raywdude">Raymond Wang</a></td>
+   <td>CVE-2018-9501</td>
+  </tr>
+  <tr>
+   <td><a href="https://srlabs.de">安全研究实验室</a>的 <a href="https://github.com/stze">Stephan Zeisberg</a></td>
+   <td>CVE-2018-9497</td>
+  </tr>
+  <tr>
+   <td>Zimperium zLabs 团队的 Tamir Zahavi-Brunner (<a href="https://twitter.com/tamir_zb">@tamir_zb</a>)</td>
+   <td>CVE-2018-9499</td>
+  </tr>
+  <tr>
+   <td><a href="xlab.tencent.com">腾讯安全玄武实验室</a>的王永科 (<a href="https://twitter.com/rudykewang">@Rudykewang</a>) 和 Xiangqian Zhang (<a href="https://twitter.com/h3rb0x">@h3rb0x</a>)</td>
+   <td>CVE-2018-9502、CVE-2018-9508、CVE-2018-9509、CVE-2018-9510</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司成都安全响应中心的韩子诺 (<a href="weibo.com/ele7enxxh">weibo.com/ele7enxxh</a>)</td>
+   <td>CVE-2018-9476、CVE-2018-9498、CVE-2018-9504</td>
+  </tr>
+</tbody></table>
+
+<h4 id="sept-2018">9 月</h4>
+
+<table>
+  <colgroup><col width="70%" />
+  <col width="30%" />
+  </colgroup><tbody><tr>
+   <th>研究人员</th>
+   <th>CVE</th>
+  </tr>
+  <tr>
+    <td>阿里巴巴移动安全团队的 Baozeng Ding (<a href="https://twitter.com/@sploving1" class="external">@sploving1</a>)、Chengming Yang 和 Yang Song</td>
+   <td>CVE-2018-9517</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司成都安全响应中心的 Chong Wang (<a href="http://weibo.com/csddl" class="external">weibo.com/csddl</a>)</td>
+   <td>CVE-2018-9480、CVE-2018-9481、CVE-2018-9482、CVE-2018-9485</td>
+  </tr>
+  <tr>
+   <td>L.O. 团队的 Cusas</td>
+   <td>CVE-2018-9440、CVE-2018-9467</td>
+  </tr>
+  <tr>
+   <td>IOActive 高级安全顾问 Daniel Kachakil</td>
+   <td>CVE-2018-9468</td>
+  </tr>
+  <tr>
+   <td>MS509Team (<a href="http://www.ms509.com" class="external">ms509.com</a>) 的 En He (<a href="https://twitter.com/@heeeeen4x" class="external">@heeeeen4x</a>) 和 Bo Liu</td>
+   <td>CVE-2018-9475</td>
+  </tr>
+  <tr>
+   <td>Innotec System 的 Hector Cuesta Garcia (<a href="https://twitter.com/hectorcuesta" class="external">@HectorCuesta</a>)</td>
+   <td>CVE-2018-9470</td>
+  </tr>
+  <tr>
+   <td>C0RE 团队的 Hongli Han (<a href="https://twitter.com/hexb1n" class="external">@hexb1n</a>) 和周明建 (<a href="https://twitter.com/mingjian_zhou" class="external">@Mingjian_Zhou</a>)</td>
+   <td>CVE-2018-11261</td>
+  </tr>
+  <tr>
+   <td>Google Project Zero 的 Jann Horn</td>
+   <td>CVE-2018-9488</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司 Alpha 团队的戴建军 (<a href="https://twitter.com/jioun_dai" class="external">@jioun_dai</a>) 和龚广 (<a href="https://twitter.com/@oldfresher" class="external">@oldfresher</a>)</td>
+   <td>CVE-2018-9478、CVE-2018-9479</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 IceSword 实验室的 Jianqiang Zhao (@jianqiangzhao) 和 pjf (<a href="http://weibo.com/jfpan" class="external">weibo.com/jfpan</a>)</td>
+   <td>CVE-2018-9516</td>
+  </tr>
+  <tr>
+   <td>M3, Inc.</td>
+   <td>CVE-2018-9469</td>
+  </tr>
+  <tr>
+   <td>C0RE 团队的周明建 (<a href="https://twitter.com/@Mingjian_Zhou" class="external">@Mingjian_Zhou</a>)</td>
+   <td>CVE-2018-11816</td>
+  </tr>
+  <tr>
+   <td>华为移动安全实验室的丁鹏飞</td>
+   <td>CVE-2018-9519</td>
+  </tr>
+  <tr>
+   <td>Zimperium zLabs 团队的 Tamir Zahavi-Brunner (<a href="https://twitter.com/@tamir_zb" class="external">@tamir_zb</a>)</td>
+   <td>CVE-2018-9411</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 科技有限公司成都安全响应中心的韩子诺 (<a href="http://weibo.com/ele7enxxh" class="external">weibo.com/ele7enxxh</a>)</td>
+   <td>CVE-2018-9471、CVE-2018-9474、CVE-2018-9483、CVE-2018-9484、CVE-2018-9486</td>
+  </tr>
+</tbody></table>
+
 <h4 id="aug-2018">8 月</h4>
 
 <table>
@@ -76,7 +212,7 @@
    <td>CVE-2017-18306、CVE-2017-18307</td>
   </tr>
   <tr>
-   <td><a href="http://c0reteam.org" class="external">CORE 团队</a>的 Tong Lin (<a href="mailto:[email protected]" class="external">[email protected]</a>) 和周明建 (<a href="https://twitter.com/Mingjian_Zhou" class="external">@Mingjian_Zhou</a>)</td>
+   <td><a href="http://c0reteam.org" class="external">C0RE 团队</a>的 Tong Lin (<a href="mailto:[email protected]" class="external">[email protected]</a>) 和周明建 (<a href="https://twitter.com/Mingjian_Zhou" class="external">@Mingjian_Zhou</a>)</td>
    <td>CVE-2018-9439</td>
   </tr>
   <tr>
@@ -123,7 +259,11 @@
   </tr>
   <tr>
    <td>奇虎 360 科技有限公司 Alpha 团队的戴建军 (<a href="https://twitter.com/Jioun_dai">@Jioun_dai</a>) 和龚广 (<a href="https://twitter.com/oldfresher">@oldfresher</a>)</td>
-   <td>CVE-2018-9418、CVE-2018-9413、CVE-2018-9365</td>
+   <td>CVE-2018-9418、CVE-2018-9419、CVE-2018-9413、CVE-2018-9365</td>
+  </tr>
+  <tr>
+   <td>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao" class="external">@jianqiangzhao</a>) 和 pjf (<a href="http://weibo.com/jfpan">weibo.com/jfpan</a>)</td>
+   <td>CVE-2018-9417</td>
   </tr>
   <tr>
    <td>特斯拉产品安全团队的 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>)</td>
@@ -134,6 +274,10 @@
    <td>CVE-2018-9423</td>
   </tr>
   <tr>
+   <td>百度安全实验室的丁鹏飞、包沉浮和韦韬</td>
+   <td>CVE-2017-15851</td>
+  </tr>
+  <tr>
    <td>Scott Bauer (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>)</td>
    <td>CVE-2018-9430</td>
   </tr>
@@ -172,6 +316,10 @@
    <td>CVE-2018-9375</td>
   </tr>
   <tr>
+   <td>derrek (<a href="https://twitter.com/derrekr6">@derrekr6</a>)</td>
+   <td>CVE-2017-6290、CVE-2017-6292、CVE-2017-6294</td>
+  </tr>
+  <tr>
    <td>奇虎 360 科技有限公司 Alpha 团队的 Elphet 和龚广</td>
    <td>CVE-2018-9348</td>
   </tr>
@@ -209,10 +357,10 @@
   </tr>
   <tr>
    <td>百度安全实验室的<br />丁鹏飞、包沉浮和韦韬</td>
-   <td>CVE-2018-5832</td>
+   <td>CVE-2018-5832、CVE-2018-5896、CVE-2018-5897</td>
   </tr>
   <tr>
-   <td>360 Beaconlab 的清东</td>
+   <td>360 Beaconlab 的 Qing Dong</td>
    <td>CVE-2018-9386</td>
   </tr>
   <tr>
@@ -465,6 +613,10 @@
    <td>CVE-2017-13269</td>
   </tr>
   <tr>
+   <td>Deja vu Security 的 Sang Shin Jung</td>
+   <td>CVE-2017-13270</td>
+  </tr>
+  <tr>
    <td>Zimperium zLabs 团队的 Tamir Zahavi-Brunner (<a href="https://twitter.com/tamir_zb">@tamir_zb</a>)</td>
    <td>CVE-2017-13253</td>
   </tr>
@@ -473,7 +625,7 @@
    <td>CVE-2017-13249、CVE-2017-13248、CVE-2017-13264</td>
   </tr>
   <tr>
-   <td>蚂蚁金服巴斯光年安全实验室的<a href=" https://twitter.com/wish_wu">吴潍浠</a> (<a href="http://www.weibo.com/wishlinux">@wish_wu</a>)</td>
+   <td>蚂蚁金服巴斯光年安全实验室的<a href="http://www.weibo.com/wishlinux">吴潍浠</a> (<a href=" https://twitter.com/wish_wu">@wish_wu</a>)</td>
    <td>CVE-2017-13259、CVE-2017-13272</td>
   </tr>
   <tr>
@@ -559,7 +711,7 @@
    </td>
   </tr>
   <tr>
-   <td><a href="mailto:[email protected]">Niky1235</a> (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>)</td>
+   <td><a href="mailto:jiych.guru&#64;gmail.com">Niky1235</a> (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>)</td>
    <td>CVE-2017-13230、CVE-2017-13234
    </td>
   </tr>
@@ -647,7 +799,7 @@
    <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>) 和周明建 (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou)</a></td>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的 Hongli Han (<a href="https://twitter.com/HexB1n">@HexB1n</a>) 和周明建 (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
    <td>CVE-2017-13183、CVE-2017-13180</td>
   </tr>
   <tr>
@@ -663,7 +815,7 @@
    <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><a href="mailto:jiych.guru&#64;gmail.com">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>
@@ -1071,7 +1223,7 @@
    <td>CVE-2016-5552</td>
   </tr>
   <tr>
-   <td><a href="mailto:[email protected]">Niky1235</a> (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>)</td>
+   <td><a href="mailto:jiych.guru&#64;gmail.com">Niky1235</a> (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>)</td>
    <td>CVE-2017-0603、CVE-2017-0670、CVE-2017-0697、CVE-2017-0726、CVE-2017-0818</td>
   </tr>
   <tr>
@@ -1112,7 +1264,7 @@
   </tr>
   <tr>
    <td>腾讯科恩实验室的何淇丹 (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>)</td>
-   <td>CVE-2017-0325、CVE-2017-0337、CVE-2017-0382、CVE-2017-0427、CVE-2017-0476、CVE-2017-0544、CVE-2017-0861、CVE-2017-0866、CVE-2017-13167、CVE-2017-15868</td>
+   <td>CVE-2017-0325、CVE-2017-0337、CVE-2017-0382、CVE-2017-0427、CVE-2017-0476、CVE-2017-0544、CVE-2017-0861、CVE-2017-0866、CVE-2017-13167、CVE-2017-13324、CVE-2017-15868</td>
   </tr>
   <tr>
    <td>奇虎 360 的 Qing Zhang</td>
@@ -1231,7 +1383,7 @@
    <td>CVE-2017-0577、CVE-2017-0580</td>
   </tr>
   <tr>
-   <td>蚂蚁金服巴斯光年安全实验室的<a href="https://twitter.com/wish_wu">吴潍浠</a> (<a href="http://www.weibo.com/wishlinux">@wish_wu</a>)</td>
+   <td>蚂蚁金服巴斯光年安全实验室的<a href="http://www.weibo.com/wishlinux">吴潍浠</a> (<a href="https://twitter.com/wish_wu">@wish_wu</a>)</td>
    <td>CVE-2017-0408、CVE-2017-0477、CVE-2017-11063、CVE-2017-11092</td>
   </tr>
   <tr>
@@ -1471,7 +1623,7 @@
 
 <p><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>)</p>
 
-<p>Gal Beniamini(<a href="https://twitter.com/@laginimaineb">@laginimaineb</a>、<a href="http://bits-please.blogspot.com/">http://bits-please.blogspot.com</a>)</p>
+<p>Gal Beniamini (<a href="https://twitter.com/@laginimaineb">@laginimaineb</a>、<a href="http://bits-please.blogspot.com/">http://bits-please.blogspot.com</a>)</p>
 
 <p>奇虎 360 科技有限公司 0x031E 实验室的陈耿佳 (<a href="https://twitter.com/@chengjia4574">@chengjia4574</a>)</p>
 
@@ -1683,7 +1835,7 @@
 
 <p>北京大学的 <a href="mailto:[email protected]">Xinhui Han</a></p>
 
-<p><a href="http://www.360safe.com/">奇虎 360</a> <a href="http://c0reteam.org">C0RE 团队</a>的 Xuxian Jiang</p>
+<p><a href="http://www.360safe.com/">奇虎 360</a><a href="http://c0reteam.org">C0RE 团队</a>的 Xuxian Jiang</p>
 
 <p>Android Bionic 团队的 Yabin Cui</p>
 
@@ -1892,12 +2044,11 @@
 
 <p>Sebastian Brenza</p>
 
-<p>EC SPRIDE 达姆施塔特工业大学<a href="https://blogs.uni-paderborn.de/sse/">安全软件工程团队</a>的 Siegfried Rasthofer (<a href="mailto:[email protected]">[email protected]</a>)</p>
+<p>EC SPRIDE 达姆施塔特工业大学<a href="https://blogs.uni-paderborn.de/sse/">安全软件工程团队</a>的 Siegfried Rasthofer <a href="mailto:[email protected]">[email protected]</a>)</p>
 
 <p><a href="http://www.sonymobile.com">索尼移动</a></p>
 
-<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.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">
@@ -1928,8 +2079,7 @@
 
 <p>印第安纳大学布卢明顿分校的 <a href="http://www.informatics.indiana.edu/xw7/">Xiaofeng Wang</a> (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
-<p><a href="http://www.cs.indiana.edu/~zhou/">印第安纳大学布卢明顿分校</a>的 Xiaoyong Zhou <br />
-(<a href="https://twitter.com/xzhou">@xzhou</a>、<a href="mailto:[email protected]">[email protected]</a>)</p>
+<p><a href="http://www.cs.indiana.edu/~zhou/">印第安纳大学布卢明顿分校</a>的 Xiaoyong Zhou <br />(<a href="https://twitter.com/xzhou">@xzhou</a>、<a href="mailto:[email protected]">[email protected]</a>)</p>
 
 <p>北京大学的 Xinhui Han (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
@@ -1949,13 +2099,13 @@
 
 <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>)
+<p><a href="http://www.accuvant.com/">Accuvant LABS</a> 的 Joshua J. Drake of (<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>
 
-<p><a href="http://raonsecurity.com/">RaonSecurity</a> 的 Lucas Yang(amadoh4ck、<a href="mailto:[email protected]">[email protected]</a>)</p>
+<p><a href="http://raonsecurity.com/">RaonSecurity</a> 的 Lucas Yang (amadoh4ck) (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
 <p>印第安纳大学布卢明顿分校的 <a href="http://homes.soic.indiana.edu/luyixing">Luyi Xing</a> (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
diff --git a/zh-cn/security/selinux/compatibility.html b/zh-cn/security/selinux/compatibility.html
index 97bf87b..98a66e1 100644
--- a/zh-cn/security/selinux/compatibility.html
+++ b/zh-cn/security/selinux/compatibility.html
@@ -24,7 +24,7 @@
 本文介绍 Android 如何处理与平台 OTA 相关的政策兼容性问题,其中新平台 SELinux 设置可能与旧供应商 SELinux 设置有所不同。
 </p>
 <p>
-<em></em><em></em>基于 Treble 的 SELinux 政策设计考虑到平台和供应商政策之间的二进制文件区别;如果供应商分区生成依赖项(例如 <code>platform</code> &lt; <code>vendor</code> &lt; <code>oem</code>),则该方案会变得更加复杂。
+基于 Treble 的 SELinux 政策设计考虑到平台和供应商政策之间的二进制文件区别;如果供应商分区生成依赖项(例如 <code>platform</code> &lt; <code>vendor</code> &lt; <code>oem</code>),则该方案会变得更加复杂。<em></em><em></em>
 </p>
 <p>
 在 Android 8.0 及更高版本中,SELinux 全局政策划分为私有和公共组件。公共组件包含政策和相关基础架构,保证可用于平台版本。
@@ -140,7 +140,9 @@
   </tr>
 </tbody></table>
 <aside class="note">
-  <strong>*</strong> 有关更多示例,请参阅 <a href="https://android.googlesource.com/platform/system/sepolicy/+/master/private/file_contexts" class="external"><code>system/sepolicy/private/file_contexts</code></a>。</aside>
+  <strong>*</strong> 有关更多示例,请参阅
+<a href="https://android.googlesource.com/platform/system/sepolicy/+/master/private/file_contexts" class="external">
+  <code>system/sepolicy/private/file_contexts</code></a>。</aside>
 
 <p>
 因此,您在 <code>vendor</code> 分区中标记额外的文件时,必须遵循特定规则(通过 <code>neverallows</code> 强制执行):
@@ -163,21 +165,21 @@
 <code>Debugfs</code> 可以在 <code>file_contexts</code> 和 <code>genfscon</code> 中进行标记。在 Android 7.0 中,平台和供应商都会标记 <code>debugfs</code>。
 </p>
 <p>
-<strong>建议</strong>:在短期内,只有供应商政策标记 <code>debugfs</code>。从长远来看,请移除 <code>debugfs</code>。
+<strong>建议</strong>:在短期内,只有供应商政策可以标记 <code>debugfs</code>。从长远来看,请移除 <code>debugfs</code>。
 </p>
 <h4 id="tracefs">Tracefs (/sys/kernel/debug/tracing)</h4>
 <p>
 <code>Tracefs</code> 可以在 <code>file_contexts</code> 和 <code>genfscon</code> 中进行标记。在 Android 7.0 中,只有平台标记 <code>tracefs</code>。
 </p>
 <p>
-<strong>建议</strong>:只有平台标记 <code>tracefs</code>。
+<strong>建议</strong>:只有平台可以标记 <code>tracefs</code>。
 </p>
 <h4 id="sysfs">Sysfs (/sys)</h4>
 <p>
 <code>/sys</code> 中的文件可以使用 <code>file_contexts</code> 和 <code>genfscon</code> 进行标记。在 Android 7.0 中,平台和供应商都使用 <code>file_contexts</code> 和 <code>genfscon</code> 来标记 <code>sysfs</code> 中的文件。
 </p>
 <p>
-<strong>建议</strong>:平台可以标记非设备特定的 <code>sysfs</code> 节点。否则,只有供应商可以标记文件。
+<strong>建议</strong>:平台可以标记非特定于设备的 <code>sysfs</code> 节点。否则,只有供应商可以标记文件。
 </p>
 <h4 id="tmpfs">tmpfs (/dev)</h4>
 <p>
@@ -248,7 +250,7 @@
 </p>
 <p>
 以 <code>allow source_foo target_bar:<em>class
-perm</em>;</code> 形式导出的平台公共政策包含在供应商政策中。在<a href="/security/selinux/build">编译</a>(包括相应的版本)期间,它将转换为将放入设备供应商部分的政策(显示在转换后的通用中间语言 (CIL) 中):
+perm</em>;</code> 形式导出的平台公共政策包含在供应商政策中。在<a href="/security/selinux/build">编译</a>(包括相应的版本)期间,它将转换为将放入设备供应商部分的政策(以转换后的通用中间语言 (CIL) 显示):
 </p>
 <pre class="prettyprint"> (allow source_foo_vN target_bar_vN (class (perm)))</pre>
 <p>
@@ -257,7 +259,7 @@
 
 <h3 id="policy-diffs">政策差异</h3>
 <p>
-如果不在各版本差异中将属性映射到类型,那么通过向每种类型的末尾处添加 <code>_v<em>N</em></code> 来自动创建属性不起任何作用。Android 维护着属性版本之间的映射以及类型到这些属性的映射。这是在前面提到的包含语句的映射文件(例如 (CIL))中完成的:
+如果不在各版本差异中将属性映射到类型,那么通过向每种类型的末尾添加 <code>_v<em>N</em></code> 来自动创建属性不起任何作用。Android 维护着属性版本之间的映射以及类型到这些属性的映射。这是在前面提到的包含语句的映射文件(例如 (CIL))中完成的:
 </p>
 
 <pre class="prettyprint">(typeattributeset foo_vN (foo))</pre>
@@ -505,7 +507,7 @@
 建议:
 </p>
 <ul>
-<li>不受信任的应用应与系统服务通信,系统服务再与供应商 HIDL HAL 通信。例如,应用可以与 <code><a href="https://android.googlesource.com/platform/system/sepolicy/+/master/public/app.te#209" class="external">binderservicedomain</a></code> 通信,然后 <code>mediaserver</code>(这是 <code>binderservicedomain</code>)再与 <code><a href="https://android.googlesource.com/platform/system/sepolicy/+/master/private/mediaserver.te#6" class="external">hal_graphics_allocator</a></code> 通信。
+<li>不受信任的应用应与系统服务通信,系统服务再与供应商 HIDL HAL 通信。例如,应用可以与 <code><a href="https://android.googlesource.com/platform/system/sepolicy/+/master/public/app.te#209" class="external">binderservicedomain</a></code> 通信,然后 <code>mediaserver</code>(属于 <code>binderservicedomain</code>)再与 <code><a href="https://android.googlesource.com/platform/system/sepolicy/+/master/private/mediaserver.te#6" class="external">hal_graphics_allocator</a></code> 通信。
 
 <p><strong><em>或</em></strong></p></li>
 <li>需要直接访问 <code>vendor</code> HAL 的应用应具有各自的供应商定义的 sepolicy 域。</li>
diff --git a/zh-cn/security/trusty/index.html b/zh-cn/security/trusty/index.html
index 344f41d..2ed7dda 100644
--- a/zh-cn/security/trusty/index.html
+++ b/zh-cn/security/trusty/index.html
@@ -29,7 +29,7 @@
 
 <p><strong>重要提示</strong>:Trusty 和 Trusty API 随时可能发生变化。</p>
 
-<p>如需关于 Trusty API 的信息,请参阅 <a href="trusty-ref.html">API 参考</a>。</p>
+<p>如需关于 Trusty API 的信息,请参阅 <a href="/security/trusty/trusty-ref">API 参考</a>。</p>
 
 <h2 id="uses_examples">使用和示例</h2>
 
diff --git a/zh-cn/setup/build/gsi.html b/zh-cn/setup/build/gsi.html
index 09fdb6a..262d2da 100644
--- a/zh-cn/setup/build/gsi.html
+++ b/zh-cn/setup/build/gsi.html
@@ -4,6 +4,7 @@
     <meta name="book_path" value="/_book.yaml"/>
   </head>
   <body>
+
   <!--
       Copyright 2018 The Android Open Source Project
 
@@ -20,593 +21,396 @@
       limitations under the License.
   -->
 
-<h2 id="overview">概述</h2>
-<p>
-本文档介绍了适用于 Android 9 的常规系统映像 (GSI),并详细介绍了适用于搭载 Android 9 设备的 GSI 与适用于升级到 Android 9 设备的 GSI 之间的差异。
+<p>常规系统映像 (GSI) 是包含已针对 Android 设备调整配置的系统映像。这种映像被视为所有 Android 设备应该都能顺利运行且包含未经修改的 Android 开源项目 (AOSP) 代码的“纯 Android”实现。
 </p>
+
+<p>GSI 中的内容不依赖于供应商映像。为了验证 GSI 的独立性,Android 设备的系统映像会被替换为 GSI,然后通过<a href="/compatibility/vts/">供应商测试套件 (VTS)</a> 和<a href="/compatibility/cts/">兼容性测试套件 (CTS)</a> 进行全面测试。同样,您可以使用 GSI 替换自己的系统映像,以验证 Android 设备能够正确实现供应商接口。
+</p>
+
+<h2 id="gsi-configuration-and-variances">GSI 配置和差异</h2>
+
+<p>GSI 的目标是为所有 Android 设备提供特定的通用配置,同时允许不同的供应商设备之间存在差异。当前的 GSI 基于 Android 9。
+</p>
+
+<p>当前的 GSI 具有以下配置:</p>
+
+<ul>
+  <li><strong>Treble</strong>。GSI 完全支持 Android 8.0 中引入的<a href="/devices/architecture/#hidl">基于 HIDL 的架构更改</a>(也称为“Treble”),其中包括对 <a href="/reference/hidl/">HIDL 接口</a>的支持。您可以在任何使用 HIDL 供应商接口的 Android 设备上使用 GSI(如需了解详情,请参阅<a href="/devices/architecture/#resources">关于架构的资源</a>)。</li>
+  <li><strong>验证启动。</strong> GSI 不包含验证启动解决方案(<a href="/security/verifiedboot/">vboot 1.0</a>、<a href="/security/verifiedboot/avb">AVB</a> 等)。要将 GSI 刷写到 Android 设备上,此设备必须具有停用验证启动的方法。</li>
+  <li><strong>编译变体</strong>。GSI 始终凭借 <code>userdebug</code> 编译变体来支持运行 VTS 和 CTS。将系统映像替换为 GSI 后,您可以对设备进行 Root 操作,然后使用 <code>user</code> 版本的供应商映像和 <code>userdebug</code> 版本的系统映像进行测试。</li>
+  <li><strong>文件系统和映像格式</strong>。GSI 使用具有稀疏映像格式的 ext4 文件系统。</li>
+</ul>
+
+<p>当前的 GSI 包含以下主要差异:</p>
+
+<ul>
+  <li><strong>版本</strong>。支持 Android 8.0、Android 8.1 和 Android 9。</li>
+  <li><strong>CPU 架构</strong>。支持不同的 CPU 指令(ARM、x86 等)和 CPU 位数(32 位或 64 位)。</li>
+  <li><strong>分区布局</strong>。可以使用 <a href="/devices/bootloader/system-as-root">system-as-root</a> 或非 system-as-root 分区布局。</li>
+  <li>支持 binder 接口位数。</li>
+</ul>
+
 <h2 id="gsi-types">GSI 类型</h2>
-<p>
-Android 9 支持以下 GSI:
-</p>
+
+<p>GSI 类型取决于设备搭载的 Android 版本。Android 9 支持以下 GSI:</p>
+
 <table>
   <tbody><tr>
-   <th><strong>GSI 名称</strong>
-   </th>
-   <th><strong>说明</strong>
-   </th>
-   <th><strong>产品名称</strong>
-   </th>
+   <th>GSI 名称</th>
+   <th>说明</th>
+   <th>产品名称</th>
   </tr>
   <tr>
-   <td>P GSI
-   </td>
-   <td>适用于搭载 Android 9 的设备
-   </td>
-   <td><code>aosp_$arch</code>
-   </td>
+   <td>Android GSI</td>
+   <td>适用于搭载 Android 9 的设备</td>
+   <td><code>aosp_$arch</code></td>
   </tr>
   <tr>
-   <td>旧版 GSI
-   </td>
-   <td>适用于升级到 Android 9 的设备
-   </td>
-   <td><code>aosp_$arch_a(b)</code>
-   </td>
+   <td>旧版 GSI</td>
+   <td>适用于搭载 Android 8.0 或 Android 8.1 的设备</td>
+   <td><code>aosp_$arch_a(b)</code></td>
   </tr>
 </tbody></table>
-<p>
-所有 GSI 都是从 Android 9 代码库编译的。
+
+<aside class="note">
+  <strong>注意</strong>:要为某个设备确定合适的 GSI,请将此设备连接到工作站,然后运行 <code>adb shell getprop ro.product.first_api_level</code>。如果 API 级别为 28,则使用 Android GSI;如果 API 级别为 27,则使用旧版 GSI。如果没有系统属性,则说明此设备可能不受支持。
+</aside>
+
+<p>所有 GSI 都是从 Android 9 代码库编译的。是否支持旧版 GSI 取决于设备的供应商接口实现,并非所有搭载 Android 8.0 或 Android 8.1 的设备都能使用旧版 GSI。有关详情,请参阅<a href="#vendor-binaries-and-vndk-dependencies">供应商二进制文件和 VNDK 依赖项</a>。
 </p>
-<h3 id="changes-in-p-gsis">适用于 Android 9 的 GSI 中的变更</h3>
-<p>
-搭载 Android 9 的设备必须使用 P GSI,P GSI 与早期 GSI 相比存在以下主要变更:
-</p><ul>
-<li><strong>合并 GSI 和模拟器。</strong>GSI 是根据模拟器产品(例如,<code>aosp_arm64</code>、<code>aosp_x86</code> 等)的系统映像编译的。</li><li><strong>System-as-root</strong>。在以前的 Android 版本中,不支持 A/B 更新的设备可以在 <code>/system</code> 目录下装载系统映像。<strong></strong>在 Android 9 中,系统映像的 root 作为设备的 root 装载。
-</li><li><strong>64 位 binder 接口</strong>。在 Android 8.x 中,32 位 GSI 使用 32 位 binder 接口。Android 9 不支持 32 位 binder 接口,因此 32 位 GSI 和 64 位 GSI 都使用 64 位 binder 接口。
-</li><li><strong>强制执行 VNDK</strong>。在 Android 8.1 中,VNDK 是可选的。在 Android 9 中,VNDK 是强制性的,这意味着<strong>不得</strong>设置 <code>BOARD_VNDK_RUNTIME_DISABLE</code>:<code>BOARD_VNDK_RUNTIME_DISABLE :=  # must not be set</code>
-</li><li><strong>兼容的系统属性</strong>。Android 9 支持对兼容的系统属性进行访问检查:<code>
-PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE := true</code>。</li></ul>
-<p>
-要通过 cts-on-gsi 测试搭载 Android 9 的设备,请使用 <a href="#p-gsi-build-targets">P GSI 的编译目标</a>。
+
+<h3 id="changes-in-p-gsis">Android 9 GSI 变更</h3>
+
+<p>搭载 Android 9 的设备必须使用 Android 9 GSI,Android 9 GSI 与早期 GSI 相比存在以下主要变化:</p>
+
+<ul>
+  <li><strong>合并 GSI 和模拟器</strong>。GSI 是根据模拟器产品(例如,<code>aosp_arm64</code>、<code>aosp_x86</code> 等)的系统映像编译的。</li>
+  <li><strong>System-as-root</strong>。在以前的 Android 版本中,不支持 A/B 更新的设备可以在 <code>/system</code> 目录下装载系统映像。在 Android 9 中,系统映像的 root 作为设备的 root 装载。</li>
+    <li><strong>64 位 binder 接口</strong>。在 Android 8.x 中,32 位 GSI 使用 32 位 binder 接口。Android 9 不支持 32 位 binder 接口,因此 32 位 GSI 和 64 位 GSI 都使用 64 位 binder 接口。</li>
+    <li><strong>强制执行 VNDK</strong>。在 Android 8.1 中,VNDK 是可选的。在 Android 9 中,VNDK 是强制性的,这意味着 <code>BOARD_VNDK_RUNTIME_DISABLE</code> <strong>不可</strong>设置 (<code>BOARD_VNDK_RUNTIME_DISABLE :=  # must not be set</code>)。</li>
+    <li><strong>兼容的系统属性</strong>。Android 9 支持对兼容的系统属性进行访问检查:<code>PRODUCT_COMPATIBLE_PROPERTY_OVERRIDE := true</code>。</li>
+</ul>
+
+<p>要通过 cts-on-gsi 测试搭载 Android 9 的设备,请使用 <a href="#p-gsi-build-targets">Android 9 GSI 的编译目标</a>。</p>
+
+<h3 id="changes-in-legacy-gsis">Android 9 旧版 GSI 变更</h3>
+
+<p>升级到 Android 9 的设备可以使用名称带后缀 <code>_ab</code> 或 <code>_a</code> 的旧版 GSI 产品(例如,<code>aosp_arm64_ab</code>、<code>aosp_x86_a</code>)。此 GSI 支持以下升级用例:</p>
+
+<ul>
+  <li>具有 Android 8.1 供应商接口实现的设备</li>
+  <li>更新到 Android 9 供应商接口实现的设备</li>
+</ul>
+
+<p>旧版 GSI 是从 Android 9 源代码树编译的,但包含以下针对升级设备的向后兼容配置:</p>
+
+<ul>
+  <li><strong>非 system-as-root</strong>。不支持系统作为 root 的设备可以继续使用 <code>_a</code> 产品(例如 <code>aosp_arm_a</code>)。</li>
+  <li><strong>32 位用户空间 + 32 位 binder 接口。</strong>32 位 GSI 可以继续使用 32 位 binder 接口。</li>
+  <li><strong>8.1 VNDK</strong>。设备可以使用随附的 8.1 VNDK。</li>
+  <li><strong>装载目录</strong>。一些旧版设备使用目录作为装载指针(例如,<code>/bluetooth</code>、<code>/firmware/radio</code>、<code>/persist</code> 等)。</li>
+</ul>
+
+<p>要通过 cts-on-gsi 测试升级到 Android 9 的设备,请使用<a href="#legacy-gsi-build-targets">旧版 GSI 的编译目标</a>。</p>
+
+<aside class="note">
+  <strong>注意</strong>:如果 Android 9 之前的设备实现了 Android 9 供应商接口并满足 Android 9 中引入的所有要求,请不要使用旧版 GSI,而是将 Android 9 GSI 用于 VTS 和 cts-on-gsi。
+</aside>
+
+<h3 id="changes-to-keymaster-behavior">Android 9 Keymaster 变更</h3>
+
+<p>在早期版本的 Android 中,实现 Keymaster 3 或更早版本的设备需要验证并确保运行系统报告的版本信息(<code>ro.build.version.release</code> 和 <code>ro.build.version.security_patch</code>)与引导加载程序报告的版本信息匹配。此类信息通常可以从引导映像标头中获取。
 </p>
-<h3 id="changes-in-legacy-gsis">旧版 GSI 中的变更</h3>
-<p>
-升级到 Android 9 的设备可以使用名称带后缀 <code>_ab</code> 或 <code>_a</code> 的旧版 GSI 产品(例如,<code>aosp_arm64_ab</code>、<code>aosp_x86_a</code>)。此 GSI 支持以下升级用例:
-</p><ul>
-<li>具有 Android 8.1 供应商接口实现的设备</li><li>更新到 Android 9 供应商接口实现的设备</li></ul>
-<p>
-旧版 GSI 是从 Android 9 源代码树编译的,但包含以下针对升级设备的向后兼容配置:
-</p><ul>
-<li><strong>非 system-as-root</strong>。不支持系统作为 root 的设备可以继续使用 <code>_a</code> 产品(例如 <code>aosp_arm_a</code>)。
-</li><li><strong>32 位用户空间 + 32 位 binder 接口。</strong>32 位 GSI 可以继续使用 32 位 binder 接口。
-</li><li><strong>8.1 VNDK</strong>。设备可以使用随附的 8.1 VNDK。
-</li><li><strong>装载目录</strong>。一些旧版设备使用目录作为装载指针(例如,<code>/bluetooth</code>、<code>/firmware/radio</code>、<code>/persist</code> 等)。</li></ul>
-<p>
-要通过 cts-on-gsi 测试升级到 Android 9 的设备,请使用<a href="#legacy-gsi-build-targets">旧版 GSI 的编译目标</a>。
+
+<p>在 Android 9 中,为了让供应商引导 GSI,已经更改了此要求:具体来说,Keymaster 不应该执行验证,因为 GSI 报告的版本信息可能与供应商的引导加载程序报告的版本信息不匹配。对于实现 Keymaster 3 或更低版本的设备,供应商必须修改 Keymaster 实现以跳过验证(或升级到 Keymaster 4)。有关 Keymaster 的详细信息,请参阅<a href="/security/keystore/">由硬件支持的 Keystore</a>。
 </p>
-<p>
-<strong>注意</strong>:如果 Android 9 之前的设备实现了 Android 9 供应商接口并满足 Android 9 中引入的所有要求,请不要使用旧版 GSI,而是将 P GSI 用于 VTS 和 cts-on-gsi。
-</p>
-<h2 id="changes-to-keymaster-behavior">Keymaster 行为的变更</h2>
-<p>
-在早期版本的 Android 中,实现 Keymaster 3 或更早版本的设备需要验证并确保运行系统报告的版本信息(<code>ro.build.version.release</code> 和 <code>ro.build.version.security_patch</code>)与引导加载程序报告的版本信息匹配。此类信息通常可以从引导映像标头中获取。
-</p>
-<p>
-在 Android 9 中,为了让供应商引导 GSI,已经更改了此要求:Keymaster 不应该执行验证,因为 GSI 报告的版本信息可能与供应商的引导加载程序报告的版本信息不匹配。对于实现 Keymaster 3 或更早版本的设备,供应商必须修改 Keymaster 实现以跳过验证(或升级到 Keymaster 4)。
-</p>
-<p>
-有关 Keymaster 的详细信息,请参阅 source.android.com 上的<a href="https://source.android.com/security/keystore/">由硬件支持的 Keystore</a>。
-</p>
+
 <h2 id="vendor-binaries-and-vndk-dependencies">供应商二进制文件和 VNDK 依赖项</h2>
-<p>
-升级到 Android 9 的设备具有不同的升级路径,具体取决于设备上使用的供应商二进制文件的版本以及用于编译设备的 VNDK 相关配置。
-</p>
-<p>
-下表总结了针对升级设备的旧版 GSI 支持情况:</p>
-<table>
-  <tbody><tr>
-   <th><strong>用例</strong>
-   </th>
-   <th><strong>设备供应商二进制文件</strong>
-   </th>
-   <th><strong><code>BOARD_VNDK
-_VERSION</code></strong>
-   </th>
-   <th><strong><code>BOARD_VNDK
-_RUNTIME_DISABLE</code></strong>
-   </th>
-   <th><strong>旧版 GSI 系统二进制文件</strong>
-   </th>
-   <th><strong>支持</strong>
-   </th>
-  </tr>
-  <tr>
-   <td>1.a
-   </td>
-   <td>8.1
-   </td>
-   <td>(空)
-   </td>
-   <td>(任何)
-   </td>
-   <td>P
-   </td>
-   <td>否
-   </td>
-  </tr>
-  <tr>
-   <td>1.b
-   </td>
-   <td>8.1
-   </td>
-   <td><code>current</code>
-   </td>
-   <td><code>true</code>
-   </td>
-   <td>P
-   </td>
-   <td>否
-   </td>
-  </tr>
-  <tr>
-   <td>2
-   </td>
-   <td>8.1
-   </td>
-   <td><code>current</code>
-   </td>
-   <td>(空)
-   </td>
-   <td>P
-   </td>
-   <td>是
-   </td>
-  </tr>
-  <tr>
-   <td>3
-   </td>
-   <td>P
-   </td>
-   <td><code>current</code>
-   </td>
-   <td><code>true</code>
-   </td>
-   <td>P
-   </td>
-   <td>是
-   </td>
-  </tr>
-  <tr>
-   <td>4
-   </td>
-   <td>P
-   </td>
-   <td><code>current</code>
-   </td>
-   <td>(空)
-   </td>
-   <td>P
-   </td>
-   <td>是
-   </td>
-  </tr>
-</tbody></table>
-<p>
-最常见的受支持用例是 2,其中旧版 GSI 支持运行 8.1 且使用 <code>BOARD_VNDK_VERSION</code> 进行编译(而未通过设置 <code>BOARD_VNDK_RUNTIME_DISABLE</code> 进行编译,即,未停用运行时强制执行)的设备。
-</p>
-<p>
-两个不受支持的用例是 1.a 和 1.b,其中旧版 GSI 不支持运行 8.1 且未使用 <code>BOARD_VNDK_VERSION</code> 或通过设置 <code>BOARD_VNDK_RUNTIME_DISABLE</code> 进行编译(即,运行时强制执行已停用)的设备。这些设备不受支持,因为它们的供应商二进制文件依赖于 8.1 非 VNDK 共享库,这些库未包含在旧版 GSI 中。
-</p>
-<p>
-要使这些设备与旧版 GSI 兼容,供应商必须执行以下操作之一:
-</p><ul>
-<li>启用 <code>BOARD_VNDK_VERSION</code>,但未设置 <code>BOARD_VNDK_RUNTIME_DISABLE</code>(用例 2)
 
-或者
-</li><li>移植/升级供应商二进制文件,以便依赖于 Android 9 中的共享库(用例 3 和用例 4)。</li></ul>
+<p>升级到 Android 9 的设备具有不同的升级路径,具体取决于设备上使用的供应商二进制文件的版本以及用于编译设备的 VNDK 相关配置。下表总结了针对升级设备的旧版 GSI 支持情况:</p>
 
-<h2 id="build-targets">编译目标</h2>
-<p>
-请根据以下编译目标表确定设备应使用哪个 GSI 版本。
-</p>
-<h3 id="p-gsi-build-targets">P GSI 编译目标</h3>
-<p>
-以下 P GSI 编译目标适用于搭载 Android 9 的设备。(由于架构之间的差异减少,Android 9 仅包含四个 GSI 产品)。
-</p>
 <table>
   <tbody><tr>
-   <th><strong>GSI 名称</strong>
-   </th>
-   <th><strong>CPU 架构</strong>
-   </th>
-   <th><strong>Binder 接口位数</strong>
-   </th>
-   <th><strong>System-as-root</strong>
-   </th>
-   <th><strong>产品名称</strong>
-   </th>
+   <th>用例</th>
+   <th>供应商二进制文件版本</th>
+   <th><code>BOARD_VNDK_VERSION</code></th>
+   <th><code>BOARD_VNDK_RUNTIME_DISABLE</code></th>
+   <th>旧版 GSI 系统二进制文件版本</th>
+   <th>旧版 GSI 支持</th>
   </tr>
   <tr>
-   <td><strong><code>aosp_arm</code></strong>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_arm-userdebug</code>
-   </td>
+   <td>0</td>
+   <td>8.0</td>
+   <td>(任何)</td>
+   <td>(不适用)</td>
+   <td>9</td>
+   <td>否</td>
   </tr>
   <tr>
-   <td><strong><code>aosp_arm64</code></strong>
-   </td>
-   <td><code>ARM64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_arm64-userdebug</code>
-   </td>
+   <td>1.a</td>
+   <td>8.1</td>
+   <td>(空)</td>
+   <td>(任何)</td>
+   <td>9</td>
+   <td>否</td>
   </tr>
   <tr>
-   <td><strong><code>aosp_x86</code></strong>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_x86-userdebug</code>
-   </td>
+   <td>1.b</td>
+   <td>8.1</td>
+   <td><code>current</code></td>
+   <td><code>true</code></td>
+   <td>9</td>
+   <td>否</td>
   </tr>
   <tr>
-   <td><strong><code>aosp_x86_64</code></strong>
-   </td>
-   <td><code>x86-64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_x86_64-userdebug</code>
-   </td>
+   <td>2</td>
+   <td>8.1</td>
+   <td><code>current</code></td>
+   <td>(空)</td>
+   <td>9</td>
+   <td>是</td>
+  </tr>
+  <tr>
+   <td>3</td>
+   <td>9</td>
+   <td><code>current</code></td>
+   <td><code>true</code></td>
+   <td>9</td>
+   <td>是</td>
+  </tr>
+  <tr>
+   <td>4</td>
+   <td>9</td>
+   <td><code>current</code></td>
+   <td>(空)</td>
+   <td>9</td>
+   <td>是</td>
   </tr>
 </tbody></table>
-<h3 id="legacy-gsi-build-targets">旧版 GSI 编译目标</h3>
-<p>
-以下旧版 GSI 编译目标适用于升级到 Android 9 的设备。旧版 GSI 名称包含后缀 <code>_ab</code> 或 <code>_a</code>,以区别于 P GSI 名称。
+
+<p>最常见的受支持用例是 2,其中旧版 GSI 支持运行 Android 8.1 且使用 <code>BOARD_VNDK_VERSION</code> 进行编译(而未通过设置 <code>BOARD_VNDK_RUNTIME_DISABLE</code> 进行编译,即,未停用运行时强制执行)的设备。
 </p>
+
+<p>两个不受支持的用例是 1.a 和 1.b,其中旧版 GSI 不支持运行 Android 8.1 且未使用 <code>BOARD_VNDK_VERSION</code> 或通过设置 <code>BOARD_VNDK_RUNTIME_DISABLE</code> 进行编译(即,运行时强制执行已停用)的设备。这些设备不受支持,因为它们的供应商二进制文件依赖于 Android 8.1 非 VNDK 共享库,这些库未包含在旧版 GSI 中。</p>
+
+<p>要使这些设备与旧版 GSI 兼容,供应商必须执行以下操作之一:</p>
+
+<ul>
+  <li>启用 <code>BOARD_VNDK_VERSION</code>,但未设置 <code>BOARD_VNDK_RUNTIME_DISABLE</code>(用例 2)<br /><br />或<br /><br /></li>
+  <li>移植/升级供应商二进制文件,以便依赖于 Android 9 中的共享库(用例 3 和用例 4)。</li>
+</ul>
+
+<h2 id="building-gsis">编译 GSI</h2>
+
+<p>自 Android 9 开始,每个 Android 版本都在 AOSP 上拥有一个名为 <code><var>DESSERT</var>-gsi</code> 的 GSI 分支(例如,<code>pie-gsi</code> 是 Android 9 的 GSI 分支)。GSI 分支包含应用了所有<a href="/security/bulletin/">安全补丁程序</a>和 <a href="#contributing-to-a-gsi">GSI 补丁程序</a> 的 Android 内容。
+</p>
+
+<p>要编译 GSI,请从 GSI 分支进行<a href="/setup/build/downloading">下载</a>,然后<a href="/setup/build/building#choose-a-target">选择 GSI 编译目标</a>,从而设置 Android 源代码树。请根据以下编译目标表确定设备应使用哪个 GSI 版本。编译完成后,GSI 便会成为系统映像(例如 <code>system.img</code>)并显示在输出文件夹 <code>out/target/product/<strong>generic_arm64_ab</strong></code> 中。编译还会输出 <code>vbmeta.img</code>;对于使用 <a href="/security/verifiedboot/avb">Android 验证启动</a>的设备,您可以将其用于停用验证启动。
+</p><p>
+
+</p><p>示例:以下命令可在 GSI 分支 <code>pie-gsi</code> 上编译旧版 GSI 编译目标 <code>aosp_arm64_ab-userdebug</code>:</p>
+
+<pre class="prettyprint">
+$ repo init -u https://android.googlesource.com/platform/manifest -b pie-gsi
+$ repo sync -cq
+$ source build/envsetup.sh
+$ lunch aosp_arm64_ab-userdebug
+$ make -j4
+</pre>
+
+<h3 id="p-gsi-build-targets">Android 9 GSI 编译目标</h3>
+
+<p>以下 GSI 编译目标适用于搭载 Android 9 的设备。由于架构之间的差异减少,Android 9 仅包含四个 GSI 产品。
+</p>
+
 <table>
   <tbody><tr>
-   <th><strong>GSI 名称</strong>
-   </th>
-   <th><strong>CPU 架构</strong>
-   </th>
-   <th><strong>Binder 接口位数</strong>
-   </th>
-   <th><strong>System-as-root</strong>
-   </th>
-   <th><strong>产品名称</strong>
-   </th>
+   <th>GSI 名称</th>
+   <th>CPU 架构</th>
+   <th>Binder 接口位数</th>
+   <th>System-as-root</th>
+   <th>产品名称</th>
   </tr>
   <tr>
-   <td><strong><code>aosp_arm_a</code></strong>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_arm_a-userdebug</code>
-   </td>
+   <td><code>aosp_arm</code></td>
+   <td><code>ARM</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_arm-userdebug</code></td>
   </tr>
   <tr>
-   <td><strong><code>aosp_arm_ab</code></strong>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_arm_ab-userdebug</code>
-   </td>
+   <td><code>aosp_arm64</code></td>
+   <td><code>ARM64</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_arm64-userdebug</code></td>
   </tr>
   <tr>
-   <td><code>**NA</code>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td>
-   </td>
+   <td><code>aosp_x86</code></td>
+   <td><code>x86</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_x86-userdebug</code></td>
   </tr>
   <tr>
-   <td><code>aosp_arm_64b_ab</code>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_arm_64b_ab-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_arm64_a</code></strong>
-   </td>
-   <td><code>ARM64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_arm64_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_arm64_ab</code></strong>
-   </td>
-   <td><code>ARM64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_arm64_ab-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_a</code></strong>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_x86_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_ab</code></strong>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_x86_ab-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><code>**NA</code>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td>
-   </td>
-  </tr>
-  <tr>
-   <td><code>**NA</code>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_64_a</code></strong>
-   </td>
-   <td><code>x86-64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_x86_64_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_64_ab</code></strong>
-   </td>
-   <td><code>x86-64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_x86_64_ab-userdebug</code>
-   </td>
+   <td><code>aosp_x86_64</code></td>
+   <td><code>x86-64</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_x86_64-userdebug</code></td>
   </tr>
 </tbody></table>
-<p>
+
+<h3 id="legacy-gsi-build-targets">Android 9 旧版 GSI 编译目标</h3>
+
+<p>以下旧版 GSI 编译目标适用于升级到 Android 9 的设备。旧版 GSI 名称包含后缀 <code>_ab</code> 或 <code>_a</code>,以区别于 Android 9 GSI 名称。
+</p>
+
+<table>
+  <tbody><tr>
+   <th>GSI 名称</th>
+   <th>CPU 架构</th>
+   <th>Binder 接口位数</th>
+   <th>System-as-root</th>
+   <th>产品名称</th>
+  </tr>
+  <tr>
+   <td><code>aosp_arm_a</code></td>
+   <td><code>ARM</code></td>
+   <td><code>32</code></td>
+   <td><code>N</code></td>
+   <td><code>aosp_arm_a-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>aosp_arm_ab</code></td>
+   <td><code>ARM</code></td>
+   <td><code>32</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_arm_ab-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>**NA</code></td>
+   <td><code>ARM</code></td>
+   <td><code>64</code></td>
+   <td><code>N</code></td>
+   <td></td>
+  </tr>
+  <tr>
+   <td><code>aosp_arm_64b_ab</code></td>
+   <td><code>ARM</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_arm_64b_ab-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>aosp_arm64_a</code></td>
+   <td><code>ARM64</code></td>
+   <td><code>64</code></td>
+   <td><code>N</code></td>
+   <td><code>aosp_arm64_a-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>aosp_arm64_ab</code></td>
+   <td><code>ARM64</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_arm64_ab-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>aosp_x86_a</code></td>
+   <td><code>x86</code></td>
+   <td><code>32</code></td>
+   <td><code>N</code></td>
+   <td><code>aosp_x86_a-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>aosp_x86_ab</code></td>
+   <td><code>x86</code></td>
+   <td><code>32</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_x86_ab-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>**NA</code></td>
+   <td><code>x86</code></td>
+   <td><code>64</code></td>
+   <td><code>N</code></td>
+   <td></td>
+  </tr>
+  <tr>
+   <td><code>**NA</code></td>
+   <td><code>x86</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td></td>
+  </tr>
+  <tr>
+   <td><code>aosp_x86_64_a</code></td>
+   <td><code>x86-64</code></td>
+   <td><code>64</code></td>
+   <td><code>N</code></td>
+   <td><code>aosp_x86_64_a-userdebug</code></td>
+  </tr>
+  <tr>
+   <td><code>aosp_x86_64_ab</code></td>
+   <td><code>x86-64</code></td>
+   <td><code>64</code></td>
+   <td><code>Y</code></td>
+   <td><code>aosp_x86_64_ab-userdebug</code></td>
+  </tr>
+</tbody></table>
 <em>**可以根据要求添加</em>
-</p>
-<p>
-<strong>注意</strong>:在未来的 Android 版本中可能会移除这些编译目标。
-</p>
-<h3 id="gsi-8-1-build-targets">GSI 8.1 编译目标</h3>
-<p>
-Android 8.1 GSI 支持八种普通产品(在表格中以<strong>粗体</strong>显示)和一款从 Android 8.1 源代码树编译的特殊产品。
-</p>
-<table>
-  <tbody><tr>
-   <th><strong>GSI 名称</strong>
-   </th>
-   <th><strong>CPU 架构</strong>
-   </th>
-   <th><strong>Binder 接口位数</strong>
-   </th>
-   <th><strong>System-as-root</strong>
-   </th>
-   <th><strong>产品名称</strong>
-   </th>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_arm_a</code></strong>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_arm_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_arm_ab</code></strong>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_arm_ab-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><code>aosp_arm_64b_a</code>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_arm_64b_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><code>**NA</code>
-   </td>
-   <td><code>ARM</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_arm64_a</code></strong>
-   </td>
-   <td><code>ARM64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_arm64_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_arm64_ab</code></strong>
-   </td>
-   <td><code>ARM64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_arm64_ab-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_a</code></strong>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_x86_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_ab</code></strong>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>32</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_x86_ab-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><code>**NA</code>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td>
-   </td>
-  </tr>
-  <tr>
-   <td><code>**NA</code>
-   </td>
-   <td><code>x86</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_64_a</code></strong>
-   </td>
-   <td><code>x86-64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>N</code>
-   </td>
-   <td><code>aosp_x86_64_a-userdebug</code>
-   </td>
-  </tr>
-  <tr>
-   <td><strong><code>aosp_x86_64_ab</code></strong>
-   </td>
-   <td><code>x86-64</code>
-   </td>
-   <td><code>64</code>
-   </td>
-   <td><code>Y</code>
-   </td>
-   <td><code>aosp_x86_64_ab-userdebug</code>
-   </td>
-  </tr>
-</tbody></table>
-<p>
-<em>**可以根据要求添加</em>
-</p>
+
+<aside class="aside">
+  <strong>注意</strong>:在未来的 Android 版本中可能会移除这些编译目标。
+</aside>
+
+<h2 id="flashing-gsis">刷写 GSI</h2>
+
+<p>Android 设备可能具有不同的设计,因此不可能通过单个命令或单组指令将 GSI 刷写到特定设备上。请使用以下常规步骤作为指南:</p>
+
+<ol>
+  <li>确保设备具备以下条件:
+    <ul>
+      <li>支持 HIDL-HAL 接口。</li>
+      <li>用于解锁设备的方法(以便能够使用 <code>fastboot</code> 对其进行刷写)。</li>
+      <li>用于停用验证启动的方法(例如 <a href="/security/verifiedboot/">vboot 1.0</a>、<a href="/security/verifiedboot/avb">AVB</a> 等)。</li>
+      <li>解锁设备,使其可通过 <code>fastboot</code> 进行刷写。</li>
+      <aside class="note">
+        <strong>注意</strong>:请通过 Android 源代码树来编译 <code>fastboot</code>,以确保您拥有其最新版本。</aside>
+    </ul>
+  </li>
+  <li>停用验证启动。</li>
+  <li>清空当前系统分区,然后将 GSI 刷写到系统分区。</li>
+  <li>擦除用户数据,并清除来自其他必要分区的数据(例如元数据)。</li>
+  <li>重新启动设备。</li>
+</ol>
+
+<p>例如,要将 GSI 刷写到 Pixel 2 设备,请执行以下操作:</p>
+
+<ol>
+  <li><a href="/setup/build/running#booting-into-fastboot-mode">启动到引导加载程序模式</a>,然后<a href="/setup/build/running#unlocking-the-bootloader">解锁引导加载程序</a>。</li>
+  <li>通过刷写 <code>vbmeta.img</code> 来停用验证启动 (AVB):<pre class="prettyprint">$ fastboot flash vbmeta vbmeta.img</pre></li>
+  <li>清空系统分区,然后将 GSI 刷写到系统分区:<pre class="prettyprint">
+$ fastboot erase system
+$ fastboot flash system system.img
+</pre></li>
+  <li>擦除用户数据并清除其他必要分区的数据:<pre class="prettyprint">$ fastboot -w</pre></li>
+  <li>重新启动:<pre class="prettyprint">$ fastboot reboot</pre></li>
+</ol>
+
+<h2 id="contributing-to-gsis">为改进 GSI 积极贡献力量</h2>
+
+<p>Android 欢迎您为 GSI 开发贡献自己的力量。您可以通过以下方式参与开发并帮助改进 GSI:</p>
+
+<ul>
+  <li><strong>创建 GSI 补丁程序</strong>。由于 <code><var>DESSERT</var>-gsi</code> 并<strong>不是</strong>开发分支,并且仅接受从 AOSP master 分支择优挑选的补丁程序,因此要提交 GSI 补丁程序,您必须:<ol>
+      <li>将补丁程序提交到 <a href="https://android-review.googlesource.com" class="external">AOSP</a> master 分支。</li>
+      <li>择优挑选要提交到 <code><var>DESSERT</var>-gsi</code> 的补丁程序。</li>
+      <li>提交错误,以便让择优挑选的补丁程序接受审核。</li>
+    </ol>
+  </li>
+  <li><strong>报告 GSI 错误</strong>或提出其他建议。查看<a href="/setup/contribute/report-bugs#platform">报告错误</a>中的说明,然后浏览或提交 GSI 错误(在“平台”表中查找“常规系统映像”)。</li>
+</ul>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/setup/build/requirements.html b/zh-cn/setup/build/requirements.html
index 721c4f8..6d74547 100644
--- a/zh-cn/setup/build/requirements.html
+++ b/zh-cn/setup/build/requirements.html
@@ -30,7 +30,7 @@
 <ul>
   <li>如果是 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要使用 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。
   </li>
-  <li>如果要检出代码,至少需要 100GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译,则需要更多空间。
+  <li>如果要检出代码,至少需要 250GB 可用磁盘空间;如果要进行编译,则还需要 150GB。如果要进行多次编译,则需要更多空间。
   </li>
   <li>如果在虚拟机中运行 Linux,则至少需要 16GB 的 RAM/交换空间。
   </li>
@@ -76,8 +76,7 @@
 <p>
 Android 8.0 及更高版本仅支持使用 <a href="https://developer.android.com/ndk/guides/standalone_toolchain.html#working_with_clang" class="external">Clang/LLVM</a> 来编译 Android 平台。您可以加入 <a href="https://groups.google.com/forum/#!forum/android-llvm" class="external">android-llvm</a> 网上论坛来提出问题并获取帮助。在 <a href="https://github.com/android-ndk/ndk" class="external">NDK GitHub</a> 上报告 NDK/编译器问题。
 </p>
-<p>
-对于<a href="https://developer.android.com/ndk/guides/index.html" class="external">原生开发工具包 (NDK)</a> 和旧版内核,您也可以使用 AOSP master 分支中包含的 GCC 4.9(在 <code>prebuilts/</code> 下)。
+<p>对于<a href="https://developer.android.com/ndk/guides/index.html" class="external">原生开发工具包 (NDK)</a> 和旧版内核,您也可以使用 AOSP master 分支中包含的 GCC 4.9(在 <code>prebuilts/</code> 下)。
 </p>
 
 <h3 id="older-versions">较低 Android 版本的软件包</h3>
diff --git a/zh-cn/setup/build/running.html b/zh-cn/setup/build/running.html
index 49d2a9c..827d73a 100644
--- a/zh-cn/setup/build/running.html
+++ b/zh-cn/setup/build/running.html
@@ -24,7 +24,7 @@
 </p>
 
 <h2 id="building-fastboot-and-adb">编译 fastboot 和 adb</h2>
-<p>如果您还没有 <code>fastboot</code> 和 <code>adb</code>,则可以使用常规编译系统来编译。请按照<a href="building.html">编译准备工作</a>中的说明操作,将主 <code>make</code> 命令替换为以下命令:</p>
+<p>如果您还没有 <code>fastboot</code> 和 <code>adb</code>,则可以使用常规编译系统来编译。请按照<a href="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>
diff --git a/zh-cn/setup/community.html b/zh-cn/setup/community.html
index b8a5b47..cebc8a9 100644
--- a/zh-cn/setup/community.html
+++ b/zh-cn/setup/community.html
@@ -215,7 +215,7 @@
 <p>点击右侧的“我的成员资格”。</p>
 </li>
 <li>
-<p>在“您想如何阅读该论坛”下选择一个电子邮件选项。</p>
+<p>在“您想如何阅读该论坛”下,选择一个电子邮件选项。</p>
 </li>
 </ol>
 <h2 id="android-on-irc">在 IRC 上讨论 Android</h2>
@@ -246,7 +246,7 @@
 </ul>
 
 <h2 id="for-business-inquiries">关于 Google 移动服务许可方面的问题</h2>
-<p>请通过 <a href="https://www.android.com/gms/">GMS 联系</a>表单咨询关于 <a href="https://www.android.com/gms/contact/">Google 移动服务</a>许可的问题。其他非 GMS 合作伙伴关系问询可发送至 <a href="mailto:[email protected]">[email protected]</a>。</p>
+<p>请通过 <a href="https://www.android.com/gms/contact/">GMS 联系</a>表单咨询关于 <a href="https://www.android.com/gms/">Google 移动服务</a>许可的问题。其他非 GMS 合作伙伴关系问询可发送至 <a href="mailto:[email protected]">[email protected]</a>。</p>
 
 <p>我们会阅读收到的每封邮件,但无法一一进行回复。如果我们能够提供相关帮助,一定会与您联系!</p>
 
diff --git a/zh-cn/setup/contribute/read-bug-reports.html b/zh-cn/setup/contribute/read-bug-reports.html
index 98c2f94..ecca4db 100644
--- a/zh-cn/setup/contribute/read-bug-reports.html
+++ b/zh-cn/setup/contribute/read-bug-reports.html
@@ -682,7 +682,7 @@
   </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>错误报告中还包含关于唤醒锁定的统计信息,唤醒锁定是应用开发者采用的一种机制,用于表明其应用需要设备保持开启状态。(要详细了解唤醒锁定,请参阅 <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>
 
diff --git a/zh-cn/setup/start/build-numbers.html b/zh-cn/setup/start/build-numbers.html
index f8140dc..f3537f2 100644
--- a/zh-cn/setup/start/build-numbers.html
+++ b/zh-cn/setup/start/build-numbers.html
@@ -208,6 +208,30 @@
   </thead>
   <tbody>
     <tr>
+      <td>PD1A.180720.031</td>
+      <td>android-9.0.0_r12</td>
+      <td>Pie</td>
+      <td>Pixel 3 XL、Pixel 3</td>
+    </tr>
+    <tr>
+      <td>PD1A.180720.030</td>
+      <td>android-9.0.0_r11</td>
+      <td>Pie</td>
+      <td>Pixel 3 XL、Pixel 3</td>
+    </tr>
+    <tr>
+      <td>PPR2.181005.003</td>
+      <td>android-9.0.0_r10</td>
+      <td>Pie</td>
+      <td>Pixel XL、Pixel、Pixel 2 XL、Pixel 2</td>
+    </tr>
+    <tr>
+      <td>PPR1.181005.003</td>
+      <td>android-9.0.0_r9</td>
+      <td>Pie</td>
+      <td>Pixel XL、Pixel</td>
+    </tr>
+    <tr>
       <td>PPR2.180905.006.A1</td>
       <td>android-9.0.0_r8</td>
       <td>Pie</td>
@@ -250,6 +274,18 @@
       <td>Pixel 2 XL、Pixel 2、Pixel XL、Pixel</td>
     </tr>
     <tr>
+      <td>OPM8.181005.003</td>
+      <td>android-8.1.0_r48</td>
+      <td>Oreo</td>
+      <td>Pixel C</td>
+    </tr>
+    <tr>
+      <td>OPM7.181005.003</td>
+      <td>android-8.1.0_r47</td>
+      <td>Oreo</td>
+      <td>Nexus 5X 和 Nexus 6P</td>
+    </tr>
+    <tr>
       <td>OPM6.171019.030.K1</td>
       <td>android-8.1.0_r46</td>
       <td>Oreo</td>
diff --git a/zh-cn/setup/start/p-release-notes.html b/zh-cn/setup/start/p-release-notes.html
index 92a216a..b3b7be0 100644
--- a/zh-cn/setup/start/p-release-notes.html
+++ b/zh-cn/setup/start/p-release-notes.html
@@ -122,7 +122,7 @@
 
 <h4 id="product_partitions">产品分区</h4>
 
-<p>此版本支持使用 Android 编译系统编译 <a href="/devices/bootloader/product-partitions"><code>/product</code> 分区</a>。以前,Android 8.x 强制将系统芯片 (SoC) 特定组件从 <code>/system</code> 分区分离到 <code>/vendor</code> 分区,而没有为从 Android 编译系统编译的 OEM 特定组件提供专用空间。</p>
+<p>此版本支持使用 Android 编译系统编译 <a href="/devices/bootloader/product-partitions"><code>/product</code> partitions</a> 分区。以前,Android 8.x 强制将系统芯片 (SoC) 特定组件从 <code>/system</code> 分区分离到 <code>/vendor</code> 分区,而没有为从 Android 编译系统编译的 OEM 特定组件提供专用空间。</p>
 
 <h4 id="canonical_boot_reason_compliance">规范启动原因合规性</h4>
 
@@ -130,7 +130,7 @@
 
 <h4 id="system_as_root">系统作为 Root</h4>
 
-<p>搭载此版本的所有设备必须使用 <a href="/devices/bootloader/system-as-root">system-as-root</a>,它会将 <code>ramdisk.img</code> 合并到 <code>system.img</code>(亦称为 no-ramdisk),而后者又作为 <code>rootfs</code> 装载。</p>
+<p>搭载此版本的所有设备均必须使用 <a href="/devices/bootloader/system-as-root">system-as-root</a>,它会将 <code>ramdisk.img</code> 合并到 <code>system.img</code>(亦称为 no-ramdisk),而后者又作为 <code>rootfs</code> 装载。</p>
 
 <h4 id="boot_image_header_versioning">启动映像标头版本控制</h4>
 
@@ -173,7 +173,7 @@
 
 <h3 id="android_compatibility_definition_document_cdd">Android 兼容性定义文档 (CDD)</h3>
 
-<p><a href="/compatibility/android-cdd">Android 9 兼容性定义文档</a>基于<a href="/compatibility/cdd">之前版本</a>进行了迭代更新,包括有关新功能的更新以及对之前所发布功能的要求的更改。</p>
+<p><a href="/compatibility/android-cdd">Android 9 兼容性定义文档</a>基于<a href="/compatibility/cdd">之前版本</a>进行了迭代更新,包括有关新功能的更新以及针对之前所发布功能的要求做出的更改。</p>
 
 <h2 id="settings">设置</h2>
 
@@ -181,7 +181,7 @@
 
 <p>Android 应用微件框架现在可让您更清楚地了解用户交互情况,特别是在用户删除或手动添加微件时。Launcher3 默认自带此功能。</p>
 
-<p>制造商需要更新启动器应用(随设备提供)才能支持此功能(如果不是基于 Launcher3 的话)。OEM 需要在其默认的启动器中支持新的 <a href="https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo#widgetFeatures" class="external">widgetFeatures API</a>。</p>
+<p>制造商需要更新启动器应用(随设备提供)才能支持此功能(如果不是基于 Launcher3)。原始设备制造商 (OEM) 需要在其默认的启动器中支持新的 <a href="https://developer.android.com/reference/android/appwidget/AppWidgetProviderInfo#widgetFeatures" class="external">widgetFeatures API</a>。</p>
 
 <p>除非启动器按预期实现此 API,否则此 API 本身并不能保证它可端到端正常运行。AOSP 包含实现示例。要查看提供的示例代码,请参阅 AOSP Change-Id Iccd6f965fa3d61992244a365efc242122292c0ca。</p>
 
@@ -206,7 +206,7 @@
 
 <h3 id="atest">Atest</h3>
 
-<p><a href="https://android.googlesource.com/platform/tools/tradefederation/+/master/atest/README.md" class="external">Atest</a> 是一个新的命令行工具,允许用户在本地编译、安装和运行 Android 测试。</p>
+<p><a href="https://android.googlesource.com/platform/tools/tradefederation/+/master/atest/README.md" class="external">Atest</a> 是一个新的命令行工具,用户可以使用这种工具在本地编译、安装并运行 Android 测试。</p>
 
 <h3 id="compatibility_test_suite_cts">兼容性测试套件 (CTS)</h3>
 
@@ -350,7 +350,7 @@
 
 <h4 id="system_properties">系统属性</h4>
 
-<p>Android 9 限制<a href="/security/selinux/compatibility#system-property-and-process-labeling-ownership">系统属性</a>不必要地在 <code>system</code> 和 <code>vendor</code> 分区之间共享,并提供了一种确保在共享系统属性之间保持一致性的方法。</p>
+<p>Android 9 通过对<a href="/security/selinux/compatibility#system-property-and-process-labeling-ownership">系统属性</a>共享进行限制,阻止在不必要的情况下在 <code>system</code> 和 <code>vendor</code> 分区之间共享系统属性,同时提供了一种确保在共享系统属性之间保持一致性的方法。</p>
 
 <h5 id="selinux_attribute_tests">SELinux 属性测试</h5>
 
@@ -486,7 +486,7 @@
 
 <p>要验证此行为,请运行 roboelectric 和手动测试。</p>
 
-<p>在以下位置运行 roboelectric 测试:<a href="https://android.googlesource.com/platform/packages/apps/Settings/+/master/tests/robotests/src/com/android/settings/wifi/" class="external">/packages/apps/Settings/tests/robotests/src/com/android/settings/wifi/AppStateChangeWifiStateBridgeTest.java</a></p>
+<p>在以下位置运行 roboelectric 测试:<a href="https://android.googlesource.com/platform/packages/apps/Settings/+/master/tests/robotests/src/com/android/settings/wifi/" class="external">/packages/apps/Settings/tests/robotests/src/com/android/settings/wifi/AppStateChangeWifiStateBridgeTest.java</a> </p>
 
 <p>对于手动测试:</p>
 
@@ -550,9 +550,9 @@
 
 <p>Android 9 改进了对带宽估测的支持。如果 Android 应用知道可用的数据带宽,则可以更好地决定用于视频通话和视频串流的分辨率。</p>
 
-<p>在运行 Android 6.0 及更高版本的设备上,想要对移动网络进行带宽估计的调用者会调用 <a href="https://developer.android.com/reference/android/net/ConnectivityManager.html#requestBandwidthUpdate(android.net.Network)" class="external"><code>ConnectivityManager.requestBandwidthUpdate()</code></a>,并且框架可以提供估计的下行链路带宽。<em></em></p>
+<p>在运行 Android 6.0 及更高版本的设备上,想对移动网络进行带宽估算的调用者会调用 <a href="https://developer.android.com/reference/android/net/ConnectivityManager.html#requestBandwidthUpdate(android.net.Network)" class="external"><code>ConnectivityManager.requestBandwidthUpdate()</code></a>,而且框架可以提供下行链路带宽估算值。<em></em></p>
 
-<p>但是,在运行 Android 9 或更高版本的设备上,当估计带宽发生显著变化时,<a href="https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback.html#onCapabilitiesChanged(android.net.Network,%20android.net.NetworkCapabilities)" class="external"><code>onNetworkCapabilitiesChanged()</code></a> callback 会自动触发,并且调用 <code>requestBandwidthUpdate()</code> 是空操作;相关的 <a href="https://developer.android.com/reference/android/net/NetworkCapabilities#getlinkdownstreambandwidthkbps" class="external"><code>getLinkDownstreamBandwidthKbps()</code></a> 和 <a href="https://developer.android.com/reference/android/net/NetworkCapabilities#getlinkupstreambandwidthkbps" class="external"><code>getLinkUpstreamBandwidthKbps()</code></a> 会填充由物理层提供的更新信息。</p>
+<p>但是,在运行 Android 9 或更高版本的设备上,当估算的带宽发生显著变化时,<a href="https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback.html#onCapabilitiesChanged(android.net.Network,%20android.net.NetworkCapabilities)" class="external"><code>onNetworkCapabilitiesChanged()</code></a> callback 会自动触发,并且调用 <code>requestBandwidthUpdate()</code> 是空操作;相关的 <a href="https://developer.android.com/reference/android/net/NetworkCapabilities#getlinkdownstreambandwidthkbps" class="external"><code>getLinkDownstreamBandwidthKbps()</code></a> 和 <a href="https://developer.android.com/reference/android/net/NetworkCapabilities#getlinkupstreambandwidthkbps" class="external"><code>getLinkUpstreamBandwidthKbps()</code></a> 会填充由物理层提供的更新信息。</p>
 
 <p>此外,设备可以通过 <a href="https://developer.android.com/reference/android/telephony/ServiceState#getcellbandwidths" class="external"><code>ServiceState.getCellBandwidths()</code></a> 检查 LTE 单元带宽。这使应用可以确切地知道给定单元上可用的带宽(频率)有多少。通过隐藏菜单可以获得单元带宽信息,以便现场测试人员可以检查最新信息。</p>
 
@@ -568,7 +568,7 @@
 
 <p>建议您使用验证程序检查给定备份数据是否存在无效值,并仅恢复有效数据(如 <code>core/java/android/provider/SettingsValidators.java</code>)。</p>
 
-<p>此功能在默认情况下处于启用状态。可以通过 <code>Settings.Global.OVERRIDE_SETTINGS_PROVIDER_RESTORE_ANY_VERSION</code> 停用 SettingsBackupAgent 对从未来版本进行恢复的支持。除非设备制造商扩展 ROM 中包含的其中一个备份代理(或添加一个自定义代理),否则无需进行任何额外的实现。</p>
+<p>此功能在默认情况下处于启用状态。可以通过 <code>Settings.Global.OVERRIDE_SETTINGS_PROVIDER_RESTORE_ANY_VERSION</code> 停用 SettingsBackupAgent 对从未来版本进行恢复的支持。除非设备制造商扩展 ROM 中包含的某个备份代理(或添加一个自定义代理),否则无需进行任何额外的实现。</p>
 
 <p>此功能允许系统从平台的未来版本进行恢复;不过,恢复后的数据可能会不完整,这一点是可以理解的。以下说明适用于下述备份代理:</p>
 
@@ -612,7 +612,7 @@
 
 <h3 id="write-ahead_logging">预写日志</h3>
 
-<p><a href="/devices/tech/perf/compatibility-wal">应用的兼容性 WAL(预写日志记录)</a>是 SQLiteDatabase 的一种新的特殊模式,称为兼容性 WAL(预写日志记录),它允许数据库使用 <code>journal_mode=WAL</code>,同时保留每个数据库最多保持一个连接的行为。</p>
+<p><a href="/devices/tech/perf/compatibility-wal">应用的兼容性 WAL(预写日志记录)</a>是 SQLiteDatabase 的一种新的特殊模式,称为兼容性 WAL(预写日志记录),它可让数据库使用 <code>journal_mode=WAL</code>,同时保留每个数据库最多保持一个连接的行为。</p>
 
 <h3 id="boot_times">启动时间</h3>
 
diff --git a/zh-cn/setup/start/site-updates.html b/zh-cn/setup/start/site-updates.html
index 494eb72..be35750 100644
--- a/zh-cn/setup/start/site-updates.html
+++ b/zh-cn/setup/start/site-updates.html
@@ -28,7 +28,7 @@
 
 <p>欢迎访问修订后的 Android 开源项目 (AOSP) 网站。随着我们网站发展规模越来越大,我们重新改善了平台文档导航功能,以便更好地配合新信息和更新信息使用。</p>
 
-<p>有关重大更改的指南,请参阅以下各小节。有关功能摘要、更新和新增内容,请查看<a href="/setup/start/p-release-notes">版本说明</a>。您可以通过在 <a href="https://g.co/androidsourceissue" class="external">g.co/androidsourceissue</a> 中归档的错误或点击该网站上每个网页页脚中的<a href="https://issuetracker.google.com/issues/new?component=191476">网站反馈</a>链接,向我们发送您的反馈。</p>
+<p>有关重大更改的指南,请参阅以下各小节。有关功能摘要、更新和新增内容,请查看<a href="/setup/start/p-release-notes">版本说明</a>。您可以通过在 <a href="https://g.co/androidsourceissue" class="external">g.co/androidsourceissue</a> 中归档的错误,或通过点击该网站上每个网页页脚中的<a href="https://issuetracker.google.com/issues/new?component=191476">网站反馈</a>链接,向我们发送您的反馈。</p>
 
 <h3 id="second-menu">另一个横向菜单</h3>