Docs: Changes to source.android.com

  - 181204744 Devsite localized content from translation request b4bd44... by Android Partner Docs <[email protected]>
  - 181204738 Devsite localized content from translation request 6e2e74... by Android Partner Docs <[email protected]>
  - 181204731 Devsite localized content from translation request c6da36... by Android Partner Docs <[email protected]>
  - 181184337 Adding nav for vndk build system support file (includes v... by Heidi von Markham <[email protected]>
  - 181184012 Add details on enabling vndk for a partner codebase. by Heidi von Markham <[email protected]>
  - 181181304 Drop path prefix "platform/" in human readable reference ... by Android Partner Docs <[email protected]>
  - 180959465 Update public documentation around versions of OpenJDK bu... by Android Partner Docs <[email protected]>
  - 180959038 Update home page with Jan 2018 bulletins by Danielle Roberts <[email protected]>
  - 180944987 Update january 2018 bulletin with AOSP links by Danielle Roberts <[email protected]>
  - 180939327 Devsite localized content from translation request 9d7ae6... by Android Partner Docs <[email protected]>
  - 180939213 Devsite localized content from translation request 761984... by Android Partner Docs <[email protected]>
  - 180939203 Devsite localized content from translation request 37ad64... by Android Partner Docs <[email protected]>
  - 180813220 Devsite localized content from translation request 45f650... by Android Partner Docs <[email protected]>
  - 180813011 Devsite localized content from translation request 7a3ee2... by Android Partner Docs <[email protected]>
  - 180813003 Devsite localized content from translation request 52d1dd... by Android Partner Docs <[email protected]>
  - 180721815 Update Jan 2018 bulletin with announcement about CVE-2017... by Danielle Roberts <[email protected]>
  - 180718550 Update to January 2018 bulletin for coordinated disclosure by Danielle Roberts <[email protected]>
  - 180689483 Devsite localized content from translation request 015eda... by Android Partner Docs <[email protected]>
  - 180689471 Devsite localized content from translation request 86e026... by Android Partner Docs <[email protected]>
  - 180688614 Added note about requirement to restart the audioserver by Android Partner Docs <[email protected]>
  - 180681938 Add tags for January Security Release. by Android Partner Docs <[email protected]>
  - 180580440 Publish Dec 2017 Pixel bulletins by Danielle Roberts <[email protected]>
  - 180574446 Clarify OTA updates instructions in FBE docs by Danielle Roberts <[email protected]>
  - 180566242 Update researcher acknowledgement for CVE-2017-13221 by Danielle Roberts <[email protected]>
  - 180562297 January 2018 Pixel and Android Security bulletins by Danielle Roberts <[email protected]>
  - 180562227 Devsite localized content from translation request a4ca37... by Android Partner Docs <[email protected]>
  - 180562222 Devsite localized content from translation request f65459... by Android Partner Docs <[email protected]>
  - 180561535 Devsite localized content from translation request 881cd3... by Android Partner Docs <[email protected]>
  - 180561527 Devsite localized content from translation request 51b684... by Android Partner Docs <[email protected]>
  - 180561524 Devsite localized content from translation request 226f2c... by Android Partner Docs <[email protected]>
  - 180560907 Devsite localized content from translation request 9b462a... by Android Partner Docs <[email protected]>
  - 180560904 Devsite localized content from translation request 1e3945... by Android Partner Docs <[email protected]>
  - 180560895 Devsite localized content from translation request 60fa89... by Android Partner Docs <[email protected]>
  - 180560177 Devsite localized content from translation request 9f6556... by Android Partner Docs <[email protected]>
  - 180560173 Devsite localized content from translation request 37eb85... by Android Partner Docs <[email protected]>
  - 180560169 Devsite localized content from translation request abf551... by Android Partner Docs <[email protected]>
  - 180214623 Devsite localized content from translation request 69a1b1... by Android Partner Docs <[email protected]>
  - 180214622 Devsite localized content from translation request abe464... by Android Partner Docs <[email protected]>
  - 180214009 Devsite localized content from translation request 1c13f2... by Android Partner Docs <[email protected]>
  - 180214006 Devsite localized content from translation request 9237e3... by Android Partner Docs <[email protected]>
  - 180214003 Devsite localized content from translation request 1116f7... by Android Partner Docs <[email protected]>
  - 179974666 Devsite localized content from translation request afb4de... by Android Partner Docs <[email protected]>
  - 179932481 Devsite localized content from translation request 499773... by Android Partner Docs <[email protected]>
  - 179932464 Devsite localized content from translation request 6bcb66... by Android Partner Docs <[email protected]>
  - 179932462 Devsite localized content from translation request 6c13a3... by Android Partner Docs <[email protected]>
  - 179931339 Correct out of place punctuation by Danielle Roberts <[email protected]>
  - 179874281 Add libFuzzer docs to SAC. by Danielle Roberts <[email protected]>
  - 179859323 Exclude compatibility/source from localization by Danielle Roberts <[email protected]>
  - 179836094 Devsite localized content from translation request 3dae55... by Android Partner Docs <[email protected]>
  - 179835757 Devsite localized content from translation request 76210b... by Android Partner Docs <[email protected]>
  - 179835692 Devsite localized content from translation request eab645... by Android Partner Docs <[email protected]>
  - 179835686 Devsite localized content from translation request 23e94d... by Android Partner Docs <[email protected]>
  - 179778362 Devsite localized content from translation request 6406f2... by Android Partner Docs <[email protected]>
  - 179688064 Devsite localized content from translation request 713535... by Android Partner Docs <[email protected]>
  - 179622714 Add information about where to find OTA logs for both A/B... by Christina Nguyen <[email protected]>
  - 179617573 Incorporate CDD source assets in google3 to allow buildin... by Clay Murphy <[email protected]>

PiperOrigin-RevId: 181204744
Change-Id: If0130be7bf5d5544f5b0ddda0977243b884b9943
diff --git a/zh-cn/_book.yaml b/zh-cn/_book.yaml
index c3afa7d..c8cc466 100644
--- a/zh-cn/_book.yaml
+++ b/zh-cn/_book.yaml
@@ -28,7 +28,7 @@
         - path: /setup/downloading
           title: 下载源代码
         - path: /setup/building
-          title: 准备构建
+          title: 准备编译
         - path: /setup/jack
           title: 使用 Jack 编译
         - path: /setup/devices
@@ -36,17 +36,15 @@
         - path: /setup/running
           title: 运行版本
         - path: /setup/building-kernels
-          title: 构建内核
+          title: 编译内核
         - path: /setup/known-issues
           title: 已知问题
-        title: 下载和构建
+        title: 下载和编译
       - section:
         - path: /setup/developing
           title: 概览
         - path: /setup/using-repo
           title: 使用 Repo
-        - path: /setup/git-resources
-          title: 了解 Git
         - path: /setup/add-device
           title: 添加新设备
         - path: /setup/64-bit-builds
@@ -90,6 +88,8 @@
       - section:
         - path: /security/enhancements/
           title: 概览
+        - path: /security/enhancements/enhancements80
+          title: Android 8.0
         - path: /security/enhancements/enhancements70
           title: Android 7.0
         - path: /security/enhancements/enhancements60
@@ -104,7 +104,7 @@
           title: Android 4.2
         - path: /security/enhancements/enhancements41
           title: Android 4.1
-        title: 增强功能
+        title: 增强
       - path: /security/overview/acknowledgements
         title: 致谢
       - section:
@@ -118,6 +118,12 @@
           title: 公告
         - section:
           - section:
+            - path: /security/bulletin/2018-01-01
+              title: 1 月
+            - path: /security/bulletin/2018
+              title: 索引
+            title: 2018 年公告
+          - section:
             - path: /security/bulletin/2017-12-01
               title: 12 月
             - path: /security/bulletin/2017-11-01
@@ -191,12 +197,22 @@
         - section:
           - path: /security/bulletin/pixel/index
             title: 概览
-          - path: /security/bulletin/pixel/2017-12-01
-            title: 2017 年 12 月
-          - path: /security/bulletin/pixel/2017-11-01
-            title: 2017 年 11 月
-          - path: /security/bulletin/pixel/2017-10-01
-            title: 2017 年 10 月
+          - section:
+            - path: /security/bulletin/pixel/2018-01-01
+              title: 1 月
+            - path: /security/bulletin/pixel/2018
+              title: 索引
+            title: 2018 年公告
+          - section:
+            - path: /security/bulletin/pixel/2017-12-01
+              title: 12 月
+            - path: /security/bulletin/pixel/2017-11-01
+              title: 11 月
+            - path: /security/bulletin/pixel/2017-10-01
+              title: 10 月
+            - path: /security/bulletin/pixel/2017
+              title: 索引
+            title: 2017 年公告
           title: Pixel/Nexus 公告
         title: 公告
       - section:
@@ -213,6 +229,8 @@
         - path: /security/authentication/gatekeeper
           title: Gatekeeper
         title: 身份验证
+      - path: /security/biometric/
+        title: 生物识别解锁
       - section:
         - path: /security/keystore/
           title: 概览
@@ -337,7 +355,7 @@
           - path: /devices/architecture/hidl-cpp/types
             title: 数据类型
           - path: /devices/architecture/hidl-cpp/functions
-            title: 功能
+            title: 函数
           title: HIDL (C++)
         - section:
           - path: /devices/architecture/hidl-java/
@@ -423,6 +441,8 @@
           title: 数据格式
         - path: /devices/audio/attributes
           title: 属性
+        - path: /devices/audio/aaudio
+          title: AAudio 和 MMAP
         - path: /devices/audio/warmup
           title: 预热
         - section:
@@ -498,7 +518,7 @@
         - path: /devices/camera/camera3_crop_reprocess
           title: 输出和剪裁
         - path: /devices/camera/camera3_error_stream
-          title: 错误和信息流
+          title: 错误和数据流
         - path: /devices/camera/camera3_requests_methods
           title: 创建请求
         - path: /devices/camera/versioning
@@ -549,7 +569,7 @@
           - path: /devices/graphics/testing
             title: 概览
           - path: /devices/graphics/build-tests
-            title: 构建测试程序
+            title: 编译测试程序
           - path: /devices/graphics/port-tests
             title: 移植测试框架
           - path: /devices/graphics/run-tests
@@ -715,6 +735,8 @@
           title: 特许权限白名单
         - path: /devices/tech/config/runtime_perms
           title: 运行时权限
+        - path: /devices/tech/config/timezone-rules
+          title: 时区规则
         - path: /devices/tech/config/uicc
           title: UICC
         - path: /devices/tech/config/usb-hal
@@ -732,7 +754,7 @@
         - path: /devices/tech/connect/data-saver
           title: 流量节省模式
         - path: /devices/tech/connect/emergency-affordance
-          title: 提供紧急呼叫
+          title: 快速紧急呼救
         - path: /devices/tech/connect/felica
           title: FeliCa 的主机卡模拟
         - path: /devices/tech/connect/oob-users
@@ -740,7 +762,9 @@
         - path: /devices/tech/connect/connect_tests
           title: 网络连接测试
         - path: /devices/tech/connect/ril
-          title: 无线界面层 (RIL)
+          title: 无线接口层 (RIL)
+        - path: /devices/tech/connect/wifi-aware
+          title: Wi-Fi Aware
         title: 网络连接
       - section:
         - path: /devices/tech/datausage/
@@ -777,18 +801,24 @@
           - path: /devices/tech/debug/jank_jitter
             title: 识别与系统行为相关的卡顿
           title: 评估性能
-        - path: /devices/tech/debug/asan
-          title: AddressSanitizer
-        - path: /devices/tech/debug/sanitizers
-          title: LLVM 清理程序
-        - path: /devices/tech/debug/kasan-kcov
-          title: 使用 KASAN + KCOV 编译内核
+        - section:
+          - path: /devices/tech/debug/fuzz-sanitize
+            title: 概览
+          - path: /devices/tech/debug/asan
+            title: AddressSanitizer
+          - path: /devices/tech/debug/sanitizers
+            title: LLVM 清理程序
+          - path: /devices/tech/debug/kasan-kcov
+            title: 使用 KASAN + KCOV 编译内核
+          - path: /devices/tech/debug/libfuzzer
+            title: 通过 libFuzzer 进行模糊测试
+          title: 模糊测试和清理
         - path: /devices/tech/debug/gdb
           title: 使用 GDB
         - path: /devices/tech/debug/native-memory
-          title: 本地内存使用情况
+          title: 本机内存使用情况
         - path: /devices/tech/debug/rescue-party
-          title: 救援方
+          title: Rescue Party
         - path: /devices/tech/debug/storaged
           title: Storaged
         - path: /devices/tech/debug/strace
@@ -820,13 +850,15 @@
         - path: /devices/tech/display/
           title: 概览
         - path: /devices/tech/display/adaptive-icons
-          title: 自动调节图标
+          title: 自适应图标
         - path: /devices/tech/display/app-shortcuts
           title: 应用快捷方式
         - path: /devices/tech/display/circular-icons
           title: 圆形图标
+        - path: /devices/tech/display/color-mgmt
+          title: 颜色管理
         - path: /devices/tech/display/dnd
-          title: 勿扰模式
+          title: 勿扰
         - path: /devices/tech/display/hdr
           title: HDR 视频
         - path: /devices/tech/display/multi-window
@@ -839,6 +871,8 @@
           title: 零售演示模式
         - path: /devices/tech/display/split-screen
           title: 分屏交互
+        - path: /devices/tech/display/textclassifier
+          title: TEXTCLASSIFIER
         - path: /devices/tech/display/widgets-shortcuts
           title: 微件和快捷方式
         title: 显示
@@ -848,7 +882,7 @@
         - path: /devices/tech/ota/tools
           title: OTA 工具
         - path: /devices/tech/ota/sign_builds
-          title: 签名版本以供发布
+          title: 对要发布的版本进行签名
         - path: /devices/tech/ota/reduce_size
           title: 减小 OTA 大小
         - path: /devices/tech/ota/ab_updates
@@ -860,7 +894,7 @@
         - path: /devices/tech/ota/block
           title: 基于块的 OTA
         - path: /devices/tech/ota/inside_packages
-          title: OTA 软件包内部
+          title: OTA 软件包内部探秘
         - path: /devices/tech/ota/device_code
           title: 设备专属代码
         title: OTA 更新
@@ -880,16 +914,16 @@
         - path: /devices/tech/power/
           title: 概览
         - path: /devices/tech/power/mgmt
-          title: 电源管理
+          title: 电耗管理
         - path: /devices/tech/power/performance
           title: 性能管理
         - path: /devices/tech/power/component
-          title: 组件电量消耗
+          title: 组件电耗
         - path: /devices/tech/power/device
-          title: 设备电源
+          title: 设备电耗
         - path: /devices/tech/power/values
-          title: 功率值
-        title: 功率
+          title: 电耗值
+        title: 电耗
       - section:
         - path: /devices/tech/settings/
           title: 概览
@@ -910,7 +944,7 @@
         - path: /devices/tech/test_infra/tradefed/fundamentals/machine_setup
           title: 机器设置
         - path: /devices/tech/test_infra/tradefed/fundamentals/devices
-          title: 使用设备
+          title: 测试设备
         - path: /devices/tech/test_infra/tradefed/fundamentals/lifecycle
           title: 测试生命周期
         - path: /devices/tech/test_infra/tradefed/fundamentals/options
diff --git a/zh-cn/_index.yaml b/zh-cn/_index.yaml
index 7bc0ea3..d8e5ec2 100644
--- a/zh-cn/_index.yaml
+++ b/zh-cn/_index.yaml
@@ -28,10 +28,10 @@
       image_path: /images/landing_icon-porting.png
     - heading: 保障 Android 安全至关重要
       description: >
-        了解 Android 安全计划的运作方式,并了解如何实现最新功能。
+        了解 Android 安全性计划的运作方式,并了解如何实现最新功能。
       image_path: /images/landing_icon-security.png
       buttons:
-      - label: 实现安全
+      - label: 实现安全性
         path: /security/
     - heading: 确保兼容性,支持各类应用
       description: >
@@ -44,31 +44,31 @@
       tf-about-row devsite-landing-row-75
     background: grey
     items:
-    - heading: Android 开放源代码项目简介
+    - heading: Android 开源项目简介
       description: |
-        Android 是一个支持多种移动设备的开源软件堆栈以及对应的由 Google 领导的开源项目。此网站和 Android 开放源代码项目 (AOSP) 代码库可为您提供所需信息和源代码,供您创建定制的 Android 堆栈版本,将设备和配件移植到 Android 平台,同时确保您的设备符合兼容性要求。<br /><br />
+        Android 是一个支持多种移动设备的开源软件堆栈以及对应的由 Google 领导的开源项目。此网站和 Android 开源项目 (AOSP) 代码库可为您提供所需信息和源代码,供您创建定制的 Android 堆栈版本,将设备和配件移植到 Android 平台,同时确保您的设备符合兼容性要求。<br /><br />
 
         此外,我们还希望确保 Android 平台不存在一个集中瓶颈(意即没有任何行业参与者可一手限制或控制其他参与者的创新)。这样,我们就可以针对消费类商品打造一个完整的高品质操作系统,并支持对源代码进行定制和移植。<br /><br />
 
-        欢迎您向我们的 AOSP 文档网站贡献力量。随着生态系统不断变化,我们需要您的帮助来保持最新状态。您可以按照我们的 <a href="https://android.googlesource.com/platform/docs/source.android.com/+/master/README.txt">README</a> 中的说明直接对源文件进行修复,也可以使用任意页面底部的<a href="https://issuetracker.google.com/issues/new?component=191476">网站反馈</a>链接来报告错误以及提供改进建议。如需详细了解所有更新,请参阅网站的<a href="https://android.googlesource.com/platform/docs/source.android.com/+log/master?pretty=full&no-merges">更改日志</a>。
+        欢迎您向我们的 AOSP 文档网站贡献力量。随着生态系统不断变化,我们需要您的帮助来保持内容与时俱进。您可以按照我们的 <a href="https://android.googlesource.com/platform/docs/source.android.com/+/master/README.txt">README</a> 中的说明直接对源文件进行修正,也可以使用任意页面底部的<a href="https://issuetracker.google.com/issues/new?component=191476">网站反馈</a>链接来报告错误以及提出改进建议。如需详细了解所有更新,请参阅网站的<a href="https://android.googlesource.com/platform/docs/source.android.com/+log/master?pretty=full&no-merges">更改日志</a>。
       image_path: /images/android_stack.png
   - heading: 新闻
     items:
     - heading: Android 8.1 版说明
       description: >
-        Android 8.1 版现已推出,其中提供了许多面向设备制造商以及这类用户的新功能。
+        Android 8.1 版现已推出,其中提供了许多面向设备制造商以及个人用户的新功能。
       buttons:
       - label: 2017 年 12 月 5 日
         path: /setup/site-updates#Dec-2017
     - heading: HIDL 参考资料更新
       description: >
-        HAL 接口描述语言 (HIDL) 的参考资料已更新,以体现 Android 8.1 版本。
+        HAL 接口描述语言 (HIDL) 的参考资料已更新,以体现 Android 8.1 版本的相关变化。
       buttons:
       - label: 2017 年 12 月 5 日
         path: /reference/hidl/
     - heading: 12 月安全公告
       description: >
-        2017 年 12 月的 Android 和 Pixel/Nexus 安全公告已经发布,可为 12 月安全更新补丁提供支持。
+        2017 年 12 月的 Android 和 Pixel/Nexus 安全公告已经发布,其中提供了与 12 月安全更新补丁相关的信息。
       buttons:
       - label: 2017 年 12 月 4 日
         path: /security/bulletin/2017-12-01
diff --git a/zh-cn/compatibility/cts/audio-framework.html b/zh-cn/compatibility/cts/audio-framework.html
index 777cdb1..a592cbe 100644
--- a/zh-cn/compatibility/cts/audio-framework.html
+++ b/zh-cn/compatibility/cts/audio-framework.html
@@ -95,7 +95,7 @@
     <td><img src="/compatibility/cts/images/audio-framework-line-port.png" alt="音频频响曲线" width="300" id="line_port_check"/></td>
  </tr>
  <tr>
-    <td>如果上一步中的回答为 <strong>NO</strong>,请按测试底部的<strong>通过</strong>(绿色对勾标记)并完成。</td>
+    <td>如果上一步中的回答为 <strong>NO</strong>,请按测试底部的<strong>通过</strong>(绿色对勾标记)并完成</td>
     <td><img src="/compatibility/cts/images/audio-framework-pass.png" alt="音频通过按钮" width="300" id="port_pass"/></td>
  </tr>
  <tr>
diff --git a/zh-cn/compatibility/cts/run.html b/zh-cn/compatibility/cts/run.html
index 4f7aa52..0269d33 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 脚本(例如 <code>$ ./android-cts/tools/cts-tradefed</code>)来启动 CTS 控制台。<em></em>
+  </li><li>通过运行解压缩 CTS 包所得的文件夹中的 cts-tradefed<em></em> 脚本(例如 <code>$ ./android-cts/tools/cts-tradefed</code>)来启动 CTS 控制台。
   </li><li>通过附加以下命令启动默认测试计划(包含所有测试包):<code>run
     cts --plan CTS</code>。这将启动测试兼容性所需的所有 CTS 测试。
       <ul>
diff --git a/zh-cn/compatibility/cts/setup.html b/zh-cn/compatibility/cts/setup.html
index 1447e96..f9e4a1f 100644
--- a/zh-cn/compatibility/cts/setup.html
+++ b/zh-cn/compatibility/cts/setup.html
@@ -140,7 +140,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) 视为隔离的客户端(请参阅上文的<em>物理环境</em>部分),并可以连接到互联网:<a href="#physical_environment">设置 &gt; WLAN</a><strong></strong>
+  </li><li><em></em>连接到满足以下要求的 WLAN 网络:支持 IPv6,可以将被测设备 (DUT) 视为隔离的客户端(请参阅上文的<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>
@@ -159,7 +159,7 @@
 <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> 和任何其他预加载的设备管理器保持停用状态。
+依次选择“设置”&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 3c83e82..570c125 100644
--- a/zh-cn/compatibility/cts/usb-audio.html
+++ b/zh-cn/compatibility/cts/usb-audio.html
@@ -197,7 +197,7 @@
 
 <table>
   <tbody><tr>
-   <td width="50%">选择“USB Audio Peripheral Record Test”<em></em>
+   <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>
diff --git a/zh-cn/compatibility/index.html b/zh-cn/compatibility/index.html
index a8a7117..0676c81 100644
--- a/zh-cn/compatibility/index.html
+++ b/zh-cn/compatibility/index.html
@@ -49,8 +49,8 @@
 <p>要打造与 Android 兼容的移动设备,请遵循以下三个步骤进行操作:</p>
 <ol>
 <li>获取 <a href="/setup/index.html">Android 软件源代码</a><em></em>。这是要移植到您的硬件的 Android 平台源代码。</li>
-<li><em></em>遵循 Android 兼容性定义文档 (CDD)(<a href="/compatibility/android-cdd.pdf">PDF</a>、<a href="/compatibility/android-cdd.html">HTML</a>)的要求。CDD 列出了对兼容的 Android 设备的软件和硬件要求。</li>
-<li>通过<a href="/compatibility/cts/">兼容性测试套件 (CTS)</a><em></em> 测试。在开发过程中随时借助 CTS 评估兼容性。</li> </ol>
+<li>遵循 Android 兼容性定义文档 (CDD)(<em></em>PDF、<a href="/compatibility/android-cdd.pdf">HTML</a>)的要求。<a href="/compatibility/android-cdd.html"></a>CDD 列出了对兼容的 Android 设备的软件和硬件要求。</li>
+<li>通过<a href="/compatibility/cts/">兼容性测试套件 (CTS)</a> 测试。<em></em>在开发过程中随时借助 CTS 评估兼容性。</li> </ol>
 
 <p>在符合 CDD 要求且通过 CTS 测试后,您的设备即是与 Android 兼容的设备,这意味着生态系统中的 Android 应用在您的设备上运行时可提供一致的体验。有关 Android 兼容性计划的详细信息,请参阅<a href="overview.html">计划概述</a>。</p>
 
diff --git a/zh-cn/devices/architecture/dto/optimize.html b/zh-cn/devices/architecture/dto/optimize.html
index a2a6866..1b0e861 100644
--- a/zh-cn/devices/architecture/dto/optimize.html
+++ b/zh-cn/devices/architecture/dto/optimize.html
@@ -70,7 +70,7 @@
 </tbody></table>
 
 <h2 id="libufdt">libufdt</h2>
-<p>虽然最新的 <code><a href="https://github.com/dgibson/dtc/tree/master/libfdt" class="external">libfdt</a></code> 支持 DTO,但是我们建议您使用 <code>libufdt</code> 来实现 DTO(源文件位于 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></p>
+<p>虽然最新的 <code><a href="https://github.com/dgibson/dtc/tree/master/libfdt" class="external">libfdt</a></code> 支持 DTO,但是我们建议您使用 <code>libufdt</code> 来实现 DTO(源文件位于 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></p>
 
 <h3 id="performance">性能测试</h3>
 <p>在 Google 的内部测试中,进行编译后,在 2405 个 <code>.dtb</code> 和 283 个 <code>.dtbo</code> DT 节点上使用 <code>libufdt</code> 生成了 70618 字节和 8566 字节的文件。与从 FreeBSD 移植的 <a href="http://fxr.watson.org/fxr/source/boot/fdt/" class="external">DTO 实现</a>(运行时为 124 毫秒)相比,<code>libufdt</code> DTO 运行时为 10 毫秒。</p>
diff --git a/zh-cn/devices/architecture/hidl-cpp/functions.html b/zh-cn/devices/architecture/hidl-cpp/functions.html
index 4b62dc8..f55119e 100644
--- a/zh-cn/devices/architecture/hidl-cpp/functions.html
+++ b/zh-cn/devices/architecture/hidl-cpp/functions.html
@@ -25,7 +25,8 @@
 <h2 id="parameters">函数参数</h2>
 <p><code>.hal</code> 文件中列出的参数会映射到 C++ 数据类型。未映射到基元 C++ 类型的参数会通过常量引用进行传递。</p>
 
-<p>对于具有返回值(具有 <code>generates</code> 语句)的每个 HIDL 函数,该函数的 C++ 参数列表中都有一个附加参数:使用 HIDL 函数的返回值调用的回调函数。不过也有<strong>一个例外</strong>:如果 <code>generates</code> 子句包含直接映射到 C++ 基元的单个参数,则使用回调省略(回调会被移除,而返回值则会通过正常的 <code>return</code> 语句从函数返回)。<em></em></p>
+<p>对于具有返回值(具有 <code>generates</code> 语句)的每个 HIDL 函数,该函数的 C++ 参数列表中都有一个附加参数:使用 HIDL 函数的返回值调用的回调函数。
+不过也有<strong>一个例外</strong>:如果 <code>generates</code> 子句包含直接映射到 C++ 基元的单个参数,则使用回调省略(回调会被移除,而返回值则会通过正常的 <code>return</code> 语句从函数返回)。<em></em></p>
 
 <h2 id="return-values">函数返回值</h2>
 <p>以下函数具有返回值。</p>
@@ -60,7 +61,8 @@
 <h3 id="return-callback">使用回调参数返回</h3>
 <p>回调可以将 HIDL 函数的返回值回传给调用方。回调的原型是 <code>std::function</code> 对象,其参数(从 <code>generates</code> 语句中获取)会映射到 C++ 类型。它的返回值为 void(回调本身并不会返回任何值)。</p>
 
-<p>具有回调参数的 C++ 函数的返回值具有 <code>Return&lt;void&gt;</code> 类型。服务器实现仅负责提供返回值。由于返回值已使用回调传输,因此 <code>T</code> 模板参数为 <code>void</code>:</p>
+<p>具有回调参数的 C++ 函数的返回值具有 <code>Return&lt;void&gt;</code> 类型。服务器实现仅负责提供返回值。由于返回值已使用回调传输,因此 <code>T</code> 模板参数为 <code>void</code>:
+</p>
 
 <pre class="prettyprint">
 Return&lt;void&gt; someMethod(someMethod_cb _cb);
diff --git a/zh-cn/devices/architecture/hidl-cpp/index.html b/zh-cn/devices/architecture/hidl-cpp/index.html
index 517d911..94f6804 100644
--- a/zh-cn/devices/architecture/hidl-cpp/index.html
+++ b/zh-cn/devices/architecture/hidl-cpp/index.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>Android O 对 Android 操作系统的架构重新进行了设计,以在独立于设备的 Android 平台与特定于设备和供应商的代码之间定义清晰的接口。Android 已经以 HAL 接口的形式(在 <code>hardware/libhardware</code> 下定义为 C 标头)定义了许多此类接口。HIDL 将这些 HAL 接口替换为稳定的带版本接口,它们可以是采用 C++ 的客户端和服务器端 HIDL 接口(如下所述)或 <a href="/devices/architecture/hidl-java/index.html">Java</a> 接口。</p>
+<p>Android O 对 Android 操作系统的架构重新进行了设计,以在独立于设备的 Android 平台与特定于设备和供应商的代码之间定义清晰的接口。Android 已经以 HAL 接口的形式(在 <code>hardware/libhardware</code> 中定义为 C 标头)定义了许多此类接口。HIDL 将这些 HAL 接口替换为稳定的带版本接口,它们可以是采用 C++(如下所述)或 <a href="/devices/architecture/hidl-java/index.html">Java</a> 的客户端和服务器端 HIDL 接口。</p>
 
 <p>本部分中的几页内容介绍了 HIDL 接口的 C++ 实现,其中详细说明了 <code>hidl-gen</code> 编译器基于 HIDL <code>.hal</code> 文件自动生成的文件,这些文件如何打包,以及如何将这些文件与使用它们的 C++ 代码集成。</p>
 
@@ -70,9 +70,9 @@
     -randroid.hidl:system/libhidl/transport $PACKAGE
 </pre>
 
-<p>为了让 HAL 在直通模式下发挥作用(对于旧版设备),您必须具有 HIDL_FETCH_IModuleName 函数<em></em>(位于 <code>/system/lib(64)?/hw/[email protected](-$OPTIONAL_IDENTIFIER).so</code> 下),其中 <code>$OPTIONAL_IDENTIFIER</code> 是一个标识直通实现的字符串。直通模式要求会通过上述命令自动满足,这些命令也会创建 <code>[email protected]</code> 目标。</p>
+<p>为了让 HAL 在直通模式下发挥作用(对于旧版设备),您必须具有 HIDL_FETCH_IModuleName 函数<em></em>(位于 <code>/system/lib(64)?/hw/[email protected]($OPTIONAL_IDENTIFIER).so</code> 下),其中 <code>$OPTIONAL_IDENTIFIER</code> 是一个用于标识直通实现的字符串。直通模式要求会通过上述命令自动满足,这些命令也可用于创建 <code>[email protected]</code> 目标,但是可以使用扩展。例如,<code>[email protected]</code> 就是使用 <code>-foo</code> 来区分它自己。</p>
 
-<p>接下来,使用功能填写存根并设置守护进程。守护进程代码(支持直通)示例:</p>
+<p>接下来,使用相应功能填写存根并设置守护进程。守护进程代码(支持直通)示例:</p>
 
 <pre class="prettyprint">
 #include &lt;hidl/LegacySupport.h&gt;
@@ -87,7 +87,11 @@
 <pre class="prettyprint">
 int main(int /* argc */, char* /* argv */ []) {
     Nfc nfc = new Nfc();
-    nfc-&gt;registerAsService();
+    const status_t status = nfc-&gt;registerAsService();
+    if (status != ::android::OK) {
+        return 1; // or handle error
+    }
+    // join pool or do other things
 }
 </pre>
 
diff --git a/zh-cn/devices/architecture/hidl-cpp/types.html b/zh-cn/devices/architecture/hidl-cpp/types.html
index 9885dcb..170c86e 100644
--- a/zh-cn/devices/architecture/hidl-cpp/types.html
+++ b/zh-cn/devices/architecture/hidl-cpp/types.html
@@ -22,7 +22,7 @@
 
 <p>HIDL 数据声明可生成 C++ 标准布局数据结构。您可以将这些结构放置在任何合适的位置(可以放在堆栈上,放在文件或全局范围内,也可以放在堆区上),而且这些结构能以相同的方式构成。客户端代码会调用传入常量引用和基元类型的 HIDL 代理代码,而存根和代理代码会隐藏序列化的细节。</p>
 
-<p class="note"><strong>注意:</strong>在任何情况下,对数据结构进行显式序列化或反序列化都不需要使用开发者编写的代码。</p>
+<p class="note"><strong>注意</strong>:在任何情况下,开发者编写的代码都不需要对数据结构进行显式序列化或反序列化。</p>
 
 <p>下表将 HIDL 基元映射到了 C++ 数据类型:</p>
 
@@ -213,7 +213,7 @@
 <h2 id="vect">vec&lt;T&gt;</h2>
 <p><code>hidl_vec&lt;T&gt;</code> 类模板是 <code>libhidlbase</code> 的一部分,可用于传递具备任意大小的任何 HIDL 类型的矢量。与之相当的具有固定大小的容器是 <code>hidl_array</code>。此外,您也可以使用 <code>hidl_vec::setToExternal()</code> 函数将 <code>hidl_vec&lt;T&gt;</code> 初始化为指向 <code>T</code> 类型的外部数据缓冲区。</p>
 
-<p>除了在生成的 C++ 标头中适当地发出/插入结构之外,您还可以使用 <code>vec&lt;T&gt;</code> 生成一些便利函数,用于转换到 <code>std::vector</code> 和 <code>T</code> 裸指针或从其进行转换。如果您将 <code>vec&lt;T&gt;</code> 用作参数,则使用它的函数将过载(将生成两个原型),以接受并传递该参数的 HIDL 结构和 <code>std::vector&lt;T&gt;</code> 类型。</p>
+<p>除了在生成的 C++ 标头中适当地发出/插入结构之外,您还可以使用 <code>vec&lt;T&gt;</code> 生成一些便利函数,用于转换到 <code>std::vector</code> 和 <code>T</code> 裸指针或从它们进行转换。如果您将 <code>vec&lt;T&gt;</code> 用作参数,则使用它的函数将过载(将生成两个原型),以接受并传递该参数的 HIDL 结构和 <code>std::vector&lt;T&gt;</code> 类型。</p>
 
 <h2 id="arrays">数组</h2>
 <p>hidl 中的常量数组由 <code>libhidlbase</code> 中的 <code>hidl_array</code> 类表示。<code>hidl_array&lt;T, S1, S2, …,
@@ -222,7 +222,7 @@
 <h2 id="string">字符串</h2>
 <p><code>hidl_string</code> 类(<code>libhidlbase</code> 的一部分)可用于通过 HIDL 接口传递字符串,并在 <code>/system/libhidl/base/include/hidl/HidlSupport.h</code> 下进行定义。该类中的第一个存储位置是指向其字符缓冲区的指针。</p>
 
-<p><code>hidl_string</code> 知道如何使用 <code>operator=</code>、隐式转换和 <code>.c_str()</code> 函数转换到 <code>std::string and char*</code>(C 样式的字符串)以及如何从其进行转换。HIDL 字符串结构具有适当的复制构造函数和赋值运算符,可用于:</p>
+<p><code>hidl_string</code> 知道如何使用 <code>operator=</code>、隐式类型转换和 <code>.c_str()</code> 函数转换到 <code>std::string and char*</code>(C 样式的字符串)以及如何从其进行转换。HIDL 字符串结构具有适当的复制构造函数和赋值运算符,可用于:</p>
 
 <ul>
 <li>从 <code>std::string</code> 或 C 字符串加载 HIDL 字符串。</li>
@@ -236,7 +236,7 @@
 
 <h2 id="handle">句柄</h2>
 
-<p class="warning"><strong>警告:</strong>任何类型的地址(即使是物理设备地址)都不得是本机句柄的一部分。在进程之间传递这项信息很危险,会使这些信息容易遭到窃取。在进程之间传递的任何值都必须先经过验证,然后才能用于在进程内查找分配的内存。否则,错误的句柄可能会导致内存访问错误或内存损坏。</p>
+<p class="warning"><strong>警告</strong>:任何类型的地址(即使是物理设备地址)都不能是本机句柄的一部分。在进程之间传递该信息很危险,会导致进程容易受到攻击。在进程之间传递的任何值都必须先经过验证,然后才能用于在进程内查找分配的内存。否则,错误的句柄可能会导致内存访问错误或内存损坏。</p>
 
 <p><code>handle</code> 类型由 C++ 形式的 <code>hidl_handle</code> 结构表示,该结构是一个简单的封装容器,用于封装指向 <code>const native_handle_t</code> 对象的指针(该对象已经在 Android 中存在了很长时间)。</p>
 
@@ -308,8 +308,8 @@
 </pre>
 
 <h2 id="interfaces">接口</h2>
-<p>接口可作为对象传递。“接口”一词可用作 <code>[email protected]::IBase</code> 类型的语法糖衣;此外,当前的接口以及任何导入的接口都将定义为一种类型。<em></em></p>
+<p>接口可作为对象传递。<em></em>“接口”一词可用作 <code>[email protected]::IBase</code> 类型的语法糖衣;此外,当前的接口以及任何导入的接口都将定义为一种类型。</p>
 
-<p>保存接口的变量应该是强指针:<code>sp&lt;IName&gt;</code>。接受接口参数的 HIDL 函数会将原始指针转换为强指针,从而导致非直觉行为(可能会意外清除指针)。为避免出现问题,请务必将 HIDL 接口存储为 <code>sp&lt;&gt;</code>。</p>
+<p>存储接口的变量应该是强指针:<code>sp&lt;IName&gt;</code>。接受接口参数的 HIDL 函数会将原始指针转换为强指针,从而导致非直觉行为(可能会意外清除指针)。为避免出现问题,请务必将 HIDL 接口存储为 <code>sp&lt;&gt;</code>。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/hidl/binder-ipc.html b/zh-cn/devices/architecture/hidl/binder-ipc.html
index 874c11c..560c9f4 100644
--- a/zh-cn/devices/architecture/hidl/binder-ipc.html
+++ b/zh-cn/devices/architecture/hidl/binder-ipc.html
@@ -28,7 +28,8 @@
 
 <h3 id="contexts">多个 Binder 域(上下文)</h3>
 <em>在通用 3.10、3.18、4.4、4.9 版内核和上游中</em>
-<p>为了明确地拆分框架(与设备无关)和供应商(与具体设备相关)代码之间的 Binder 流量,Android O 引入了“Binder 上下文”这一概念。<em></em>每个 Binder 上下文都有自己的设备节点和上下文(服务)管理器。您只能通过上下文管理器所属的设备节点对其进行访问,并且在通过特定上下文传递 Binder 节点时,只能由另一个进程从相同的上下文访问上下文管理器,从而确保这些域完全互相隔离。如需使用方法的详细信息,请参阅 <a href="#vndbinder">vndbinder</a> 和 <a href="#vndservicemanager">vndservicemanager</a>。
+<p>
+为了明确地拆分框架(与设备无关)和供应商(与具体设备相关)代码之间的 Binder 流量,Android O 引入了“Binder 上下文”这一概念。<em></em>每个 Binder 上下文都有自己的设备节点和上下文(服务)管理器。您只能通过上下文管理器所属的设备节点对其进行访问,并且在通过特定上下文传递 Binder 节点时,只能由另一个进程从相同的上下文访问上下文管理器,从而确保这些域完全互相隔离。如需使用方法的详细信息,请参阅 <a href="#vndbinder">vndbinder</a> 和 <a href="#vndservicemanager">vndservicemanager</a>。
 </p>
 
 <h3 id="scatter">分散-集中</h3>
@@ -41,7 +42,8 @@
 <li>一次是在目标进程中对 <code>Parcel</code> 进行反序列化</li>
 </ul>
 
-<p>Android O 使用<a href="https://en.wikipedia.org/wiki/Vectored_I/O">分散-集中优化</a>机制将复制次数从 3 次减少到了 1 次。数据保留在其原始结构和内存布局中且 Binder 驱动程序会立即将数据复制到目标进程中,而不是先在 <code>Parcel</code> 中对数据进行序列化。在目标进程中,这些数据的结构和内存布局保持不变,并且,在无需再次复制的情况下即可读取这些数据。
+<p>
+Android O 使用<a href="https://en.wikipedia.org/wiki/Vectored_I/O">分散-集中优化</a>机制将复制次数从 3 次减少到了 1 次。数据保留其原始结构和内存布局,且 Binder 驱动程序会立即将数据复制到目标进程中,而不是先在 <code>Parcel</code> 中对数据进行序列化。在目标进程中,这些数据的结构和内存布局保持不变,并且,在无需再次复制的情况下即可读取这些数据。
 </p>
 
 <h3 id="locking">精细锁定</h3>
@@ -59,15 +61,18 @@
 
 <p>Binder 驱动程序一直支持 nice 优先级继承。随着 Android 中以实时优先级运行的进程日益增加,现在出现以下这种情形也属正常:如果实时线程进行 Binder 调用,则处理该调用的进程中的线程同样会以实时优先级运行。为了支持这些使用情景,Android O 现在在 Binder 驱动程序中实现了实时优先级继承。
 </p>
-<p>除了事务级优先级继承之外,“节点优先级继承”允许节点(Binder 服务对象)指定对该节点执行调用操作所需的最低优先级。<em></em>之前版本的 Android 已经通过 nice 值支持节点优先级继承,但 Android O 增加了对实时调度政策节点继承的支持。
+<p>
+除了事务级优先级继承之外,“节点优先级继承”允许节点(Binder 服务对象)指定对该节点执行调用操作所需的最低优先级。<em></em>之前版本的 Android 已经通过 nice 值支持节点优先级继承,但 Android O 增加了对实时调度政策节点继承的支持。
 </p>
 <p class="note"><strong>注意</strong>:Android 性能团队发现,实时优先级继承会对框架 Binder 域 (<code>/dev/binder</code>) 造成不必要的负面影响,因此已对该域<strong>停用</strong>实时优先级继承。
 </p>
 
 <h3 id="userspace">用户空间更改</h3>
-<p>Android O 纳入了在通用内核中使用现有 Binder 驱动程序所需的所有用户空间更改,但有一个例外:针对 <code>/dev/binder</code> 停用实时优先级继承的原始实现使用的是 <a href="https://android.googlesource.com/kernel/msm/+/868f6ee048c6ff51dbd92353dd5c68bea4419c78" class="external">ioctl</a>。由于后续开发将优先级继承的控制方法改为了更加精细的方法(根据 Binder 模式,而非上下文),因此,ioctl 不存于 Android 通用分支中,而是<a href="https://android-review.googlesource.com/#/c/421861/" class="external">提交到了我们的通用内核中</a>。
+<p>
+Android O 纳入了在通用内核中使用现有 Binder 驱动程序所需的所有用户空间更改,但有一个例外:针对 <code>/dev/binder</code> 停用实时优先级继承的原始实现使用的是 <a href="https://android.googlesource.com/kernel/msm/+/868f6ee048c6ff51dbd92353dd5c68bea4419c78" class="external">ioctl</a>。由于后续开发将优先级继承的控制方法改为了更加精细的方法(根据 Binder 模式,而非上下文),因此,ioctl 不存于 Android 通用分支中,而是<a href="https://android-review.googlesource.com/#/c/421861/" class="external">提交到了我们的通用内核中</a>。
 </p>
-<p>此项更改的影响是,所有节点均默认停用实时优先级继承。<em></em>Android 性能团队发现,为 <code>hwbinder</code> 域中的所有节点启用实时优先级继承会有一定好处。要达到同样的效果,请在用户空间中择优实施<a href="https://android-review.googlesource.com/#/c/440359/" class="external">此更改</a>。
+<p>
+此项更改的影响是,所有节点均默认停用实时优先级继承。<em></em>Android 性能团队发现,为 <code>hwbinder</code> 域中的所有节点启用实时优先级继承会有一定好处。要达到同样的效果,请在用户空间中择优实施<a href="https://android-review.googlesource.com/#/c/440359/" class="external">此更改</a>。
 </p>
 <h3 id="shas">通用内核的 SHA</h3>
 <p>要获取对 Binder 驱动程序所做的必要更改,请同步到下列 SHA(或更高版本):
@@ -109,7 +114,7 @@
 
 <p>为了显示 <code>/dev/vndbinder</code>,请确保内核配置项 <code>CONFIG_ANDROID_BINDER_DEVICES</code> 设为 <code>"binder,hwbinder,vndbinder"</code>(这是 Android 通用内核树的默认设置)。</p>
 
-<p>通常,供应商进程不直接打开 Binder 驱动程序,而是链接到打开 Binder 驱动程序的 <code>libbinder</code> 用户空间库。为 <code>::android::ProcessState()</code> 添加方法可为 <code>libbinder</code> 选择 Binder 驱动程序。供应商进程应该在调用 <code>ProcessState,</code>、<code>IPCThreadState</code> 或(在一般情况下)发出任何 Binder 调用<strong>之前</strong>调用此方法。要使用该方法,请在供应商进程(客户端和服务器)的 <code>main()</code> 后放置以下调用:</p>
+<p>通常,供应商进程不直接打开 Binder 驱动程序,而是链接到打开 Binder 驱动程序的 <code>libbinder</code> 用户空间库。为 <code>::android::ProcessState()</code> 添加方法可为 <code>libbinder</code> 选择 Binder 驱动程序。供应商进程应该在调用 <code>ProcessState,</code>、<code>IPCThreadState</code> 或发出任何普通 Binder 调用<strong>之前</strong>调用此方法。要使用该方法,请在供应商进程(客户端和服务器)的 <code>main()</code> 后放置以下调用:</p>
 
 <pre class="prettyprint">ProcessState::initWithDriver("/dev/vndbinder");</pre>
 
@@ -137,7 +142,7 @@
 
 <p>要满足要求 4,您必须按照处理服务名称、服务标签和规则的方式进行更改。</p>
 
-<p>有关 SELinux 的详细信息,请参阅 <a href="https://source.android.com/security/selinux/">Android 中的安全增强型 Linux</a>。有关 Android 8.0 中 SELinux 的详细信息,请参阅 <a href="/security/selinux/images/SELinux_Treble.pdf">SELinux for Android 8.0</a>。</p>
+<p>有关 SELinux 的详细信息,请参阅 <a href="/security/selinux/">Android 中的安全增强型 Linux</a>。有关 Android 8.0 中 SELinux 的详细信息,请参阅 <a href="/security/selinux/images/SELinux_Treble.pdf">SELinux for Android 8.0</a>。</p>
 
 <h3 id="names">服务名称</h3>
 <p>以前,供应商进程在 <code>service_contexts</code> 文件中注册服务名称并添加用于访问该文件的相应规则。来自 <code>device/google/marlin/sepolicy</code> 的 <code>service_contexts</code> 文件示例:</p>
@@ -151,7 +156,7 @@
 vendor.qcom.PeripheralManager         u:object_r:per_mgr_service:s0
 </pre>
 
-<p>而在 Android O 中,<code>vndservicemanager</code> 会加载 <code>vndservice_contexts</code> 文件。迁移到 <code>vndservicemanager</code> 供应商服务(且已经在旧的 <code>service_contexts</code> 文件中)的供应商服务应该添加到新的 <code>vndservice_contexts</code> 文件中。</p>
+<p>而在 Android O 中,<code>vndservicemanager</code> 会加载 <code>vndservice_contexts</code> 文件。迁移到 <code>vndservicemanager</code>(且已经在旧的 <code>service_contexts</code> 文件中)的供应商服务应该添加到新的 <code>vndservice_contexts</code> 文件中。</p>
 
 <h3 id="labels">服务标签</h3>
 <p>以前,服务标签(例如 <code>u:object_r:atfwd_service:s0</code>)在 <code>service.te</code> 文件中定义。例如:</p>
@@ -170,8 +175,7 @@
 allow some_vendor_app atfwd_service:service_manager add;
 </pre>
 
-<p>在 Android O 中,这样的规则可继续存在并使用相同的类。例如:
-</p>
+<p>在 Android O 中,这样的规则可继续存在并使用相同的类。例如:</p>
 
 <pre class="prettyprint">
 allow atfwd atfwd_service:service_manager find;
diff --git a/zh-cn/devices/architecture/hidl/code-style.html b/zh-cn/devices/architecture/hidl/code-style.html
index ac06cdc..b16f742 100644
--- a/zh-cn/devices/architecture/hidl/code-style.html
+++ b/zh-cn/devices/architecture/hidl/code-style.html
@@ -440,7 +440,7 @@
 };
 </pre>
 
-<p>如果一行中放不下,则尝试按相同的缩进量放置参数和返回值,并突出 <code>generate</code>,以便阅读者快速看到参数和返回值。例如:</p>
+<p>如果一行中放不下,则尝试按相同的缩进量放置参数和返回值,并突出 <code>generate</code>,以便读取器快速看到参数和返回值。例如:</p>
 
 <pre class="prettyprint">
 interface IFoo {
@@ -476,14 +476,14 @@
 <li>将换行的参数与上一行的第一个参数对齐,如果不能对齐,则这些参数缩进 8 个空格。</li>
 </ul>
 
-<h3 id="annotations">注解</h3>
-<p>对于注解,请采用以下格式:</p>
+<h3 id="annotations">注释</h3>
+<p>对于注释,请采用以下格式:</p>
 
 <pre class="prettyprint">
 @annotate(keyword = value, keyword = {value, value, value})
 </pre>
 
-<p>按字母顺序对注解进行排序,并在等号两边加空格。例如:</p>
+<p>按字母顺序对注释进行排序,并在等号两边加空格。例如:</p>
 
 <pre class="prettyprint">
 @callflow(key = value)
@@ -491,7 +491,7 @@
 @exit
 </pre>
 
-<p>确保注解占一整行。例如:</p>
+<p>确保注释占一整行。例如:</p>
 <pre class="prettyprint">
 // Good
 @entry
@@ -501,7 +501,7 @@
 @entry @exit
 </pre>
 
-<p>如果注解在同一行中放不下,则缩进 8 个空格。例如:</p>
+<p>如果注释在同一行中放不下,则缩进 8 个空格。例如:</p>
 
 <pre class="prettyprint">
 @annotate(
@@ -525,7 +525,7 @@
 @callflow(key = { "val","val" })
 </pre>
 
-<p>注解和函数声明之间不得有空行。例如:</p>
+<p>注释和函数声明之间不得有空行。例如:</p>
 <pre class="prettyprint">
 // Good
 @entry
diff --git a/zh-cn/devices/architecture/hidl/fmq.html b/zh-cn/devices/architecture/hidl/fmq.html
index 070d0e5..c5fb1fd 100644
--- a/zh-cn/devices/architecture/hidl/fmq.html
+++ b/zh-cn/devices/architecture/hidl/fmq.html
@@ -184,7 +184,7 @@
 
 <ul>
 <li><code>beginWrite</code> 方法负责提供用于访问 FMQ 环形缓冲区的基址指针。在数据写入之后,使用 <code>commitWrite()</code> 提交数据。<code>beginRead</code>/<code>commitRead</code> 方法的运作方式与之相同。</li>
-<li><code>beginRead</code>/<code>Write</code> 方法会将要读取/写入的消息条数视为输入,并会返回一个布尔值来指示是否可以执行读取/写入操作。如果可以执行读取或写入操作,则 <code>memTx</code> 结构体中会填入基址指针,该指针可用于对环形缓冲区共享内存进行直接指针访问。</li>
+<li><code>beginRead</code>/<code>Write</code> 方法会将要读取/写入的消息条数视为输入,并会返回一个布尔值来指示是否可以执行读取/写入操作。如果可以执行读取或写入操作,则 <code>memTx</code> 结构体中会填入基址指针,这些指针可用于对环形缓冲区共享内存进行直接指针访问。</li>
 <li><code>MemRegion</code> 结构体包含有关内存块的详细信息,其中包括基址指针(内存块的基址)和以 <code>T</code> 表示的长度(以 HIDL 定义的消息队列类型表示的内存块长度)。</li>
 <li><code>MemTransaction</code> 结构体包含两个 <code>MemRegion</code> 结构体(<code>first</code> 和 <code>second</code>),因为对环形缓冲区执行读取或写入操作时可能需要绕回到队列开头。这意味着,要对 FMQ 环形缓冲区执行数据读取/写入操作,需要两个基址指针。</li>
 </ul>
@@ -209,17 +209,17 @@
 <pre class="prettyprint">
 MessageQueueSync::MemTransaction tx;
 if (mQueue-&gt;beginRead(dataLen, &amp;tx)) {
-auto first = tx.getFirstRegion();
-auto second = tx.getSecondRegion();
+    auto first = tx.getFirstRegion();
+    auto second = tx.getSecondRegion();
 
-foo(first.getAddress(), first.getLength()); // method that performs the data write
-foo(second.getAddress(), second.getLength()); // method that performs the data write
+    foo(first.getAddress(), first.getLength()); // method that performs the data write
+    foo(second.getAddress(), second.getLength()); // method that performs the data write
 
-if(commitWrite(dataLen) == false) {
-//report error
-}
+    if(commitWrite(dataLen) == false) {
+       // report error
+    }
 } else {
-//report error
+   // report error
 }
 </pre>
 
@@ -240,7 +240,7 @@
 <ol>
 <li>创建消息队列对象,如上所述。</li>
 <li>使用 <code>isValid()</code> 验证对象是否有效。</li>
-<li>如果您要通过将 <code>EventFlag</code> 传递到长格式的 <code>readBlocking()</code>/<code>writeBlocking()</code> 来等待多个队列,则可以从经过初始化的 <code>MessageQueue</code> 对象提取事件标记指针(使用 <code>getEventFlagWord()</code>)以创建标记,然后使用创建的标记来创建必需的 <code>EventFlag</code> 对象。</li>
+<li>如果您要通过将 <code>EventFlag</code> 传递到长格式的 <code>readBlocking()</code>/<code>writeBlocking()</code> 来等待多个队列,则可以从经过初始化的 <code>MessageQueue</code> 对象提取事件标记指针(使用 <code>getEventFlagWord()</code>)以创建标记,然后使用该标记创建必需的 <code>EventFlag</code> 对象。</li>
 <li>使用 <code>MessageQueue</code> <code>getDesc()</code> 方法获取描述符对象。</li>
 <li>在 <code>.hal</code> 文件中,为某个方法提供一个类型为 <code>fmq_sync<t></t></code> 或 <code>fmq_unsync<t></t></code> 的参数,其中 <code>T</code> 是 HIDL 定义的一种合适类型。使用此方法将 <code>getDesc()</code> 返回的对象发送到接收进程。</li>
 </ol>
diff --git a/zh-cn/devices/architecture/hidl/hashing.html b/zh-cn/devices/architecture/hidl/hashing.html
index d81c4de..538184d 100644
--- a/zh-cn/devices/architecture/hidl/hashing.html
+++ b/zh-cn/devices/architecture/hidl/hashing.html
@@ -45,7 +45,7 @@
 822998d7...74d63b8c [email protected]::IFoo
 </pre>
 
-<p class="note"><strong>注意</strong>:为了便于跟踪各个哈希的来源,Google 将 HIDL <code>current.txt</code> 文件分为不同的部分:第一部分已在 Android O 中发布,第二部分将在 Android O MR1 中发布。<em></em><em></em>我们强烈建议在您的 <code>current.txt</code> 文件中使用类似布局。</p>
+<p class="note"><strong>注意</strong>:为了便于跟踪各个哈希的来源,Google 将 HIDL <code>current.txt</code> 文件分为不同的部分:第一部分列出在 Android O 中发布的接口文件;第二部分列出在 Android O MR1 中发布的接口文件。<em></em><em></em>我们强烈建议在您的 <code>current.txt</code> 文件中使用类似布局。</p>
 
 <h2 id="hidl-gen">使用 hidl-gen 添加哈希</h2>
 <p>您可以手动将哈希添加到 <code>current.txt</code> 文件中,也可以使用 <code>hidl-gen</code> 添加。以下代码段提供了可与 <code>hidl-gen</code> 搭配使用来管理 <code>current.txt</code> 文件的命令示例(哈希已缩短):</p>
@@ -73,7 +73,7 @@
 <li>如果接口与哈希匹配,则编译会继续进行。</li>
 <li>如果接口与哈希不匹配,则编译会暂停,因为这意味着之前发布的接口会被更改。
 <ul>
-<li>如要进行保留 ABI 的更改(请参阅 <a href="#abi-stability">ABI 稳定性</a>),必须先修改 <code>current.txt</code> 文件,然后编译才能继续进行。</li>
+<li>要进行不影响 ABI 的更改(请参阅 <a href="#abi-stability">ABI 稳定性</a>),必须先修改 <code>current.txt</code> 文件,然后编译才能继续进行。</li>
 <li>所有其他更改都应在接口的 minor 或 major 版本升级中进行。</li>
 </ul></li></ul></li></ul>
 
@@ -87,10 +87,10 @@
 <ul>
 <li>可确保您的实现能够通过供应商测试套件 (VTS) 测试,通过该测试后您将能够正常进行仅限框架的 OTA。</li>
 <li>作为原始设备制造商 (OEM),您将能够提供简单易用且符合规定的板级支持包 (BSP)。</li>
-<li>有助于您跟踪哪些接口可以发布。将 <code>current.txt</code> 视为接口目录的映射,您将能够查看软件包根目录中提供的所有接口的历史记录和状态。</li>
+<li>有助于您跟踪哪些接口可以发布。您可以将 <code>current.txt</code> 视为接口目录的“地图”,从中了解软件包根目录中提供的所有接口的历史记录和状态。</li>
 </ul>
 
-<p>对于在 <code>current.txt</code> 中已有条目的接口,为其添加新的哈希时,请务必仅添加表示负责维持 ABI 稳定性的接口的哈希。请查看以下更改类型:
+<p>对于在 <code>current.txt</code> 中已有条目的接口,为其添加新的哈希时,请务必仅为可保持 ABI 稳定性的接口添加哈希。请查看以下更改类型:
 </p>
 
 <table>
@@ -113,7 +113,9 @@
 <td>
 <ul>
 <li>重新排列参数、方法等…</li>
-<li>在接口的任意位置添加方法/结构体字段/等等…</li>
+<li>重命名接口或将其移至新的软件包。</li>
+<li>重命名软件包。</li>
+<li>在接口的任意位置添加方法/结构体字段等等…</li>
 <li>会破坏 C++ vtable 的任何更改。</li>
 <li>等等…</li>
 </ul>
diff --git a/zh-cn/devices/architecture/hidl/interfaces.html b/zh-cn/devices/architecture/hidl/interfaces.html
index cc396df..ca847ce 100644
--- a/zh-cn/devices/architecture/hidl/interfaces.html
+++ b/zh-cn/devices/architecture/hidl/interfaces.html
@@ -24,7 +24,7 @@
 
 <h2 id="packages">软件包</h2>
 
-<p>软件包名称可以具有子级,例如 <code>package.subpackage</code>。已发布的 HIDL 软件包的根目录是 <code>hardware/interfaces</code> 或 <code>vendor/vendorName</code>(例如 Pixel 设备的 <code>vendor/google</code>)。软件包名称在根目录下形成一个或多个子目录;定义软件包的所有文件都位于同一目录下。例如,<code>package [email protected]</code> 可以在 <code>hardware/interfaces/example/extension/light/2.0</code> 下找到。</p>
+<p>软件包名称可以具有子级,例如 <code>package.subpackage</code>。已发布的 HIDL 软件包的根目录是 <code>hardware/interfaces</code> 或 <code>vendor/vendorName</code>(例如 Pixel 设备为 <code>vendor/google</code>)。软件包名称在根目录下形成一个或多个子目录;定义软件包的所有文件都位于同一目录下。例如,<code>package [email protected]</code> 可以在 <code>hardware/interfaces/example/extension/light/2.0</code> 下找到。</p>
 
 <p>下表列出了软件包前缀和位置:</p>
 <table>
@@ -58,10 +58,10 @@
 </tbody>
 </table>
 
-<p>软件包目录种包含扩展名为 <code>.hal</code> 的文件。每个文件均必须包含一个指定文件所属的软件包和版本的 <code>package</code> 语句。文件 <code>types.hal</code>(如果存在)并不定义接口,而是定义软件包中每个接口可以访问的数据类型。</p>
+<p>软件包目录中包含扩展名为 <code>.hal</code> 的文件。每个文件均必须包含一个指定文件所属的软件包和版本的 <code>package</code> 语句。文件 <code>types.hal</code>(如果存在)并不定义接口,而是定义软件包中每个接口可以访问的数据类型。</p>
 
 <h2 id="interface-def">接口定义</h2>
-<p>除了 <code>types.hal</code> 之外,其他 <code>.hal</code> 文件均定义一个接口。例如,接口的定义通常如下所示:</p>
+<p>除了 <code>types.hal</code> 之外,其他 <code>.hal</code> 文件均定义一个接口。接口通常定义如下:</p>
 
 <pre class="prettyprint">
 interface IBar extends IFoo { // IFoo is another interface
@@ -82,7 +82,8 @@
 <li><code>interfaceDescriptor</code></li>
 <li><code>notifySyspropsChanged</code></li>
 <li><code>linkToDeath</code></li>
-<li><code>unlinkToDeath</code></li><li><code>setHALInstrumentation</code></li>
+<li><code>unlinkToDeath</code></li>
+<li><code>setHALInstrumentation</code></li>
 <li><code>getDebugInfo</code></li>
 <li><code>debug</code></li>
 <li><code>getHashChain</code></li>
@@ -92,7 +93,7 @@
 <p><code>import</code> 语句是用于访问其他软件包中的软件包接口和类型的 HIDL 机制。<code>import</code> 语句本身涉及两个实体:</p>
 
 <ul>
-<li>导入实体:可以是软件包或接口;<em></em></li>
+<li>导入实体:可以是软件包或接口;以及<em></em></li>
 <li>被导入实体:也可以是软件包或接口。<em></em></li>
 </ul>
 
@@ -103,17 +104,18 @@
 
 <ul>
 <li><strong>完整软件包导入</strong>。如果该值是一个软件包名称和版本(语法见下文),则系统会将整个软件包导入至导入实体中。</li>
-<li><strong>部分导入</strong>。
+<li><strong>部分导入</strong>。如果值为:
 <ul>
-<li>如果该值是一个接口,则系统会将该软件包的 <code>types.hal</code> 和该接口导入至导入实体中。</li>
-<li>如果该值是一个在 <code>types.hal</code> 定义的 UDT,则系统仅会将该 UDT 导入至导入实体中(不导入 <code>types.hal</code> 中的其他类型)。</li>
+<li>一个接口,则系统会将该软件包的 <code>types.hal</code> 和该接口导入至导入实体中。</li>
+<li>在 <code>types.hal</code> 中定义的 UDT,则系统仅会将该 UDT 导入至导入实体中(不导入 <code>types.hal</code> 中的其他类型)。
+</li>
 </ul>
 </li><li><strong>仅类型导入</strong>。如果该值将上文所述的“部分导入”的语法与关键字 <code>types</code> 而不是接口名称配合使用,则系统仅会导入指定软件包的 <code>types.hal</code> 中的 UDT。</li>
 </ul>
 
 <p>导入实体可以访问以下各项的组合:</p>
 <ul>
-<li><code>types.hal</code> 中定义的被导入的软件包的常见 UDT;</li>
+<li><code>types.hal</code> 中定义的被导入软件包的常见 UDT;</li>
 <li>被导入的软件包的接口(完整软件包导入)或指定接口(部分导入),以便调用它们、向其传递句柄和/或从其继承句柄。</li>
 </ul>
 
@@ -145,12 +147,63 @@
 <h2 id="version">版本编号</h2>
 <p>软件包分版本,且接口的版本和其软件包的版本相同。版本用两个整数表示:major.minor。<em></em><em></em></p>
 <ul>
-<li><strong>Major 版本</strong>不向后兼容。递增 Major 版本号会将 Minor 版本重置为 0。</li>
-<li><strong>Minor 版本</strong>向后兼容。如果递增 Minor 版本号,则意味着较新版本完全向后兼容之前的版本。您可以添加新的数据结构和方法,但不能更改现有的数据结构或方法签名。</li>
+<li><strong>Major</strong> 版本不向后兼容。递增 Major 版本号将会使 Minor 版本号重置为 0。</li>
+<li><strong>Minor</strong> 版本向后兼容。如果递增 Minor 版本号,则意味着较新版本完全向后兼容之前的版本。您可以添加新的数据结构和方法,但不能更改现有的数据结构或方法签名。</li>
 </ul>
 
-<p>为实现与框架的更广泛的兼容性,可同时在一台设备上提供 HAL 的多个 Major 版本。虽然同时也可以在一台设备上提供多个 Minor 版本,但是由于 Minor 版本向后兼容,因此不必在最新 Minor 版本以外,为各个 Major 版本提供其他额外支持。</p>
+<p>为实现与框架的更广泛的兼容性,可同时在一台设备上提供 HAL 的多个 Major 版本。虽然也可以同时在一台设备上提供多个 Minor 版本,但是由于 Minor 版本向后兼容,因此不必在最新 Minor 版本以外,为各个 Major 版本提供其他额外支持。有关版本编号和供应商扩展的更多详细信息,请参阅 <a href="/devices/architecture/hidl/versioning">HIDL 版本编号</a>。</p>
 
-<p>有关版本编号和供应商扩展的更多详细信息,请参阅 <a href="/devices/architecture/hidl/versioning">HIDL 版本编号</a>。</p>
+<h2 id="interface-layout-summary">接口布局总结</h2>
+<p>本部分总结了如何管理 HIDL 接口软件包(如 <code>hardware/interfaces</code>)并整合了整个 HIDL 部分提供的信息。在阅读之前,请确保您熟悉 <a href="/devices/architecture/hidl/versioning">HIDL 版本控制</a>、<a href="/devices/architecture/hidl/hashing#hidl-gen">使用 hidl-gen 添加哈希</a>中的哈希概念、<a href="/devices/architecture/hidl/">在一般情况下使用 HIDL</a> 的详细信息以及以下定义:</p>
+
+<table>
+<thead>
+<tr>
+<th width="30%">术语</th>
+<th>定义</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>应用二进制接口 (ABI)</td>
+<td>应用编程接口 + 所需的任何二进制链接。</td>
+</tr>
+<tr>
+<td>完全限定名称 (fqName)</td>
+<td>用于区分 hidl 类型的名称。例如:<code>[email protected]::IFoo</code>。</td>
+</tr>
+<tr>
+<td>软件包</td>
+<td>包含 HIDL 接口和类型的软件包。例如:<code>[email protected]</code>。</td>
+</tr>
+<tr>
+<td>软件包根目录</td>
+<td>包含 HIDL 接口的根目录软件包。例如:HIDL 接口 <code>android.hardware</code> 在软件包根目录 <code>[email protected]</code> 中。</td>
+</tr>
+<tr>
+<td>软件包根目录路径</td>
+<td>软件包根目录映射到的 Android 源代码树中的位置。</td>
+</tr>
+</tbody>
+</table>
+
+<p>有关更多定义,请参阅 HIDL <a href="/devices/architecture/hidl/#terms">术语</a>。
+</p>
+
+<h3 id="file-found">每个文件都可以通过软件包根目录映射及其完全限定名称找到</h3>
+<p>软件包根目录以参数 <code>-r android.hardware:hardware/interfaces</code> 的形式指定给 <code>hidl-gen</code>。例如,如果软件包为 <code>[email protected]::IFoo</code> 并且向 <code>hidl-gen</code> 发送了 <code>-r vendor.awesome:some/device/independent/path/interfaces</code>,那么接口文件应该位于 <code>$ANDROID_BUILD_TOP/some/device/independent/path/interfaces/foo/1.0/IFoo.hal</code>。
+</p>
+<p>在实践中,建议称为 <code>awesome</code> 的供应商或原始设备制造商 (OEM) 将其标准接口放在 <code>vendor.awesome</code> 中。在选择了软件包路径之后,不能再更改该路径,因为它已写入接口的 ABI。</p>
+
+<h3 id="package-path-mapping">软件包路径映射不得重复</h3>
+<p>例如,如果您有 <code>-rsome.package:$PATH_A</code> 和 <code>-rsome.package:$PATH_B</code>,则 <code>$PATH_A</code> 必须等于 <code>$PATH_B</code> 以实现一致的接口目录(这也使得<a href="/devices/architecture/hidl/versioning">接口版本控制起来</a>更简单)。</p>
+
+<h3 id="package-root-version">软件包根目录必须有版本控制文件</h3>
+<p>如果您创建一个软件包路径(如 <code>-r vendor.awesome:vendor/awesome/interfaces</code>),则还应创建文件 <code>$ANDROID_BUILD_TOP/vendor/awesome/interfaces/current.txt</code>,它应包含使用 <code>hidl-gen</code>(在<a href="/devices/architecture/hidl/hashing#hidl-gen">使用 hidl-gen 添加哈希</a>中广泛进行了讨论)中的 <code>-Lhash</code> 选项创建的接口的哈希。</p>
+
+<aside class="caution"><strong>注意</strong>:请谨慎管理所有更改!如果接口未冻结,则<a href="/devices/tech/vts/">供应商测试套件 (VTS)</a> 将失败,并且对接口进行的与 ABI 不兼容的更改将导致仅限框架的 OTA 失败。</aside>
+
+<h3 id="interfaces-device-dependent">接口位于设备无关的位置</h3>
+<p>在实践中,建议在分支之间共享接口。这样可以最大限度地重复使用代码,并在不同的设备和用例中对代码进行最大程度的测试。</p>
 
 </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 8ed914f..8e4d0f1 100644
--- a/zh-cn/devices/architecture/hidl/services.html
+++ b/zh-cn/devices/architecture/hidl/services.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>
@@ -26,24 +26,30 @@
 <p>HIDL 接口服务器(实现接口的对象)可注册为已命名的服务。注册的名称不需要与接口或软件包名称相关。如果没有指定名称,则使用名称“默认”;这应该用于不需要注册同一接口的两个实现的 HAL。例如,在每个接口中定义的服务注册的 C++ 调用是:</p>
 
 <pre class="prettyprint">
-registerAsService();
-registerAsService("another_foo_service");  // if needed
+status_t status = myFoo-&gt;registerAsService();
+status_t anotherStatus = anotherFoo-&gt;registerAsService("another_foo_service");  // if needed
 </pre>
 
 <p>HIDL 接口的版本包含在接口本身中。版本自动与服务注册关联,并可通过每个 HIDL 接口上的方法调用 (<code>android::hardware::IInterface::getInterfaceVersion()</code>) 进行检索。服务器对象不需要注册,并可通过 HIDL 方法参数传递到其他进程,相应的接收进程会向服务器发送 HIDL 方法调用。</p>
 
 <h2 id="discover">发现服务</h2>
-<p>客户端代码按名称和版本请求指定的接口,从而对所需的 HAL 类调用 <code>getService</code>:</p>
+<p>客户端代码按名称和版本请求指定的接口,并对所需的 HAL 类调用 <code>getService</code>:</p>
 
 <pre class="prettyprint">
+// C++
 sp&lt;V1_1::IFooService&gt; service = V1_1::IFooService::getService();
 sp&lt;V1_1::IFooService&gt; alternateService = 1_1::IFooService::getService("another_foo_service");
+// Java
+V1_1.IFooService; service = V1_1.IFooService.getService(true /* retry */);
+V1_1.IFooService; alternateService = 1_1.IFooService.getService("another", true /* retry */);
 </pre>
 
 <p>每个版本的 HIDL 接口都会被视为单独的接口。因此,<code>IFooService</code> 版本 1.1 和 <code>IFooService</code> 版本 2.2 都可以注册为“foo_service”,并且两个接口上的 <code>getService("foo_service")</code> 都可获取该接口的已注册服务。因此,在大多数情况下,注册或发现服务均无需提供名称参数(也就是说名称为“默认”)。</p>
 
 <p>供应商接口对象还会影响所返回接口的传输方法。对于软件包 <code>[email protected]</code> 中的接口 <code>IFoo</code>,<code>IFoo::getService</code> 返回的接口始终使用设备清单中针对 <code>android.hardware.foo</code> 声明的传输方法(如果相应条目存在的话);如果该传输方法不存在,则返回 nullptr。</p>
 
+<p>在某些情况下,即使没有获得相关服务,也可能需要立即继续。例如,当客户端希望自行管理服务通知或者在需要获取所有 hwservice 并检索它们的诊断程序(例如 <code>atrace</code>)中时,可能会发生这种情况。在这种情况下,可以使用其他 API,例如 C++ 中的 <code>tryGetService</code> 或 Java 中的 <code>getService("instance-name", false)</code>。Java 中提供的旧版 API <code>getService</code> 也必须与服务通知一起使用。使用此 API 不会避免以下竞态条件:当客户端使用某个非重试 API 请求服务器后,该服务器对自身进行了注册。</p>
+
 <h2 id="death">服务终止通知</h2>
 <p>想要在服务终止时收到通知的客户端会接收到框架传送的终止通知。要接收通知,客户端必须:</p>
 <ol>
@@ -51,7 +57,7 @@
 <li>替换其 <code>serviceDied()</code> 方法。</li>
 <li>实例化 <code>hidl_death_recipient</code> 子类的对象。
 </li>
-<li>在服务上调用 <code>linkToDeath()</code> 方法以进行监控,从而传递 <code>IDeathRecipient</code> 的接口对象。</li>
+<li>在要监控的服务上调用 <code>linkToDeath()</code> 方法,并传入 <code>IDeathRecipient</code> 的接口对象。</li>
 </ol>
 
 <p>伪代码示例(C++ 和 Java 类似):</p>
@@ -79,21 +85,21 @@
 <li><strong>单向</strong>方法仅朝一个方向发送数据且不阻塞。如果 RPC 调用中正在传输的数据量超过实现限制,则调用可能会阻塞或返回错误指示(具体行为尚不确定)。</li>
 </ul>
 
-<p>不返回值但未声明为 <code>oneway</code> 的方法仍在阻塞。</p>
+<p>不返回值但未声明为 <code>oneway</code> 的方法仍会阻塞。</p>
 
-<p>在 HIDL 接口中声明的所有方法都是单向调用,要么从 HAL 发出,要么到 HAL。该接口没有指定具体调用方向。需要从 HAL 发起调用的架构应该在 HAL 软件包中提供两个(或更多个)接口并从每个进程提供相应的接口。对于接口的调用方向,我们使用字词“客户端”和“服务器”来表示(即 HAL 可以是一个接口的服务器,也可以是另一个接口的客户端)。<em></em><em></em></p>
+<p>在 HIDL 接口中声明的所有方法都是单向调用,要么从 HAL 发出,要么到 HAL。该接口没有指定具体调用方向。需要从 HAL 发起调用的架构应该在 HAL 软件包中提供两个(或更多个)接口并从每个进程提供相应的接口。我们根据接口的调用方向来取名“客户端”或“服务器”(即 HAL 可以是一个接口的服务器,也可以是另一个接口的客户端)。<em></em><em></em></p>
 
 <h3 id="callbacks">回调</h3>
-<p>“回调”一词指的是两个不同的概念,可通过“同步回调”和“异步回调”进行区分。<em></em><em></em><em></em></p>
+<p>“回调”一词可以指代两个不同的概念,可通过“同步回调”和“异步回调”进行区分。<em></em><em></em><em></em></p>
 
-<p>“同步回调”在返回数据的一些 HIDL 方法中使用。<em></em>返回多个值(或返回非基元类型的一个值)的 HIDL 方法会通过回调函数返回其结果。如果只返回一个值且该值是基元类型,则不使用回调且该值从方法中返回。服务器实现 HIDL 方法,而客户端实现回调。</p>
+<p>“同步回调”用于返回数据的一些 HIDL 方法。<em></em>返回多个值(或返回非基元类型的一个值)的 HIDL 方法会通过回调函数返回其结果。如果只返回一个值且该值是基元类型,则不使用回调且该值从方法中返回。服务器实现 HIDL 方法,而客户端实现回调。</p>
 
-<p>“异步回调”允许 HIDL 接口的服务器发起调用。<em></em>通过第一个接口传递第二个接口的实例即可完成此操作。第一个接口的客户端必须作为第二个接口的服务器。第一个接口的服务器可以在第二个接口对象上调用方法。例如,HAL 实现可以通过在由该进程创建和提供的接口对象上调用方法来将信息异步发送回正在使用它的进程。用于异步回调的接口中的方法可以是阻塞(并且可能将值返回到调用程序),也可以是 <code>oneway</code>。要查看相关示例,请参阅 <a href="/devices/architecture/hidl-cpp/interfaces.html">HIDL C++</a> 中的“异步回调”。</p>
+<p>“异步回调”允许 HIDL 接口的服务器发起调用。<em></em>通过第一个接口传递第二个接口的实例即可完成此操作。第一个接口的客户端必须作为第二个接口的服务器。第一个接口的服务器可以在第二个接口对象上调用方法。例如,HAL 实现可以通过在由该进程创建和提供的接口对象上调用方法来将信息异步发送回正在使用它的进程。用于异步回调的接口中的方法可以是阻塞方法(并且可能将值返回到调用程序),也可以是 <code>oneway</code> 方法。要查看相关示例,请参阅 <a href="/devices/architecture/hidl-cpp/interfaces.html">HIDL C++</a> 中的“异步回调”。</p>
 
-<p>要简化内存所有权,方法调用和回调只能选择 <code>in</code> 参数,并且不支持 <code>out</code> 或 <code>inout</code> 参数。</p>
+<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 方法和回调中发送的数据量。具体限制尚不确定,但可能小至 4K。超出这些限制的调用会立即返回失败。另一个限制是可供 HIDL 基础架构处理多个同时进行的事务的资源。由于多个线程或进程向一个进程发送调用或者接收进程未能快速处理多个 <code>oneway</code> 调用,因此多个事务可能会同时进行。</p>
 
 <p>在设计良好的接口中,不应出现超出这些资源限制的情况;如果超出的话,则超出资源的调用可能会阻塞,直到资源可用或发出传输错误的信号。每当因正在进行的总事务导致出现超出每事务限制或溢出 HIDL 实现资源的情况时,系统都会记录下来以方便调试。</p>
 
diff --git a/zh-cn/devices/architecture/hidl/types.html b/zh-cn/devices/architecture/hidl/types.html
index b6ab398..9cc36e1 100644
--- a/zh-cn/devices/architecture/hidl/types.html
+++ b/zh-cn/devices/architecture/hidl/types.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>本部分介绍了 HIDL 数据类型。有关实现详情,请参阅 <a href="/devices/architecture/hidl-cpp/index.html">HIDL C++</a>(对于 C++ 实现)或 <a href="/devices/architecture/hidl-java/index.html">HIDL Java</a>(对于 Java 实现)。</p>
+<p>本部分介绍了 HIDL 数据类型。有关实现详情,请参阅 <a href="/devices/architecture/hidl-cpp/index.html">HIDL C++</a>(如果是 C++ 实现)或 <a href="/devices/architecture/hidl-java/index.html">HIDL Java</a>(如果是 Java 实现)。</p>
 
 <p>与 C++ 的相似之处包括:</p>
 <ul>
@@ -48,11 +48,11 @@
 </ul>
 
 <h2 id="represent">数据表示法</h2>
-<p>包含<a href="http://en.cppreference.com/w/cpp/language/data_members#Standard_layout">标准布局</a>(简旧数据类型相关要求的子集)的 <code>struct</code> 或 <code>union</code> 在生成的 C++ 代码中具有一致的内存布局,这是由 <code>struct</code> 和 <code>union</code> 成员上的显式对齐属性强制执行的。</p>
+<p>采用 <a href="http://en.cppreference.com/w/cpp/language/data_members#Standard_layout">Standard-Layout</a>(plain-old-data 类型相关要求的子集)的 <code>struct</code> 或 <code>union</code> 在生成的 C++ 代码中具有一致的内存布局,这是依靠 <code>struct</code> 和 <code>union</code> 成员上的显式对齐属性实现的。</p>
 
-<p>基本的 HIDL 类型以及 <code>enum</code> 和 <code>bitfield</code> 类型(始终从基本类型派生而来)会映射到标准 C++ 类型,例如 <a href="http://en.cppreference.com/w/cpp/types/integer">cstdint</a> 中的 <code>std::uint32_t</code>。</p>
+<p>基元 HIDL 类型以及 <code>enum</code> 和 <code>bitfield</code> 类型(始终从基元类型派生而来)会映射到标准 C++ 类型(例如 <a href="http://en.cppreference.com/w/cpp/types/integer">cstdint</a> 中的 <code>std::uint32_t</code>)。</p>
 
-<p>由于 Java 不支持未签名的类型,因此未签名的 HIDL 类型会映射到相应的已签名 Java 类型。结构体会映射到 Java 类;数组会映射到 Java 数组;Java 目前不支持联合。<em></em><em></em><em></em>字符串在内部以 UTF8 格式存储。<em></em>由于 Java 仅支持 UTF16 字符串,因此发送到或来自 Java 实现的字符串值会进行转换;在重新转换回来后,字符串值可能不会与原来的值完全相同,这是因为字符集并非总能顺畅映射。</p>
+<p>由于 Java 不支持无符号的类型,因此无符号的 HIDL 类型会映射到相应的有符号 Java 类型。结构体会映射到 Java 类;数组会映射到 Java 数组;Java 目前不支持联合。<em></em><em></em><em></em>字符串在内部以 UTF8 格式存储。<em></em>由于 Java 仅支持 UTF16 字符串,因此发送到或来自 Java 实现的字符串值会进行转换;在重新转换回来后,字符串值可能不会与原来的值完全相同,这是因为字符集并非总能顺畅映射。</p>
 
 <p>在 C++ 中通过 IPC 接收的数据会被标记为 <code>const</code>,并存储在仅在函数调用期间存在的只读内存中。在 Java 中通过 IPC 接收的数据已被复制到 Java 对象中,因此无需额外的复制操作即可保留下来(可以对其进行修改)。</p>
 
@@ -90,7 +90,7 @@

 </pre>
 
-<p>例外情况是:接口类型只能嵌入到 <code>vec&lt;T&gt;</code> 中,并且只能嵌套一层(无 <code>vec&lt;vec&lt;IFoo&gt;&gt;</code>)。</p>
+<p>例外情况是:接口类型只能嵌入到 <code>vec&lt;T&gt;</code> 中,并且只能嵌套一层(不能出现 <code>vec&lt;vec&lt;IFoo&gt;&gt;</code> 这样的情况)。</p>
 
 <h2 id="raw-pointer">原始指针语法</h2>
 <p>HIDL 语言不使用 <strong>*</strong>,并且不支持 C/C++ 原始指针的全面灵活性。要详细了解 HIDL 如何封装指针和数组/向量,请参阅 <a href="#vec">vec &lt;T&gt; 模板</a>。</p>
@@ -100,7 +100,7 @@
 
 <ul>
 <li>打开 .hal 文件中接口的定义。</li>
-<li>可用作结构体/联合字段、方法参数和返回项中的特殊类型。该关键字会被视为一般接口,与 <code>[email protected]::IBase</code> 同义。</li>
+<li>可用作结构体/联合字段、方法参数和返回项中的特殊类型。该关键字被视为一般接口,与 <code>[email protected]::IBase</code> 同义。</li>
 </ul>
 
 <p>例如,<code>IServiceManager</code> 具有以下方法:</p>
@@ -125,7 +125,7 @@
 <p><code>pointer</code> 类型仅供 HIDL 内部使用。</p>
 
 <h2 id="bitfield">bitfield &lt;T&gt; 类型模板</h2>
-<p><code>bitfield&lt;T&gt;</code>(其中的 <code>T</code> 是<a href="#enum">用户定义的枚举</a>)表明值是在 <code>T</code> 中定义的枚举值的按位“或”值。在生成的代码中,<code>bitfield&lt;T&gt;</code> 会显示为 T 的基础类型。例如:</p>
+<p><code>bitfield&lt;T&gt;</code>(其中的 <code>T</code> <a href="#enum">是用户定义的枚举</a>)表明值是在 <code>T</code> 中定义的枚举值的按位“或”值。在生成的代码中,<code>bitfield&lt;T&gt;</code> 会显示为 T 的基础类型。例如:</p>
 
 <pre class="prettyprint">
 enum Flag : uint8_t {
@@ -139,13 +139,12 @@
 
 <p>编译器会按照处理 <code>uint8_t</code> 的相同方式处理 Flag 类型。</p>
 
-<p>为什么不使用 <code>(u)int8_t</code>/<code>(u)int16_t</code>/<code>(u)int32_t</code>/<code>(u)int64_t</code>?
-使用 <code>bitfield</code> 可向读取器提供额外的 HAL 信息,读取器现在知道 <code>setFlags</code> 采用 Flag 的按位“或”值(即知道使用 int16_t 调用 <code>setFlags</code> 是无效的)。如果没有 <code>bitfield</code>,则该信息仅通过文档传达。此外,VTS 实际上可以检查标记的值是否为 Flag 的按位“或”值。
+<p>为什么不使用 <code>(u)int8_t</code>/<code>(u)int16_t</code>/<code>(u)int32_t</code>/<code>(u)int64_t</code>?使用 <code>bitfield</code> 可向读取器提供额外的 HAL 信息,读取器现在知道 <code>setFlags</code> 采用 Flag 的按位“或”值(即知道使用 int16_t 调用 <code>setFlags</code> 是无效的)。如果没有 <code>bitfield</code>,则该信息仅通过文档传达。此外,VTS 实际上可以检查标记的值是否为 Flag 的按位“或”值。
 </p>
 
 <h2 id="handle-primitive">句柄基本类型</h2>
 
-<p class="warning"><strong>警告</strong>:任何类型的地址(即使是物理设备地址)都不能是本机句柄的一部分。在进程之间传递该信息很危险,会导致进程容易受到攻击。在进程之间传递的任何值都必须先经过验证,然后才能用于在进程内查找分配的内存。否则,错误的句柄可能会导致内存访问错误或内存损坏。</p>
+<p class="warning"><strong>警告</strong>:任何类型的地址(即使是物理设备地址)都不能是原生句柄的一部分。在进程之间传递该信息很危险,会导致进程容易受到攻击。在进程之间传递的任何值都必须先经过验证,然后才能用于在进程内查找分配的内存。否则,错误的句柄可能会导致内存访问错误或内存损坏。</p>
 
 <p>HIDL 语义是按值复制,这意味着参数会被复制。所有大型数据或需要在进程之间共享的数据(例如同步栅栏)都是通过传递指向以下持久对象的文件描述符进行处理:针对共享内存的 <code>ashmem</code>、实际文件或可隐藏在文件描述符后的任何其他内容。Binder 驱动程序会将文件描述符复制到其他进程。</p>
 
@@ -162,18 +161,18 @@
 } native_handle_t;
 </pre>
 
-<p>本机句柄是整数和文件描述符的集合(按值传递)。单个文件描述符可存储在既没有整数也没有单个文件描述符的本机句柄中。使用封装有 <code>handle</code> 基本类型的本机句柄传递句柄可确保相应的本机句柄直接包含在 HIDL 中。</p>
+<p>原生句柄是整数和文件描述符的集合(按值传递)。单个文件描述符可存储在没有整数、包含单个文件描述符的原生句柄中。使用封装有 <code>handle</code> 基本类型的原生句柄传递句柄可确保相应的原生句柄直接包含在 HIDL 中。</p>
 
 <p><code>native_handle_t</code> 的大小可变,因此无法直接包含在结构体中。句柄字段会生成指向单独分配的 <code>native_handle_t</code> 的指针。</p>
 
-<p>在早期版本的 Android 中,本机句柄是使用相同的函数创建的,这些函数位于 <a href="https://android.googlesource.com/platform/system/core/+/master/libcutils/native_handle.c">libcutils</a> 中。在 Android O 中,这些函数现在被复制到了 <code>android::hardware::hidl</code> 命名空间或移动到了 NDK。HIDL 自动生成的代码会自动对这些函数进行序列化和反序列化,而无需用户编写的代码参与。</p>
+<p>在早期版本的 Android 中,原生句柄是使用 <a href="https://android.googlesource.com/platform/system/core/+/master/libcutils/native_handle.c">libcutils</a> 中的相同函数创建的。在 Android O 中,这些函数现在被复制到了 <code>android::hardware::hidl</code> 命名空间或移到了 NDK 中。HIDL 自动生成的代码会自动对这些函数进行序列化和反序列化,而无需用户编写的代码参与。</p>
 
 <h3 id="ownership">句柄和文件描述符所有权</h3>
 <p>当您调用传递(或返回)<code>hidl_handle</code> 对象(复合类型的顶级或一部分)的 HIDL 接口方法时,其中包含的文件描述符的所有权如下所述:</p>
 
 <ul>
 <li>将 <code>hidl_handle</code> 对象作为参数传递时,调用程序会保留对其封装的 <code>native_handle_t</code> 中包含的文件描述符的所有权,并且调用程序必须在对这些文件描述符的相关操作完成后将其关闭。同样,返回 <code>hidl_handle</code> 对象(通过将其传递到 <code>_cb</code> 函数)时,返回相应对象的进程保留对其封装的 <code>native_handle_t</code> 中包含的文件描述符的所有权,并且该进程必须在对这些文件描述符的相关操作完成后将其关闭。</li>
-<li>接收 <code>hidl_handle</code> 对象时,<strong>transport</strong> 是其封装的 <code>native_handle_t</code> 中的文件描述符的所有者;接收器可在事务回调期间按原样使用这些描述符,但如果想要在回调完成之后继续使用这些文件描述符,则必须克隆相应的本机句柄。事务完成时,transport 将自动 <code>close()</code> 文件描述符。</li>
+<li>接收 <code>hidl_handle</code> 对象时,<strong>transport</strong> 是其封装的 <code>native_handle_t</code> 中的文件描述符的所有者;接收器可在事务回调期间按原样使用这些描述符,但如果想要在回调完成之后继续使用这些文件描述符,则必须克隆相应的原生句柄。事务完成时,transport 将自动对文件描述符执行 <code>close()</code> 操作。</li>
 </ul>
 
 <p>HIDL 不支持在 Java 中使用句柄(因为 Java 根本不支持句柄)。</p>
@@ -194,7 +193,7 @@
 <p class="note"><strong>注意</strong>:通过 HIDL 接口将字符串传递到 Java 或从 Java 传递字符串(包括从 Java 传递到 Java)将会导致字符集转换,而此项转换可能无法精确保留原始编码。</p>
 
 <h2 id="vec">vec&lt;T&gt; 类型模板</h2>
-<p><code>vec&lt;T&gt;</code> 模板用于表示包含 <code>T</code> 的实例且大小可变的缓冲区。<code>T</code> 可以是任何由 HIDL 提供的或由用户定义的类型,句柄除外。(<code>vec&lt;T&gt;</code> 的 <code>vec&lt;&gt;</code> 将指向 <code>vec&lt;T&gt;</code> 结构体数组,而不是指向内部 T 缓冲区数组。)</p>
+<p><code>vec&lt;T&gt;</code> 模板用于表示包含 <code>T</code> 实例且大小可变的缓冲区。<code>T</code> 可以是任何由 HIDL 提供的或由用户定义的类型,句柄除外。(<code>vec&lt;T&gt;</code> 的 <code>vec&lt;&gt;</code> 将指向 <code>vec&lt;T&gt;</code> 结构体数组,而不是指向内部 T 缓冲区数组。)</p>
 
 <p><code>T</code> 可以是以下项之一:</p>
 <ul>
@@ -236,7 +235,7 @@
 <p>HIDL 不支持完全包含在结构体内且长度可变的数据结构。这包括 C/C++ 中有时用作结构体最后一个字段且长度不定的数组(有时会看到其大小为 <code>[0]</code>)。HIDL <code>vec&lt;T&gt;</code> 表示数据存储在单独的缓冲区中且大小动态变化的数组;此类实例由 <code>struct</code> 中的 <code>vec&lt;T&gt;</code> 的实例表示。
 </p>
 
-<p>同样,<code>string</code> 可包含在 <code>struct</code> 中(关联的缓冲区是相互独立的)。在生成的 C++ 代码中,HIDL 句柄类型的实例通过指向实际本机句柄的指针来表示,因为基础数据类型的实例的长度可变。</p>
+<p>同样,<code>string</code> 可包含在 <code>struct</code> 中(关联的缓冲区是相互独立的)。在生成的 C++ 代码中,HIDL 句柄类型的实例通过指向实际原生句柄的指针来表示,因为基础数据类型的实例的长度可变。</p>
 
 <h3 id="union">联合</h3>
 <p>HIDL 不支持匿名联合。另一方面,联合与 C 类似。</p>
diff --git a/zh-cn/devices/architecture/hidl/versioning.html b/zh-cn/devices/architecture/hidl/versioning.html
index 334d160..dfd4684 100644
--- a/zh-cn/devices/architecture/hidl/versioning.html
+++ b/zh-cn/devices/architecture/hidl/versioning.html
@@ -25,12 +25,12 @@
 <h2 id="code-structure">HIDL 代码结构</h2>
 
 <p>
-<a href="/reference/hidl/index.html">HIDL 代码按用户定义的类型、接口和软件包进行组织</a>:</p>
+<a href="/reference/hidl/index.html">HIDL 代码按用户定义的类型、接口和软件包进行整理</a>:</p>
 
 <ul>
-<li><strong>用户定义的类型 (UDT)</strong>:HIDL 能够提供对一组基本数据类型的访问权限,这些数据类型可用于通过结构、联合和枚举组成更复杂的类型。UDT 会被传递到接口的方法。可以在软件包级定义 UDT(针对所有接口的通用 UDT),也可以在本地针对某个接口定义 UDT。</li>
-<li><strong>接口</strong>:作为 HIDL 的基本构造块,接口由 UDT 和方法声明组成。接口也可以继承自其他接口。</li>
-<li><strong>软件包</strong>:整理相关 HIDL 接口及其操作的数据类型。软件包通过名称和版本进行标识,包括以下内容:
+<li><strong>用户定义的类型 (UDT)</strong>。HIDL 能够提供对一组基本数据类型的访问权限,这些数据类型可用于通过结构、联合和枚举组成更复杂的类型。UDT 会被传递到接口的方法。可以在软件包级定义 UDT(针对所有接口的通用 UDT),也可以在本地针对某个接口定义 UDT。</li>
+<li><strong>接口</strong>。作为 HIDL 的基本构造块,接口由 UDT 和方法声明组成。接口也可以继承自其他接口。</li>
+<li><strong>软件包</strong>。整理相关 HIDL 接口及其操作的数据类型。软件包通过名称和版本进行标识,包括以下内容:
 <ul>
  <li>称为 <code>types.hal</code> 的数据类型定义文件。</li>
  <li>零个或多个接口,每个都位于各自的 <code>.hal</code> 文件中。</li>
@@ -76,7 +76,7 @@
 
 <p>所有核心软件包都位于编译系统中的 <code>hardware/interfaces/</code> 下。<code>$m.$n</code> 版本的软件包 <code>android.hardware.</code>[<code>name1</code>].[<code>name2</code>]… 位于 <code>hardware/interfaces/name1/name2/</code>…<code>/$m.$n/</code> 下;<code>3.4</code> 版本的软件包 <code>android.hardware.camera</code> 位于目录 <code>hardware/interfaces/camera/3.4/.</code> 下。 软件包前缀 <code>android.hardware.</code> 和路径 <code>hardware/interfaces/</code> 之间存在硬编码映射。</p>
 
-<p>非核心(供应商)软件包是指由 SoC 供应商或原始设计制造商 (ODM) 开发的软件包。非核心软件包的前缀是 <code>vendor.$(VENDOR).hardware.</code>,其中 <code>$(VENDOR)</code> 是指 SoC 供应商或原始设备制造商 (OEM)/原始设计制造商 (ODM)。此前缀映射到源代码树中的路径 <code>vendor/$(VENDOR)/interfaces</code>(该映射也属于硬编码映射)。</p>
+<p>非核心(供应商)软件包是指由 SoC 供应商或 ODM 开发的软件包。非核心软件包的前缀是 <code>vendor.$(VENDOR).hardware.</code>,其中 <code>$(VENDOR)</code> 是指 SoC 供应商或 OEM/ODM。此前缀映射到源代码树中的路径 <code>vendor/$(VENDOR)/interfaces</code>(该映射也属于硬编码映射)。</p>
 
 <h2 id="fqn">用户定义的类型的完全限定名称</h2>
 <p>在 HIDL 中,每个 UDT 都有一个完全限定名称,该名称由 UDT 名称、定义 UDT 的软件包名称,以及软件包版本组成。完全限定名称仅在声明类型的实例时使用,在定义类型本身时不使用。例如,假设 <code>1.0</code> 版本的软件包 <code>android.hardware.nfc,</code> 定义了一个名为 <code>NfcData</code> 的结构体。在声明位置(无论是在 <code>types.hal</code> 中,还是在接口的声明中),声明中仅注明:</p>
@@ -130,7 +130,7 @@
 
 <p><code>Bar</code> 的完全限定名称为 <code>[email protected]::IQuux.Foo.Bar</code>。</p>
 
-<p>在上述两种情况下,只有在 <code>Foo</code> 的声明范围内才能使用 <code>Bar</code> 来引用 <code>Bar</code>。在软件包级或接口级,必须通过 <code>Foo</code>:<code>Foo.Bar</code> 来引用 <code>Bar</code>,如上述方法 <code>doSomething</code> 的声明中所示。或者,您可以更详细地将该方法声明为:</p>
+<p>在上述两种情况下,只有在 <code>Foo</code> 的声明范围内才能使用 <code>Bar</code> 来引用 <code>Bar</code>。在软件包级或接口级,必须通过 <code>Foo</code>:<code>Foo.Bar</code> 来引用 <code>Bar</code>(如上述方法 <code>doSomething</code> 的声明中所述)。或者,您可以更详细地将该方法声明为:</p>
 
 <pre class="prettyprint">
 // IQuux.hal
@@ -210,7 +210,8 @@
 </pre>
 
 <h3 id="rule3">规则 3</h3>
-<p>如果规则 2 未能生成匹配项(UDT 未在当前软件包中定义),HIDL 编译器会扫描所有导入的软件包,查找是否有匹配项。以上面的示例来说,假设 <code>ExtendedNfcData</code> 是在 <code>1.1</code> 版本的软件包 <code>android.hardware.nfc</code> 中声明的,<code>1.1</code> 按预期导入 <code>1.0</code>(请参阅<a href="#package-ext">软件包级扩展</a>),且定义仅指定 UDT 名称:</p>
+<p>如果规则 2 未能生成匹配项(UDT 未在当前软件包中定义),HIDL 编译器会扫描所有导入的软件包,查找是否有匹配项。
+以上面的示例来说,假设 <code>ExtendedNfcData</code> 是在 <code>1.1</code> 版本的软件包 <code>android.hardware.nfc</code> 中声明的,<code>1.1</code> 按预期导入 <code>1.0</code>(请参阅<a href="#package-ext">软件包级扩展</a>),且定义仅指定 UDT 名称:</p>
 
 <pre class="prettyprint">
 struct ExtendedNfcData {
@@ -277,8 +278,8 @@
 
 <p>会导入以下内容:</p>
 <ul>
-<li><code>[email protected]::IBase</code> (隐式)</li>
-<li><code>[email protected]::types</code> (隐式)</li>
+<li><code>[email protected]::IBase</code>(隐式)</li>
+<li><code>[email protected]::types</code>(隐式)</li>
 <li><code>[email protected]</code> 中的所有内容(包括所有接口及其 <code>types.hal</code>)</li>
 <li><code>[email protected]::types</code> 中的 <code>types.hal</code>(<code>[email protected]</code> 中的接口不会被导入)</li>
 <li><code>[email protected]</code> 中的 <code>IQux.hal</code> 和 <code>types.hal</code></li>
@@ -334,7 +335,7 @@

 <br /><br />
 </li>
-<li>“继承至少一个具有相同名称的接口”:存在扩展 <code>package@major.(minor-1)::IFoo</code> 的接口 <code>[email protected]::IFoo</code>;
+<li>“继承至少一个具有相同名称的接口”:存在扩展 <code>package@major.(minor-1)::IFoo</code> 的接口 <code>[email protected]::IFoo</code>(如果前一个软件包具有接口);
 <br /><br />

 <br /><br />
@@ -352,7 +353,7 @@
 </li>
 </ul>
 
-<p>不过,规则 A 不会影响软件包名称相同但 major 版本不同的软件包(例如,<code>android.hardware.camera.device</code> 定义了 <code>@1.0</code> 和 <code>@3.2</code>;<code>@3.2</code> 无需与 <code>@1.0</code> 进行交互)。<em></em>因此,<code>@3.2::IExtFoo</code> 可扩展 <code>@1.0::IFoo</code>。</p>
+<p><em></em>不过,规则 A 不会影响软件包名称相同但 major 版本不同的软件包(例如,<code>android.hardware.camera.device</code> 定义了 <code>@1.0</code> 和 <code>@3.2</code>;<code>@3.2</code> 无需与 <code>@1.0</code> 进行交互)。因此,<code>@3.2::IExtFoo</code> 可扩展 <code>@1.0::IFoo</code>。</p>
 
 <p>如果软件包名称不同,则 <code>[email protected]::IBar</code> 可从名称不同的接口进行扩展(例如,<code>[email protected]::IBar</code> 可扩展 <code>[email protected]::IBaz</code>)。如果接口未使用 <code>extend</code> 关键字显式声明超类型,它将扩展 <code>[email protected]::IBase</code>(<code>IBase</code> 本身除外)。</p>
 
@@ -378,7 +379,7 @@
 
 <p>在 <code>IQuux</code> 声明中的 <code>extends @1.0::IQuux</code> 内,我们指定了被继承的 <code>IQuux</code> 的版本(需要澄清说明,因为 <code>IQuux</code> 用于声明接口和从接口继承)。由于声明只是名称(会继承位于声明位置处的所有软件包和版本属性),因此澄清说明必须位于基接口的名称中;我们可能也使用了完全限定的 UDT,但这样做是多余的。</p>
 
-<p>新接口 <code>IQuux</code> 不会重新声明它从 <code>@1.0::IQuux</code> 继承的方法 <code>fromFooToBar()</code>;它只会列出它添加的新方法 <code>fromBarToFoo()</code>。在 HIDL 中,<strong>不得</strong>在子接口中重新声明继承的方法,所以对于 <code>IQuux</code> 来说,它不会是显式声明 <code>fromFooToBar()</code> 的选项。</p>
+<p>新接口 <code>IQuux</code> 不会重新声明它从 <code>@1.0::IQuux</code> 继承的方法 <code>fromFooToBar()</code>;它只会列出它添加的新方法 <code>fromBarToFoo()</code>。在 HIDL 中,<strong>不得</strong>在子接口中重新声明继承的方法,所以对于 <code>IQuux</code> 来说,不得显式声明 <code>fromFooToBar()</code>。</p>
 
 <aside class="key-point"><strong>要点</strong>:在 HIDL 中,每个从基类继承的方法都必须在继承类中显式实现。如果方法实现需要回退到相关基类,则回退必须位于实现中。</aside>
 
diff --git a/zh-cn/devices/architecture/index.html b/zh-cn/devices/architecture/index.html
index 749c90d..fe8f943 100644
--- a/zh-cn/devices/architecture/index.html
+++ b/zh-cn/devices/architecture/index.html
@@ -36,15 +36,15 @@
 <p>Binder 进程间通信 (IPC) 机制允许应用框架跨越进程边界并调用 Android 系统服务代码,从而使得高级框架 API 能与 Android 系统服务进行交互。在应用框架级别,开发者无法看到此类通信的过程,但一切都会“按部就班地运行”。</p>
 
 <h2 id="system-services">系统服务</h2>
-<p>系统服务是集中的模块化组件,例如窗口管理器、搜索服务或通知管理器。应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件。Android 包含两组服务:“系统”(诸如窗口管理器和通知管理器之类的服务)和“媒体”(与播放和录制媒体相关的服务)。<em></em><em></em></p>
+<p>系统服务是专注于特定功能的模块化组件,例如窗口管理器、搜索服务或通知管理器。应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件。Android 包含两组服务:“系统”(诸如窗口管理器和通知管理器之类的服务)和“媒体”(与播放和录制媒体相关的服务)。<em></em><em></em></p>
 
 <h2 id="hal">硬件抽象层 (HAL)</h2>
 <p>硬件抽象层 (HAL) 会定义一个标准接口来供硬件供应商实现,从而能让 Android 忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。HAL 实现会被封装成模块,并会由 Android 系统适时地加载。有关详情,请参阅<a href="/devices/architecture/hal.html">硬件抽象层 (HAL)</a> 一文。
 </p>
 
 <h2 id="Linux-kernel">Linux 内核</h2>
-<p>开发设备驱动程序与开发典型的 Linux 设备驱动程序类似。Android 使用的 Linux 内核版本包含一些特殊的补充功能,例如:唤醒锁(这是一种内存管理系统,可更主动地保护内存)、Binder IPC 驱动程序以及对移动嵌入式平台非常重要的其他功能。这些补充功能主要用于增强系统功能,不会影响驱动程序开发。</p>
+<p>开发设备驱动程序与开发典型的 Linux 设备驱动程序类似。Android 使用的 Linux 内核版本包含几个特殊的补充功能,例如:Low Memory Killer(一种内存管理系统,可更主动地保留内存)、唤醒锁定(一种 <a href="https://developer.android.com/reference/android/os/PowerManager.html"><code>PowerManager</code></a> 系统服务)、Binder IPC 驱动程序以及对移动嵌入式平台来说非常重要的其他功能。这些补充功能主要用于增强系统功能,不会影响驱动程序开发。</p>
 
-<p>您可以使用任意版本的内核,只要它支持所需功能(如 Binder 驱动程序)。不过,我们建议您使用 Android 内核的最新版本。有关详情,请参阅<a href="/source/building-kernels.html">编译内核</a>一文。</p>
+<p>您可以使用任意版本的内核,只要它支持所需功能(如 Binder 驱动程序)即可。不过,我们建议您使用 Android 内核的最新版本。有关详情,请参阅<a href="/source/building-kernels.html">编译内核</a>一文。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/kernel/modular-kernels.html b/zh-cn/devices/architecture/kernel/modular-kernels.html
index fc86fbd..7026046 100644
--- a/zh-cn/devices/architecture/kernel/modular-kernels.html
+++ b/zh-cn/devices/architecture/kernel/modular-kernels.html
@@ -36,7 +36,7 @@
 </ul>
 
 <h2 id="loadable-kernel-modules">可加载的内核模块</h2>
-<p>所有 SoC 内核都应支持可加载的内核模块。作为着手点,以下内核配置选项(或其内核版本等效选项)已添加到所有常见内核中的 <a href="https://android.googlesource.com/kernel/common/+/android-4.4-o/android/configs/android-base.cfg" class="external">android-base.cfg</a>,且必须在所有设备内核中启用:</p>
+<p>所有 SoC 内核都应支持可加载的内核模块。作为着手点,以下内核配置选项(或其内核版本等效选项)已添加到所有通用内核中的 <a href="https://android.googlesource.com/kernel/common/+/android-4.4-o/android/configs/android-base.cfg" class="external">android-base.cfg</a>,且必须在所有设备内核中启用:</p>
 
 <pre class="prettyprint">
 CONFIG_MODULES=y
@@ -121,16 +121,16 @@
 <li>内核模块不应位于 <code>/system</code> 中。</li>
 <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>恢复模式所用的内核模块不应依赖仅位于 <code>/vendor</code> 或 <code>/odm</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>恢复模式所用的内核模块不应依赖仅位于 <code>/vendor</code> 或 <code>/odm</code> 中的模块,因为这些分区在恢复模式下没有装载。</li>
 <li>SoC 供应商内核模块不应依赖 ODM 内核模块。</li>
 </ul>
 
-<p>在 Android 7.x 及更早版本中,<code>/vendor</code> 和 <code>/odm</code> 分区<strong>未</strong>提前装载。在 Android 8.0 中,为使模块能够从这些分区加载,已进行相关配置,以便为<a href="https://source.android.com/devices/tech/ota/ab_updates">非 A/B 和 A/B 设备</a>提前装载分区。这还确保了在 Android 和充电模式下均装载分区。</p>
+<p>在 Android 7.x 及更早版本中,<code>/vendor</code> 和 <code>/odm</code> 分区<strong>未</strong>提前装载。在 Android 8.0 中,为使模块能够从这些分区加载,已进行相关配置,以便为<a href="/devices/tech/ota/ab_updates">非 A/B 和 A/B 设备</a>提前装载分区。这还确保了在 Android 和充电模式下均装载分区。</p>
 
 <h3 id="android-build-system-support">Android 编译系统支持</h3>
-<p>在 <code>BoardConfig.mk</code> 中,Android 编译系统定义了 <code>BOARD_VENDOR_KERNEL_MODULES</code> 变量,该变量提供用于供应商映像的内核模块的完整列表。此变量中列出的模块会被复制到位于 <code>/lib/modules/</code> 的供应商映像中,在 Android 中装载后会显示在 <code>/vendor/lib/modules</code> 中(根据上述要求)。下面是一个供应商内核模块的配置示例:</p>
+<p>在 <code>BoardConfig.mk</code> 中,Android 编译系统定义了 <code>BOARD_VENDOR_KERNEL_MODULES</code> 变量,该变量提供了用于供应商映像的内核模块的完整列表。此变量中列出的模块会被复制到位于 <code>/lib/modules/</code> 的供应商映像中,在 Android 中装载后会显示在 <code>/vendor/lib/modules</code> 中(根据上述要求)。下面是一个供应商内核模块的配置示例:</p>
 
 <pre class="prettyprint">
 vendor_lkm_dir := device/$(vendor)/lkm-4.x
@@ -165,7 +165,7 @@
 <p>通常,内核模块必须使用将与该模块结合使用的内核进行编译,否则,内核会拒绝加载该模块。
 <code>CONFIG_MODVERSIONS</code> 通过检测 ABI 中的损坏情况提供了一种解决方案。该功能会计算内核中每个导出的符号的原型的循环冗余校验 (CRC) 值,并将这些值作为内核的一部分进行存储;对于内核模块所用的符号,相应的值也会存储在内核模块中。模块加载完成后,模块所用符号的值将与内核中的相应值进行比较。如果这些值相互匹配,则加载模块;如果不匹配,则模块加载会失败。</p>
 
-<p>要使内核映像的更新独立于供应商映像,请启用 <code>CONFIG_MODVERSIONS</code>。这样做可以在确保与供应商映像中的现有内核模块保持兼容的同时,对内核进行小幅度更新(如 LTS 提供的问题修复)。不过,<code>CONFIG_MODVERSIONS</code> 本身并不会修复 ABI 损坏。如果内核中某个导出的符号的原型由于源代码的修改或内核配置更改而发生变化,则会破坏与使用该符号的内核模块的兼容性。在此类情况下,必须重新编译内核模块。</p>
+<p>要使内核映像的更新独立于供应商映像,请启用 <code>CONFIG_MODVERSIONS</code>。这样做可以在确保与供应商映像中的现有内核模块保持兼容的同时,对内核进行小幅度更新(例如 LTS 提供的问题修复)。不过,<code>CONFIG_MODVERSIONS</code> 本身并不会修复 ABI 损坏。如果内核中某个导出的符号的原型由于源代码的修改或内核配置更改而发生变化,则会破坏与使用该符号的内核模块的兼容性。在此类情况下,必须重新编译内核模块。</p>
 
 <p>例如,内核中的 <code>task_struct</code> 结构(在 <code>include/linux/sched.h</code> 中定义)包含很多字段,具体包含的字段根据相关条件取决于内核配置。<code>sched_info</code> 字段仅在 <code>CONFIG_SCHED_INFO</code> 启用(启用 <code>CONFIG_SCHEDSTATS</code> 或 <code>CONFIG_TASK_DELAY_ACCT</code> 时发生)时才显示。如果这些配置选项的状态发生变化,<code>task_struct</code> 结构的布局也将发生变化,同时,从内核导出的使用 <code>task_struct</code> 的所有接口都会发生变化(如 <code>kernel/sched/core.c</code> 中的 <code>set_cpus_allowed_ptr</code>)。与使用这些接口的之前编译的内核模块的兼容性将会被破坏,这就需要使用新的内核配置重新编译这些模块。</p>
 
@@ -196,7 +196,7 @@
 <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>例如:<pre class="prettyprint">
+<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>例如:<pre class="prettyprint">
 PRODUCT_SYSTEM_VERITY_PARTITION := /dev/block/…./by-name/system
 PRODUCT_VENDOR_VERITY_PARTITION := /dev/block/…./by-name/vendor
 CUSTOM_IMAGE_VERITY_BLOCK_DEVICE := /dev/block/…./by-name/odm
@@ -220,7 +220,7 @@
 <li><code>fstab</code> 条目必须在设备树中的 <code>/firmware/android/fstab</code> 下,且必须将兼容字符串集设为 <code>android,fstab</code>。</li>
 <li><code>/firmware/android/fstab</code> 下的每个节点都被视为单个提前装载 <code>fstab</code> 条目。节点必须定义以下属性:
  <ul>
- <li><code>dev</code>。必须指向代表 by-name.分区的设备节点。<em></em></li>
+ <li><code>dev</code>。必须指向代表 by-name 分区的设备节点。<em></em></li>
  <li><code>type</code>。必须是文件系统类型(如在 <code>fstab</code> 文件中一样)。</li>
  <li><code>mnt_flags</code>。必须是装载标记的逗号分隔列表(如在 <code>fstab</code> 文件中一样)。</li>
  <li><code>fsmgr_flags</code>。必须是 Android <code>fs_mgr
@@ -289,9 +289,9 @@
 </pre>
 
 <h3 id="early-mounting-partitions-vboot-2-0">提前装载分区 (VBoot 2.0)</h3>
-<p>VBoot 2.0 代表 <a href="https://android.googlesource.com/platform/external/avb/" class="external">Android 验证启动 (AVB)</a>。 使用 VBoot 2.0 提前装载分区的要求如下:</p>
+<p>VBoot 2.0 是 <a href="https://android.googlesource.com/platform/external/avb/" class="external">Android 验证启动 (AVB)</a>。 使用 VBoot 2.0 提前装载分区的要求如下:</p>
 <ol>
-<li>设备节点路径必须在 <code>fstab</code> 和设备树条目中使用其 <em>by-name</em> 符号链接。例如,确保对分区进行命名且设备节点为 <code>/dev/block/…./by-name/{system,vendor,odm}</code>,而不是使用 <code>/dev/block/mmcblk0pX</code> 指定分区。</li>
+<li>设备节点路径必须在 <code>fstab</code> 和设备树条目中使用其 by-name 符号链接。<em></em>例如,确保对分区进行命名且设备节点为 <code>/dev/block/…./by-name/{system,vendor,odm}</code>,而不是使用 <code>/dev/block/mmcblk0pX</code> 指定分区。</li>
 <li>VBoot 1.0 所用的编译系统变量(如 <code>PRODUCT_{SYSTEM,VENDOR}_VERITY_PARTITION</code> 和 <code>CUSTOM_IMAGE_VERITY_BLOCK_DEVICE</code>)对 VBoot 2.0 而言并非必需的。相反,应该定义 VBoot 2.0 中引入的新编译系统变量(包括 <code>BOARD_AVB_ENABLE := true</code>);有关完整配置,请参阅<a href="https://android.googlesource.com/platform/external/avb/#Build-System-Integration" class="external">适用于 AVB 的编译系统集成</a>。</li>
 <li>通过设备树叠加层提供的条目不得在 <code>fstab</code> 文件片段中出现重复。例如,如果您指定某个条目以在设备树中装载 <code>/vendor</code>,则 <code>fstab</code> 文件不得重复该条目。</li>
 <li>只能提前装载 <code>/system</code>、<code>/odm</code> 或 <code>/vendor</code>。Android 不支持在 <code>init</code> 第一阶段装载其他任何分区。</li>
@@ -318,7 +318,7 @@
 <p>下面的示例显示的是在 Nexus 5X 上为 <code>system</code> 和 <code>vendor</code> 分区提前装载设备树。请注意:</p>
 <ul>
 <li><code>/system</code> 使用 AVB 进行装载,且 <code>/vendor</code> 的装载不需要进行完整性验证。</li>
-<li>由于 Nexus 5X 没有 <code>/vbmeta</code> 分区,因此顶级 vbmeta 位于 <code>/boot</code> 分区的末端(有关详情,请参阅 <a href="https://android-review.googlesource.com/#/c/344907/" class="external">AOSP 更改列表</a>)。
+<li>由于 Nexus 5X 没有 <code>/vbmeta</code> 分区,因此顶级 vbmeta 位于 <code>/boot</code> 分区的末端(有关详情,请参阅 <a href="https://android-review.googlesource.com/#/c/344907/" class="external">AOSP 变更列表</a>)。
 
 <pre class="prettyprint">
 / {
@@ -359,8 +359,8 @@
 
 <ul>
 <li>很多分区都是在 vbmeta 条目中指定的,因为这些分区<a href="https://android.googlesource.com/platform/external/avb/#The-VBMeta-struct">受 AVB 保护</a>。</li>
-<li>必须包含所有 AVB 分区,即使仅提前装载了 <code>/vendor</code> 也是如此。</li>
-<li>务必为 A/B 分区添加 <strong><code>slotselect</code></strong>。<pre class="prettyprint">
+<li>请务必包含所有 AVB 分区,即使仅提前装载了 <code>/vendor</code> 也是如此。</li>
+<li>请务必为 A/B 分区添加 <strong><code>slotselect</code></strong>。<pre class="prettyprint">
 / {
   vbmeta {
       compatible = "android,vbmeta";
@@ -388,7 +388,7 @@
 
 <h2 id="device-tree-overlay-support-bootloader">设备树叠加层支持(引导加载程序)</h2>
 <p>
-<a href="https://lkml.org/lkml/2012/11/5/615">设备树叠加层</a> (DTO) 旨在扩展现有<a href="https://events.linuxfoundation.org/sites/events/files/slides/petazzoni-device-tree-dummies.pdf" class="external">扁平化设备树 (FDT)</a> 的实现,以便在运行时用户空间可通过加载修改了原始数据的额外叠加层 FDT 来修改内核中的初始设备树数据。Android 不需要来自用户空间的 DT Blob 运行时更新,而是建议供应商借助 <code>libfdt</code>/<code>libufdt</code> 在引导加载程序中添加设备树补丁程序。</p>
+<a href="/devices/architecture/dto/">设备树叠加层</a> (DTO) 旨在扩展现有<a href="https://events.linuxfoundation.org/sites/events/files/slides/petazzoni-device-tree-dummies.pdf" class="external">扁平化设备树 (FDT)</a> 的实现,以便在运行时用户空间可通过加载修改了原始数据的额外叠加层 FDT 来修改内核中的初始设备树数据。Android 不需要来自用户空间的 DT Blob 运行时更新,而是建议供应商借助 <code>libfdt</code>/<code>libufdt</code> 在引导加载程序中添加设备树补丁程序。</p>
 
 <p>在 Android 7.x 及更早版本中,Android 不要求提供设备树支持,同时,没有针对供应商如何将 DT Blob 传递给内核或在何处存储这些 Blob 提供相关建议。不过,Android 8.0 建议提供此类支持,以将内核的板专属部分和仅限 SoC 访问的部分区分开来。</p>
 
@@ -397,9 +397,8 @@
 
 <p>设备树叠加层支持(如果使用)的要求如下:</p>
 <ul>
-<li>对于适用于板专属 DT 叠加层的每个内核映像,设备应该具有新的设备树 Blob 叠加层 (DTBO) 分区(要详细了解分区格式,请参阅 <a href="/devices/architecture/dto/partitions.html">DTB/DTBO 分区</a>)。
-假设的前提是引导加载程序已经知道从何处以及如何加载 SoC 专用 DTB。</li>
-<li>应该针对 A/B 设备对叠加层 DT 分区进行 <a href="https://source.android.com/devices/tech/ota/ab_updates.html">A/B 系统更新</a>。对这些设备而言,恢复内核与 Android 内核相同,但分区必须进行 A/B 系统更新,因为这样才可以通过 OTA 进行更新。</li>
+<li>对于适用于板专属 DT 叠加层的每个内核映像,设备应该具有新的设备树 Blob 叠加层 (DTBO) 分区(要详细了解分区格式,请参阅 <a href="/devices/architecture/dto/partitions.html">DTB/DTBO 分区</a>)。假设的前提是引导加载程序已经知道从何处以及如何加载 SoC 专用 DTB。</li>
+<li>应该针对 A/B 设备对叠加层 DT 分区进行 <a href="/devices/tech/ota/ab_updates.html">A/B 系统更新</a>。对这些设备而言,恢复内核与 Android 内核相同,但分区必须进行 A/B 系统更新,因为这样才可以通过 OTA 进行更新。</li>
 <li>分区大小取决于板。
  <ul>
  <li>DT 叠加层分区大小取决于设备以及主 SoC 内核 DT Blob 上所需的更改量。</li>
@@ -489,11 +488,11 @@
 
 <p>要获取与 Linux 内核社区协作以将您的代码上游化的相关帮助,请参阅以下资源:</p>
 <ul>
-<li><code>Documentation/process</code>(在 4.9 版及更早版本的内核中为 <code>Documentation/development-process</code>)</li>
+<li><code>Documentation/process</code>(在 4.9 版及更早版本中为 <code>Documentation/development-process</code>)</li>
 <li><code>Documentation/CodingStyle</code></li>
 <li><code>Documentation/SubmittingPatches</code></li>
 </ul>
 
-<p>社区会稍作审核就接受独立的驱动程序和文件系统并将其纳入内核的调试部分,然后在其中努力提高代码质量。</p>
+<p>社区会稍作审核就接受独立的驱动程序和文件系统并将其纳入内核的暂存区,然后在其中努力提高代码质量。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/kernel/network_tests.html b/zh-cn/devices/architecture/kernel/network_tests.html
index ad3ce84..9f81c17 100644
--- a/zh-cn/devices/architecture/kernel/network_tests.html
+++ b/zh-cn/devices/architecture/kernel/network_tests.html
@@ -24,7 +24,7 @@
 
 <h2 id="purpose">为何要运行测试?</h2> <p>运行这些测试的原因主要有 3 个:</p> <ol> <li>设备上使用的 Linux 内核的确切版本通常是特定于设备的,如果不运行测试,就很难了解某一版本的内核运行是否正常。</li> <li>将内核补丁程序向前移植和向后移植到不同的内核版本或不同的设备树,可能会导致出现一些细微的问题;如果不运行测试,则很难发现这种问题。例如,在开发过程中,某些设备的初始版本具有从 Android-3.4 向前移植(而非从 Android-3.10 中挑选)的 UID 路由补丁程序,因而导致行为不正常。</li> <li>新的网络功能可能需要借助新的内核功能或内核错误修复来实现。</li> </ol> <p>如果测试没有通过,则设备的网络堆栈会运行异常,从而导致出现用户可见的连接错误,例如 WLAN 网络断开连接。设备还可能会无法通过 Android 兼容性测试套件 (CTS) 测试。</p>
 
-<h2 id="using">使用测试</h2> <p>测试会使用 <a href="http://user-mode-linux.sourceforge.net/">User-Mode Linux</a> 来启动内核,如同 Linux 主机上的一个进程。请参阅<a href="https://source.android.com/source/initializing.html">构建编译环境</a>,查看合适的操作系统版本。单元测试框架会使用适当的磁盘映像启动内核,并从主机文件系统运行测试。测试使用 Python 2.x 进行编写,并使用 TAP 接口来测试内核行为和套接字 API。</p>
+<h2 id="using">使用测试</h2> <p>测试会使用 <a href="http://user-mode-linux.sourceforge.net/">User-Mode Linux</a> 来启动内核,如同 Linux 主机上的一个进程。请参阅<a href="/setup/initializing.html">构建编译环境</a>,查看合适的操作系统版本。单元测试框架会使用适当的磁盘映像启动内核,并从主机文件系统运行测试。测试使用 Python 2.x 进行编写,并使用 TAP 接口来测试内核行为和套接字 API。</p>
 
 <h3 id="compiling">针对 ARCH=um 编译内核</h3> <p>要运行测试,则必须针对 <code>ARCH=um SUBARCH=x86_64</code> 编译内核。这是一个受支持的基础架构上游,位于通用 Android 内核树(例如 <code>android-3.10</code>、<code>android-3.18</code>)中。但是,有时设备内核不会在这种模式下进行编译,因为设备树会在通用文件中包含特定于设备或特定于硬件的代码(例如 <code>sys/exit.c</code>)。</p> <p>在很多情况下,确保特定于硬件的代码位于 <code>#ifdef</code> 之后就足够了。通常,这应该是配置选项中的 <code>#ifdef</code>,用于控制与代码相关的特定功能。如果没有这样的配置选项,则将特定于硬件的代码放在 <code>#ifndef CONFIG_UML</code> 块中。</p> <p>一般来说,这项修复应该由内核树提供者(例如,芯片组供应商或 SoC 供应商)负责。我们正在与原始设备制造商 (OEM) 和供应商合作,确保当前和未来的内核将针对 <code>ARCH=um
 SUBARCH=x86_64</code> 进行编译,而无需进行任何更改。</p>
diff --git a/zh-cn/devices/architecture/vintf/match-rules.html b/zh-cn/devices/architecture/vintf/match-rules.html
index 4ffc2f6..90fe713 100644
--- a/zh-cn/devices/architecture/vintf/match-rules.html
+++ b/zh-cn/devices/architecture/vintf/match-rules.html
@@ -241,7 +241,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 版本,用于升级设备和启动设备。在这种情况下,可以共享同一个未签名的系统映像,但最终签名的系统映像是不同的(具有不同的 <code>avb.vbmeta-version</code>):<em></em><em></em></p>
 
 <img src="../images/treble_vintf_avb_o_p.png"/>
 <figcaption><strong>图 1. </strong>AVB 版本匹配(<code>/system</code> 为 P,其他所有分区均为 O)。</figcaption>
diff --git a/zh-cn/devices/audio/aaudio.html b/zh-cn/devices/audio/aaudio.html
new file mode 100644
index 0000000..56d79e2
--- /dev/null
+++ b/zh-cn/devices/audio/aaudio.html
@@ -0,0 +1,269 @@
+<html devsite><head>
+    <title>AAudio 和 MMAP</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+AAudio 是在 Android 8.0 版本中引入的一种音频 API。Android 8.1 版本具有增强功能,可在与支持 MMAP 的 HAL 和驱动程序结合使用时缩短延迟时间。本文档说明了需要进行哪些硬件抽象层 (HAL) 及驱动程序方面的更改才能在 Android 中支持 AAudio 的 MMAP 功能。
+</p>
+
+<p>
+要支持 AAudio MMAP,须执行以下操作:</p>
+
+<ul>
+<li>报告 HAL 的 MMAP 功能</li><li>在 HAL 中实现新功能</li><li>为“专有”模式缓冲区实现自定义 ioctl()(可选)</li><li>提供一个额外的硬件数据路径</li>
+<li>设置用于启用 MMAP 功能的系统属性</li>
+</ul>
+
+<aside class="note"><strong>注意:</strong>请仅在 Android O MR1 或更高版本上启用 MMAP 功能。</aside>
+
+<h2 id="aaudio-architecture">AAudio 架构</h2>
+
+<p>
+<a href="https://developer.android.com/ndk/guides/audio/aaudio/aaudio.html">AAudio</a> 是一种新的本地 C API,可提供 Open SL ES 的替代方案。它使用“生成器”设计模式来创建音频流。
+</p>
+
+<p>
+AAudio 提供了一个低延迟数据路径。在“专有”模式下,该功能可让客户端应用代码直接写入到与 ALSA 驱动程序共享的内存映射缓冲区。在“共享”模式下,MMAP 缓冲区由在 AudioServer 中运行的混音器使用。在“专有”模式下,由于数据会绕过混音器,延迟时间会明显缩短。
+</p>
+
+<p>
+在“专有”模式下,服务可从 HAL 请求 MMAP 缓冲区并管理资源。MMAP 缓冲区会在 NOIRQ 模式下运行,因此没有共享的读/写计数器可用来管理对缓冲区的访问权限。相反,客户端会维护硬件的计时模型,并预测将在何时读取缓冲区。
+</p>
+
+<p>
+在下图中,我们可以看到脉冲编码调制 (PCM) 数据通过 MMAP FIFO 向下流入 ALSA 驱动程序。AAudio 服务会定期请求时间戳,然后通过原子消息队列将其传递给客户端的计时模型。
+</p>
+
+<figure id="pcm-data-flow">
+  <img src="/devices/audio/images/pcm_data_flow.png" width="630" alt="PCM 数据流图。"/>
+  <figcaption><b>图 1.</b> PCM 数据通过 FIFO 流向 ALSA</figcaption>
+</figure>
+
+<p>
+在“共享”模式下,也会用到计时模型,但它位于 AAudioService 中。
+</p>
+
+<p>
+在音频捕获过程中,会用到类似的模型,但 PCM 数据会以相反方向流动。
+</p>
+
+<h2 id="hal-changes">HAL 变更</h2>
+<p>
+对于 tinyALSA,请参阅:</p>
+
+<pre class="prettyprint">
+external/tinyalsa/include/tinyalsa/asoundlib.h
+external/tinyalsa/include/tinyalsa/pcm.c
+</pre>
+
+<pre class="prettyprint">
+int pcm_start(struct pcm *pcm);
+int pcm_stop(struct pcm *pcm);
+int pcm_mmap_begin(struct pcm *pcm, void **areas,
+           unsigned int *offset,
+           unsigned int *frames);
+int pcm_get_poll_fd(struct pcm *pcm);
+int pcm_mmap_commit(struct pcm *pcm, unsigned int offset,
+           unsigned int frames);
+int pcm_mmap_get_hw_ptr(struct pcm* pcm, unsigned int *hw_ptr,
+           struct timespec *tstamp);
+</pre>
+
+<p>
+对于旧版 HAL,请参阅:</p>
+
+<pre class="prettyprint">
+hardware/libhardware/include/hardware/audio.h
+hardware/qcom/audio/hal/audio_hw.c
+</pre>
+
+<pre class="prettyprint">
+int start(const struct audio_stream_out* stream);
+int stop(const struct audio_stream_out* stream);
+int create_mmap_buffer(const struct audio_stream_out *stream,
+                        int32_t min_size_frames,
+                        struct audio_mmap_buffer_info *info);
+int get_mmap_position(const struct audio_stream_out *stream,
+                        struct audio_mmap_position *position);
+</pre>
+
+<p>
+对于 HIDL 音频 HAL:</p>
+
+<pre class="prettyprint">
+hardware/interfaces/audio/2.0/IStream.hal
+hardware/interfaces/audio/2.0/types.hal
+hardware/interfaces/audio/2.0/default/Stream.h
+</pre>
+
+<pre class="prettyprint">
+start() generates (Result retval);
+stop() generates (Result retval) ;
+createMmapBuffer(int32_t minSizeFrames)
+       generates (Result retval, MmapBufferInfo info);
+getMmapPosition()
+       generates (Result retval, MmapPosition position);
+</pre>
+
+<h3 id="reporting-mmap-support">报告 MMAP 支持</h3>
+
+<p>
+系统属性“aaudio.mmap_policy”应设置为 2 (AAUDIO_POLICY_AUTO),以便音频框架知道音频 HAL 支持 MMAP 模式(请参阅下面的“启用 AAudio MMAP 数据路径”)。
+</p>
+
+<p>
+audio_policy_configuration.xml 文件还必须包含特定于 MMAP/NO IRQ 模式的输出和输入配置文件,以便音频政策管理器得知要在创建 MMAP 客户端时打开的流:</p>
+
+<pre class="prettyprint">
+&lt;mixPort name="mmap_no_irq_out" role="source"
+            flags="AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_MMAP_NOIRQ"&gt;
+            &lt;profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                                samplingRates="48000"
+                                channelMasks="AUDIO_CHANNEL_OUT_STEREO"/&gt;
+&lt;/mixPort&gt;
+
+&lt;mixPort name="mmap_no_irq_in" role="sink" flags="AUDIO_INPUT_FLAG_MMAP_NOIRQ"&gt;
+            &lt;profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+                                samplingRates="48000"
+                                channelMasks="AUDIO_CHANNEL_IN_STEREO"/&gt;
+&lt;/mixPort&gt;
+</pre>
+
+<h3 id="opening-and-closing-an-mmap-stream">打开和关闭 MMAP 流</h3>
+
+<pre class="prettyprint">
+createMmapBuffer(int32_t minSizeFrames)
+            generates (Result retval, MmapBufferInfo info);
+</pre>
+
+<p>
+调用 Tinyalsa 函数可以打开和关闭 MMAP 流。
+</p>
+
+<h3 id="querying-mmap-position">查询 MMAP 位置</h3>
+
+<p>
+传回到计时模型的时间戳包含帧位置和 MONOTONIC 时间(以纳秒为单位):</p>
+
+<pre class="prettyprint">
+getMmapPosition()
+        generates (Result retval, MmapPosition position);
+</pre>
+
+<p>
+HAL 可以通过调用新 Tinyalsa 函数从 ALSA 驱动程序中获取此信息:</p>
+
+<pre class="prettyprint">
+int pcm_mmap_get_hw_ptr(struct pcm* pcm,
+                        unsigned int *hw_ptr,
+                        struct timespec *tstamp);
+</pre>
+
+<h2 id="kernel-changes">内核变更</h2>
+
+<p>
+在驱动程序中启用 MMAP/NOIRQ 模式。
+</p>
+
+<p>
+您可以使用由 ALSA 驱动程序生成的文件描述符引用共享内存。如果文件描述符直接与 <code>/dev/snd/</code> 驱动程序文件关联,则可用于“共享”模式下的 AAudio 服务。但是对于“专有”模式,则无法将此描述符传递给客户端代码。<code>/dev/snd/</code> 文件描述符会提供过于宽泛的客户端访问权限,因此 SELinux 会将其屏蔽。
+</p>
+
+<p>
+要支持“专有”模式,需将 <code>/dev/snd/</code> 描述符转换为 <code>anon_inode:dmabuffer</code> 文件描述符。SELinux 允许将此文件描述符传递给客户端。该文件描述符也可用于 AAudioService。
+</p>
+
+<p>
+可使用 Android Ion 内存库生成 <code>anon_inode:dmabuffer</code> 文件描述符。
+</p>
+
+<p>
+有关更多信息,请参阅下列外部资源:</p>
+
+<ol>
+<li>“Android ION 内存分配器”<a href="https://lwn.net/Articles/480055/">https://lwn.net/Articles/480055/</a>
+</li><li>“Android ION 概览”<a href="https://wiki.linaro.org/BenjaminGaignard/ion">https://wiki.linaro.org/BenjaminGaignard/ion</a>
+</li><li>“集成 ION 内存分配器”<a href="https://lwn.net/Articles/565469/">https://lwn.net/Articles/565469/</a></li>
+</ol>
+
+<p>
+AAudio 服务需要了解 <code>anon_inode:dmabuffer</code> 是否受支持。目前,验证是否受支持的唯一方法是将 MMAP 缓冲区大小传递为负数(例如 -2048 而非 2048;如果支持的话)。我们已经在规划不必打开流即可报告此信息的更佳方法。
+</p>
+
+<h2 id="audio-subsystem-changes">音频子系统变更</h2>
+
+<p>
+AAudio 在音频子系统的音频前端需要一个额外的数据路径,以便它可以与原始 AudioFlinger 路径并行运行。旧路径用于所有其他系统声音和应用声音。该功能可由 DSP 中的软件混音器或由 SOC 中的硬件混音器提供。</p>
+
+<h2 id="enabling-aaudio-mmap-data-path">启用 AAudio MMAP 数据路径</h2>
+
+<p>
+如果 MMAP 不受支持或无法打开流,AAudio 将使用旧的 AudioFlinger 数据路径。因此,AAudio 将可用于不支持 MMAP/NOIRQ 路径的音频设备。
+</p>
+
+<p>
+在测试 AAudio 的 MMAP 支持功能时,了解您是在实际测试 MMAP 数据路径还是仅测试旧的数据路径这一点尤为重要。下面介绍了如何启用或强制执行特定数据路径,以及如何查询流所使用的路径。
+</p>
+
+<h3 id="system-properties">系统属性</h3>
+
+<p>
+您可以通过系统属性设置 MMAP 政策:</p>
+
+<ul>
+<li>1 = AAUDIO_POLICY_NEVER - 仅使用旧的路径,甚至不要尝试使用 MMAP。</li><li>2 = AAUDIO_POLICY_AUTO - 尝试使用 MMAP。如果此操作失败或 MMAP 不可用,则使用旧路径。
+</li><li>3 = AAUDIO_POLICY_ALWAYS - 仅使用 MMAP 路径。不返回到旧路径。</li>
+</ul>
+
+<p>
+您可以在设备 Makefile 中设置这些项,如下所示:</p>
+
+<pre class="prettyprint">
+# Enable AAudio MMAP/NOIRQ data path.
+# 2 is AAUDIO_POLICY_AUTO so it will try MMAP then fallback to Legacy path.
+PRODUCT_PROPERTY_OVERRIDES += aaudio.mmap_policy=2
+# Allow EXCLUSIVE then fall back to SHARED.
+PRODUCT_PROPERTY_OVERRIDES += aaudio.mmap_exclusive_policy=2
+</pre>
+
+<p>
+您也可以在设备启动后替换这些值。例如,要为 MMAP 启用“自动”模式,请输入以下内容:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+adb root
+</pre>
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell setprop aaudio.mmap_policy 2
+</pre>
+
+<p>
+<code>ndk/sysroot/usr/include/aaudio/AAudioTesting.h</code> 中提供了一些函数,可让您替换使用 MMAP 路径的政策:</p>
+
+<pre class="prettyprint">aaudio_result_t AAudio_setMMapPolicy(aaudio_policy_t policy);
+</pre>
+
+<p>
+要确定某个流是否使用 MMAP 路径,请调用:</p>
+
+<pre class="prettyprint">bool AAudioStream_isMMapUsed(AAudioStream* stream);
+</pre>
+
+</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 e04f6f8..1f4187b 100644
--- a/zh-cn/devices/audio/debugging.html
+++ b/zh-cn/devices/audio/debugging.html
@@ -100,11 +100,11 @@
 <ol>
 <li>运行您的音频测试。</li>
 <li><code class="devsite-terminal">adb shell dumpsys media.audio_flinger</code></li>
-<li>在 dumpsys 输出中查找如下行:<br />
+<li>在 <code>dumpsys</code> 输出中查找如下行:<br />
 <code>tee copied to /data/misc/media/20131010101147_2.wav</code>
 <br />这是一个 PCM .wav 文件。
 </li>
-<li>然后 <code>adb pull</code> 任何感兴趣的 <code>/data/misc/media/*.wav</code> 文件;请注意,曲目专用的转储文件名不会显示在 dumpsys 输出中,但仍会在曲目关闭后保存到 <code>/data/misc/media</code>。
+<li>然后 <code>adb pull</code> 任何相关的 <code>/data/misc/media/*.wav</code> 文件;请注意,曲目专用的转储文件名不会显示在 <code>dumpsys</code> 输出中,但仍会在曲目关闭后保存到 <code>/data/misc/media</code>。
 </li>
 <li>在与其他人分享之前,请先查看转储文件是否涉及隐私权问题。</li>
 </ol>
@@ -336,7 +336,7 @@
 <h4>在出现 mediaserver 故障后恢复日志</h4>
 
 <p>
-现在尝试终止 <code>mediaserver</code> 进程:<code>kill -9 #</code>;其中 # 是之前提到的进程 ID。您应该在主 <code>logcat</code> 的 <code>media.log</code> 中看到一个转储,其中会显示导致最终崩溃的所有日志。
+现在尝试终止 <code>mediaserver</code> 进程:<code>kill -9 #</code>;其中 # 是之前提到的进程 ID。您应该会在主 <code>logcat</code> 的 <code>media.log</code> 中看到一个转储,其中会显示导致最终崩溃的所有日志。
 </p>
 
 <pre class="devsite-terminal devsite-click-to-copy">
diff --git a/zh-cn/devices/audio/terminology.html b/zh-cn/devices/audio/terminology.html
index e25d307..c53b2ea 100644
--- a/zh-cn/devices/audio/terminology.html
+++ b/zh-cn/devices/audio/terminology.html
@@ -69,12 +69,14 @@
 
 <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>。
+直接数字流。基于<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>。
 </dd>
 
 <dt>闪避</dt>
 <dd>
-当另一个音频流变得活跃时,暂时降低音频流的音量。例如,如果播放音乐时收到一条通知,则音乐会在通知播放时闪避。与“静音”对应。<em></em>
+当另一个音频流变得活跃时,暂时降低音频流的音量。
+例如,如果播放音乐时收到一条通知,则音乐会在通知播放时闪避。与“静音”对应。<em></em>
 </dd>
 
 <dt>FIFO</dt>
@@ -109,7 +111,7 @@
 
 <dt>高解析度音频</dt>
 <dd>
-与 CD(立体声 16 位 PCM,44.1 kHz)相比,代表更高的位深和采样率,且支持无损数据压缩。相当于 HD 音频。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/High-resolution_audio">高解析度音频</a>。
+与 CD(立体声 16 位 PCM,44.1 kHz)相比,位深和采样率更高的一种音频数据表示方式,且支持无损数据压缩。相当于 HD 音频。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/High-resolution_audio">高解析度音频</a>。
 </dd>
 
 <dt>延时</dt>
@@ -119,12 +121,12 @@
 
 <dt>无损</dt>
 <dd>
-可在编码和解码的过程中保持位精度的<a href="http://en.wikipedia.org/wiki/Lossless_compression">无损数据压缩算法</a>;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据相当。无损音频内容分发格式包括 <a href="http://en.wikipedia.org/wiki/Compact_disc">CD</a>、<a href="http://en.wikipedia.org/wiki/WAV">WAV</a> 中的 PCM,以及 <a href="http://en.wikipedia.org/wiki/FLAC">FLAC</a> 等。创作过程可能会导致位深或采样率相较于<a href="http://en.wikipedia.org/wiki/Audio_mastering">母版</a>有所下降;可保持母版的解析度和位精确度的分发格式是高解析度音频的载体。
+可在编码和解码的过程中保持位精度的<a href="http://en.wikipedia.org/wiki/Lossless_compression">无损数据压缩算法</a>;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据相当。无损音频内容分发格式包括 <a href="http://en.wikipedia.org/wiki/Compact_disc">CD</a>、<a href="http://en.wikipedia.org/wiki/WAV">WAV</a> 中的 PCM,以及 <a href="http://en.wikipedia.org/wiki/FLAC">FLAC</a> 等。制作过程可能会导致位深或采样率相较于<a href="http://en.wikipedia.org/wiki/Audio_mastering">母版</a>有所下降;可保持母版的解析度和位精确度的分发格式属于高解析度音频的范畴。
 </dd>
 
 <dt>有损</dt>
 <dd>
-尝试在编码和解码的过程中保留最重要媒体特征的<a href="http://en.wikipedia.org/wiki/Lossy_compression">有损数据压缩算法</a>;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据看似相似,但并不完全相同。使用有损音频压缩算法的格式包括 MP3 和 AAC 等。由于模拟值来自连续的域,而数字值是离散的,因此就振幅而言,ADC 和 DAC 属于有损转换。另请参阅“透明度”。<em></em>
+尝试在编码和解码的过程中保留最重要媒体特征的<a href="http://en.wikipedia.org/wiki/Lossy_compression">有损数据压缩算法</a>;使用这种算法时,如果对之前编码的数据进行解码,得到的结果与原始数据看似相似,但并不完全相同。使用有损音频压缩算法的格式包括 MP3 和 AAC 等。由于模拟值属于连续的域,而数字值是离散的,因此就振幅而言,ADC 和 DAC 属于有损转换。另请参阅“透明度”。<em></em>
 </dd>
 
 <dt>单声道</dt>
@@ -184,7 +186,7 @@
 
 <dt>立体声展宽</dt>
 <dd>
-应用于立体声信号的一种音效,能使可听得到的另一立体声信号更饱满丰富。该音效也可应用于单声道信号;在单声道信号中,它属于扩混。
+应用于立体声信号的一种音效,能使另一立体声信号听起来更饱满丰富。该音效也可应用于单声道信号;在单声道信号中,它属于扩混。
 </dd>
 
 <dt>环绕声</dt>
@@ -248,7 +250,7 @@
 参阅 IEEE 1394。
 </dd>
 
-<dt>HDMI 端口</dt>
+<dt>HDMI</dt>
 <dd>
 高清晰度多媒体接口,用于传输音频和视频数据。移动设备上会使用微型 HDMI(D 型)或 MHL 连接器。
 </dd>
@@ -392,7 +394,7 @@
 
 <dt>奈奎斯特频率</dt>
 <dd>
-可由离散信号以指定采样率的一半表示的最大频率分量。例如,由于人类的听力范围可达到近 20 kHz,因此数字音频信号的采样率必须至少有 40 kHz 才能代表该范围。在实践中,44.1 kHz 和 48 kHz 的采样率比较常用,而比较常用的奈奎斯特频率则为 22.05 kHz 和 24 kHz。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Nyquist_frequency">奈奎斯特频率</a>和<a href="http://en.wikipedia.org/wiki/Hearing_range">听力范围</a>。
+可由离散信号以指定采样率的一半表示的最大频率分量。例如,由于人类的听力范围可达到近 20 kHz,因此数字音频信号的采样率必须至少有 40 kHz 才能代表该范围。在实践中,44.1 kHz 和 48 kHz 的采样率比较常用,对应的奈奎斯特频率分别为 22.05 kHz 和 24 kHz。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Nyquist_frequency">奈奎斯特频率</a>和<a href="http://en.wikipedia.org/wiki/Hearing_range">听力范围</a>。
 </dd>
 
 <dt>重采样器</dt>
@@ -405,10 +407,10 @@
 <dd>执行重新采样的模块。</dd>
 
 <dt>接收器</dt>
-<dd>重采样器的输出。</dd>
+<dd>重采样器的输出端。</dd>
 
 <dt>信源</dt>
-<dd>重采样器的输入。</dd>
+<dd>重采样器的输入端。</dd>
 
 <dt>升采样</dt>
 <dd>重新采样,其中接收器采样率 &gt; 信源采样率。</dd>
@@ -430,7 +432,7 @@
 
 <dt>音频设备</dt>
 <dd>
-以 HAL 为基础的音频 I/O 端点。
+以 HAL 实现为基础的音频 I/O 端点。
 </dd>
 
 <dt>AudioEffect</dt>
@@ -470,7 +472,7 @@
 
 <dt>音频来源</dt>
 <dd>
-常量的一种枚举,用于为捕获音频输入指明目标使用情形。如需了解详情,请参阅<a href="http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html">音频来源</a>。对于 21 级及以上级别的 API,建议使用<a href="attributes.html">音频属性</a>。
+一个常量枚举,用于为捕获音频输入指明目标使用情形。如需了解详情,请参阅<a href="http://developer.android.com/reference/android/media/MediaRecorder.AudioSource.html">音频来源</a>。对于 21 级及以上级别的 API,建议使用<a href="attributes.html">音频属性</a>。
 </dd>
 
 <dt>AudioTrack</dt>
@@ -480,7 +482,7 @@
 
 <dt>audio_utils</dt>
 <dd>
-PCM 格式转换、WAV 文件 I/O 以及<a href="avoiding_pi.html#nonBlockingAlgorithms">非阻塞 FIFO</a> 等功能的音频实用程序库,很大程度上独立于 Android 平台。
+提供 PCM 格式转换、WAV 文件 I/O 以及<a href="avoiding_pi.html#nonBlockingAlgorithms">非阻塞 FIFO</a> 等功能的音频实用程序库,很大程度上独立于 Android 平台。
 </dd>
 
 <dt>客户端</dt>
@@ -510,7 +512,7 @@
 
 <dt>MediaPlayer</dt>
 <dd>
-比 AudioTrack 级别更高的客户端 API。播放已编码的内容或包含多媒体音频和视频音轨的内容。
+比 AudioTrack 级别更高的客户端 API,播放已编码的内容或包含多媒体音频和视频轨道的内容。
 </dd>
 
 <dt>media.log</dt>
@@ -565,7 +567,7 @@
 
 <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>
@@ -575,12 +577,12 @@
 
 <dt>tinyalsa</dt>
 <dd>
-ALSA 内核之上具有 BSD 许可的小型用户模式 API。建议用于实现 HAL。
+ALSA 内核之上采用 BSD 许可的小型用户模式 API。建议用于实现 HAL。
 </dd>
 
 <dt>ToneGenerator</dt>
 <dd>
-比 AudioTrack 级别更高的客户端 API,用于播放双音多频 (DTMF) 信号。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling">双音多频信号</a>和 <a href="http://developer.android.com/reference/android/media/ToneGenerator.html">android.media.ToneGenerator</a> 中的 API 定义。
+比 AudioTrack 级别更高的客户端 API,用于播放双音多频 (DTMF) 信号。如需了解详情,请参阅<a href="http://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling">双音多频信号</a>和 <a href="http://developer.android.com/reference/android/media/ToneGenerator.html">android.media.ToneGenerator</a> 处的 API 定义。
 </dd>
 
 <dt>音轨</dt>
diff --git a/zh-cn/devices/audio/usb.html b/zh-cn/devices/audio/usb.html
index 345a947..283ee4b 100644
--- a/zh-cn/devices/audio/usb.html
+++ b/zh-cn/devices/audio/usb.html
@@ -28,19 +28,23 @@
 <p>本文的目标读者是 Android 设备原始设备制造商 (OEM)、SoC 供应商、USB 音频外设供应商、高级音频应用开发者以及希望详细了解 Android 上的 USB 数字音频内件的其他人士。
 </p>
 
-<p>Nexus 设备的最终用户则应该查看 <a href="https://support.google.com/nexus/">Nexus 帮助中心</a>中的<a href="https://support.google.com/nexus/answer/6127700">使用 USB 主机模式录制和播放音频</a>一文。虽然这篇文章并非面向最终用户,但某些发烧友级消费者可能会发现感兴趣的部分。</p>
+<p>
+Nexus 设备的最终用户则应该查看 <a href="https://support.google.com/nexus/">Nexus 帮助中心</a>中的<a href="https://support.google.com/nexus/answer/6127700">使用 USB 主机模式录制和播放音频</a>一文。虽然这篇文章并非面向最终用户,但某些发烧友级消费者可能会发现感兴趣的部分。</p>
 
 <h2 id="overview">USB 概览</h2>
 
-<p>维基百科 <a href="http://en.wikipedia.org/wiki/USB">USB</a> 一文对通用串行总线 (USB) 进行了非正式描述,而 <a href="http://www.usb.org/">USB Implementers Forum, Inc</a> 发布的标准给出了正式定义。为了方便起见,我们在本文中总结了重要的 USB 概念,但上述标准仍是权威参考。
+<p>
+维基百科 <a href="http://en.wikipedia.org/wiki/USB">USB</a> 一文对通用串行总线 (USB) 进行了非正式描述,而 <a href="http://www.usb.org/">USB Implementers Forum, Inc</a> 发布的标准给出了正式定义。为了方便起见,我们在本文中总结了重要的 USB 概念,但上述标准仍是权威参考。
 </p>
 
 <h3 id="terminology">基本概念和术语</h3>
 
-<p>USB 是一种<a href="http://en.wikipedia.org/wiki/Bus_(computing)">总线</a>,具有单个数据传输操作启动器,称为“主机”。<i></i>主机通过总线与<a href="http://en.wikipedia.org/wiki/Peripheral">外设</a>进行通信。
+<p>
+USB 是一种<a href="http://en.wikipedia.org/wiki/Bus_(computing)">总线</a>,具有单个数据传输操作启动器,称为“主机”。<i></i>主机通过总线与<a href="http://en.wikipedia.org/wiki/Peripheral">外设</a>进行通信。
 </p>
 
-<p class="note"><strong>注意</strong>:术语“设备”和“配件”是“外设”的常见同义词。<i></i><i></i><i></i>在本文中,我们避免使用这些术语,因为它们可能与 Android <a href="http://en.wikipedia.org/wiki/Mobile_device">设备</a>或称为<a href="http://developer.android.com/guide/topics/connectivity/usb/accessory.html">配件模式</a>的 Android 特定概念相混淆。
+<p class="note">
+<strong>注意</strong>:术语“设备”和“配件”是“外设”的常见同义词。<i></i><i></i><i></i>在本文中,我们避免使用这些术语,因为它们可能与 Android <a href="http://en.wikipedia.org/wiki/Mobile_device">设备</a>或称为<a href="http://developer.android.com/guide/topics/connectivity/usb/accessory.html">配件模式</a>的 Android 特定概念相混淆。
 </p>
 
 <p>主机的一个重要作用是“枚举”:检测哪些外设连接到总线并通过“描述符”查询其属性的过程。<i></i><i></i>
@@ -52,7 +56,8 @@
 <p>每个外设功能都有一个“接口”,用于定义与该功能通信所用的协议。<i></i>
 </p>
 
-<p>主机通过连接到<a href="http://en.wikipedia.org/wiki/Communication_endpoint">端点</a>、数据源或外设功能之一提供的接收器的<a href="http://en.wikipedia.org/wiki/Stream_(computing)">管道</a>与外设进行通信。
+<p>
+主机通过连接到<a href="http://en.wikipedia.org/wiki/Communication_endpoint">端点</a>、数据源或外设功能之一提供的接收器的<a href="http://en.wikipedia.org/wiki/Stream_(computing)">管道</a>与外设进行通信。
 </p>
 
 <p>有两种管道:“消息”和“信息流”。<i></i><i></i>消息管道用于双向控制和状态。信息流管道用于单向数据传输。
@@ -109,7 +114,9 @@
 <p>每个外设功能都有一个关联的设备类文档,用于指定该功能的标准协议。<i></i>这使得类兼容主机和外设功能可以互操作,而无需详细了解彼此的运行原理。<i></i>如果主机和外设由不同的实体提供,则类兼容性至关重要。
 </p>
 
-<p>术语“免驱动”是“类兼容”的常见同义词,表示可以使用此类外设的标准功能,而无需安装特定于操作系统的<a href="http://en.wikipedia.org/wiki/Device_driver">驱动程序</a>。<i></i><i></i>您可以认为,如果某个外设宣称“无需驱动程序”便可用于主要桌面操作系统,那么该外设属于类兼容外设,但可能有例外情况。
+<p>
+术语“免驱动”是“类兼容”的常见同义词,表示可以使用此类外设的标准功能,而无需安装特定于操作系统的<a href="http://en.wikipedia.org/wiki/Device_driver">驱动程序</a>。<i></i><i></i>
+您可以认为,如果某个外设宣称“无需驱动程序”便可用于主要桌面操作系统,那么该外设属于类兼容外设,但可能有例外情况。
 </p>
 
 <h3 id="audioClass">USB 音频类</h3>
@@ -232,7 +239,8 @@
 
 <h2 id="applications">USB 数字音频的应用</h2>
 
-<p>顾名思义,USB 数字音频信号由<a href="http://en.wikipedia.org/wiki/Digital_data">数字</a>数据流表示,而非常见的 TRS 迷你<a href="http://en.wikipedia.org/wiki/Phone_connector_(audio)">耳机连接器</a>使用的<a href="http://en.wikipedia.org/wiki/Analog_signal">模拟</a>信号。最终任何数字信号都必须先转换为模拟信号,然后才能被听到。选择在哪里进行转换时需要做出取舍。
+<p>
+顾名思义,USB 数字音频信号由<a href="http://en.wikipedia.org/wiki/Digital_data">数字</a>数据流表示,而非常见的 TRS 迷你<a href="http://en.wikipedia.org/wiki/Phone_connector_(audio)">耳机连接器</a>使用的<a href="http://en.wikipedia.org/wiki/Analog_signal">模拟</a>信号。最终任何数字信号都必须先转换为模拟信号,然后才能被听到。选择在哪里进行转换时需要做出取舍。
 </p>
 
 <h3 id="comparison">两种 DAC 设计</h3>
@@ -280,7 +288,8 @@
 
 <h3 id="hostDebugging">在主机模式下进行调试</h3>
 
-<p>在 USB 主机模式下,通过 USB 进行 adb 调试不可用。请参阅 <a href="http://developer.android.com/tools/help/adb.html">Android 调试桥</a>的<a href="http://developer.android.com/tools/help/adb.html#wireless">无线用法</a>部分,了解备选方案。
+<p>在 USB 主机模式下,通过 USB 进行 adb 调试不可用。
+请参阅 <a href="http://developer.android.com/tools/help/adb.html">Android 调试桥</a>的<a href="http://developer.android.com/tools/help/adb.html#wireless">无线用法</a>部分,了解备选方案。
 </p>
 
 <h2 id="compatibility">实现 USB 音频</h2>
@@ -361,4 +370,7 @@
 <p>USB 音频 HAL 在很大程度上取决于 tinyalsa(如<a href="terminology.html">音频术语</a>中所述)。<i></i>虽然 USB 音频依赖于等时传输,但这是通过 ALSA 实现抽象出来的。所以,USB 音频 HAL 和 tinyalsa 不需要关注 USB 协议的这部分。
 </p>
 
+<h2 id="testing-usb-audio">测试 USB 音频</h2>
+<p>有关适用于 USB 音频的 CTS 测试的信息,请参阅 <a href="/compatibility/cts/usb-audio">USB 音频 CTS 验证程序测试</a>。</p>
+
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/audio/warmup.html b/zh-cn/devices/audio/warmup.html
index 6edf399..4d1c7a1 100644
--- a/zh-cn/devices/audio/warmup.html
+++ b/zh-cn/devices/audio/warmup.html
@@ -37,7 +37,10 @@
   <li>通过依次在设备上选择<b>设置 &gt; 声音 &gt; 触摸提示音</b>,启用触摸提示音。</li>
   <li>确保音频至少已关闭三秒钟。五秒钟或更长时间会更好,因为除了 AudioFlinger 的 3 秒钟时间之外,硬件本身可能也存在自己的电源逻辑。</li>
   <li>按主屏幕按钮,您应该会听到点击声音。</li>
-  <li>运行以下命令以接收测量的预热时间:<br /><code>adb shell dumpsys media.audio_flinger | grep measuredWarmup</code>
+  <li>运行以下命令以接收测量的预热时间:
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell dumpsys media.audio_flinger | grep measuredWarmup
+</pre>
 
 <p>您应该会看到类似以下内容的输出:</p>
 
diff --git a/zh-cn/devices/automotive/camera-hal.html b/zh-cn/devices/automotive/camera-hal.html
new file mode 100644
index 0000000..8b3470b
--- /dev/null
+++ b/zh-cn/devices/automotive/camera-hal.html
@@ -0,0 +1,358 @@
+<html devsite><head>
+    <title>车载相机 HAL</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<p>Android 8.0 包含一个汽车 HIDL 硬件抽象层 (HAL),可用于在 Android 启动过程的初期提供图像捕获和显示,并在系统启动后继续运行直到系统终止。HAL 包含外部视景系统 (EVS) 堆栈,通常用于在具有车载信息娱乐 (IVI) 系统(基于 Android)的车辆中支持后视摄像头和环绕视图显示。EVS 还支持在用户应用中实现高级功能。</p>
+
+<p>Android 8.0 还包含一个特定于 EVS 的捕获和显示驱动程序接口(在 <code>/hardware/interfaces/automotive/evs/1.0</code> 中)。尽管可以基于现有的 Android 相机和显示服务编译后视摄像头应用,但这类应用可能会在 Android 启动过程中太迟运行。使用专用 HAL 可实现简化的接口,并清楚地说明原始设备制造商 (OEM) 需要实现什么才能支持 EVS 堆栈。</p>
+
+<h2 id="system-components">系统组件</h2>
+<p>EVS 包括以下系统组件:</p>
+
+<img src="/devices/automotive/images/vhal_evs_components.png" alt="EVS 系统组件图。"/>
+<figcaption><strong>图 1</strong> EVS 系统组件概览。</figcaption>
+
+<h3 id="evs-application">EVS 应用</h3>
+<p>可作为参考实现的 C++ EVS 示例应用 (<code>/packages/services/Car/evs/sample_app</code>)。该应用负责从 EVS 管理器请求视频帧,并将用于显示的已完成的帧发送回 EVS 管理器。
+EVS 和汽车服务可供使用后,它便立即由 init 启动(设置目标为在开机两 (2) 秒内启动)。原始设备制造商 (OEM) 可视需要修改或替换 EVS 应用。</p>
+
+<h3 id="evs-manager">EVS 管理器</h3>
+
+<p>EVS 管理器 (<code>/packages/services/Car/evs/service</code>) 可提供 EVS 应用所需的编译块,以实现从简单的后视摄像头显示到 6DOF 多相机渲染的任何功能。它的接口通过 HIDL 呈现,并被编译为接受多个并发客户端。
+其他应用和服务(特别是汽车服务)可以查询 EVS 管理器状态,以了解 EVS 系统何时处于活动状态。</p>
+
+<h3 id="evs-hidl-interface">EVS HIDL 接口</h3>
+
+<p>在 EVS 系统中,相机和显示元素均在 <code>android.hardware.automotive.evs</code> 程序包中进行定义。用于实践接口的示例实现(生成合成测试图像并验证图像进行往返的过程)在 <code>/hardware/interfaces/automotive/evs/1.0/default</code> 中进行提供。</p>
+
+<p>原始设备制造商 (OEM) 负责实现由 <code>/hardware/interfaces/automotive/evs</code> 中的 .hal 文件表示的 API。这种实现负责从物理相机配置和收集数据,并通过 Gralloc 可识别的共享内存缓冲区传送这些数据。实现的显示端负责提供可由应用填充(通常通过 EGL 渲染的方式)的共享内存缓冲区,并优先呈现已完成的帧(在任何可能会显示在物理显示设备上的其他内容之前)。EVS 接口的供应商实现可以存储在 <code>/vendor/… /device/…</code> 或 <code>hardware/…</code>(例如 <code>/hardware/[vendor]/[platform]/evs</code>)下。</p>
+
+<h3 id="kernel-drivers">内核驱动程序</h3>
+
+<p>支持 EVS 堆栈的设备需要使用内核驱动程序。原始设备制造商 (OEM) 无需创建新驱动程序,他们可以选择通过现有相机和/或显示硬件驱动程序来支持 EVS 所需的功能。重复使用驱动程序可能会有好处,对于图像呈现可能需要与其他活动线程协调的显示驱动程序来说尤其如此。Android 8.0 包含一个基于 v4l2 的示例驱动程序(在 <code>packages/services/Car/evs/sampleDriver</code> 中),该驱动程序依靠内核实现 v4l2 支持,并依靠 SurfaceFlinger 呈现输出图像。</p>
+
+<aside class="note"><strong>注意</strong>:对于实际的供应商实现来说,依靠 SurfaceFlinger 是不合适的,因为 EVS 必须能够在开机后的几秒钟内运行,这个时间要远早于 SurfaceFlinger 本身启动的时间。
+不过,示例驱动程序实现一般与硬件无关,而且支持 EVS 应用开发和测试与 EVS 驱动程序开发同时进行。</aside>
+
+<h2 id="evs-hardware-interface-description">EVS 硬件接口说明</h2>
+
+<p>本部分介绍 HAL。供应商应该会提供该 API 的实现(已针对其硬件进行调整)。</p>
+
+<h3 id="ievsenumerator">IEvsEnumerator</h3>
+
+<p>该对象负责枚举系统中可用的 EVS 硬件(一个或多个相机和单个显示设备)。</p>
+
+<pre class="prettyprint">
+getCameraList() generates (vec&lt;CameraDesc&gt; cameras);
+</pre>
+
+<p>返回包含系统中所有相机的说明的矢量。假设相机组是固定的且在启动时是可知的。有关相机说明的详细信息,请参阅 <code><a href="#cameradesc">CameraDesc</a></code>。</p>
+
+<pre class="prettyprint">
+openCamera(string camera_id) generates (IEvsCamera camera);
+</pre>
+
+<p>获取用于与唯一 camera_id 字符串所标识的特定相机进行交互的接口对象。<em></em>失败时返回 NULL。
+尝试重新打开已打开的相机不会失败。为了避免出现与应用启动和关闭相关的争用状况,重新打开相机应该会关闭上一个实例,以满足新的请求。以这种方式被优先占用的相机实例必须置于非活动状态,等待最终销毁并响应任何请求以利用返回代码 <code>OWNERSHIP_LOST</code> 影响相机状态。</p>
+
+<pre class="prettyprint">
+closeCamera(IEvsCamera camera);
+</pre>
+
+<p>释放 IEvsCamera 接口(与 <code>openCamera()</code> 调用相反)。如果数据流尚未停止,此调用将自动停止数据流。</p>
+
+<pre class="prettyprint">
+openDisplay() generates (IEvsDisplay display);
+</pre>
+
+<p>获取用于专门与系统的 EVS 显示进行交互的接口对象。目前只有一个客户端可以持有 IEvsDisplay 的函数实例。与 <code>openCamera</code> 中描述的激进式打开行为相似,您可以随时创建一个新的 IEvsDisplay 对象,并停用任何先前的实例。无效的实例会继续存在并响应来自其所有者的函数调用,但不得在终止后执行任何变相的操作。最终,客户端应用应注意到 <code>OWNERSHIP_LOST</code> 错误返回代码,并关闭和释放终止的接口。</p>
+
+<pre class="prettyprint">
+closeDisplay(IEvsDisplay display);
+</pre>
+
+<p>释放 IEvsDisplay 接口(与 <code>openDisplay()</code> 调用相反)。通过 <code>getTargetBuffer()</code> 调用接收的未完成缓冲区必须在显示关闭之前返回到显示。</p>
+
+<pre class="prettyprint">
+getDisplayState() generates (DisplayState state);
+</pre>
+
+<p>获取当前的显示状态。HAL 实现应报告实际的当前状态,该状态可能与最近请求的状态不同。负责更改显示状态的逻辑应存在于设备层之上,从而使 HAL 实现无需自发更改显示状态。如果该显示目前未被任何客户端持有(通过调用 openDisplay),则此函数会返回 <code>NOT_OPEN</code>。否则,它会报告 EVS 显示的当前状态(请参阅 <a href="#ievsdisplay">IEvsDisplay API</a>)。</p>
+
+<a name="cameradesc"></a>
+<pre class="prettyprint">
+struct CameraDesc {
+    string      camera_id;
+    int32       vendor_flags;       // Opaque value
+}
+</pre>
+
+<ul>
+<li><code>camera_id</code>。用于唯一标识指定相机的字符串。
+该字符串可以是设备的内核设备名称,也可以是设备的名称,例如 rearview<em></em>。该字符串的值由 HAL 实现选择,并由上面的堆栈以不透明的方式使用。</li>
+<li><code>vendor_flags</code>。用于以不透明的方式将特殊相机信息从驱动程序传送到自定义 EVS 应用的一种方法。这些信息未经解释即从驱动程序向上直通到 EVS 应用,可直接将其忽略。</li>
+</ul>
+
+<h3 id="ievscamera">IEvsCamera</h3>
+
+<p>该对象表示单个相机,是用于捕获图像的主要接口。</p>
+
+<pre class="prettyprint">
+getId() generates (hidl_string cameraId);
+</pre>
+
+<p>返回此相机的字符串 ID。该值必须与 <code>EvsEnumerator::getCameraList()</code> 在 <code>CameraDesc</code> 结构的 <code>camera_id</code> 字段中报告的值相同。</p>
+
+<pre class="prettyprint">
+setMaxFramesInFlight(int32 bufferCount) generates (EvsResult result);
+</pre>
+
+<p>指定要求相机支持的缓冲区链的深度。IEvsCamera 的客户端可以同时持有数量如此多的帧。如果数量如此多的帧已传送到接收器但 <code>doneWithFrame</code> 未将其返回,则数据流会跳过帧,直到返回缓冲区以供重新使用。该调用在任何时候返回都是合法的,即使数据流已在运行(这种情况下,应相应地在链中添加或移除缓冲区)。如果未对此入口点进行任何调用,则 IEvsCamera 默认支持至少一个帧(更多的帧也可以接受)。</p>
+
+<p>如果无法容纳请求的 bufferCount,该函数会返回 <code>BUFFER_NOT_AVAILABLE</code> 或其他相关的错误代码。在这种情况下,系统将继续使用先前设置的值运行。</p>
+
+<pre class="prettyprint">
+startVideoStream(IEvsCameraStream receiver) generates (EvsResult result);
+</pre>
+
+<p>请求从此相机传送 EVS 相机帧。IEvsCameraStream 开始接收带有新图像帧的定期调用,直到调用 <code>stopVideoStream()</code> 为止。必须在调用 <code>startVideoStream</code> 后的 500 毫秒内开始传送帧,而且开始后,必须至少以 10 FPS 的速率生成帧。实际上,启动视频流所需的时间需要根据任何后视摄像头启动时间要求进行计算。如果未启动视频流,则必须返回错误代码;否则,则返回 OK。
+</p>
+
+<pre class="prettyprint">
+doneWithFrame(BufferDesc buffer) generates (EvsResult result);
+</pre>
+
+<p>返回传送到 IEvsCameraStream 的帧。传送到 IEvsCameraStream 接口的帧用完以后,必须被返回到 IEvsCamera 以供重新使用。只有极少的数量有限(最少可能只有一个)的缓冲区可供使用;如果供应的缓冲区耗尽,则在返回缓冲区之前不再传送任何帧,这可能会导致产生跳过的帧(具有空句柄的缓冲区表示数据流结束,无需通过此函数返回)。成功时返回 OK,否则返回相应错误代码(可能包括 <code>INVALID_ARG</code> 或 <code>BUFFER_NOT_AVAILABLE</code>)。</p>
+
+<pre class="prettyprint">
+stopVideoStream();
+</pre>
+
+<p>停止传送 EVS 相机帧。由于传送是异步的,在此调用返回后的一段时间内,系统可能会继续传送帧。在将数据流关闭信号发送到 IEvsCameraStream 之前,所有帧均必须返回。对已停止或从未启动的数据流调用 <code>stopVideoStream</code> 是合法的,在这种情况下,系统会忽略该调用。
+</p>
+
+<pre class="prettyprint">
+getExtendedInfo(int32 opaqueIdentifier) generates (int32 value);
+</pre>
+
+<p>从 HAL 实现中请求特定于驱动程序的信息。允许用于 <code>opaqueIdentifier</code> 的值是特定于驱动程序的,但传送任何值都不会使驱动程序崩溃。对于任何无法识别的 <code>opaqueIdentifier</code>,驱动程序应返回 0。</p>
+
+<pre class="prettyprint">
+setExtendedInfo(int32 opaqueIdentifier, int32 opaqueValue) generates (EvsResult result);
+</pre>
+
+<p>将特定于驱动程序的值发送到 HAL 实现。提供这项扩展的目的只是为了便于实现特定于车辆的扩展,而且任何 HAL 实现均不得要求该调用在默认状态下运行。如果驱动程序识别出并接受值,则应返回 OK;否则应返回 <code>INVALID_ARG</code> 或其他有代表性的错误代码。
+</p>
+
+<pre class="prettyprint">
+struct BufferDesc {
+    uint32  width;      // Units of pixels
+    uint32  height;     // Units of pixels
+    uint32  stride;     // Units of pixels
+    uint32  pixelSize;  // Size of single pixel in bytes
+    uint32  format;     // May contain values from android_pixel_format_t
+    uint32  usage;      // May contain values from Gralloc.h
+    uint32  bufferId;   // Opaque value
+    handle  memHandle;  // gralloc memory buffer handle
+}
+</pre>
+
+<p>描述通过 API 传送的图像。HAL 驱动程序负责填写此结构以描述图像缓冲区,而且 HAL 客户端应将此结构视为只读。这些字段包含足够的信息供客户端重建 <code>ANativeWindowBuffer</code> 对象,因为可能需要通过 <code>eglCreateImageKHR()</code> 扩展才能将图像与 EGL 结合使用。</p>
+
+<ul>
+<li><code>width</code>。所呈现图像的宽度(以像素为单位)。</li>
+<li><code>height</code>。所呈现图像的高度(以像素为单位)。</li>
+<li><code>stride</code>。每行在存储设备中实际占用的像素数;用来计算行对齐的任何内边距。以像素表示,用于匹配 gralloc 为其缓冲区说明采用的惯例。</li>
+<li><code>pixelSize</code>。由每个单独的像素占据的字节数;用于计算在图像中分隔开各个行所需的字节大小(以字节为单位的 <code>stride</code> = 以像素为单位的 <code>stride</code> × <code>pixelSize</code>)。</li>
+<li><code>format</code>。图像使用的像素格式。提供的格式必须与平台的 OpenGL 实现相兼容。要通过兼容性测试,<code>HAL_PIXEL_FORMAT_YCRCB_420_SP</code> 应优先用于相机,<code>RGBA</code> 应优先用于显示。</li>
+<li><code>usage</code>。由 HAL 实现设置的使用标记。HAL 客户端应原封不动地传送这些标记(有关详细信息,请参阅 <code>Gralloc.h</code> 相关标记)。</li>
+<li><code>bufferId</code>。由 HAL 实现指定的唯一值,用于在通过 HAL API 进行往返之后识别缓冲区。存储在该字段中的值可由 HAL 实现任意选择。
+</li><li><code>memHandle</code>。包含图像数据的底层内存缓冲区的句柄。HAL 实现可能会选择在此处存储 Gralloc 缓冲区句柄。</li>
+</ul>
+
+<h3 id="ievscamerastream">IEvsCameraStream</h3>
+
+<p>客户端实现此接口以接收异步传送的视频帧。</p>
+
+<pre class="prettyprint">
+deliverFrame(BufferDesc buffer);
+</pre>
+
+<p>每次视频帧准备好进行检查时,都从 HAL 接收调用。
+通过此方法接收的缓冲区句柄必须通过调用 <code>IEvsCamera::doneWithFrame()</code> 来返回。当视频流通过调用 <code>IEvsCamera::stopVideoStream()</code> 停止时,此回调可能会像下水道排水一样持续一段时间。每个帧仍必须返回;当传送完流数据流中的最后一帧后,系统将传送一个 NULL bufferHandle,这表示数据流结束,不会再发生进一步的帧传递。NULL bufferHandle 本身不需要通过 <code>doneWithFrame()</code> 发回,但是必须返回所有其他句柄</p>
+
+<p>尽管专用缓冲区格式在技术上是可行的,但兼容性测试要求缓冲区采用以下四种受支持的格式之一:NV21 (YCrCb 4:2:0 Semi-Planar)、YV12 (YCrCb 4:2:0 Planar)、YUYV (YCrCb 4:2:2 Interleaved)、RGBA(32 位 R:G:B:x)。所选格式必须是平台的 GLES 实现上的有效 GL 纹理源。</p>
+
+<p>应用<strong>不</strong>得依赖 <code>bufferId</code> 字段与 <code>memHandle</code> 结构中的 <code>BufferDesc</code> 之间的对应关系。一般来说,<code>bufferId</code> 值对于 HAL 驱动程序实现是私有的,该实现可以在适当的情况下使用(和重新使用)这些值。</p>
+
+<h3 id="ievsdisplay">IEvsDisplay</h3>
+
+<p>该对象可表示 EVS 显示,控制显示状态,并处理图像的实际呈现效果。</p>
+
+<pre class="prettyprint">
+getDisplayInfo() generates (DisplayDesc info);
+</pre>
+
+<p>返回关于系统提供的 EVS 显示的基本信息(请参阅 <a href="#displaydesc">DisplayDesc</a>)。</p>
+
+<pre class="prettyprint">
+setDisplayState(DisplayState state) generates (EvsResult result);
+</pre>
+
+<p>设置显示状态。客户端可以将显示状态设置为所需的状态,而且不论目前处于何种状态,HAL 实现都必须无条件接受更改为另一种状态的请求,尽管响应可能会忽略该请求。</p>
+
+<p>在初始化后,显示会被定义为以 <code>NOT_VISIBLE</code> 状态开始,之后,客户端应请求 <code>VISIBLE_ON_NEXT_FRAME</code> 状态并开始提供视频。当不再需要显示时,客户端应在传送最后一个视频帧后请求 <code>NOT_VISIBLE</code> 状态。</p>
+
+<p>任何时候都可以请求任何状态。如果显示已处于可见状态,那么设置为 <code>VISIBLE_ON_NEXT_FRAME</code> 后,显示应保持可见状态。系统将一律返回 OK,除非请求的状态是无法识别的枚举值(在这种情况下会返回 <code>INVALID_ARG</code>)。</p>
+
+<pre class="prettyprint">
+getDisplayState() generates (DisplayState state);
+</pre>
+
+<p>获取显示状态。HAL 实现应报告实际的当前状态,这可能与最近请求的状态不同。负责更改显示状态的逻辑应该存在于设备层之上,从而使 HAL 实现无需自发更改显示状态。</p>
+
+<pre class="prettyprint">
+getTargetBuffer() generates (handle bufferHandle);
+</pre>
+
+<p>将句柄返回到与显示相关联的帧缓冲区。该缓冲区可能会被软件和/或 GL 锁定和写入。此缓冲区必须通过调用 <code>returnTargetBufferForDisplay()</code> 来返回(即使显示已不再处于可见状态)。</p>
+
+<p>尽管专用缓冲区格式在技术上是可行的,但兼容性测试要求缓冲区采用以下四种受支持的格式之一:NV21 (YCrCb 4:2:0 Semi-Planar)、YV12 (YCrCb 4:2:0 Planar)、YUYV (YCrCb 4:2:2 Interleaved)、RGBA(32 位 R:G:B:x)。所选格式必须是平台的 GLES 实现上的有效 GL 渲染目标。</p>
+
+<p>在出现错误时,系统会返回一个带有空句柄的缓冲区,但这种缓冲区不需要传送回 <code>returnTargetBufferForDisplay</code>。</p>
+
+<pre class="prettyprint">
+returnTargetBufferForDisplay(handle bufferHandle) generates (EvsResult result);
+</pre>
+
+<p>向显示指明缓冲区已可供显示。只有通过调用 <code>getTargetBuffer()</code> 而检索的缓冲区才能用于此调用,而且 <code>BufferDesc</code> 的内容不能由客户端应用进行修改。在此调用后,缓冲区不再可供客户端使用。系统会在成功时返回 OK,否则会返回相应错误代码(可能包括 <code>INVALID_ARG</code> 或 <code>BUFFER_NOT_AVAILABLE</code>)。</p>
+
+<a name="displaydesc"></a>
+<pre class="prettyprint">
+struct DisplayDesc {
+     string  display_id;
+     int32   vendor_flags;  // Opaque value
+}
+</pre>
+
+<p>该函数描述 EVS 显示的基本属性,并且 EVS 实现需要该函数。HAL 负责填写此结构以描述 EVS 显示。这种显示可以是物理显示,也可以是与其他演示设备重叠或混合的虚拟显示。</p>
+
+<ul>
+<li><code>display_id</code>。唯一标识显示的字符串。
+该字符串可以是设备的内核设备名称,也可以是设备的名称,例如“rearview”。该字符串的值由 HAL 实现进行选择,并由上面的堆栈以不透明的方式使用。</li>
+<li><code>vendor_flags</code>。用于以不透明的方式将特殊相机信息从驱动程序传送到自定义 EVS 应用的一种方法。这些信息未经解释即从驱动程序向上直通到 EVS 应用,可直接将其忽略。</li>
+</ul>
+
+<pre class="prettyprint">
+enum DisplayState : uint32 {
+    NOT_OPEN,               // Display has not been “opened” yet
+    NOT_VISIBLE,            // Display is inhibited
+    VISIBLE_ON_NEXT_FRAME,  // Will become visible with next frame
+    VISIBLE,                // Display is currently active
+    DEAD,                   // Display is not available. Interface should be closed
+}
+</pre>
+
+<p>用于描述 EVS 显示的状态,这种状态可以是“已停用”(对驱动程序不可见),也可以是“已启用”(向驱动程序显示图像)<em></em><em></em>。
+它包括一个过渡状态;在该状态下,显示尽管还处于不可见状态,但已准备好通过 <code>returnTargetBufferForDisplay()</code> 调用传送下一帧图像,从而变为可见状态。</p>
+
+<h2 id="evs-manager">EVS 管理器</h2>
+<p>EVS 管理器提供 EVS 系统的公共接口,用于收集和呈现外部相机视图。在硬件驱动程序针对每个资源(相机或显示设备)仅允许支持一个活动接口的情况下,EVS 管理器可为对相机进行共享访问提供便利。单个主要 EVS 应用是 EVS 管理器的第一个客户端,并且是有权写入显示数据的唯一客户端(其他客户端可获得对相机图像的只读访问权限)。</p>
+
+<p>EVS 管理器实现与底层 HAL 驱动程序相同的 API,并通过支持多个并发客户端来提供扩展服务(多个客户端可以通过 EVS 管理器打开相机并接收视频流)。</p>
+
+<figure id="evs-manager">
+<img src="/devices/automotive/images/vhal_evs_manager.png" alt="EVS 管理器和 EVS 硬件 API 图。"/>
+<figcaption><strong>图 2.</strong> EVS 管理器镜像底层 EVS 硬件 API</figcaption>
+</figure>
+
+<p>除非 EVS 管理器 API 允许对相机数据流进行并发访问,否则通过 EVS 硬件 HAL 实现操作还是通过 EVS 管理器 API 操作,对应用而言将不会有任何差异。EVS 管理器本身就是 EVS 硬件 HAL 层允许的客户端,并且充当 EVS 硬件 HAL 的代理。</p>
+
+<p>以下部分仅介绍在 EVS 管理器实现中具有不同(扩展)行为的调用,其余调用与 EVS HAL 说明中介绍的相同。</p>
+
+<h3 id="ievsenumerator">IEvsEnumerator</h3>
+
+<pre class="prettyprint">
+openCamera(string camera_id) generates (IEvsCamera camera);
+</pre>
+
+<p>获取用于与唯一 camera_id 字符串所标识的特定相机进行交互的接口对象。<em></em>失败时返回 NULL。
+在 EVS 管理器层,只要有足够的系统资源可用,已经打开的相机便可由另一进程再次打开,从而允许将视频流传送到多个消费者应用。EVS 管理器层上的 <code>camera_id</code> 字符串与向 EVS 硬件层报告的字符串相同。</p>
+
+<h3 id="ievscamera">IEvsCamera</h3>
+
+<p>EVS 管理器提供的 IEvsCamera 实现在内部虚拟化,以便一个客户端在相机上进行的操作不会影响其他客户端,从而使客户端保持对其相机的独立访问。</p>
+
+<pre class="prettyprint">
+startVideoStream(IEvsCameraStream receiver) generates (EvsResult result);
+</pre>
+
+<p>启动视频流。多个客户端可以相互独立地在同一底层相机上启动和停止视频流。底层相机在第一个客户端启动时启动。</p>
+
+<pre class="prettyprint">
+doneWithFrame(uint32 frameId, handle bufferHandle) generates (EvsResult result);
+</pre>
+
+<p>返回帧。每个客户端必须在帧完成后返回帧,但是可以根据需要将帧持有任意长的时间。当客户端持有的帧数达到其配置的上限时,将不会再接收到任何帧,直到它返回一个帧。此次跳帧不会影响其他客户端,这些客户端可以继续接收预期要接收的所有帧。</p>
+
+<pre class="prettyprint">
+stopVideoStream();
+</pre>
+
+<p>停止视频流。每个客户端都可以随时停止其视频流,而不会影响其他客户端。当给定相机的最后一个客户端停止其数据流时,硬件层的底层相机数据流将停止。</p>
+
+<pre class="prettyprint">
+setExtendedInfo(int32 opaqueIdentifier, int32 opaqueValue) generates (EvsResult result);
+</pre>
+
+<p>发送特定于驱动程序的值,这可能会使一个客户端影响另一个客户端。由于 EVS 管理器无法理解供应商定义的控制字的含义,因此控制字不会被虚拟化,而且任何副作用都会殃及给定相机的所有客户端。例如,如果某个供应商使用此调用来更改帧速率,则受影响的硬件层相机的所有客户端都将以新的速率接收帧。</p>
+
+<h3 id="ievsdisplay">IEvsDisplay</h3>
+
+<p>显示仅允许有一个所有者,即使在 EVS 管理器层面也是如此。管理器不添加任何功能,只是将 IEvsDisplay 接口直接传送给底层 HAL 实现。</p>
+
+<h2 id="evs-application">EVS 应用</h2>
+
+<p>Android 8.0 包含与 EVS 管理器和车载 HAL 通信的 EVS 应用的原生 C++ 参考实现,以提供基本的后视摄像头功能。该应用应在系统启动过程的早期启动,根据可用的相机和汽车状态(车轮和转向信号状态)显示合适的视频。
+原始设备制造商 (OEM) 可以使用自己的特定于车辆的逻辑和呈现来修改或替换 EVS 应用。</p>
+
+<img src="/devices/automotive/images/vhal_evs_get_camera.png"/>
+<figcaption><strong>图 3.</strong> EVS 应用逻辑样本,获取相机列表。</figcaption>
+<br />
+<br />
+<img src="/devices/automotive/images/vhal_evs_receive_frame.png"/>
+<figcaption><strong>图 4.</strong> EVS 应用逻辑样本,接收帧回调。</figcaption>
+
+<p>由于图像数据通过标准图形缓冲区呈现给应用,因此应用负责将图像从源缓冲区移动到输出缓冲区。尽管这会产生复制数据的成本,但也为应用以任何所需的方式将图像呈现到显示缓冲区提供了机会。</p>
+
+<p>例如,应用可以选择移动像素数据本身,从而可以进行内嵌缩放或旋转操作。应用还可以选择使用源图像作为 OpenGL 纹理,并将复杂场景呈现给输出缓冲区,包括虚拟元素(如图标、准则和动画)。更复杂的应用还可以选择多个并发输入相机并将它们合并到单个输出帧中(例如用于从上到下地显示车辆周围环境的虚拟视图)。</p>
+
+<h2 id="beyond-android-o">Android 8.0 之外</h2>
+
+<p>Android 8.0 支持基本后视摄像头应用,但 Google 发现了几种可能成为 EVS 堆栈未来扩展基础的用例。</p>
+
+<aside class="note"><strong>注意</strong>:Google 保留随时更改版本功能的权利。</aside>
+
+<ul>
+<li><strong>环绕视图</strong>。为了解决车辆的车身周围有多个相机时的用例,Google 正在考虑增强 EVS 应用,将来自多个并发相机的视频转换成适合狭小空间操作(例如在狭窄的空间中停车)的 3D 演示。</li>
+<li><strong>用户输入</strong>。在 Android 8.0 中,应用负责从内核设备获取和解析输入事件。通过与 dev/event# 内核设备进行互动,可以在启动周期早期读取用户输入,并且从这些流读取事件不会影响 Android InputFlinger 监测这些相同输入流的能力。为了解决输入事件的用例,Google 正在考虑采用支持单触摸事件的简单 EVS 接口。</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/automotive/index.html b/zh-cn/devices/automotive/index.html
index 7d550cf..b68d912 100644
--- a/zh-cn/devices/automotive/index.html
+++ b/zh-cn/devices/automotive/index.html
@@ -22,10 +22,10 @@
 
 <img style="float: right; margin: 0px 15px 15px 15px;" src="../images/ape_fwk_hal_vehicle.png" alt="Android 车载 HAL 图标"/>
 
-<p>借助各种总线拓扑,很多汽车子系统都可以实现互连以及与车载信息娱乐 (IVI) 系统的连接。根据制造商不同,所提供的确切总线类型和协议也有很大差异(甚至同一品牌的不同车型之间也是如此);示例包括控制器区域网络 (CAN) 总线、本地互联网络 (LIN) 总线、媒体导向系统传输 (MOST) 总线以及汽车级以太网和 TCP/IP 网络(例如 BroadR-Reach)。
+<p>借助各种总线拓扑,很多汽车子系统都可以实现互连以及与车载信息娱乐 (IVI) 系统的连接。不同的制造商提供的确切总线类型和协议之间有很大差异(甚至同一品牌的不同车型之间也是如此),例如控制器区域网络 (CAN) 总线、局域互联网络 (LIN) 总线、面向媒体的系统传输 (MOST) 总线以及汽车级以太网和 TCP/IP 网络(如 BroadR-Reach)。
 </p>
-<p>Android Automotive 的硬件抽象层 (HAL) 为 Android 框架提供了一致的接口(无需考虑物理传输层)。此车载 HAL 是用于开发 Android Automotive 实现的接口。</p>
-<p>系统集成人员可以将特定于功能的平台 HAL 接口(如 HVAC)与特定于技术的网络接口(如 CAN 总线)连接,以实现车载 HAL 模块。典型的实现可能包括运行专有实时操作系统 (RTOS) 的专用微控制器单元(MCU,用于 CAN 总线访问或类似操作),该微控制器单元可通过串行链路连接到运行 Android Automotive 的 CPU。除了专用的 MCU,您还可以将总线访问作为虚拟 CPU 来实现。只要实现符合车载 HAL 的接口要求,每个合作伙伴都可以选择适合硬件的架构。</p>
+<p>Android Automotive 的硬件抽象层 (HAL) 为 Android 框架提供了一致的接口(无需考虑物理传输层)。此车载 HAL 是开发 Android Automotive 实现的接口。</p>
+<p>系统集成商可以将特定于功能的平台 HAL 接口(如 HVAC)与特定于技术的网络接口(如 CAN 总线)连接,以实现车载 HAL 模块。典型的实现可能包括运行专有实时操作系统 (RTOS) 的专用微控制器单元 (MCU),以用于 CAN 总线访问或类似操作,该微控制器单元可通过串行链路连接到运行 Android Automotive 的 CPU。除了专用的 MCU,还可以将总线访问作为虚拟 CPU 来实现。只要实现符合车载 HAL 的接口要求,每个合作伙伴都可以选择适合硬件的架构。</p>
 
 <h2 id="arch">架构</h2>
 <p>车载 HAL 是汽车与车辆网络服务之间的接口定义:</p>
@@ -34,9 +34,9 @@
 <p class="img-caption"><strong>图 1</strong>. 车载 HAL 与 Android Automotive 架构</p>
 
 <ul>
-<li><strong>Car API</strong>:包含 CarHvacManager、CarSensorManager 和 CarCameraManager 等 API。如需详细了解受支持的 API,请参阅 <code>/platform/packages/services/Car/car-lib</code>。</li>
+<li><strong>Car API</strong>:包含 CarHvacManager 和 CarSensorManager 等 API。如需详细了解受支持的 API,请参阅 <code>/platform/packages/services/Car/car-lib</code>。</li>
 <li><strong>CarService</strong>:位于 <code>/platform/packages/services/Car/</code>。</li>
-<li><strong>VehicleNetworkService</strong>:通过内置安全机制来控制车载 HAL。仅限系统组件使用(第三方应用等非系统组件应使用汽车 API)。原始设备制造商 (OEM) 可以通过 <code>vns_policy.xml</code> 和 <code>vendor_vns_policy.xml</code> 控制访问权限。位于 <code>/platform/packages/services/Car/vehicle_network_service/</code>;要查看用于访问车辆网络的库,请参阅 <code>/platform/packages/services/Car/libvehiclenetwork/</code>。</li>
+<li><strong>VehicleNetworkService</strong>:通过内置安全机制控制车载 HAL。仅限访问系统组件(第三方应用等非系统组件需使用 Car API)。原始设备制造商 (OEM) 可以通过 <code>vns_policy.xml</code> 和 <code>vendor_vns_policy.xml</code> 控制访问权限。位于 <code>/platform/packages/services/Car/vehicle_network_service/</code>;要查看用于访问车辆网络的库,请参阅 <code>/platform/packages/services/Car/libvehiclenetwork/</code>。</li>
 <li><strong>车载 HAL</strong>:定义 OEM 可以实现的车辆属性的接口。包含属性元数据(例如,车辆属性是否为 int 以及允许使用哪些更改模式)。位于 <code>hardware/libhardware/include/hardware/vehicle.h</code>。要了解基本参考实现的相关信息,请参阅 <code>hardware/libhardware/modules/vehicle/</code>。</li>
 </ul>
 <p>有关更多详情,请参阅<a href="/devices/automotive/properties.html">车辆属性</a>。
@@ -45,10 +45,10 @@
 <p>车载 HAL 支持 3 个级别的数据访问安全性:</p>
 <ul>
 <li>仅限系统(由 <code>vns_policy.xml</code> 控制)</li>
-<li>允许拥有权限的应用进行访问(通过汽车服务)</li>
+<li>允许拥有权限的应用访问(通过汽车服务)</li>
 <li>无需任何权限即可访问(通过汽车服务)</li>
 </ul>
-<p>仅允许部分系统组件直接访问车辆属性,而车辆网络服务是把关程序。大多数应用都需要通过汽车服务的额外把关(例如,只有系统应用可以控制 HVAC,因为系统权限只能授予系统应用)。</p>
+<p>仅允许部分系统组件直接访问车辆属性,而车辆网络服务是把关程序。大多数应用需通过汽车服务的额外把关(例如,只有系统应用可以控制 HVAC,因为这需要仅授予系统应用的系统权限)。</p>
 
 <h2 id="validation">验证</h2>
 <p>AOSP 包含开发过程中使用的以下测试资源:</p>
diff --git a/zh-cn/devices/automotive/properties.html b/zh-cn/devices/automotive/properties.html
index 7480ba8..0a9e203 100644
--- a/zh-cn/devices/automotive/properties.html
+++ b/zh-cn/devices/automotive/properties.html
@@ -36,7 +36,7 @@
 <li><code>(*subscribe)(..., int32_t prop, float sample_rate, int32_t
 zones)</code>
 <ul>
-<li>开始监视属性值的变化。对于区域属性,订阅适用于请求的区域。“zones = 0”用于请求所有受支持的区域。
+<li>开始监视属性值的变化。对于区域属性,订阅适用于请求的区域。Zones = 0 用于请求所有受支持的区域。
 </li>
 <li>车载 HAL 应该在属性值发生变化时(即 on-change 类型)或按一定间隔(即 continuous 类型)调用单独的回调。</li>
 </ul></li>
@@ -73,13 +73,13 @@
 <li><code>vehicle_window</code>
 <br />基于窗户的区域。</li>
 </ul>
-<p>每个区域属性都应使用预定义的区域类型。如有必要,您可以为每个属性都使用自定义区域类型(有关详情,请参阅<a href="#prop_custom">处理自定义属性</a>一节)。</p>
+<p>每个区域属性都应使用预定义的区域类型。如有必要,您可以为每个属性使用自定义区域类型(有关详情,请参阅<a href="#prop_custom">处理自定义属性</a>)。</p>
 
 <h2 id="prop_config">配置属性</h2>
-<p>请使用 <code>vehicle_prop_config_t</code> 为每个属性提供配置信息。具体信息包括:</p>
+<p>使用 <code>vehicle_prop_config_t</code> 为每个属性提供配置信息。具体信息包括:</p>
 <ul>
 <li><code>access</code>(r、w、rw)</li>
-<li><code>change_mode</code>(表示监视属性的方式:on-change 模式还是 continuous 模式)</li>
+<li><code>change_mode</code>(表示监视属性的方式:变化模式还是连续模式)</li>
 <li><code>min_value</code>(int32、float、int64)、<code>max_value</code>(int32、float、int64)</li>
 <li><code>min_sample_rate</code>、<code>max_sample_rate</code></li>
 <li><code>permission_model</code></li>
@@ -92,13 +92,13 @@
 <h2 id="zone_prop">处理区域属性</h2>
 <p>区域属性相当于多个属性的集合,其中每个子属性都可由指定的区域值访问。</p>
 <ul>
-<li>区域属性的 <code>get</code> 调用请求中始终包含区域,因此,只应返回所请求区域的当前值。</li>
-<li>区域属性的 <code>set</code> 调用请求中始终包含区域,因此,只应更改所请求的区域。</li>
-<li><code>subscribe</code> 调用包含所有已订阅区域的标记。不应报告来自未订阅区域的事件。</li>
+<li>区域属性的 <code>get</code> 调用始终包含请求中的区域,因此,只应返回所请求区域的当前值。</li>
+<li>区域属性的 <code>set</code> 调用始终包含请求中的区域,因此,只应更改所请求的区域。</li>
+<li><code>subscribe</code> 调用包括所有已订阅区域的标记。不应报告来自未订阅区域的事件。</li>
 </ul>
 
-<h3 id="get">get 调用</h3>
-<p>在初始化期间,由于尚未收到匹配的车辆网络消息,因此属性的值可能不可用。在这种情况下,<code>get</code> 调用应该返回 <code>-EAGAIN</code>。某些属性(如 HVAC)具有单独的电源开/关属性。关机时这种属性的 <code>get</code> 调用应返回特殊值 <code>(VEHICLE_INT_OUT_OF_RANGE_OFF/VEHICLE_FLOAT_OUT_OF_RANGE_OFF)</code>,而不是返回错误。</p>
+<h3 id="get">Get 调用</h3>
+<p>在初始化期间,由于尚未收到匹配的车辆网络消息,属性的值可能不可用。在这种情况下,<code>get</code> 调用应该返回 <code>-EAGAIN</code>。某些属性(如 HVAC)具有独立的电源开/关属性。这种属性的 <code>get</code> 的调用(关机时)应返回特殊值 <code>(VEHICLE_INT_OUT_OF_RANGE_OFF/VEHICLE_FLOAT_OUT_OF_RANGE_OFF)</code>,而不是返回错误。</p>
 <p>此外,某些属性(如 HVAC 温度)可以用某个值来表示其处于最大功率模式,而不是特定的温度值。在这种情况下,请使用特殊值表示这种状态。</p>
 <ul>
 <li>VEHICLE_INT_OUT_OF_RANGE_MAX/MIN</li>
@@ -106,30 +106,30 @@
 </ul>
 
 <p>示例:获取 HVAC 温度</p>
-<img src="../images/vehicle_hvac_get.png" alt="车载 HAL 获取 HVAC 的示例"/>
+<img src="../images/vehicle_hvac_get.png" alt="车载 HAL get 获取 HVAC 的示例"/>
 <p class="img-caption"><strong>图 1</strong>. 获取 HVAC 温度(CS = CarService、VNS = VehicleNetworkService、VHAL = 车载 HAL)</p>
 
-<h3 id="set">set 调用</h3>
-<p><code>set</code> 调用属于异步操作,涉及进行所请求更改之后的事件通知。在典型的操作中,<code>set</code> 调用会导致在车辆网络中发出更改请求。拥有该属性的电子控制单元 (ECU) 执行更改后,更新后的值会通过车辆网络返回,而车载 HAL 会将更新后的值作为事件发送给车辆网络服务 (VNS)。</p>
-<p>某些 <code>set</code> 调用可能要求准备好初始数据,而这些数据在初始化期间可能尚未提供。在这种情况下,<code>set</code> 调用应该返回 <code>-EAGAIN</code>。某些具有单独的电源开/关的属性应在电源关闭且无法设置时返回 <code>-ESHUTDOWN</code>。</p>
-<p>在 <code>set</code> 生效之前,<code>get</code> 不一定会返回所设置的值。不过,例外的是更改模式为 <code>VEHICLE_PROP_CHANGE_MODE_ON_SET.</code> 的属性。此类属性仅在被 Android 之外的外部组件(如 <code>VEHICLE_PROPERTY_UNIX_TIME</code> 等时钟属性)设置时才会通知更改。</p>
+<h3 id="set">Set 调用</h3>
+<p><code>set</code> 调用属于异步操作,涉及进行所请求更改之后的事件通知。在典型的操作中,<code>set</code> 调用会导致在车辆网络中发出更改请求。拥有该属性的电子控制单元 (ECU) 执行更改后,更新后的值通过车辆网络返回,而车载 HAL 会将更新后的值作为事件发送给车辆网络服务 (VNS)。</p>
+<p>某些 <code>set</code> 调用可能要求准备好初始数据,而这些数据在初始化期间可能尚不可用。在这种情况下,<code>set</code> 调用应该返回 <code>-EAGAIN</code>。某些具有独立的电源开/关的属性应在属性关闭且无法设置时返回 <code>-ESHUTDOWN</code>。</p>
+<p>在 <code>set</code> 生效之前,<code>get</code> 不一定会返回所设置的值。例外情况是更改模式为 <code>VEHICLE_PROP_CHANGE_MODE_ON_SET.</code> 的属性。此属性仅在被 Android 之外的外部组件(如 <code>VEHICLE_PROPERTY_UNIX_TIME</code> 等时钟属性)设置时才通知更改。</p>
 
 <p>示例:设置 HVAC 温度</p>
 <img src="../images/vehicle_hvac_set.png" alt="车载 HAL 设置 HVAC 的示例"/>
 <p class="img-caption"><strong>图 2</strong>. 设置 HVAC 温度(CD = CarService、VNS = VehicleNetworkService、VHAL = 车载 HAL)</p>
 
 <h2 id="prop_custom">处理自定义属性</h2>
-<p>为了满足合作伙伴的特定需求,车载 HAL 允许使用仅限于系统应用的自定义属性。在使用自定义属性时,请遵循以下指南:</p>
+<p>为了满足合作伙伴的特定需求,车载 HAL 允许使用针对系统应用的自定义属性。在使用自定义属性时,请遵循以下指南:</p>
 <ul>
-<li>键应该处于 [<code>VEHICLE_PROPERTY_CUSTOM_START,
-VEHICLE_PROPERTY_CUSTOM_END</code>] 范围内。其他范围已预留下来以供将来扩展;使用这些范围可能会导致在将来的 Android 版本中出现冲突。</li>
-<li>仅使用定义的 <code>value_type</code>。BYTES 类型允许传递原始数据,因此,在大多数情况下这就足够了。通过自定义属性频繁发送大数据可能会减缓整个车辆网络的访问速度,因此,在添加大量需要 HAL 处理的数据时要小心谨慎。</li>
-<li>将访问策略添加到 <code>vendor_vns_policy.xml</code>(否则所有访问都会被拒)。</li>
-<li>通过 <code>VendorExtensionManager</code>(适用于 Java 组件)或 Vehicle Network Service API(适用于原生代码)访问。请勿修改其他汽车 API,因为这样做可能会在将来导致兼容性问题。</li>
+<li>键值应该在 [<code>VEHICLE_PROPERTY_CUSTOM_START,
+VEHICLE_PROPERTY_CUSTOM_END</code>] 范围内。其他范围会预留以供将来的扩展功能使用;使用这种范围可能会导致将来的 Android 版本中出现冲突。</li>
+<li>仅使用定义的 <code>value_type</code>。BYTES 类型允许传递原始数据,因此,在大多数情况下是足够的。通过自定义属性频繁发送大数据可能会减缓整个车辆网络的访问速度,因此,在添加大量需要 HAL 处理的数据时要小心谨慎。</li>
+<li>将访问策略添加到 <code>vendor_vns_policy.xml</code>(否则所有访问都将被拒)。</li>
+<li>通过 <code>VendorExtensionManager</code>(适用于 Java 组件)或 Vehicle Network Service API(适用于本机)访问。请勿修改其他汽车 API,因为这样做可能会在将来导致兼容性问题。</li>
 </ul>
 
 <h2 id="prop_hvac">处理 HVAC 属性</h2>
-<p>您可以通过设置与 HVAC 相关的属性,来使用车载 HAL 控制 HVAC。大多数 HVAC 属性都是区域属性,但也有一些非区域(全局)属性。定义的示例属性包括:</p>
+<p>您可以使用车载 HAL 控制 HVAC,具体方法是设置与 HVAC 相关的属性。大多数 HVAC 属性都是区域属性,但也有一些非区域(全局)属性。定义的示例属性包括:</p>
 <ul>
 <li><code>VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET</code>
 <br />按区域设置温度。</li>
@@ -139,7 +139,7 @@
 <p>有关 HVAC 属性的完整列表,请在 <code>vehicle.h</code> 中搜索 <code>VEHICLE_PROPERTY_HVAC_*</code>。</p>
 
 <h2 id="prop_sensor">处理传感器属性</h2>
-<p>车载 HAL 传感器属性表示实际的传感器数据或策略信息,如驾驶状况。某些传感器信息(如驾驶状况和日间/夜间模式)不限制任何应用的访问,因为这些数据是构建安全车载应用所必需的。还有一些传感器信息(如车辆速度)更为敏感,需要用户可以管理的特定权限。</p>
+<p>车载 HAL 传感器属性表示真实的传感器数据或策略信息,如驾驶状态。某些传感器信息(如驾驶状态和日间/夜间模式)不限制任何应用的访问,因为这些数据是构建安全车载应用所必需的。其他传感器信息(如车辆速度)更为敏感,需要用户可以管理的特定权限。</p>
 <p>支持的传感器属性包括:</p>
 <ul>
 <li><code>DRIVING_STATUS</code>
@@ -159,4 +159,15 @@
 <br />油位是否较低(布尔值)。</li>
 </ul>
 
+<h2 id="vms">车载地图服务 (VMS)</h2>
+
+<p>Android 8.1 引入了对车载地图服务 (VMS) 的支持,这是一种仅用于 Android Automotive 实现的新车辆属性。
+VMS 可用于支持常见车辆功能(例如高级驾驶辅助系统 (<a href="https://en.wikipedia.org/wiki/Advanced_driver-assistance_systems" class="external">ADAS</a>))的内置车载地图服务。
+
+</p><aside class="note"><strong>注意</strong>:有关 Automotive 兼容性要求的详细信息,请参阅 <a href="https://source.android.com/compatibility/android-cdd#2_5_automotive_requirements">Automotive 要求</a>。</aside>
+
+<p>VMS 属性是一种复杂的数据类型,它可以表示在 Android Automotive 实现与负责管理车载地图数据的底层车辆硬件之间交换的地图数据。</p>
+
+<p>AOSP 不包含 VMS 的默认实现,它目前只以属性和相关枚举的形式存在。<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/automotive/vehicle/2.0/types.hal#3216">VMSMessageType</a> 枚举中的<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/automotive/vehicle/2.0/types.hal">车载 HAL 2.0</a> 中对消息类型和数据结构进行了说明,其中列出了受支持的 VMS 消息的类型。此枚举用作车辆属性整数数组中的第一个整数,并用于确定消息其余部分的解码方式。</p>
+
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/bluetooth/index.html b/zh-cn/devices/bluetooth/index.html
new file mode 100644
index 0000000..1c17b69
--- /dev/null
+++ b/zh-cn/devices/bluetooth/index.html
@@ -0,0 +1,135 @@
+<html devsite><head>
+    <title>蓝牙</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+    <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License"); you may
+      not use this file except in compliance with the License.  You may obtain a
+      copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+      WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+      License for the specific language governing permissions and limitations
+      under the License.
+    -->
+    <img style="float: right; margin: 0px 15px 15px 15px;" src="/devices/bluetooth/images/ape_fwk_hal_bluetooth.png" alt="Android 蓝牙 HAL 图标"/>
+
+    <p>
+Android 提供支持经典蓝牙和蓝牙低功耗的默认蓝牙堆栈。借助蓝牙,Android 设备可以创建个人区域网络,以便通过附近的蓝牙设备发送和接收数据。
+    </p>
+
+    <p>
+在 Android 4.3 及更高版本中,Android 蓝牙堆栈可提供实现蓝牙低功耗 (BLE) 的功能。要充分利用 BLE API,请遵循 <a href="/devices/bluetooth/hci_requirements.html">Android 蓝牙 HCI 要求</a>。具有合格芯片组的 Android 设备可以实现经典蓝牙或同时实现经典蓝牙和 BLE。BLE 不能向后兼容较旧版本的蓝牙芯片组。
+    </p>
+
+    <p>
+在 Android 8.0 中,原生蓝牙堆栈完全符合蓝牙 5 的要求。要使用可用的蓝牙 5 功能,该设备需要具有符合蓝牙 5 要求的芯片组。
+    </p>
+
+    <aside class="note"><strong>注意</strong>:Android 8.0 及以前版本之间的原生蓝牙堆栈的最大变化是使用<a href="/devices/architecture/treble.html">高音</a>。Android 8.0 中的供应商实现必须使用 HIDL 而不是 <code>libbt-vendor</code>。</aside>
+
+    <h2 id="architecture-android-80">Android 8.0 架构</h2>
+
+      <p>
+蓝牙应用通过 Binder 与蓝牙进程进行通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:
+      </p>
+
+      <img src="/devices/bluetooth/images/fluoride_architecture.png" alt="Android 8.0 蓝牙架构" id="figure1"/>
+      <p class="img-caption">
+      <strong>图 1</strong> Android 8.0 蓝牙架构
+      </p>
+
+      <dl>
+        <dt>应用框架</dt>
+        <dd>
+处于应用框架级别的是应用代码,它使用 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
+        </dd>
+
+        <dt>蓝牙系统服务</dt>
+        <dd>
+蓝牙系统服务(位于 <code>packages/apps/Bluetooth</code> 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。</dd>
+
+        <dt>JNI</dt>
+        <dd>
+与 android.bluetooth 相关联的 JNI 代码位于 <code>packages/apps/Bluetooth/jni</code> 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用蓝牙堆栈。
+        </dd>
+
+        <dt>蓝牙堆栈</dt>
+        <dd>
+系统在 AOSP 中提供了默认蓝牙堆栈,它位于 <code>system/bt</code> 中。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。
+        </dd>
+
+        <dt>供应商实现</dt>
+        <dd>
+供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈交互。
+        </dd>
+      </dl>
+
+      <h3 id="hidl">HIDL</h3>
+      <p>
+      <a href="/devices/architecture/hidl.html">HIDL</a> 定义了蓝牙堆栈和供应商实现之间的接口。要生成蓝牙 HIDL 文件,请将蓝牙接口文件传递到 HIDL 生成工具中。接口文件位于 <code>hardware/interfaces/bluetooth</code> 下。
+      </p>
+
+      <h3 id="bluetooth-stack-development">蓝牙堆栈开发</h3>
+      <p>
+Android 8.0 蓝牙堆栈是一个完全限定的蓝牙堆栈。限定列表位于蓝牙 SIG 网站上的 <a href="https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=35890">QDID 97584</a> 下。
+      </p>
+
+      <p>
+核心蓝牙堆栈位于 <code><a href="https://android.googlesource.com/platform/system/bt/+/master">
+          system/bt</a></code> 下。开发工作在 AOSP 中进行,欢迎贡献内容。
+      </p>
+
+    <h2 id="architecture-android-7x-and-earlier">Android 7.x 及更早版本的架构</h2>
+      <p>蓝牙系统服务通过 JNI 与蓝牙堆栈进行通信,并通过 Binder IPC 与应用通信。系统服务向开发者提供了对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:
+      </p>
+
+      <img src="/devices/bluetooth/images/ape_fwk_bluetooth.png" alt="Android 蓝牙架构" id="figure2"/>
+      <p class="img-caption">
+      <strong>图 2.</strong> Android 7.x 及更早版本的蓝牙架构
+      </p>
+
+      <dl>
+        <dt>应用框架</dt>
+        <dd>处于应用框架级别的是应用代码,它利用 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
+        </dd>
+
+        <dt>蓝牙系统服务</dt>
+        <dd>蓝牙系统服务(位于 <code>packages/apps/Bluetooth</code> 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。
+该应用通过 JNI 调用 HAL 层。
+        </dd>
+
+        <dt>JNI</dt>
+        <dd>与 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> 相关联的 JNI 代码位于 <code>packages/apps/Bluetooth/jni</code> 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用 HAL 层并从 HAL 接收回调。
+        </dd>
+
+        <dt>HAL</dt>
+        <dd>硬件抽象层定义了 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 和蓝牙进程会调用的标准接口,并且您必须实现该接口才能使蓝牙硬件正常工作。蓝牙 HAL 的头文件是 <code>hardware/libhardware/include/hardware/bluetooth.h</code>。
+另外,请查看所有 <code>hardware/libhardware/include/hardware/bt_*.h</code> 文件。
+        </dd>
+
+        <dt>蓝牙堆栈</dt>
+        <dd>系统为您提供了默认蓝牙堆栈(位于 <code>system/bt</code> 中)。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。
+        </dd>
+
+        <dt>供应商扩展程序</dt>
+        <dd>要添加自定义扩展程序和用于跟踪的 HCI 层,您可以创建一个 libbt-vendor 模块并指定这些组件。
+        </dd>
+
+      </dl>
+
+      <h3 id="implementing-the-hal">实现 HAL</h3>
+        <p>蓝牙 HAL 位于 <code>/hardware/libhardware/include/hardware/bluetooth.h</code> 中。
+<code>bluetooth.h</code> 文件包含蓝牙堆栈的基本接口,而且您必须实现其功能。</p>
+
+        <p>特定于配置文件的文件位于同一目录下。有关详情,请参阅 <a href="/reference/hal/dir_6b11132f1a015b03f2670f21bef1d871.html">HAL 文件参考</a>。
+        </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 dad51f1..c853230 100644
--- a/zh-cn/devices/camera/versioning.html
+++ b/zh-cn/devices/camera/versioning.html
@@ -119,7 +119,7 @@
 
 <ul>
 <li>HAL1 不受 cameraservice 移动的影响,并且<strong>不需要供应商更新</strong>。</li>
-<li><em></em>HAL3 会受到影响,但<strong>不需要供应商更新</strong>:<p><img src="images/ape_camera_n_api2_hal3.png" alt="HAL2 上 API2 中的 Android 7.0 相机和媒体堆栈" id="figure1"/></p>
+<li>HAL3 会受到影响,但<strong>不需要供应商更新</strong>:<em></em><p><img src="images/ape_camera_n_api2_hal3.png" alt="HAL2 上 API2 中的 Android 7.0 相机和媒体堆栈" id="figure1"/></p>
 <p class="img-caption"><strong>图 3. </strong>HAL3 上 API2 中的 Android 7.0 相机和媒体堆栈。</p>
 </li>
 </ul>
@@ -139,6 +139,56 @@
 <h2 id="version-history">Camera HAL 版本历史记录</h2>
 <p>有关可用于评估 Android Camera HAL 的测试列表,请参阅 <a href="/compatibility/cts/camera-hal.html">Camera HAL 测试核对清单</a>。</p>
 
+<h3 id="80">Android 8.0</h3>
+
+<p>
+Android 8.0 版本中包含针对相机服务的以下主要增强功能:
+</p>
+
+<ul>
+  <li>共享表面 - 可让多个表面共享同一个 <code>OutputConfiguration</code></li>
+  <li>适用于自定义相机模式的系统 API</li>
+  <li><code>onCaptureQueueEmpty</code></li>
+</ul>
+
+<p>
+有关这些功能的详细信息,请参阅以下部分。
+</p>
+
+<h4 id="shared-surfaces">共享表面</h4>
+
+<p>
+借助此功能,只需一组缓冲区就可以驱动两个输出(例如预览和视频编码),从而降低功耗和内存消耗。要支持此功能,设备制造商需要确保其相机 HAL 和 gralloc HAL 实现可以创建将由多个不同消耗方(而不是仅一个消耗方;例如 Hardware Composer/GPU 和视频编码器)使用的 gralloc 缓冲区。相机服务会将消耗方使用情况标记传递到相机 HAL 和 gralloc HAL;它们需要分配正确的缓冲区类型,或者相机 HAL 需要返回一个表明该消耗方组合不受支持的错误。
+</p>
+
+<p>
+有关其他详细信息,请参阅 <code><a href="https://developer.android.com/reference/android/hardware/camera2/params/OutputConfiguration.html#enableSurfaceSharing()">enableSurfaceSharing</a></code> 开发者文档。</p>
+
+<h4 id="system-api-for-custom-camera-modes">适用于自定义相机模式的系统 API</h4>
+
+<p>
+公共相机 API 定义了两种操作模式:正常模式和受限高速录制模式。这两种模式的语义截然不同;高速模式受限于一次最多只能有两个具体输出等。各个原始设备制造商 (OEM) 已表现出极大的兴趣想要针对特定于硬件的功能定义其他自定义模式。说白了,模式只是一个传递到 configure_streams 的整数。请参阅:<code>hardware/libhardware/+/master/include/hardware/camera3.h#1736</code>
+</p>
+
+<p>
+此功能包括一个系统 API 调用,OEM 相机应用可以使用该调用来启用自定义模式。这些自定义模式必须以整数值 0x8000 开头,以避免与未来添加到公共 API 的模式发生冲突。
+</p>
+
+<p>
+要支持这一功能,OEM 只需将相应的新模式添加到其 HAL 接口即可,传递至 HAL 的这一整数会在 configure_streams 上触发该模式,然后 OEM 就可以让其自定义相机应用使用系统 API 了。</p>
+
+<p>
+此方法的名称是 <code><a href="https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.StateCallback.html#onCaptureQueueEmpty(android.hardware.camera2.CameraCaptureSession)">android.hardware.camera2.CameraDevice#createCustomCaptureSession</a></code>。
+请参阅:<code>frameworks/base/core/java/android/hardware/camera2/CameraDevice.java#797</code>
+
+</p><p class="note"><strong>注意</strong>:在 Android 8.0 MR1 版本中,应用必须预安装到系统映像上才能访问此 API。</p>
+
+<h4 id="oncapturequeueempty">onCaptureQueueEmpty</h4>
+
+<p>
+此 API 的目的是通过尽可能让请求队列为空,来缩短控制更改(如缩放)的延迟时间。<code>onCaptureQueueEmpty</code> 不需要 HAL 发挥作用;它只是一种框架端补充。想要利用此 API 的应用需要向回调添加监听器,并相应地发出响应。通常情况下,响应方式是向相机设备发送另一个捕获请求。
+</p>
+
 <h3 id="34">3.4</h3>
 
 <p>对受支持的元数据添加了少许内容并对 data_space 支持进行了更改:</p>
@@ -150,16 +200,16 @@
 <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></li>
-  <li><code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST</code></li>
+  </a>
+  </li><li><code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST</code></li>
   <li><code>ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE</code></li>
   <li><code>ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL</code></li>
   <li><code>ANDROID_SENSOR_DYNAMIC_WHITE_LEVEL</code></li>
   <li><code>ANDROID_SENSOR_OPAQUE_RAW_SIZE</code></li>
   <li><code>ANDROID_SENSOR_OPTICAL_BLACK_REGIONS</code></li>
   </ul>
-  </li><li>
-</li></ul>
+  </li>
+</ul>
 
 <h3 id="33">3.3</h3>
 
@@ -213,7 +263,7 @@
 <p>初始版本的扩展功能 HAL (Android 4.2) [camera2.h]:</p>
 
 <ul>
-<li>足够实现现有 <code>android.hardware.Camera</code> API。</li>
+<li>足够用于实现现有的 <code>android.hardware.Camera</code> API。</li>
 <li>允许用于相机服务层中的 ZSL 队列。</li>
 <li>未针对任何新功能(如手动捕获控制、Bayer RAW 捕获,RAW 数据的重新处理等)进行测试。</li>
 </ul>
diff --git a/zh-cn/devices/graphics/automate-tests.html b/zh-cn/devices/graphics/automate-tests.html
index d3e92ce..180abb1 100644
--- a/zh-cn/devices/graphics/automate-tests.html
+++ b/zh-cn/devices/graphics/automate-tests.html
@@ -78,7 +78,7 @@
 testlog-to-csv --mode=diff --format=text Device_v1.qpa Device_v2.qpa
 </pre>
 
-<p class="note"><strong>注</strong>:参数 <code>--value=code</code> 可输出测试结果代码,如“Pass”或“Fail”。参数 <code>--value=details</code> 可选择对性能、功能或精度测试产生的结果或数值做进一步说明。</p>
+<p class="note"><strong>注意</strong>:参数 <code>--value=code</code> 可输出测试结果代码,如“Pass”或“Fail”。参数 <code>--value=details</code> 可选择对性能、功能或精度测试产生的结果或数值做进一步说明。</p>
 
 <h3 id="test_log_xml_export">以 XML 格式导出测试日志</h3>
 
diff --git a/zh-cn/devices/graphics/build-tests.html b/zh-cn/devices/graphics/build-tests.html
index cd6e0da..0ec7880 100644
--- a/zh-cn/devices/graphics/build-tests.html
+++ b/zh-cn/devices/graphics/build-tests.html
@@ -41,7 +41,7 @@
  <tr>
     <td><code>DEQP_TARGET</code></td>
 <td><p>目标名称,例如“android”</p>
-<p>deqp CMake 脚本将包含文件 <code>targets/<var>DEQP_TARGET</var>/<var>DEQP_TARGET</var>.cmake</code>,这里应该可以找到特定于目标的编译选项。</p>
+<p>deqp CMake 脚本将包含文件 <code>targets/<var>DEQP_TARGET</var>/<var>DEQP_TARGET</var>.cmake</code>,而且这里应该可以找到特定于目标的编译选项。</p>
 </td>
  </tr>
  <tr>
diff --git a/zh-cn/devices/graphics/implement-vulkan.html b/zh-cn/devices/graphics/implement-vulkan.html
index 6475e81..26f396a 100644
--- a/zh-cn/devices/graphics/implement-vulkan.html
+++ b/zh-cn/devices/graphics/implement-vulkan.html
@@ -39,12 +39,10 @@
 <h2 id="driver_emun">驱动程序枚举和加载</h2>
 <p>Android 要求在构建系统映像时系统可用的 GPU 是已知状态。加载程序使用现有 HAL 机制(请参阅 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/hardware.h">hardware.h</a></code>)来发现和加载驱动程序。32 位和 64 位 Vulkan 驱动程序的首选路径分别为:</p>
 
-<p>
-</p><pre class="devsite-click-to-copy">
+<pre class="devsite-click-to-copy">
 /vendor/lib/hw/vulkan.&lt;ro.product.platform&gt;.so
 /vendor/lib64/hw/vulkan.&lt;ro.product.platform&gt;.so
 </pre>
-<p></p>
 
 <p>其中,&lt;<code>ro.product.platform</code>&gt; 需替换为具有该名称的系统属性的值。有关详细信息和受支持的备选位置,请参阅 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/hardware.c">libhardware/hardware.c</a></code>。</p>
 
@@ -73,8 +71,7 @@
 <h3 id="gralloc_usage_flags">Gralloc 用途标记</h3>
 <p>实现可能需要使用由实现定义的私密 gralloc 用途标记来分配交换链缓冲区。创建交换链时,Android 平台要求驱动程序将请求的格式和图像用途标记转换为 gralloc 用途标记,具体方法是调用:</p>
 
-<p>
-</p><pre class="devsite-click-to-copy">
+<pre class="devsite-click-to-copy">
 VkResult VKAPI vkGetSwapchainGrallocUsageANDROID(
     VkDevice            device,
     VkFormat            format,
@@ -82,14 +79,13 @@
     int*                grallocUsage
 );
 </pre>
-<p></p>
 
 <p><code>format</code> 和 <code>imageUsage</code> 参数来自 <code>VkSwapchainCreateInfoKHR</code> 结构。驱动程序应使用相关格式和用途所需的 gralloc 用途标记来填充 <code>*grallocUsage</code>(分配缓冲区时,与交换链消费者请求的用途标记配合使用)。</p>
 
 <h3 id="gralloc_usage_flags">由 Gralloc 支持的图像</h3>
 
-<p><code>VkNativeBufferANDROID</code> 是一个 <code>vkCreateImage</code> 扩展程序结构,用于创建由 gralloc 缓冲区支持的图像。该结构提供给 <code>VkImageCreateInfo</code> 结构链中的 <code>vkCreateImage</code>。在第一次调用 <code>vkGetSwapChainInfoWSI(..
-VK_SWAP_CHAIN_INFO_TYPE_IMAGES_WSI ..)</code> 期间,会调用具有此结构的 <code>vkCreateImage</code>。WSI 实现为交换链分配请求的原生缓冲区数,然后为每个缓冲区创建一个 <code>VkImage</code>:</p>
+<p><code>VkNativeBufferANDROID</code> 是一个 <code>vkCreateImage</code> 扩展程序结构,用于创建由 gralloc 缓冲区支持的图像。该结构提供给 <code>VkImageCreateInfo</code> 结构链中的 <code>vkCreateImage</code>。对具有此结构的 <code>vkCreateImage</code> 的调用发生在第一次调用 <code>vkGetSwapChainInfoWSI(..
+VK_SWAP_CHAIN_INFO_TYPE_IMAGES_WSI ..)</code> 期间。WSI 实现为交换链分配请求的原生缓冲区数,然后为每个缓冲区创建一个 <code>VkImage</code>:</p>
 
 <pre class="devsite-click-to-copy">
 typedef struct {
@@ -121,7 +117,7 @@
   .sharingMode         = VkSwapChainCreateInfoWSI::sharingMode
   .queueFamilyCount    = VkSwapChainCreateInfoWSI::queueFamilyCount
   .pQueueFamilyIndices = VkSwapChainCreateInfoWSI::pQueueFamilyIndices
-</pre><p></p>
+</pre>
 
 <h3 id="acquire_image">获取图像</h3>
 <p><code>vkAcquireImageANDROID</code> 会获取交换链图像的所有权,并将已获得外部信号量的原生栅栏同时导入到现有的 <code>VkSemaphore</code> 对象和现有的 <code>VkFence</code> 对象:</p>
@@ -158,6 +154,6 @@
 <p>很多驱动程序可以忽略图像参数,但有些驱动程序可能需要准备与 gralloc 缓冲区相关联的 CPU 端数据结构,以供外部图像消费者使用。作为将图像转换为 <code>VK_IMAGE_LAYOUT_PRESENT_SRC_KHR</code> 的一个环节,准备外部消费者使用的缓冲区内容应该异步完成。</p>
 
 <h2 id="validation">验证</h2>
-<p>OEM 可以使用 CTS 测试其 Vulkan 实现,其中包括使用 Vulkan 运行时的 <a href="/devices/graphics/cts-integration.html">drawElements 质量计划 (dEQP)</a> 测试。</p>
+<p>原始设备制造商 (OEM) 可以使用 CTS 测试其 Vulkan 实现,其中包括使用 Vulkan 运行时的 <a href="/devices/graphics/cts-integration.html">drawElements 质量计划 (dEQP)</a> 测试。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/graphics/index.html b/zh-cn/devices/graphics/index.html
index 4d23d05..ac7f0c3 100644
--- a/zh-cn/devices/graphics/index.html
+++ b/zh-cn/devices/graphics/index.html
@@ -112,6 +112,6 @@
 
 <p>例如,应用可以将要在 GPU 中执行的工作加入队列。然后,GPU 开始绘制该图像。尽管图像尚未被绘制到内存中,但缓冲区指针仍然可以与指示 GPU 工作何时完成的栅栏一起传递到窗口合成器。然后,窗口合成器可以提前开始处理,并将工作移交给显示控制器。通过这种方式,CPU 工作可以提前完成。GPU 完成后,显示控制器就可以立即显示图像。</p>
 
-<p>同步框架还允许实现人员在自己的硬件组件中利用同步资源。最后,框架使实现人员可以查看图形管道,以帮助进行调试。</p>
+<p>同步框架还允许实现人员在自己的硬件组件中利用同步资源。最后,框架使实现人员能够查看图形管道,以帮助调试。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/graphics/renderer.html b/zh-cn/devices/graphics/renderer.html
new file mode 100644
index 0000000..57d60c0
--- /dev/null
+++ b/zh-cn/devices/graphics/renderer.html
@@ -0,0 +1,179 @@
+<html devsite><head>
+    <title>OpenGLRenderer 配置</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>本文档介绍了以充分利用硬件为目标的性能调校。</p>
+
+<h2>OpenGLRenderer (libhwui) 属性</h2>
+<p>本文档列出了您可以用来控制 Android 的 2D 硬件加速渲染管道的所有属性。将 <code>device.mk</code> 中的这些属性设为 <code>PRODUCT_PROPERTY_OVERRIDES</code>。</p>
+
+<table>
+<tbody><tr>
+  <th>属性</th>
+  <th>类型</th>
+  <th>默认值</th>
+  <th>说明</th>
+</tr>
+
+<tr>
+  <td><code>ro.hwui.disable_scissor_opt</code></td>
+  <td><code>boolean</code></td>
+  <td><code>false</code></td>
+  <td><p>用于启用或停用剪刀优化。接受的值为 true 和 false。如果启用剪刀优化,则 OpenGLRenderer 会尝试选择性启用和停用 GL 剪刀测试,以尽可能不使用剪刀。</p>
+  <p>如果停用优化,则 OpenGLRenderer 会让 GL 剪刀测试保持启用状态,并根据需要更改剪刀矩形。当剪刀矩形的更改频率超过启用或停用剪刀测试的频率时,某些 GPU(例如 SGX 540)的性能会更好。</p>
+  </td>
+</tr>
+
+<tr>
+
+  <td><code>ro.hwui.texture_cache_size</code></td>
+  <td><code>float</code></td>
+  <td><code>24</code></td>
+  <td>定义每个进程纹理缓存的大小(以兆字节为单位)。我们建议使用大容量的缓存,以足够容纳多个 32 位纹理的屏幕(例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 4 MB 的内存,因此缓存应至少为 20 MB)。</td>
+</tr>
+
+<tr>
+  <td><code>ro.hwui.layer_cache_size</code></td>
+  <td><code>float</code></td>
+  <td><code>16</code></td>
+  <td>定义每个进程图层缓存的大小(以兆字节为单位)。我们建议使用大容量的缓存,以足够容纳 4 次 32 位屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 4 MB 的内存,因此缓存应至少为 16 MB。</td>
+</tr>
+<tr>
+  <td><code>ro.hwui.gradient_cache_size</code></td>
+  <td><code>0.5</code></td>
+  <td><code>float</code></td>
+  <td>定义每个进程渐变缓存的大小(以兆字节为单位)。单次渐变通常占用 1-4 KB 的内存。建议使用大容量的缓存,以足够容纳至少 12 次渐变。</td>
+</tr>
+
+<tr>
+  <td><code>ro.hwui.patch_cache_size</code></td>
+  <td><code>integer</code></td>
+  <td><code>128</code></td>
+  <td>定义每个进程中 9patch 缓存的大小(以千字节为单位)。此缓存仅保留顶点数据,因此可以保持小容量。每个顶点由 4 个浮点数或 16 个字节组成。</td>
+</tr>
+
+<tr>
+  <td><code>ro.hwui.path_cache_size</code></td>
+  <td><code>float</code></td>
+  <td><code>4</code></td>
+  <td>定义每个进程路径缓存的大小(以兆字节为单位)。我们建议使用大容量缓存,以足够容纳至少一个 32 位纹理的屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 4 MB 的内存,因此缓存应至少为 4 MB。</td>
+</tr>
+
+<tr>
+  <td><code>ro.hwui.shape_cache_size</code></td>
+  <td><code>float</code></td>
+  <td><code>1</code></td>
+  <td>定义每个进程图形缓存的大小(以兆字节为单位)。该值由多个缓存(如圆形和圆角矩形)使用。我们建议使用大容量缓存,以足够容纳至少一个 8 位屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 1 MB 的内存,因此缓存应至少为 1 MB。</td>
+</tr>
+<tr>
+  <td><code>ro.hwui.drop_shadow_cache_size</code></td>
+  <td><code>float</code></td>
+  <td><code>2</code></td>
+  <td>定义每个进程文字阴影缓存的大小(以兆字节为单位)。我们建议使用大容量缓存,以足够容纳两个 8 位纹理的屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 1 MB 的内存,因此缓存应至少为 2 MB。</td>
+</tr>
+<tr>
+  <td><code>ro.hwui.r_buffer_cache_size</code></td>
+  <td><code>float</code></td>
+  <td><code>2</code></td>
+  <td>定义每个进程的渲染缓冲区缓存的大小(以兆字节为单位)。我们建议您使用大容量的缓存,以足够容纳 2 次 8 位的屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 1 MB 的内存,因此缓存应至少为 2 MB。如果设备支持 4 位或 1 位模板缓冲,则可以使用更小容量的缓存。</td>
+</tr>
+<tr>
+  <td><code>ro.hwui.texture_cache_flush_rate</code></td>
+  <td><code>float</code></td>
+  <td><code>0.6</code></td>
+  <td>定义内存清理之后保留的纹理缓存所占的比例。当系统需要回收所有应用的内存时,就会触发内存清理。我们建议在这种情况下释放大约 50% 的缓存。</td>
+</tr>
+<tr>
+  <td><code>ro.hwui.text_small_cache_width</code></td>
+  <td><code>integer</code></td>
+  <td><code>1024</code></td>
+  <td>定义默认字体缓存的宽度(以像素为单位)。上限取决于 GPU 上传纹理的速度。我们建议该宽度不低于 1024 像素、不超过 2048 像素。您还应该使用二次方值。</td>
+</tr>
+<tr>
+  <td><code>ro.hwui.text_small_cache_height</code></td>
+  <td><code>integer</code></td>
+  <td><code>256</code></td>
+  <td>定义默认字体缓存的高度(以像素为单位)。上限取决于 GPU 上传纹理的速度。我们建议该高度不低于 256 像素、不超过 1024 像素。</td>
+</tr>
+<tr>
+  <td><code>ro.hwui.text_large_cache_width</code></td>
+  <td><code>integer</code></td>
+  <td><code>2048</code></td>
+  <td>定义大号字体缓存的宽度(以像素为单位)。此缓存用于字形过大难以适应默认字体缓存的情形。上限取决于 GPU 上传纹理的速度。我们建议该宽度不低于 2048 像素、不超过 4096 像素。您还应该使用二次方值。</td>
+</tr>
+
+<tr>
+  <td><code>ro.hwui.text_large_cache_height</code></td>
+  <td><code>integer</code></td>
+  <td><code>512</code></td>
+  <td>定义大号字体缓存的高度(以像素为单位)。大号字体缓存用于字形过大难以适应默认字体缓存的情形。上限取决于 GPU 上传纹理的速度。我们建议该高度不低于 512 像素、不超过 2048 像素。您还应该使用二次方值。</td>
+</tr>
+
+<tr>
+  <td><code>ro.zygote.disable_gl_preload</code></td>
+  <td><code>boolean</code></td>
+  <td><code>false</code></td>
+  <td>用于在启动时启用/停用 Zygote 中的 EGL/GL 驱动程序预加载。当此属性设为 false 时,Zygote 将通过调用 eglGetDisplay(EGL_DEFAULT_DISPLAY) 来预加载 GL 驱动程序。目标是加载 Zygote 中的动态库代码,以便与所有其他进程共享。如果驱动程序不支持共享,则将此属性设为 true。</td>
+</tr>
+
+<tr>
+  <td><code>hwui.text_gamma_correction</code></td>
+  <td><code>string</code></td>
+  <td><code>lookup</code></td>
+  <td>选择文字伽马校正方法。有以下四种方法可供选择:<ul>
+   <li><code>lookup3</code>:基于查询表校正。伽马校正针对黑白文字的表现不同(请参见下方的阈值)。</li>
+
+   <li><code>lookup</code>:基于单一查询表校正。</li>
+
+    <li><code>shader3</code>:由 GLSL 着色器应用校正。伽马校正针对黑白文字的表现不同(请参见下方的阈值)。</li>
+
+    <li><code>shader</code>:由 GLSL 着色器应用校正。</li>
+  </ul>查询伽马校正在着色器数学受限的 GPU 上表现最出色。着色器伽马校正是节省内存的最佳选择。我们建议使用默认的 <code>lookup</code> 方法,它能够在质量、速度和内存使用方面提供理想的折中方案。
+</td>
+</tr>
+
+<tr>
+  <td><code>hwui.text_gamma</code></td>
+  <td><code>float</code></td>
+  <td><code>1.4</code></td>
+  <td>定义用于文字伽马校正的伽马值。该值可以根据设备使用的显示屏进行调整。</td>
+</tr>
+<tr>
+  <td><code>hwui.text_gamma.black_threshold</code></td>
+  <td><code>integer</code></td>
+  <td><code>64</code></td>
+  <td>定义应用黑色伽马校正的亮度阈值上限。必须在 0-255 的范围内定义该值。</td>
+</tr>
+<tr>
+  <td><code>hwui.text_gamma.white_threshold</code></td>
+  <td><code>integer</code></td>
+  <td><code>192</code></td>
+  <td>定义应用白色伽马校正的亮度阈值下限。必须在 0-255 的范围内定义该值。</td>
+</tr>
+<tr>
+  <td><code>hwui.use_gpu_pixel_buffers</code></td>
+  <td><code>boolean</code></td>
+  <td><code>true</code></td>
+  <td>用于启用或停用 OpenGL ES 3.0 硬件上的 PBO。PBO 渲染程序会使用 PBO 来执行异步纹理上传,尤其是字体缓存。该属性应始终保持启用状态,但如果使用 PBO 导致出现损坏或性能低下的情况,则可以在启动或开发期间停用该属性。因此,该属性不是只读属性。</td>
+</tr>
+</tbody></table>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/index.html b/zh-cn/devices/index.html
index e46f65c..b3ae2e7 100644
--- a/zh-cn/devices/index.html
+++ b/zh-cn/devices/index.html
@@ -20,118 +20,10 @@
       limitations under the License.
   -->
 
-<p>
-Android 可让您自由实现您自己的设备规格和驱动程序。硬件抽象层 (HAL) 提供了一种用于在 Android 平台堆叠和硬件之间创建软件钩的标准方法。Android 操作系统也是开放源代码系统,因此您可以贡献您自己的接口和增强功能。
-</p>
+<p>Android 可让您自由实现自己的设备规格和驱动程序。硬件抽象层 (HAL) 提供了一种用于在 Android 平台堆叠和硬件之间创建软件钩的标准方法。Android 操作系统也是开放源代码系统,因此您可以贡献自己的接口和增强功能。</p>
 
-<p>
-为确保设备能够保持较高的质量水平并提供一致的用户体验,每部设备都必须通过兼容性测试套件 (CTS) 中的测试。CTS 可验证设备是否符合一定的质量标准,此类标准可确保应用稳定运行并提供良好的用户体验。若想详细了解 CTS,请参阅<a href="/compatibility/index.html">兼容性</a>。
-</p>
+<p>在将 Android 移植到您的硬件之前,请花点时间了解 <a href="/devices/architecture/index.html">Android 系统架构</a>。由于您的驱动程序和 HAL 会与 Android 进行交互,因此了解 Android 的结构可帮助您浏览 Android 开放源代码项目 (AOSP) 源代码树中的多个代码层。当您熟悉基本的 Android 架构后,请查看本部分中特定于接口的文档,以了解具体的 HAL 以及如何为您的设备编译这些 HAL。</p>
 
-<p>
-在将 Android 移植到您的硬件之前,请花点时间从更高层面上了解 Android 系统架构。由于您的驱动程序和 HAL 会与 Android 进行交互,因此了解 Android 的工作原理可帮助您浏览 Android 开放源代码项目 (AOSP) 源代码树中的多个代码层。
-</p>
-
-<img src="images/ape_fwk_all.png"/>
-
-<p class="img-caption"><strong>图 1.</strong> Android 系统架构</p>
-
-<h2 id="Application-framework">应用框架</h2>
-<p>
-应用框架最常被应用开发者使用。作为硬件开发者,您应该非常了解开发者 API,因为很多此类 API 都可直接映射到底层 HAL 接口,并可提供与实现驱动程序相关的实用信息。
-</p>
-
-<h2 id="Binder-IPC">Binder IPC</h2>
-<p>
-Binder 进程间通信 (IPC) 机制允许应用框架跨越进程边界并调用 Android 系统服务代码,从而使得高级框架 API 能与 Android 系统服务进行交互。在应用框架级别,开发者无法看到此类通信的过程,但一切似乎都在“按部就班地运行”。
-</p>
-
-<h2 id="System-services">系统服务</h2>
-<p>
-应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件。服务是集中的模块化组件,例如窗口管理器、搜索服务或通知管理器。Android 包含两组服务:“系统”(诸如窗口管理器和通知管理器之类的服务)和“媒体”(与播放和录制媒体相关的服务)。<em></em><em></em>
-</p>
-
-<h2 id="Hardware-Abstraction-Layer">硬件抽象层 (HAL)</h2>
-<p>
-硬件抽象层 (HAL) 会定义一个标准接口以供硬件供应商实现,并允许 Android 忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或无需更改更高级别的系统。HAL 实现会被封装成模块 (<code>.so</code>) 文件,并会由 Android 系统适时地加载。
-</p>
-
-<img src="images/ape_fwk_hal.png"/>
-
-<p class="img-caption"><strong>图 2.</strong> 硬件抽象层 (HAL) 组件</p>
-
-<p>
-您必须为您的产品所提供的特定硬件实现相应的 HAL(和驱动程序)。HAL 实现通常会内置在共享库模块(<code>.so</code> 文件)中。Android 并不要求您的 HAL 实现与设备驱动程序之间进行标准交互,因此您可以自由地根据您的具体情况执行适当的操作。不过,要使 Android 系统能够与您的硬件正确互动,您<strong>必须</strong>遵守各个针对特定硬件的 HAL 接口中定义的合同。
-</p>
-
-<h3 id="structure">标准 HAL 结构</h3>
-<p>
-  每个针对特定硬件的 HAL 接口均具有 <code>hardware/libhardware/include/hardware/hardware.h</code> 中定义的属性,这些属性可保证 HAL 具有可预测的结构。此类接口允许 Android 系统以一致的方式加载 HAL 模块的正确版本。HAL 接口包含两个通用组件:一个模块和一个设备。
-</p>
-<p>
-  模块表示被封装且存储为共享库 (<code>.so file</code>) 的 HAL 实现。它会包含模块的版本、名称和作者等元数据,这些元数据有助于 Android 找到并正确加载该模块。<code>hardware/libhardware/include/hardware/hardware.h</code> 标头文件会定义一个表示模块的结构体 (<code>hw_module_t</code>),其中会包含模块的版本、作者和名称等信息。</p>
-
-  <p>另外,<code>hw_module_t</code> 结构体还会包含一个指向另一结构体 <code>hw_module_methods_t</code> 的指针,后面这个结构体则会包含一个指向相应模块的“open”函数的指针。该“open”函数用于与相关硬件(此 HAL 是其抽象形式)建立通信。每个针对特定硬件的 HAL 通常都会使用附加信息为该特定硬件扩展通用的 <code>hw_module_t</code> 结构体。例如,在相机 HAL 中,<code>camera_module_t</code> 结构体会包含一个 <code>hw_module_t</code> 结构体以及其他针对相机的函数指针:
-</p>
-
-<pre class="devsite-click-to-copy">
-typedef struct camera_module {
-    hw_module_t common;
-    int (*get_number_of_cameras)(void);
-    int (*get_camera_info)(int camera_id, struct camera_info *info);
-} camera_module_t;
-</pre>
-
-<p>当您实现 HAL 并创建模块结构体时,必须将其命名为 <code>HAL_MODULE_INFO_SYM</code>。例如,以下是 Nexus 9 音频 HAL 的示例:</p>
-
-<pre class="devsite-click-to-copy">
-struct audio_module HAL_MODULE_INFO_SYM = {
-    .common = {
-        .tag = HARDWARE_MODULE_TAG,
-        .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
-        .hal_api_version = HARDWARE_HAL_API_VERSION,
-        .id = AUDIO_HARDWARE_MODULE_ID,
-        .name = "NVIDIA Tegra Audio HAL",
-        .author = "The Android Open Source Project",
-        .methods = &amp;hal_module_methods,
-    },
-};
-</pre>
-<p>
-  设备会提取产品的实际硬件。例如,音频模块可能会包含主音频设备、USB 音频设备或蓝牙 A2DP 音频设备。设备由 <code>hw_device_t</code> 结构体表示。与模块类似,每类设备都会为通用的 <code>hw_device_t</code> 定义一个更详细的版本,其中会包含指向硬件特定功能的函数指针。例如,<code>audio_hw_device_t</code> 结构体类型会包含指向音频设备操作的函数指针:
-</p>
-
-<pre class="devsite-click-to-copy">
-struct audio_hw_device {
-    struct hw_device_t common;
-
-    /**
-     * used by audio flinger to enumerate what devices are supported by
-     * each audio_hw_device implementation.
-     *
-     * Return value is a bitmask of 1 or more values of audio_devices_t
-     */
-    uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
-  ...
-};
-typedef struct audio_hw_device audio_hw_device_t;
-</pre>
-
-<p>
-  除了这些标准属性之外,每个针对特定硬件的 HAL 接口都可以定义更多的自有特性和要求。若想详细了解如何实现某个特定接口,请参阅 <a href="/reference/hal/">HAL 参考文档</a>以及各 HAL 的单独说明。
-</p>
-
-<h3 id="modules">HAL 模块</h3>
-<p>HAL 实现会内置在模块 (<code>.so</code>) 文件中,并会由 Android 适时地动态关联。您可通过为每个 HAL 实现创建 <code>Android.mk</code> 文件并指向源文件来构建模块。一般来说,您的共享库必须以某种格式命名,以便被找到并正确加载。各模块的命名方案略有不同,但它们都遵循以下通用模式:<code>&lt;module_type&gt;.&lt;device_name&gt;</code>。</p>
-
-  <p>若想详细了解如何为每个 HAL 设置模块构建,请参阅各 HAL 对应的文档。</p>
-
-<h2 id="Linux-kernel">Linux 内核</h2>
-<p>
-开发设备驱动程序与开发典型的 Linux 设备驱动程序类似。Android 使用的 Linux 内核版本包含一些特殊的补充功能,例如:唤醒锁(这是一种内存管理系统,可更主动地保护内存)、Binder IPC 驱动程序以及对移动嵌入式平台非常重要的其他功能。这些补充功能主要用于增强系统功能,不会影响驱动程序开发。
-
-</p><p>
-您可以使用任一版本的内核,只要它支持所需功能(如 Binder 驱动程序)。不过,我们建议您使用 Android 内核的最新版本。若想详细了解 Android 内核的最新版本,请参阅<a href="/source/building-kernels.html">构建内核</a>。
-</p>
+<p>为了保持较高的质量水平并提供一致的用户体验,Android 会要求所有实现都符合<a href="/compatibility/cdd.html">兼容性定义文档 (CDD)</a> 中规定的要求,而且所有设备都必须通过<a href="/compatibility/cts.html">兼容性测试套件 (CTS)</a> 中的测试。有关 Android 兼容性计划的详细信息,请参阅<a href="/compatibility/index.html">兼容性</a>。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/input/index.html b/zh-cn/devices/input/index.html
index f1612d9..5339d9e 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>
@@ -20,8 +20,106 @@
       limitations under the License.
   -->
 
-<img style="float: right; margin: 0px 135px 15px 15px;" src="images/ape_fwk_hal_input.png" alt="Android 输入 HAL 图标"/>
+<img style="float: right; margin: 0px 15px 15px 15px;" src="images/ape_fwk_hal_input.png" alt="Android 输入 HAL 图标"/>
 
-<p>Android 输入子系统支持各种不同类型的设备,包括键盘、操纵杆、轨迹球、鼠标和触摸屏。本部分的文档介绍了如何为输入设备配置、校准、测试和编写驱动程序。</p>
+<p>Android 输入子系统名义上是由遍历系统多个层的事件管道组成。</p>
+<h2 id="input-pipeline">输入管道</h2>
+<p>在最低层,物理输入设备会生成描述状态更改(例如按键按压和触摸接触点)的信号。设备固件以某种方式编码和传输这些信号,例如向系统发送 USB HID 报告或在 I2C 总线上产生中断。</p>
+<p>然后,信号由 Linux 内核中的设备驱动程序解码。Linux 内核为许多标准的外围设备提供驱动程序,特别是那些符合 HID 协议的外围设备。然而,原始设备制造商 (OEM) 通常必须为在低级别紧密集成到系统的嵌入式设备(如触摸屏)提供自定义驱动程序。</p>
+<p>输入设备驱动程序负责通过 Linux 输入协议将设备特定信号转换为标准输入事件格式。Linux 输入协议在 <code>linux/input.h</code> 内核头文件中定义了一组标准事件类型和代码。这样一来,内核之外的组件就不需要关注物理扫描代码、HID 用途、I2C 消息、GPIO 引脚等方面的详细信息。</p>
+<p>接下来,Android <code>EventHub</code> 组件通过打开与每个输入设备关联的 <code>evdev</code> 驱动程序从内核读取输入事件。然后,Android InputReader 组件根据设备类别解码输入事件,并生成 Android 输入事件流。在此过程中,Linux 输入协议事件代码将根据输入设备配置、键盘布局文件和各种映射表,转化为 Android 事件代码。</p>
+<p>最后,<code>InputReader</code> 将输入事件发送到 InputDispatcher,后者将这些事件转发到相应的窗口。</p>
+<h2 id="control-points">控制点</h2>
+<p>在输入管道中有几个阶段会影响对输入设备行为的控制。</p>
+<h3 id="driver-and-firmware-configuration">驱动程序和固件配置</h3>
+<p>输入设备驱动程序经常通过在寄存器中设置参数甚或上传固件本身来配置输入设备的行为。对于诸如触摸屏等嵌入式设备尤其如此,其中一大部分校准过程涉及到调整这些参数或修复固件,以提供所需的精度和响应能力并抑制噪声。</p>
+<p>驱动程序配置选项通常在内核板级支持包 (BSP) 中指定为模块参数,以便同一驱动程序可以支持多种不同的硬件实现。</p>
+<p>本文档旨在介绍驱动程序或固件配置,但在总体上提供了有关设备校准的指导。</p>
+<h3 id="board-configuration-properties">板配置属性</h3>
+<p>内核板级支持包 (BSP) 可以通过由 Android InputReader 组件使用的 SysFS 导出板配置属性,如虚拟键在触摸屏上的位置。</p>
+<p>有关不同设备如何使用板配置属性的详细信息,请参阅设备类别部分。</p>
+<h3 id="resource-overlays">资源叠加层</h3>
+<p>有几个输入行为是通过 <code>config.xml</code> 中的资源叠加层配置的,例如机盖开关的操作。</p>
+<p>以下是几个例子:</p>
+<ul>
+<li>
+<p><code>config_lidKeyboardAccessibility</code>:指定机盖开关对硬件键盘可访问还是隐藏的影响。</p>
+</li>
+<li>
+<p><code>config_lidNavigationAccessibility</code>:指定机盖开关对触控板可访问还是隐藏的影响。</p>
+</li>
+<li>
+<p><code>config_longPressOnPowerBehavior</code>:指定当用户按住电源按钮时应该发生的情况。</p>
+</li>
+<li>
+<p><code>config_lidOpenRotation</code>:指定机盖开关对屏幕方向的影响。</p>
+</li>
+</ul>
+<p>要详细了解每个配置选项,请参阅 <code>frameworks/base/core/res/res/values/config.xml</code> 中的文档。</p>
+<h3 id="key-maps">按键映射</h3>
+<p>Android <code>EventHub</code> 和 <code>InputReader</code> 组件使用按键映射来配置按键、操纵杆按钮和操纵杆轴从 Linux 事件代码到 Android 事件代码的映射。映射可能会因设备或语言的不同而不同。</p>
+<p>要详细了解不同设备如何使用按键映射,请参阅设备类别部分。</p>
+<h3 id="input-device-configuration-files">输入设备配置文件</h3>
+<p>Android <code>EventHub</code> 和 <code>InputReader</code> 组件使用输入设备配置文件来配置特殊设备特征,例如,如何报告触摸尺寸信息。</p>
+<p>要详细了解不同设备如何使用输入设备配置映射,请参阅设备类别部分。</p>
+<h2 id="understanding-hid-usages-and-event-codes">了解 HID 用途和事件代码</h2>
+<p>通常使用几个不同的标识符来指代键盘上的任何指定按键、游戏控制器上的按钮、操纵杆轴或其他控件。这些标识符之间的关系并非总是一样的:它们取决于一组映射表,其中一些映射是固定的,还有一些映射随设备特征、设备驱动程序、当前语言区域、系统配置、用户偏好设置和其他因素而变化。</p>
+<dl>
+<dt>物理扫描代码</dt>
+<dd>
+<p>物理扫描代码是与每个按键、按钮或其他控件相关联的设备特定标识符。由于物理扫描代码通常因设备而异,因此固件或设备驱动程序负责将其映射到标准标识符,例如 HID 用途或 Linux 按键代码。</p>
+<p>扫描代码主要用于键盘。其他设备通常使用 GPIO 引脚、I2C 消息或其他方式在低级别进行通信。因此,软件堆栈的上层依赖于设备驱动程序来确定发生的操作。</p>
+</dd>
+<dt>HID 用途</dt>
+<dd>
+<p>HID 用途是一种标准标识符,用于报告控件(如键盘按键、操纵杆轴、鼠标按钮或触摸接触点)的状态。大多数 USB 和蓝牙输入设备都符合 HID 规范,使得系统能够以统一的方式与它们进行连接。</p>
+<p>Android 框架依赖于 Linux 内核 HID 驱动程序来将 HID 用途代码转换为 Linux 按键代码和其他标识符。因此,主要是外设制造商关注 HID 用途。</p>
+</dd>
+<dt>Linux 按键代码</dt>
+<dd>
+<p>Linux 按键代码是用于按键或按钮的标准标识符。Linux 按键代码在 <code>linux/input.h</code> 头文件中使用以前缀 <code>KEY_</code> 或 <code>BTN_</code> 开头的常量进行定义。Linux 内核输入驱动程序负责将物理扫描代码、HID 用途和其他设备特定信号转换为 Linux 按键代码,并作为 <code>EV_KEY</code> 事件的一部分提供有关它们的信息。</p>
+<p>Android API 有时将与按键相关联的 Linux 按键代码称为其“扫描代码”。这在技术上是错误的,但是有助于在 API 中区分 Linux 按键代码和 Android 按键代码。</p>
+</dd>
+<dt>Linux 相对或绝对轴代码</dt>
+<dd>
+<p>Linux 相对或绝对轴代码是一种标准标识符,用于报告沿着某个轴的相对位移或绝对位置,例如鼠标沿其 X 轴的相对位移或者操纵杆沿其 X 轴的绝对位置。Linux 轴代码在 <code>linux/input.h</code> 头文件中使用以前缀 <code>REL_</code> 或 <code>ABS_</code> 开头的常量进行定义。Linux 内核输入驱动程序负责将 HID 用途和其他设备特定信号转换为 Linux 轴代码,并作为 <code>EV_REL</code> 和 <code>EV_ABS</code> 事件的一部分提供有关它们的信息。</p>
+</dd>
+<dt>Linux 开关代码</dt>
+<dd>
+<p>Linux 开关代码是用于报告设备上的开关(例如机盖开关)状态的标准标识符。Linux 开关代码在 <code>linux/input.h</code> 头文件中使用以前缀 <code>SW_</code> 开头的常量进行定义。Linux 内核输入驱动程序以 <code>EV_SW</code> 事件形式报告开关状态更改。</p>
+<p>Android 应用通常不会接收来自开关的事件,但系统可能会在内部使用它们来控制各种特定于设备的功能。</p>
+</dd>
+<dt>Android 按键代码</dt>
+<dd>
+<p>Android 按键代码是在 Android API 中定义的标准标识符,用于指示特定按键(如“主屏幕”)。Android 按键代码由 <code>android.view.KeyEvent</code> 类定义为以前缀 <code>KEYCODE_</code> 开头的常量。</p>
+<p>按键布局指定了 Linux 按键代码如何映射到 Android 按键代码。可以使用不同的按键布局,具体取决于键盘型号、语言、国家/地区、布局或特殊功能。</p>
+<p>使用特定于设备和语言区域的按键字符映射将 Android 按键代码组合转换为字符代码。例如,当同时按下标识为 <code>KEYCODE_SHIFT</code> 和 <code>KEYCODE_A</code> 的按键时,系统将在按键字符映射中查找该组合并找到大写字母“A”,然后将其插入当前聚焦的文本微件中。</p>
+</dd>
+<dt>Android 轴代码</dt>
+<dd>
+<p>Android 轴代码是在 Android API 中定义的标准标识符,用于指示特定设备轴。Android 轴代码由 <code>android.view.MotionEvent</code> 类定义为以前缀 <code>AXIS_</code> 开头的常量。</p>
+<p>按键布局指定了 Linux 轴代码如何映射到 Android 轴代码。可能会使用不同的按键布局,具体取决于设备型号、语言、国家/地区、布局或特殊功能。</p>
+</dd>
+<dt>Android 元状态</dt>
+<dd>
+<p>Android 元状态是在 Android API 中定义的标准标识符,用于指示按哪些辅助键。Android 元状态由 <code>android.view.KeyEvent</code> 类定义为以前缀 <code>META_</code> 开头的常量。</p>
+<p>当前元状态由 Android InputReader 组件确定,该组件用于监控何时按下/释放辅助键(如 <code>KEYCODE_SHIFT_LEFT</code>)并设置/重置相应的元状态标记。</p>
+<p>辅助键和元状态之间的关系采用硬编码,但是按键布局可以改变辅助键本身的映射方式,这反过来又会影响元状态。</p>
+</dd>
+<dt>Android 按钮状态</dt>
+<dd>
+<p>Android 按钮状态是在 Android API 中定义的标准标识符,用于指示按下(鼠标或触控笔上的)哪些按钮。Android 按钮状态由 <code>android.view.MotionEvent</code> 类定义为以前缀 <code>BUTTON_</code> 开头的常量。</p>
+<p>当前的按钮状态由 Android InputReader 组件确定,该组件用于监控何时按下/释放(鼠标或触控笔上的)按钮并设置/重置相应的按钮状态标记。</p>
+<p>按钮和按钮状态之间的关系采用硬编码。</p>
+</dd>
+</dl>
+<h2 id="further-reading">延伸阅读</h2>
+<ol>
+<li><a href="http://www.kernel.org/doc/Documentation/input/event-codes.txt">Linux 输入事件代码</a></li>
+<li><a href="http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt">Linux 多点触控协议</a></li>
+<li><a href="http://www.kernel.org/doc/Documentation/input/input.txt">Linux 输入驱动程序</a></li>
+<li><a href="http://www.kernel.org/doc/Documentation/input/ff.txt">Linux 强制反馈</a></li>
+<li><a href="http://www.usb.org/developers/hidpage">HID 信息,包括 HID 用途表</a></li>
+</ol>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/input/migration-guide.html b/zh-cn/devices/input/migration-guide.html
index fee62cb..42a7f59 100644
--- a/zh-cn/devices/input/migration-guide.html
+++ b/zh-cn/devices/input/migration-guide.html
@@ -29,13 +29,13 @@
 <p>务必更新您的所有按键字符映射文件,以便使用新的语法。</p>
 <p>如果您的外围设备依赖于旧的“qwerty”按键映射,则您可能需要提供特定于设备的新按键映射,以模拟旧行为。您应该为通过 USB 产品 ID/供应商 ID 或设备名称标识的每种设备创建新的按键映射。</p>
 <p>为所有特殊功能输入设备提供按键字符映射文件尤为重要。这些文件应该只包含一个将键盘类型设置为 <code>SPECIAL_FUNCTION</code> 的行。</p>
-<p>可确保所有内置输入设备均正确配置的一个方法是运行 <a href="dumpsys.html">Dumpsys</a>,然后使用 <code>Generic.kcm</code> 查找配置不正确的设备。</p>
+<p>可确保所有内置输入设备均正确配置的一个方法是运行 <a href="https://developer.android.com/studio/command-line/dumpsys.html"><code>dumpsys</code></a>,然后使用 <code>Generic.kcm</code> 查找配置不正确的设备。</p>
 <h2 id="migrating-to-android-honeycomb-32">迁移到 Android Honeycomb 3.2</h2>
 <p>在 Honeycomb 3.2 中,我们新增了对操纵杆的支持,并扩展了按键布局文件格式以支持操纵杆轴映射。</p>
 <h2 id="migrating-to-android-ice-cream-sandwich-40">迁移到 Android Ice Cream Sandwich 4.0</h2>
 <p>在 Ice Cream Sandwich 4.0 中,我们将触摸屏的设备驱动程序要求更改为遵循标准的 Linux 多点触控输入协议,并新增了对“B”协议的支持。我们还支持数字化仪平板电脑和基于触控笔的触屏设备。</p>
 <p>您可能需要更新输入设备驱动程序,以按照标准正确实现 Linux 多点触控输入协议。</p>
 <p>您还需要更新输入设备配置文件,因为某些更改后的属性更简单、更系统化。</p>
-<p>如需了解有关驱动程序要求的更多详细信息,请参阅<a href="touch-devices.html">触屏设备</a>。</p>
+<p>要详细了解驱动程序要求,请参阅<a href="touch-devices.html">触屏设备</a>。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/media/index.html b/zh-cn/devices/media/index.html
index 6a8851d..9dd4a04 100644
--- a/zh-cn/devices/media/index.html
+++ b/zh-cn/devices/media/index.html
@@ -28,7 +28,7 @@
 
 <p>Stagefright 还支持集成您提供的自定义硬件编解码器。要设置编码和解码媒体的硬件路径,您必须将基于硬件的编解码器作为 OpenMax IL(集成层)组件进行实现。</p>
 
-<p class="note"><strong>注意</strong>:Stagefright 更新可通过 Android <a href="/security/bulletin/index.html">每月安全更新</a>过程,作为 Android 操作系统版本的一部分进行更新。</p>
+<p class="note"><strong>注意</strong>:Stagefright 更新可通过 Android <a href="/security/bulletin/index.html">每月安全更新</a>流程,作为 Android 操作系统版本的一部分进行更新。</p>
 
 <h2 id="architecture">架构</h2>
 <p>媒体应用根据以下架构与 Android Native 多媒体框架进行交互。</p>
@@ -70,14 +70,14 @@
 </ol>
 
 <h2 id="expose">将编解码器暴露给框架</h2>
-<p>Stagefright 服务解析 <code>system/etc/media_codecs.xml</code> 和 <code>system/etc/media_profiles.xml</code>,从而向应用开发者暴露设备支持的编解码器和配置文件(通过 <code>android.media. MediaCodecList</code> 和 <code>android.media.CamcorderProfile</code> 类)。您必须在 <code>device/&lt;company&gt;/&lt;device&gt;/</code> 目录中创建两个文件,并将其复制到设备 Makefile 中系统映像的 <code>system/etc</code> 目录中。例如:</p>
+<p>Stagefright 服务会解析 <code>system/etc/media_codecs.xml</code> 和 <code>system/etc/media_profiles.xml</code>,从而向应用开发者显示设备支持的编解码器和配置文件(通过 <code>android.media. MediaCodecList</code> 和 <code>android.media.CamcorderProfile</code> 类)。您必须在 <code>device/&lt;company&gt;/&lt;device&gt;/</code> 目录中创建两个文件,并将其复制到设备 Makefile 中系统映像的 <code>system/etc</code> 目录中。例如:</p>
 <pre class="devsite-click-to-copy">
 PRODUCT_COPY_FILES += \
   device/samsung/tuna/media_profiles.xml:system/etc/media_profiles.xml \
   device/samsung/tuna/media_codecs.xml:system/etc/media_codecs.xml \
 </pre>
 
-<p>有关完整示例,请参阅 <code>device/samsung/tuna/media_codecs.xml</code> 和 <code>device/samsung/tuna/media_profiles.xml</code>。</p>
+<p>有关完整的示例,请参阅 <code>device/samsung/tuna/media_codecs.xml</code> 和 <code>device/samsung/tuna/media_profiles.xml</code>。</p>
 
 <p class="note"><strong>注意</strong>:从 Android 4.1 开始,不再支持媒体编解码器的 <code>&lt;Quirk&gt;</code> 元素。</p>
 
diff --git a/zh-cn/devices/media/oem.html b/zh-cn/devices/media/oem.html
index 5a5e0db..c8923c6 100644
--- a/zh-cn/devices/media/oem.html
+++ b/zh-cn/devices/media/oem.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>本文档旨在帮助原始设备制造商 (OEM) 正确实现对 Android 媒体资源管理器和相关 API 的支持。</p>
+<p>本文档旨在帮助 OEM 正确实现对 Android 媒体资源管理器和相关 API 的支持。</p>
 
 <h2 id="1_max_concurrent_codec_instances">1. 最大并发编解码器实例数量</h2>
 
@@ -95,7 +95,9 @@
   <ol>
     <li>首先使用 cts-tradefed 运行测试。鉴于 Android 性能的波动性,建议多次运行测试以获得更准确的最小值和最大值。
     </li><li>使用提供的 <a href="https://android.googlesource.com/platform/cts/+/marshmallow-cts-dev/tools/cts-media/get_achievable_rates.py">get_achievable_rates.py</a> 脚本生成 XML 文件。
-    </li><li>将 XML 文件放置在以下位置:<code>/etc/media_codecs_performance.xml</code><br />通常通过将 XML 文件放置在设备项目 (device/<em>&lt;vendor&gt;</em>/<em>&lt;product&gt;</em>) 中并将 <code>PRODUCT_COPY_FILES</code> 行添加到 <code>device.mk</code> 来完成此过程,如下所示:<pre class="devsite-click-to-copy">
+    </li><li>将 XML 文件放置在以下位置:<code>/etc/media_codecs_performance.xml</code><br />
+通常通过将 XML 文件放置在设备项目 (device/&lt;vendor&gt;&lt;product&gt;<em></em>/<em></em>) 中并将 <code>PRODUCT_COPY_FILES</code> 行添加到 <code>device.mk</code> 来完成此过程,如下所示:
+<pre class="devsite-click-to-copy">
 PRODUCT_COPY_FILES += \
 ...
    device/moto/shamu/media_codecs.xml:system/etc/media_codecs.xml \
diff --git a/zh-cn/devices/media/soc.html b/zh-cn/devices/media/soc.html
index 2b7d6b2..5721d10 100644
--- a/zh-cn/devices/media/soc.html
+++ b/zh-cn/devices/media/soc.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>媒体资源管理器的 SoC 供应商依赖关系</title>
+    <title>媒体资源管理器的 SoC 供应商依赖项</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
@@ -20,24 +20,24 @@
       limitations under the License.
   -->
 
-<p>本文档旨在帮助系统芯片供应商 (SoC) 正确实现对 Android 媒体资源管理器所需的优先级、运营率和钩子的支持。</p>
+<p>本文档旨在帮助系统芯片供应商 (SoC) 正确实现对 Android 媒体资源管理器所需的优先级、操作速率和钩子的支持。</p>
 
 <h2 id="1_omx_errorinsufficientresources">1. OMX_ErrorInsufficientResources</h2>
 
 <p>如果失败的原因是资源不足,则编解码器组件应针对 <code>GetHandle</code>、<code>Init</code>、<code>UseBuffer</code>、<code>AllocateBuffer</code> 或状态转换返回 <code>OMX_ErrorInsufficientResources</code>。媒体资源管理器会将该错误代码用作指示符(意味着可能会从其他优先级较低的进程抢占媒体资源)。</p>
 
-<p>Android 兼容性测试套件 (CTS) 测试存在的目的是重复地分配、配置和启动每一个编解码器,直到出现 <code>catching
+<p>Android 兼容性测试套件 (CTS) 中的相关测试会重复分配、配置和启动每一个编解码器,直到出现 <code>catching
 OMX_ErrorInsufficientResources</code>(通过)结果或任何其他错误(失败)。</p>
 
 <h2 id="2_omx_indexconfigpriority">2. OMX_IndexConfigPriority</h2>
 
-<p>通过此配置,应用可以说明所需的编解码器优先级。</p>
+<p>通过此项配置,应用可以说明其所需的编解码器优先级。</p>
 
 <p>关联值为整数。值越高,优先级越低。
 目前仅支持两种级别:</p>
 
 <ul>
-  <li>0:实时优先级 - 指的是编解码器应该实时支持指定的性能配置(如帧速率)。该优先级只能用于媒体播放、捕获,而且在可提供的最佳性能不合适时,还可能用于实时通信场景。</li>
+  <li>0:实时优先级 - 指的是编解码器应该实时支持指定的性能配置(如帧速率)。该优先级只能用于媒体播放、捕获,另外还可能用于实时通信场景(如果“可提供的最佳性能”选项不适用)。</li>
   <li>1:非实时优先级(可提供的最佳性能)。这是默认值。</li>
 </ul>
 
@@ -47,7 +47,7 @@
 
 <h2 id="3_omx_indexconfigoperatingrate">3. OMX_IndexConfigOperatingRate</h2>
 
-<p>通过此配置,应用可以说明编解码器需要操作的视频的操作帧速率或音频的采样率。</p>
+<p>通过此项配置,应用可以说明编解码器在进行操作时所需的视频操作帧速率或音频采样率。</p>
 
 <p>该配置的其中一种使用情况为高速/慢动作视频捕获;在这种情况下,视频编码器格式包含目标播放速率(如 30 帧/秒),但组件必须能够处理较高的操作捕获速率(如 240 帧/秒)。</p>
 
diff --git a/zh-cn/devices/sensors/batching.html b/zh-cn/devices/sensors/batching.html
index 75047b9..ffe3a2b 100644
--- a/zh-cn/devices/sensors/batching.html
+++ b/zh-cn/devices/sensors/batching.html
@@ -68,7 +68,7 @@
   在挂起模式下,<code>max_report_latency</code> 对非唤醒 FIFO 没有影响。</p>
 <p>当唤醒 FIFO 存满时,或者当其中一个唤醒传感器的 <code>max_report_latency</code> 已过时,硬件必须唤醒 SoC 并报告数据。</p>
 <p>在这两种情况下(唤醒和非唤醒),只要 SoC 退出挂起模式,即使一些传感器的 <code>max_report_latency</code> 未过,也会产生一个包含所有 FIFO 内容的批处理。这样可最大限度地降低 SoC 再次挂起而必须重新将其唤醒的风险。这进而可以最大限度地降低功耗。</p>
-<p>*不允许驱动程序持有唤醒锁的一个明显例外情况是,在 <code>max_report_latency</code> 小于 1 秒时,启用<a href="report-modes.html#continuous">轮询报告模式</a>的唤醒传感器。在此情况下,驱动程序可以持有唤醒锁,这是因为 SoC 在进入挂起模式前会被唤醒事件唤醒,因此没有机会进入挂起模式。</p>
+<p>*不允许驱动程序持有唤醒锁定的一个明显例外情况是,在 <code>max_report_latency</code> 小于 1 秒时,启用<a href="report-modes.html#continuous">连续报告模式</a>的唤醒传感器。在此情况下,驱动程序可以持有唤醒锁,这是因为 SoC 在进入挂起模式前会被唤醒事件唤醒,因此没有机会进入挂起模式。</p>
 <h2 id="precautions_to_take_when_batching_wake-up_sensors">批处理唤醒传感器时的注意事项</h2>
 <p>根据设备不同,SoC 可能需要几毫秒才能完全退出挂起模式并开始刷新 FIFO。因此必须在 FIFO 中分配足够的头空间,才能让设备完全退出挂起状态,而不造成唤醒 FIFO 溢出。不得丢失任何事件,并且必须遵照 <code>max_report_latency</code>。</p>
 <h2 id="precautions_to_take_when_batching_non-wake-up_on-change_sensors">批处理采用 On-change 触发方式的非唤醒传感器时的注意事项</h2>
diff --git a/zh-cn/devices/sensors/hal-interface.html b/zh-cn/devices/sensors/hal-interface.html
index c5e0fe6..aceead3 100644
--- a/zh-cn/devices/sensors/hal-interface.html
+++ b/zh-cn/devices/sensors/hal-interface.html
@@ -49,7 +49,7 @@
 <pre class="prettyprint">int (*activate)(struct sensors_poll_device_t *dev, int sensor_handle, int
   enabled);</pre>
 <p>激活或禁用传感器。</p>
-<p><code>sensor_handle</code> 是要激活/禁用的传感器的句柄。传感器的句柄由其 <a href="#sensor_t">sensor_t</a> 结构的 <code>handle</code> 字段定义。</p>
+<p><code>sensor_handle</code> 是要激活/禁用的传感器的句柄。传感器的句柄由其 <code>handle</code> 结构的 <a href="#sensor_t">handle</a> 字段定义。</p>
 <p><code>enabled</code> 设为 1 时启用传感器,设为 0 时则停用传感器。</p>
 <p>单次传感器在接收到事件后会自动自行禁用,并且必须仍接受通过调用 <code>activate(...,
   enabled=0)</code> 进行禁用。</p>
@@ -147,15 +147,15 @@
 <p>当传感器禁用时,将调用 <code>activate(..., enable=0)</code>。</p>
 <p>在进行上述调用的同时,会反复调用 <code>poll</code> 函数来请求数据。甚至在没有传感器激活的情况下,也可以调用 <code>poll</code>。</p>
 <h2 id="sensors_module_t">sensors_module_t</h2>
-<p><code>sensors_module_t</code> 是用于为传感器创建 Android 硬件模块的类型。对 HAL 的实现必须定义一个该类型的对象 <code>HAL_MODULE_INFO_SYM</code>,以提供 <a href="#get_sensors_list_list">get_sensors_list</a> 函数。要了解详情,请参阅 <a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h">sensors.h</a> 中关于 <code>sensors_module_t</code> 的定义和 <code>hw_module_t</code> 的定义。</p>
+<p><code>sensors_module_t</code> 是用于为传感器创建 Android 硬件模块的类型。HAL 的实现必须定义一个该类型的对象 <code>HAL_MODULE_INFO_SYM</code>,以暴露 <a href="#get_sensors_list_list">get_sensors_list</a> 函数。要了解详情,请参阅 <a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h">sensors.h</a> 中关于 <code>sensors_module_t</code> 的定义和 <code>hw_module_t</code> 的定义。</p>
 <h2 id="sensors_poll_device_t_sensors_poll_device_1_t">sensors_poll_device_t/sensors_poll_device_1_t</h2>
-<p><code>sensors_poll_device_1_t</code> 包含上文定义的方法的剩余部分:<code>activate</code>、<code>batch</code>、<code>flush</code> 和 <code>poll</code>。其 <code>common</code> 字段(类型为 <a href="/devices/halref/structhw__device__t.html">hw_device_t</a>)定义 HAL 的版本号。</p>
+<p><code>sensors_poll_device_1_t</code> 包含上文定义的方法的剩余部分:<code>activate</code>、<code>batch</code>、<code>flush</code> 和 <code>poll</code>。其 <code>common</code> 字段(类型为 <a href="/devices/halref/structhw__device__t.html">hw_device_t</a>)可定义 HAL 的版本号。</p>
 <h2 id="sensor_t">sensor_t</h2>
 <p><code>sensor_t</code> 表示 <a href="index.html">Android 传感器</a>。以下是 sensor_t 的一些重要字段:</p>
 <p><strong>name</strong>:表示传感器的用户可见字符串。该字符串通常包括底层传感器的部件名称、传感器的类型以及是否为唤醒传感器。例如,“LIS2HH12 Accelerometer”、“MAX21000 Uncalibrated Gyroscope”、“BMP280 Wake-up Barometer”、“MPU6515 Game Rotation Vector”。</p>
 <p><strong>handle</strong>:用于在注册到传感器或从传感器生成事件时表示传感器的整数。</p>
 <p><strong>type</strong>:传感器的类型。要详细了解传感器类型的解释,请参阅<a href="index.html">什么是 Android 传感器?</a>; 要了解官方传感器类型,请参阅<a href="sensor-types.html">传感器类型</a>。对于非官方传感器类型,<code>type</code> 必须以 <code>SENSOR_TYPE_DEVICE_PRIVATE_BASE</code> 开头。</p>
-<p><strong>stringType</strong>:传感器的类型(以字符串表示)。如果传感器为官方类型,则设置为 <code>SENSOR_STRING_TYPE_*</code>。如果传感器为制造商特定类型,<code>stringType</code> 必须以制造商的反向域名开头。例如,由 Fictional-Company 的 Cool-product 团队定义的传感器(比如 unicorn 检测器)可以使用 <code>stringType=”com.fictional_company.cool_product.unicorn_detector”</code>。<em></em>
+<p><strong>stringType</strong>:传感器的类型(以字符串表示)。如果传感器为官方类型,则设置为 <code>SENSOR_STRING_TYPE_*</code>。如果传感器为制造商特定类型,<code>stringType</code> 必须以制造商的反向域名开头。<em></em>例如,由 Fictional-Company 的 Cool-product 团队定义的传感器(比如 unicorn 检测器)可以使用 <code>stringType=”com.fictional_company.cool_product.unicorn_detector”</code>。
   <code>stringType</code> 用于唯一标识非官方传感器类型。要详细了解传感器类型和字符串类型,请参阅 <a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h">sensors.h</a>。</p>
 <p><strong>requiredPermission</strong>:代表应用要查看传感器、注册到传感器和接收传感器数据所必须具备的权限的字符串。空字符串表明应用不需要获取该传感器的任何访问权限。<a href="sensor-types.html#heart_rate">心率监测器</a>等传感器类型具有强制性的 <code>requiredPermission</code>。提供敏感用户信息(例如心率)的所有传感器必须受到权限保护。</p>
 <p><strong>flags</strong>:传感器的标记,用于定义传感器的报告模式以及传感器是否为唤醒传感器。例如,对于单次唤醒传感器,标记为 <code>flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP</code>。当前版本的 HAL 中未使用的标记位必须等于 0。</p>
@@ -164,11 +164,11 @@
 <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>
+<p><strong>fifoReservedEventCount</strong>:硬件 FIFO 中为该传感器保留的事件数。如果该传感器有专属的 FIFO,则 <code>fifoReservedEventCount</code> 是该专属 FIFO 的大小。如果该 FIFO 与其他传感器共用,则 <code>fifoReservedEventCount</code> 是为该传感器保留的 FIFO 部分的大小。对于大多数共享 FIFO 的系统以及没有硬件 FIFO 的系统,该值为 0。</p>
 <p><strong>fifoMaxEventCount</strong>:FIFO 中可为该传感器存储的最大事件数。该值总是大于或等于 <code>fifoReservedEventCount</code>。该值用于估计在假设不激活任何其他传感器的情况下,以特定速率注册到传感器时 FIFO 多快会被填满。对于没有硬件 FIFO 的系统,<code>fifoMaxEventCount</code> 为 0。要了解详情,请参阅<a href="batching.html">批量处理</a>。</p>
 <p>对于官方传感器类型的传感器,一些字段会被框架覆盖。例如,<a href="sensor-types.html#accelerometer">加速度计</a>传感器被强制使用连续报告模式,而<a href="sensor-types.html#heart_rate">心率</a>监测器被强制受 <code>SENSOR_PERMISSION_BODY_SENSORS</code> 权限的保护。</p>
 <h2 id="sensors_event_t">sensors_event_t</h2>
-<p>由 Android 传感器生成并通过 <a href="#poll">poll</a> 函数报告的传感器事件具有 <code>type sensors_event_t</code>。以下是 <code>sensors_event_t</code> 的一些重要字段:</p>
+<p>由 Android 传感器生成并通过 <a href="#poll">poll</a> 函数报告的传感器事件属于 <code>type sensors_event_t</code>。以下是 <code>sensors_event_t</code> 的一些重要字段:</p>
 <p><strong>version</strong>:必须是 <code>sizeof(struct sensors_event_t)</code></p>
 <p><strong>sensor</strong>:生成事件的传感器的句柄,由 <code>sensor_t.handle</code> 定义。</p>
 <p><strong>type</strong>:生成事件的传感器的传感器类型,由 <code>sensor_t.type</code> 定义。</p>
diff --git a/zh-cn/devices/sensors/index.html b/zh-cn/devices/sensors/index.html
index 6f67107..08e5df1 100644
--- a/zh-cn/devices/sensors/index.html
+++ b/zh-cn/devices/sensors/index.html
@@ -22,7 +22,7 @@
 
 <img style="float: right; margin: 0px 15px 15px 15px;" src="images/ape_fwk_hal_sensors.png" alt="Android 传感器 HAL 图标"/>
 
-<p>Android 传感器使应用可以访问移动设备的底层物理传感器。它们是负责提供数据的虚拟设备,由传感器硬件抽象层 (HAL) <a href="/devices/halref/sensors_8h.html">sensor.h</a> 进行定义。</p>
+<p>Android 传感器使应用可以访问移动设备的底层物理传感器。它们是负责提供数据的虚拟设备,由传感器硬件抽象层 (HAL) <a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h">sensor.h</a> 进行定义。</p>
 
 <h2 id="what_are_“android_sensors”">什么是 Android 传感器?</h2>
 <p>Android 传感器属于虚拟设备,可提供来自以下各种物理传感器的数据:加速度计、陀螺仪、磁力计、气压计、湿度传感器、压力传感器、光传感器、近程传感器和心率传感器。</p>
@@ -37,7 +37,8 @@
     </ul>
     <p>每个 Android 传感器都有一个“类型”,表示传感器的行为及其提供的数据。</p>
     <ul>
-      <li>官方 Android <a href="sensor-types.html">传感器类型</a>在 <a href="/devices/halref/sensors_8h.html">sensors.h</a> 中的 SENSOR_TYPE_ 名称下定义<ul>
+      <li>官方 Android <a href="sensor-types.html">传感器类型</a> 在 <a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h">sensors.h</a> 中的 SENSOR_TYPE_ 名称下定义:
+        <ul>
           <li>绝大多数传感器都具有官方传感器类型。</li>
           <li>这些类型记录在 Android SDK 中。</li>
 	  <li>这些类型的传感器的行为在 Android 兼容性测试套件 (CTS) 中进行测试。</li>
@@ -100,7 +101,7 @@
       </li>
       <li>硬件抽象层 (HAL)
         <ul>
-          <li> <a href="/devices/halref/sensors_8h_source.html">https://source.android.com/devices/halref/sensors_8h_source.html</a></li>
+          <li> <a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h">https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h</a></li>
           <li>也称为“sensors.h”</li>
           <li>信息来源。开发新功能时要更新的第一份文档。</li>
         </ul>
diff --git a/zh-cn/devices/sensors/sensor-types.html b/zh-cn/devices/sensors/sensor-types.html
index 35d677a..e4a8701 100644
--- a/zh-cn/devices/sensors/sensor-types.html
+++ b/zh-cn/devices/sensors/sensor-types.html
@@ -79,7 +79,7 @@
 </li>
 </ul>
 <h3 id="accelerometer">加速度计</h3>
-<p>报告模式:连续模式<em><a href="report-modes.html#continuous"></a></em></p>
+<p>报告模式:<em><a href="report-modes.html#continuous">连续模式</a></em></p>
 <p><code>getDefaultSensor(SENSOR_TYPE_ACCELEROMETER)</code> 返回一个非唤醒传感器<em></em></p>
 <p>加速度计传感器可报告设备沿 3 个传感器坐标轴的加速度。测量的加速度包括物理加速度(速度变化)和重力加速度。测量结果在 sensor_event_t.acceleration 的 x、y 和 z 字段中报告。</p>
 <p>所有值均采用国际单位制单位 (m/s^2),测量结果为设备加速度减去沿 3 个传感器坐标轴的重力加速度。</p>
@@ -97,9 +97,9 @@
   <li>在线尺度校准</li>
 </ul>
 <p>仅当传感器已禁用时,才可更新偏差校准和尺度校准,以避免流式传输时出现值激增。</p>
-<p>加速度计还通过 <code>sensors_event_t.acceleration.status</code> 报告其预测的读数精度。要详细了解此字段的可能值,请参阅 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html">SensorManager</a> 的 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html#SENSOR_STATUS_ACCURACY_HIGH"><code>SENSOR_STATUS_*  </code></a> 常量。</p>
+<p>加速度计还通过 <code>sensors_event_t.acceleration.status</code> 报告其预测的读数精度。要详细了解此字段的可能值,请参阅 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html">SensorManager</a> 的 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html#SENSOR_STATUS_ACCURACY_HIGH"><code>SENSOR_STATUS_*  </code></a>常量。</p>
 <h3 id="ambient_temperature">环境温度传感器</h3>
-<p>报告模式:<em><a href="report-modes.html#on-change">变化模式</a></em></p>
+<p>报告模式:<em><a href="report-modes.html#on-change">按变化模式</a></em></p>
 <p><code>getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE)</code> 返回一个非唤醒传感器<em></em></p>
 <p>该传感器可提供环境(室内)温度,单位是摄氏度。</p>
 <h3 id="magnetic_field_sensor">磁场传感器</h3>
@@ -127,21 +127,21 @@
   <li>出厂(或在线)尺度补偿</li>
   <li>在线偏差校准(以去除漂移)</li>
 </ul>
-<p>陀螺仪还通过 <code>sensors_event_t.gyro.status</code> 报告其预测的读数精度。要详细了解此字段的可能值,请参阅 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html">SensorManager</a> 的 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html#SENSOR_STATUS_ACCURACY_HIGH"><code>SENSOR_STATUS_*</code></a> 常量。</p>
+<p>陀螺仪还通过 <code>sensors_event_t.gyro.status</code> 报告其预测的读数精度。要详细了解此字段的可能值,请参阅 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html">SensorManager</a> 的 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html#SENSOR_STATUS_ACCURACY_HIGH"><code>SENSOR_STATUS_*</code></a>常量。</p>
 <p>陀螺仪不能基于磁力计和加速度计进行模拟,因为这样将导致局部一致性和响应速度降低。它必须基于常见的陀螺仪芯片。</p>
 <h3 id="heart_rate">心率传感器</h3>
-<p>报告模式:<em><a href="report-modes.html#on-change">变化模式</a></em></p>
+<p>报告模式:<em><a href="report-modes.html#on-change">按变化模式</a></em></p>
 <p><code>getDefaultSensor(SENSOR_TYPE_HEART_RATE)</code> 返回一个非唤醒传感器<em></em></p>
 <p>心率传感器可报告触摸设备的人员当前的心率。</p>
 <p>以每分钟心跳次数 (BPM) 表示的当前心率在 <code>sensors_event_t.heart_rate.bpm</code> 中报告,而传感器的状态在 <code>sensors_event_t.heart_rate.status</code> 中报告。要详细了解此字段的可能值,请参阅 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html">SensorManager</a> 的 <a href="https://developer.android.com/reference/android/hardware/SensorManager.html#SENSOR_STATUS_ACCURACY_HIGH"><code>SENSOR_STATUS_*</code></a> 常量。特别是在第一次激活时,除非系统已知设备未随身携带,否则首次事件的状态字段必须设置为 <code>SENSOR_STATUS_UNRELIABLE</code>。因为传感器采用变化模式,当且仅当 <code>heart_rate.bpm</code> 或 <code>heart_rate.status</code> 自上次事件后已发生变化时才会触发事件。事件生成速度不会大于每隔 <code>sampling_period</code> 一次。</p>
 <p><code>sensor_t.requiredPermission</code> 始终是 <code>SENSOR_PERMISSION_BODY_SENSORS</code>。</p>
 <h3 id="light">光线传感器</h3>
-<p>报告模式:<em><a href="report-modes.html#on-change">变化模式</a></em></p>
+<p>报告模式:<em><a href="report-modes.html#on-change">按变化模式</a></em></p>
 <p><code>getDefaultSensor(SENSOR_TYPE_LIGHT)</code> 返回一个非唤醒传感器<em></em></p>
 <p>光线传感器可报告当前照明度,采用国际单位勒克斯 (lux)。</p>
 <p>测量结果在 <code>sensors_event_t.light</code> 中报告。</p>
 <h3 id="proximity">近程传感器</h3>
-<p>报告模式:<em><a href="report-modes.html#on-change">变化模式</a></em></p>
+<p>报告模式:<em><a href="report-modes.html#on-change">按变化模式</a></em></p>
 <p>通常定义为唤醒传感器</p>
 <p><code>getDefaultSensor(SENSOR_TYPE_PROXIMITY)</code> 返回一个唤醒传感器<em></em></p>
 <p>近程传感器可报告从传感器到最近的可见表面的距离。</p>
@@ -159,14 +159,14 @@
 </ul>
 <p>气压计通常用于估算高度变化。要估算绝对高度,必须将海平面压力(随天气变化)作为参照点。</p>
 <h3 id="relative_humidity">相对湿度传感器</h3>
-<p>报告模式:<em><a href="report-modes.html#on-change">变化模式</a></em></p>
+<p>报告模式:<em><a href="report-modes.html#on-change">按变化模式</a></em></p>
 <p><code>getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY)</code> 返回一个非唤醒传感器<em></em></p>
 <p>相对湿度传感器用于测量环境空气相对湿度,并返回百分比值。</p>
 
 <h2 id="composite_sensor_types">复合传感器类型</h2>
 <p>复合传感器通过处理和/或融合来自一个或多个物理传感器的数据来生成数据。(任何非基础传感器的传感器均称为复合传感器。)复合传感器的示例包括:</p>
 <ul>
-<li><a href="#step_detector">步测器</a>和<a href="#significant_motion">大幅度动作传感器</a>,通常基于加速度计,但是也可基于其他传感器(如果功耗和精度可接受)。</li>
+<li><a href="#step_detector">步测器</a>和<a href="#significant_motion">大幅度动作传感器</a>,通常基于加速度计,但是也可基于其他传感器(如果功耗和精度可接受的话)。</li>
 <li><a href="#game_rotation_vector">游戏旋转矢量传感器</a>,基于加速度计和陀螺仪。</li>
 <li><a href="#gyroscope_uncalibrated">未校准陀螺仪</a>,类似于陀螺仪基础传感器,但是单独报告偏差校准(而非在测量结果中校正)。</li>
 </ul>
@@ -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>
@@ -214,7 +214,7 @@
   </tr>
   <tr>
     <td><p><a href="#linear_acceleration">线性加速度传感器</a></p></td>
-    <td><p>活动</p></td>
+    <td><p>活动类</p></td>
     <td><p>加速度计、陀螺仪(如有)或磁力计(如果陀螺仪不存在)</p></td>
     <td><p>连续模式</p></td>
   </tr>
@@ -232,7 +232,7 @@
   </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>
@@ -244,30 +244,30 @@
   </tr>
   <tr>
     <td><p><a href="#significant_motion">大幅度动作传感器</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="#step_counter">计步器</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="#step_detector">步测器</a> <img src="images/battery_icon.png" width="20" height="20" alt="低功耗传感器"/></p></td> <td><p>活动</p></td>
+    <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><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>
@@ -275,7 +275,7 @@
 <p><img src="images/battery_icon.png" width="20" height="20" alt="低功耗传感器"/> = 低功耗传感器</p>
 <h2 id="activity_composite_sensors">活动复合传感器</h2>
 <h3 id="linear_acceleration">线性加速度传感器</h3>
-<p>底层物理传感器:加速度计和(如有)陀螺仪(或如果陀螺仪不存在,则使用磁力计)</p>
+<p>底层物理传感器:加速度计和(如有)陀螺仪(如果陀螺仪不存在,则使用磁力计)</p>
 <p>报告模式:<em><a href="report-modes.html#continuous">连续模式</a></em></p>
 <p><code>getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION)</code> 返回一个非唤醒传感器<em></em></p>
 <p>线性加速度传感器可报告传感器框架内设备的线性加速度(不包括重力加速度)。</p>
@@ -321,7 +321,7 @@
 <p>每个传感器事件在 <code>sensors_event_t.data[0]</code> 中报告 1</p>
 <h3 id="step_counter">计步器</h3>
 <p>底层物理传感器:加速度计(可能还有其他低功耗计量器)</p>
-<p>报告模式:<em><a href="report-modes.html#on-change">变化模式</a></em></p>
+<p>报告模式:<em><a href="report-modes.html#on-change">按变化模式</a></em></p>
 <p>低功耗</p>
 <p><code>getDefaultSensor(SENSOR_TYPE_STEP_COUNTER)</code> 返回一个非唤醒传感器<em></em></p>
 <p>计步器报告自激活后上一次重新启动以来用户行走的步数。</p>
@@ -487,6 +487,7 @@
 <p>仅实现该传感器的唤醒版本。</p>
 <p><code>getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE)</code> 返回一个唤醒传感器<em></em></p>
 <p>快览手势传感器可短暂开启屏幕,方便用户使用特定动作浏览屏幕内容。当该传感器被触发时,设备将短暂开启屏幕,让用户可以在设备处于锁定且非互动状态(低电耗模式)时浏览通知或其他内容,然后屏幕将再次关闭。用户可在设备设置中禁用这种行为(当该传感器被触发时,短暂开启屏幕)。更改设置不会影响传感器的行为:仅改变当该传感器被触发时,Android 框架是否短暂开启屏幕。未指定待检测的实际手势,可由设备制造商进行选择。</p>
-<p>该传感器必须具备低功耗特性,因为它可能全天候开启。每个传感器事件在 <code>sensors_event_t.data[0]</code> 中报告 1。</p>
+<p>该传感器必须具备低功耗特性,因为它可能全天候开启。
+  每个传感器事件在 <code>sensors_event_t.data[0]</code> 中均报告 1。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/sensors/versioning.html b/zh-cn/devices/sensors/versioning.html
index 304b528..7a7dae5 100644
--- a/zh-cn/devices/sensors/versioning.html
+++ b/zh-cn/devices/sensors/versioning.html
@@ -39,7 +39,7 @@
 
 <p>即使您没有实现批处理(您的硬件没有 FIFO),您也必须实现 <code>batch</code> 函数。<code>batch</code> 用于设置指定传感器的采样周期和最大报告延迟时间。它取代了 <code>setDelay</code>。<code>setDelay</code> 将不再被调用。</p>
 
-<p>如果您不实现批处理,则可以利用提供的 <code>sampling_period_ns</code> 参数通过仅调用现有的 <code>setDelay</code> 函数来实现 <code>batch</code>。</p>
+<p>如果您没有实现批处理,则可以利用提供的 <code>sampling_period_ns</code> 参数通过仅调用现有的 <code>setDelay</code> 函数来实现 <code>batch</code>。</p>
 
 <h2>实现 Flush 函数</h2>
 
@@ -93,7 +93,7 @@
 
 <p><em></em>maxDelay:这个值很重要,您将需要根据传感器及其驱动程序的功能对此字段进行设置。</p>
 
-<p>仅对连续 (continuous) 和中断 (on-change) 模式下的传感器定义此值。此值是两个传感器事件之间的延迟时间,其中传感器事件对应传感器支持的最低频率。当通过 <code>batch</code> 函数请求较低的频率时,将以该频率生成事件。框架或应用可以用它来预测批处理 FIFO 可能存满的时间。如果此值设置不正确,CTS 将失败。对于单次 (one-shot) 和特殊 (special) 报告模式下的传感器,请将 <code>maxDelay</code> 设置为 0。</p>
+<p>仅对连续 (continuous) 和中断 (on-change) 模式下的传感器定义此值。此值是两个传感器事件之间的延迟时间,对应传感器支持的最低频率。当通过 <code>batch</code> 函数请求较低的频率时,将以该频率生成事件。框架或应用可以用它来预测批处理 FIFO 可能存满的时间。如果此值设置不正确,CTS 将失败。对于单次 (one-shot) 和特殊 (special) 报告模式下的传感器,请将 <code>maxDelay</code> 设置为 0。</p>
 
 <p>对于连续模式下的传感器,请将此字段设置为允许的最大采样周期(以微秒为单位)。</p>
 
@@ -107,9 +107,9 @@
 
 <p>如果您不实施批处理,只是从 1.0 升级到 1.3,请将此字段设置为:</p>
 
-<p><code>SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE</code> - <a href="/devices/sensors/report-modes.html#one-shot">单次 (one-shot)</a> 传感器</p>
+<p><code>SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE</code> - <a href="/devices/sensors/report-modes.html#one-shot">单次模式</a>传感器</p>
 
-<p><code>SENSOR_FLAG_CONTINUOUS_MODE</code> - <a href="/devices/sensors/report-modes.html#continuous">连续 (continuous)</a> 传感器;<code>SENSOR_FLAG_ON_CHANGE_MODE</code> - <a href="/devices/sensors/report-modes.html#on-change">中断 (on-change)</a> 传感器(<a href="#proximity">近程</a>传感器除外);<code>SENSOR_FLAG_SPECIAL_REPORTING_MODE</code> - <a href="/devices/sensors/report-modes.html#special">特殊 (special)</a> 传感器(<a href="/devices/sensors/sensor-types.html#tilt_detector">倾斜探测器</a>传感器除外)。</p>
+<p><code>SENSOR_FLAG_CONTINUOUS_MODE</code> - <a href="/devices/sensors/report-modes.html#continuous">连续模式</a>传感器;<code>SENSOR_FLAG_ON_CHANGE_MODE</code> - <a href="/devices/sensors/report-modes.html#on-change">变化模式</a>传感器(<a href="#proximity">近程</a>传感器除外);<code>SENSOR_FLAG_SPECIAL_REPORTING_MODE</code> - <a href="/devices/sensors/report-modes.html#special">特殊</a>报告模式传感器(<a href="/devices/sensors/sensor-types.html#tilt_detector">倾斜探测器</a>传感器除外)。</p>
 
 <p><code>SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE</code> - <a href="/devices/sensors/sensor-types.html#proximity">近程</a>传感器和 Android 官方<a href="/devices/sensors/sensor-types.html#tilt_detector">倾斜探测器</a>传感器。</p>
 
diff --git a/zh-cn/devices/storage/config-example.html b/zh-cn/devices/storage/config-example.html
index 02424e3..5be65e4 100644
--- a/zh-cn/devices/storage/config-example.html
+++ b/zh-cn/devices/storage/config-example.html
@@ -28,29 +28,33 @@
 <p>这是 Nexus One 等具有单一外部存储设备(一种物理 SD 卡)的设备的典型配置。</p>
 <p>首先,原始物理设备必须装载在 <code>/mnt/media_rw</code>(仅系统和 FUSE 守护进程可以访问该位置)下。然后,当插入/移除媒体时,<code>vold</code> 将管理 <code>fuse_sdcard0</code> 服务。
 </p><h4>fstab.hardware</h4>
-<pre><code>[physical device node]  auto  vfat  defaults  voldmanaged=sdcard0:auto,noemulatedsd
-</code></pre>
+<pre class="devsite-click-to-copy">
+[physical device node]  auto  vfat  defaults  voldmanaged=sdcard0:auto,noemulatedsd
+</pre>
 <h4>init.hardware.rc</h4>
-<pre><code>on init
+<pre class="devsite-click-to-copy">
+on init
     mkdir /mnt/media_rw/sdcard0 0700 media_rw media_rw
     mkdir /storage/sdcard0 0700 root root
     export EXTERNAL_STORAGE /storage/sdcard0
 service fuse_sdcard0 /system/bin/sdcard -u 1023 -g 1023 -d /mnt/media_rw/sdcard0 /storage/sdcard0
     class late_start
     disabled
-</code></pre>
+</pre>
 <h4>storage_list.xml</h4>
-<pre><code>&lt;storage
+<pre class="devsite-click-to-copy">
+&lt;storage
     android:mountPoint="/storage/sdcard0"
     android:storageDescription="@string/storage_sd_card"
     android:removable="true"
     android:primary="true"
     android:maxFileSize="4096" /&gt;
-</code></pre>
+</pre>
 <h3 id="android_5_x_emulated">仅主要模拟存储</h3>
 <p>这是 Nexus 4 等具有单一外部存储设备(由设备上的内部存储设备提供支持)的设备的典型配置。</p>
 <h4>init.hardware.rc</h4>
-<pre><code>on init
+<pre class="devsite-click-to-copy">
+on init
     mkdir /mnt/shell/emulated 0700 shell shell
     mkdir /storage/emulated 0555 root root
     export EXTERNAL_STORAGE /storage/emulated/legacy
@@ -60,21 +64,24 @@
     setprop ro.crypto.fuse_sdcard true
 service sdcard /system/bin/sdcard -u 1023 -g 1023 -l /data/media /mnt/shell/emulated
     class late_start
-</code></pre>
+</pre>
 <h4>storage_list.xml</h4>
-<pre><code>&lt;storage
+<pre class="devsite-click-to-copy">
+&lt;storage
     android:storageDescription="@string/storage_internal"
     android:emulated="true"
     android:mtpReserve="100" /&gt;
-</code></pre>
+</pre>
 <h3 id="android_5_x_both">模拟存储为主,物理存储为辅</h3>
 <p>这是 Xoom 等具有多个外部存储设备(其中主要设备由设备上的内部存储设备提供支持,辅助设备是物理 SD 卡)的设备的典型配置。</p>
 <p>首先,原始物理设备必须装载在 <code>/mnt/media_rw</code>(仅系统和 FUSE 守护进程可以访问该位置)下。然后,当插入/移除媒体时,<code>vold</code> 将管理 <code>fuse_sdcard1</code> 服务。</p>
 <h4>fstab.hardware</h4>
-<pre><code>[physical device node]  auto  vfat  defaults  voldmanaged=sdcard1:auto
-</code></pre>
+<pre class="devsite-click-to-copy">
+[physical device node]  auto  vfat  defaults  voldmanaged=sdcard1:auto
+</pre>
 <h4>init.hardware.rc</h4>
-<pre><code>on init
+<pre class="devsite-click-to-copy">
+on init
     mkdir /mnt/shell/emulated 0700 shell shell
     mkdir /storage/emulated 0555 root root
     mkdir /mnt/media_rw/sdcard1 0700 media_rw media_rw
@@ -90,9 +97,10 @@
 service fuse_sdcard1 /system/bin/sdcard -u 1023 -g 1023 -w 1023 -d /mnt/media_rw/sdcard1 /storage/sdcard1
     class late_start
     disabled
-</code></pre>
+</pre>
 <h4>storage_list.xml</h4>
-<pre><code>&lt;storage
+<pre class="devsite-click-to-copy">
+&lt;storage
     android:storageDescription="@string/storage_internal"
     android:emulated="true"
     android:mtpReserve="100" /&gt;
@@ -101,20 +109,22 @@
     android:storageDescription="@string/storage_sd_card"
     android:removable="true"
     android:maxFileSize="4096" /&gt;
-</code></pre>
+</pre>
 
 <h2 id="android_6">Android 6.0</h2>
 <h3 id="android_6_physical">仅主要物理存储</h3>
 <p>这是原始 Android One 等具有单一外部存储设备(一种物理 SD 卡)的设备的典型配置。这种配置没有辅助共享存储空间,且设备不支持多用户。</p>
 <h4>fstab.device</h4>
-<pre><code>/devices/platform/mtk-msdc.1/mmc_host*         auto        auto       defaults
+<pre class="devsite-click-to-copy">
+/devices/platform/mtk-msdc.1/mmc_host*         auto        auto       defaults
 voldmanaged=sdcard0:auto,encryptable=userdata,noemulatedsd
-</code></pre>
+</pre>
 <h4>init.device.rc</h4>
-<pre><code>on init
+<pre class="devsite-click-to-copy">
+on init
     # By default, primary storage is physical
     setprop ro.vold.primary_physical 1
-    </code></pre>
+</pre>
 <h3 id="android_6_emulated">仅主要模拟存储</h3>
 <p>这是 Nexus 6 等具有单一外部存储设备(由设备上的内部存储设备提供支持)的设备的典型配置。</p>
 <ul>
@@ -124,8 +134,9 @@
   </li><li>支持多用户。
 </li></ul>
 <h4>fstab.device</h4>
-<pre><code>/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
-                                                    voldmanaged=usb:auto</code></pre>
+<pre class="devsite-click-to-copy">/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
+                                                    voldmanaged=usb:auto
+</pre>
 <h3 id="android_6_both">模拟存储为主,物理存储为辅</h3>
 <p>这是 Xoom 等具有多个外部存储设备(其中主要设备由设备上的内部存储设备提供支持,辅助设备是物理 SD 卡)的设备的典型配置。</p>
 <ul>
@@ -134,8 +145,9 @@
   </li><li>支持多用户。
 </li></ul>
 <h4>fstab.device</h4>
-<pre><code>/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
+<pre class="devsite-click-to-copy">
+/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
 voldmanaged=sdcard1:auto,encryptable=userdata
-</code></pre>
+</pre>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/storage/faster-stats.html b/zh-cn/devices/storage/faster-stats.html
new file mode 100644
index 0000000..2cf4883
--- /dev/null
+++ b/zh-cn/devices/storage/faster-stats.html
@@ -0,0 +1,78 @@
+<html devsite><head>
+    <title>更快地获得存储统计信息</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+在早期版本的 Android 中,系统会遍历特定应用拥有的所有文件以测量磁盘使用情况。此手动测量过程可能需要几分钟的计算时间,然后才能在“设置”中向用户显示结果。
+</p>
+<p>
+此外,清除缓存数据文件的内部算法仅查看所有应用的修改时间。这使得恶意应用可以通过将修改时间设置在遥远的未来以使其不当地拥有高于其他应用的优先级,从而降低整体用户体验。
+</p>
+<p>
+为了提升这些体验,Android 8.0 会询问是否利用 ext4 文件系统的“配额”支持来几乎即时地返回磁盘使用情况统计信息。此配额功能还可以防止任何单个应用使用超过 90% 的磁盘空间或 50% 的索引节点,从而提高系统的稳定性。
+</p>
+<h2 id="implementation">实现</h2>
+<p>
+配额功能是 <code>installd</code> 默认实现的一部分。
+在特定文件系统上启用配额功能后,<code>installd</code> 会自动使用该功能。如果在所测量的块设备上未启用或不支持配额功能,则系统将自动且透明地恢复手动计算方式。
+</p>
+<p>
+要在特定块设备上启用配额支持,请执行以下操作:
+</p>
+<ol>
+<li>启用 <code>CONFIG_QUOTA</code>、<code>CONFIG_QFMT_V2</code> 和 <code>CONFIG_QUOTACTL</code> 内核选项。</li>
+<li>将 <code>quota</code> 选项添加到 fstab 文件中的 userdata 分区:
+<pre>
+/dev/block/platform/soc/624000.ufshc/by-name/userdata   /data
+ext4    noatime,nosuid,nodev,barrier=1,noauto_da_alloc
+latemount,wait,check,formattable,fileencryption=ice<strong>,quota</strong></pre>
+</li>
+</ol>
+<p>
+您可以在现有设备上安全地启用或停用 <code>fstab</code> 选项。在更改 <code>fstab</code> 选项后的第一次启动过程中,<code>fsmgr</code> 会强制执行 <code>fsck</code> 传递以更新所有配额数据结构,这可能会导致首次启动时间稍长。后续启动不会受到影响。
+</p>
+<p>
+配额支持仅在 ext4 和 Linux 3.18 或更高版本上进行了测试。如果在其他文件系统或者较旧的内核版本上启用,设备制造商将负责测试和检查统计信息的正确性。
+</p>
+<p>
+不需要特殊硬件支持。
+</p>
+<h2 id="validation">验证</h2>
+<p>
+<code>StorageHostTest</code> 下包含 CTS 测试,它们可使用用于测量磁盘使用情况的公共 API。无论是否启用了配额支持,这些 API 都应返回正确的值。
+</p>
+<h3 id="debugging">调试</h3>
+<p>
+测试应用通过为空间大小使用唯一的质数来仔细分配磁盘空间区域。调试这些测试时,请使用此质数来确定任何差异的原因。例如,如果增量为 11MB 的测试失败了,请检查 <code>Utils.useSpace()</code> 方法以查看 11MB blob 是否存储在 <code>getExternalCacheDir()</code> 中。
+</p>
+<p>
+还有一些可能对调试有用的内部测试,但它们可能需要停用安全检查才能通过:
+</p>
+
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">runtest -x frameworks/base/services/tests/servicestests/ \
+  src/com/android/server/pm/InstallerTest.java</code>
+<code class="devsite-terminal">adb shell /data/nativetest64/installd_utils_test/installd_utils_test</code>
+<code class="devsite-terminal">adb shell /data/nativetest64/installd_cache_test/installd_cache_test</code>
+<code class="devsite-terminal">adb shell /data/nativetest64/installd_service_test/installd_service_test</code>
+</pre>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/storage/index.html b/zh-cn/devices/storage/index.html
index 7e1482a..af0d1ec 100644
--- a/zh-cn/devices/storage/index.html
+++ b/zh-cn/devices/storage/index.html
@@ -20,10 +20,10 @@
       limitations under the License.
   -->
 
-<img style="float: right; margin: 0px 15px 15px 15px;" src="images/ape_fwk_hal_extstor.png" alt="Android external storage HAL icon"/>
+<img style="float: right; margin: 0px 15px 15px 15px;" src="images/ape_fwk_hal_extstor.png" alt="Android 外部存储设备 HAL 图标"/>
 <p>Android 一直在不断发展,可支持各种存储设备类型和功能。所有 Android 版本均支持配有<a href="/devices/storage/traditional.html">传统存储</a>(包括便携式存储和内置存储)的设备。便携式存储是指物理介质(如 SD 卡或 USB 设备),用于进行临时数据传输/文件存储。<em></em>物理介质可以随设备一起保留更长时间,但并非固定在设备上,可以移除。自 Android 1.0 开始,SD 卡已可用作便携式存储;Android 6.0 增加对 USB 的支持。“内置”存储可通过将部分内部存储暴露于模拟层来实现存储,并且从 Android 3.0 开始便已支持此功能。<em></em></p>
 
-<p>从 Android 6.0 开始,Android 支持<a href="/devices/storage/adoptable.html">适配的存储设备</a>,此类存储是指物理介质(如 SD 卡或 USB 设备),已进行加密和格式化,能像内部存储一样运行。<em></em>适配的存储设备可存储各类应用数据。</p>
+<p>从 Android 6.0 开始,Android 支持<a href="/devices/storage/adoptable.html">适配<em></em>的存储设备</a>,这类存储是指物理介质(如 SD 卡或 USB 设备),已进行加密和格式化,能像内部存储一样运行。适配的存储设备可存储各类应用数据。</p>
 
 <h2 id="permissions">权限</h2>
 <p>采用各种 Android 权限保护对外部存储设备的访问。从 Android 1.0 开始,采用 <code>WRITE_EXTERNAL_STORAGE</code> 权限保护写入访问。从 Android 4.1 开始,采用 <code>READ_EXTERNAL_STORAGE</code> 权限保护读取访问。</p>
@@ -43,6 +43,6 @@
 
 <p>用于实现此特性的 <code>setns()</code> 功能至少需要运行 Linux 3.8,但补丁程序已反向移植至 Linux 3.4。<code>PermissionsHostTest</code> CTS 测试可用于验证内核行为是否正确。</p>
 
-<p>在 Android 6.0 中,第三方应用无权访问 <code>sdcard_r</code> 和 <code>sdcard_rw</code> GID。相反,访问通过仅为该应用装载适当的运行时视图来控制。用户间交互使用 <code>everybody</code> GID 来阻止。</p>
+<p>在 Android 6.0 中,第三方应用无权访问 <code>sdcard_r</code> 和 <code>sdcard_rw</code> GID。相反,访问通过仅为该应用装载适当的运行时视图来控制。系统会使用 <code>everybody</code> GID 来阻止用户间交互。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/admin/enterprise-telephony.html b/zh-cn/devices/tech/admin/enterprise-telephony.html
index 4945f03..a7e4ef6 100644
--- a/zh-cn/devices/tech/admin/enterprise-telephony.html
+++ b/zh-cn/devices/tech/admin/enterprise-telephony.html
@@ -38,7 +38,7 @@
 </p>
 
 <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>
@@ -52,14 +52,13 @@
 <h3 id="cross-profile-contact-search">跨资料联系人搜索</h3>
 
 <p>
-跨资料联系人搜索应该使用 Enterprise Contacts API(<code>ContactsContract.Contacts.ENTERPRISE_CONTENT_FILTER_URI</code> 等)实现。该 API 可在 Android EMM 开发者网站上的 <a href="http://developer.android.com/preview/features/afw.html#contacts">EMM 开发者概览</a>中找到。
+跨资料联系人搜索应使用 Enterprise Contacts API(<code>ContactsContract.Contacts.ENTERPRISE_CONTENT_FILTER_URI</code> 等)来实现。该 API 可在 Android EMM 开发者网站上的 <a href="http://developer.android.com/preview/features/afw.html#contacts">EMM 开发者概览</a>中找到。
 </p>
 
 <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 c04559b..8278ab0 100644
--- a/zh-cn/devices/tech/admin/implement.html
+++ b/zh-cn/devices/tech/admin/implement.html
@@ -67,7 +67,7 @@
 <h3 id="uses-feature">Uses-feature</h3>
 <p>设备必须定义以下 <code>uses-feature</code>:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 android.software.managed_users
 android.software.device_admin
 </pre>
@@ -77,15 +77,19 @@
 <h3 id="required_apps">仅限基本应用</h3>
 <p>默认情况下,在配置托管设备时,只能启用资料正确运行所必需的应用。原始设备制造商 (OEM) 必须通过修改以下文件确保托管资料或设备具有所有必需的应用:</p>
 
-<pre>vendor_required_apps_managed_profile.xml
+<pre class="devsite-click-to-copy">
+vendor_required_apps_managed_profile.xml
 vendor_required_apps_managed_device.xml
 </pre>
 
 <p>Nexus 设备的示例:</p>
 
-<p><code>packages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_device.xml</code></p>
+<pre class="devsite-click-to-copy">
+packages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_device.xml
+</pre>
 
-<pre>&lt;resources&gt;
+<pre class="devsite-click-to-copy">
+&lt;resources&gt;
   &lt;!-- A list of apps to be retained on the managed device --&gt;
   &lt;string-array name="vendor_required_apps_managed_device"&gt;
     &lt;item&gt;com.android.vending&lt;/item&gt; &lt;!--­Google Play --&gt;
@@ -98,11 +102,11 @@
 &lt;/resources&gt;
 </pre>
 
-<p><code>
+<pre class="devsite-click-to-copy">
 packages/apps/ManagedProvisioning/res/values/vendor_required_apps_managed_profile.xml
-</code></p>
+</pre>
 
-<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;
     &lt;string-array name="vendor_required_apps_managed_profile"&gt;
@@ -121,8 +125,12 @@
 
 <p>NFC 设备必须在“开箱即用”的过程(即安装向导)中启用 NFC,并配置为接受托管配置 Intent:</p>
 
-<p><code>packages/apps/Nfc/res/values/provisioning.xml</code></p>
-<pre>&lt;bool name="enable_nfc_provisioning"&gt;true&lt;/bool&gt;
+<pre class="devsite-click-to-copy">
+packages/apps/Nfc/res/values/provisioning.xml
+</pre>
+
+<pre class="devsite-click-to-copy">
+&lt;bool name="enable_nfc_provisioning"&gt;true&lt;/bool&gt;
 &lt;item&gt;application/com.android.managedprovisioning&lt;/item&gt;
 </pre>
 
@@ -130,9 +138,10 @@
 
 <p>支持“开箱即用”过程(即安装向导)的设备应实现设备所有者配置功能。当“开箱即用”过程开始时,应检查其他进程(如设备所有者配置)是否已经完成用户设置,如果已完成,则应触发返回主屏幕的 Intent 完成设置。配置应用会捕获此 Intent,然后将控制权交给新设置的设备所有者。</p>
 
-<p>要满足设置要求,请将以下代码添加到设备设置的主要活动中:</p>
+<p>要满足设置要求,请将以下代码添加到设备设置的主 Activity 中:</p>
 
-<pre>@Override
+<pre class="devsite-click-to-copy">
+@Override
    protected void onStart() {
         super.onStart();
 
diff --git a/zh-cn/devices/tech/admin/provision.html b/zh-cn/devices/tech/admin/provision.html
index a77e73d..8d1680d 100644
--- a/zh-cn/devices/tech/admin/provision.html
+++ b/zh-cn/devices/tech/admin/provision.html
@@ -30,7 +30,7 @@
 
 <p>托管配置是一个框架式界面流程,用于确保用户充分了解设置设备所有者或受管理资料的含义。它旨在充当受管理资料的设置向导。</p>
 
-<p class="note"><strong>注意</strong>:只能为未配置的设备设置设备所有者。如果 <code>Settings.Secure.USER_SETUP_COMPLETE</code> 已设置,则设备被视为已配置,不能再设置设备所有者。</p>
+<p class="note"><strong>注意</strong>:只能为未配置的设备设置设备所有者。如果已设置 <code>Settings.Secure.USER_SETUP_COMPLETE</code>,则设备被视为已配置,不能再设置设备所有者。</p>
 
 <p>如果启用设备的默认加密功能,则设备的管理配置流程会相当简单和快速。受管理配置组件会:</p>
 
@@ -55,15 +55,16 @@
 
 <p>资料所有者配置假定设备的用户(而不是公司 IT 部门)监督设备管理。要启用资料所有者配置,您必须发送包含相应附加内容的 intent。例如,使用 TestDPC 应用(<a href="https://play.google.com/store/apps/details?id=com.afwsamples.testdpc&hl=zh-cn">从 Google Play 下载</a>或<a href="https://github.com/googlesamples/android-testdpc/">从 GitHub 构建</a>)。在设备上安装 TestDPC,从启动器启动该应用,然后按照应用说明进行操作。启动器抽屉式导航栏中出现带有标记的图标时,则表示配置完成。</p>
 
-<p>移动设备管理 (MDM) 应用通过发送包含操作的 intent 来触发受管理资料的创建:<a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/admin/DevicePolicyManager.java">DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE</a>。以下是触发受管理资料创建并将 DeviceAdminSample 设为资料所有者的示例 intent:</p>
+<p>移动设备管理 (MDM) 应用通过发送包含以下操作的 intent 来触发受管理资料的创建:<a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/admin/DevicePolicyManager.java">DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE</a>。以下是触发受管理资料创建并将 DeviceAdminSample 设为资料所有者的示例 intent:</p>
 
-<pre>adb shell am start -a android.app.action.PROVISION_MANAGED_PROFILE \
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb shell am start -a android.app.action.PROVISION_MANAGED_PROFILE \
           -c android.intent.category.DEFAULT \
 	      -e wifiSsid $(printf '%q' \"WifiSSID\") \
           -e deviceAdminPackage "com.google.android.deviceadminsample" \
 	      -e android.app.extra.deviceAdminPackageName $(printf '%q'
                         .DeviceAdminSample\$DeviceAdminSampleReceiver) \
-	      -e android.app.extra.DEFAULT_MANAGED_PROFILE_NAME "My Organisation"
+              -e android.app.extra.DEFAULT_MANAGED_PROFILE_NAME "My Organisation"</code>
 </pre>
 
 <h2 id="device_owner_provisioning_via_nfc">设备所有者配置</h2>
@@ -74,7 +75,7 @@
 
 <p>典型的 NFC 包包括以下内容:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
                 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME
                 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LOCATION
                 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
@@ -84,8 +85,10 @@
 
 <p>设备必须将 NFC 配置为接受来自设置体验的托管配置 Mimetype:</p>
 
-<pre>/packages/apps/Nfc/res/values/provisioning.xml
-
+<pre class="devsite-click-to-copy">
+/packages/apps/Nfc/res/values/provisioning.xml
+</pre>
+<pre class="devsite-click-to-copy">
       &lt;bool name="enable_nfc_provisioning"&gt;true&lt;/bool&gt;
       &lt;item&gt;application/com.android.managedprovisioning&lt;/item&gt;
 </pre>
diff --git a/zh-cn/devices/tech/admin/testing-provision.html b/zh-cn/devices/tech/admin/testing-provision.html
index e7ac5b8..af8cd38 100644
--- a/zh-cn/devices/tech/admin/testing-provision.html
+++ b/zh-cn/devices/tech/admin/testing-provision.html
@@ -30,20 +30,22 @@
 <h2 id="download_source">下载源代码</h2>
 <p>按照<a href="/source/downloading.html">下载源代码</a>中的步骤下载 AfW 自动化测试框架源代码。AfW 自动化测试框架源代码位于 <code>./test/AfwTestHarness</code> 项目中。要下载的 AfW 自动化测试框架版本取决于分支名称(每个 Android 平台都有其单独的 AfW 自动化测试框架版本)。Android 7.0 的分支名称为 <code>afw-test-harness-nougat-dev</code>。要初始化该分支的 Repo 并下载源代码,请使用:</p>
 
-<pre>
-$ mkdir WORKING_DIRECTORY
-$ cd WORKING_DIRECTORY
-$ git config --global user.name "Your Name"
-$ git config --global user.email "[email protected]"
-$ repo init -u https://android.googlesource.com/platform/manifest -b afw-test-harness-nougat-dev
-$ repo sync -j24
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">mkdir WORKING_DIRECTORY</code>
+<code class="devsite-terminal">cd WORKING_DIRECTORY</code>
+<code class="devsite-terminal">git config --global user.name "Your Name"</code>
+<code class="devsite-terminal">git config --global user.email "[email protected]"</code>
+<code class="devsite-terminal">repo init -u https://android.googlesource.com/platform/manifest -b afw-test-harness-nougat-dev</code>
+<code class="devsite-terminal">repo sync -j24</code>
 </pre>
 
 <p>要查看不同版本的源代码,请用相应标签指定分支。可用的分支包括:</p>
 
 <table>
 <tbody><tr>
-<th>分支名称</th><th>支持的 Android 平台</th></tr>
+<th>分支名称</th>
+<th>支持的 Android 平台</th>
+</tr>
 <tr>
 <td>afw-test-harness-nougat-dev</td>
 <td>Android 7.0</td>
@@ -67,9 +69,9 @@
 <h3 id="view_studio">在 Android Studio 中查看</h3>
 <p>要在 Android Studio 中查看和修改 AfW 源代码,请执行以下操作:</p>
 <ol>
-<li>运行以下命令:<pre>
-$ make idegen
-$ development/tools/idegen/idegen.sh
+<li>运行以下命令:<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">make idegen</code>
+<code class="devsite-terminal">development/tools/idegen/idegen.sh</code>
 </pre>
 </li>
 <li>在 Android Studio 中打开 <code>android.ipr</code>。</li>
@@ -80,12 +82,13 @@
 <h2 id="config_harness">配置 AfW 自动化测试框架</h2>
 <p>通过配置 <code>test/AfwTestHarness/afw-test.props</code>,您可以自定义自动化测试框架。要成功运行自动化测试框架,请按照以下步骤操作:</p>
 <ol>
-<li>使用以下属性在 <code>afw-test.props</code> 中配置 WLAN 网络:<pre>wifi_ssid
+<li>使用以下属性在 <code>afw-test.props</code> 中配置 WLAN 网络:<pre class="devsite-click-to-copy">
+wifi_ssid
 wifi_password (optional)
 wifi_security_type (optional, available options are: NONE, WEP or WPA)
 </pre>
 </li>
-<li>从与 Test DPC(充当设备策略控制器)绑定的一个域中获取至少一个帐号。使用以下属性在 <code>afw-test.props</code> 中指定详细信息:<pre>
+<li>从与 Test DPC(充当设备策略控制器)绑定的一个域中获取至少一个帐号。使用以下属性在 <code>afw-test.props</code> 中指定详细信息:<pre class="devsite-click-to-copy">
 work_account_username
 work_account_password
 </pre>
@@ -95,23 +98,29 @@
 
 <h2 id="build_harness">编译 AfW 自动化测试框架</h2>
 <p>使用以下命令初始化编译配置:</p>
-<pre>
-$ source build/envsetup.sh
-$ lunch
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">source build/envsetup.sh</code>
+<code class="devsite-terminal">lunch</code>
 </pre>
 
 <p>选择设备类型,然后按 <strong>Enter</strong> 键。</p>
 
 <p>使用以下命令编译自动化测试框架:</p>
-<pre>$ make afw-test-harness -j32</pre>
+<pre class="devsite-terminal devsite-click-to-copy">
+make afw-test-harness -j32
+</pre>
 <p>该操作将创建一个目录 (<code>out/host/linux-x86/afw-th/android-cts</code>),该目录包含运行自动化测试框架所需的全部二进制文件、配置文件和工具。该目录还会被压缩在一个文件 (<code>out/host/linux-x86/afw-th/android-afw-test-harness.zip</code>) 中以供分发。</p>
 
 <h2 id="run_harness">运行 AfW 自动化测试框架</h2>
 <p>请按照以下步骤运行 AfW 自动化测试框架:</p>
 <ol>
-<li>使用以下命令,在您的编译环境中启动测试运行程序:<pre>$ afw-test-tradefed</pre>
+<li>使用以下命令,在您的编译环境中启动测试运行程序:<pre class="devsite-terminal devsite-click-to-copy">
+afw-test-tradefed
+</pre>
 该操作将启动 <code>cts-tf</code> 控制台,并从 <code>out/host/linux-x86/afw-th/android-cts</code> 中加载测试计划、测试用例和 <code>afw-test.props</code>。</li>
-<li>使用以下命令,从 <code>android-afw-test-harness.zip</code> 的解压缩文件夹中启动测试运行程序:<pre>$ cts-tf &gt; ./android‐cts/tools/afw-test‐tradefed</pre>
+<li>使用以下命令,从 <code>android-afw-test-harness.zip</code> 的解压缩文件夹中启动测试运行程序:<pre class="devsite-click-to-copy">
+cts-tf&gt; ./android‐cts/tools/afw-test‐tradefed
+</pre>
 该操作将从 <code>android-cts</code> 目录中加载测试计划、测试用例和 <code>afw-test.props</code>。
 请确保 <code>./android‐cts/repository/testcases/afw-test.props</code> 拥有工作帐号和 WLAN 配置。</li>
 
@@ -120,10 +129,13 @@
 <li><code><strong>afw-user-build</strong></code>。该计划在 user 版本中运行,但要求对测试设备进行正确设置,其中包括完成初始设置以及启用 USB 调试。</li>
 </ul>
 
-<br />要运行测试计划 <code>afw-userdebug-build</code>,请使用:<pre>$ cts-tf &gt; run cts --plan afw-userdebug-build</pre>要查看所有测试计划,请使用命令 <code>list plans</code>。要查看计划定义,请参阅 <code>out/host/linux-x86/afw-th/android-cts/repository/plans</code>。
+<br />要运行测试计划 <code>afw-userdebug-build</code>,请使用:<pre class="devsite-click-to-copy">
+cts-tf&gt; run cts --plan afw-userdebug-build
+</pre>要查看所有测试计划,请使用命令 <code>list plans</code>。要查看计划定义,请参阅 <code>out/host/linux-x86/afw-th/android-cts/repository/plans</code>。
 <br />
 </li>
-<li>运行测试包。要运行单个测试包,请使用:<pre>$ cts-tf &gt; run cts --package com.android.afwtest.NfcProvisioning
+<li>运行测试包。要运行单个测试包,请使用:<pre class="devsite-click-to-copy">
+cts-tf&gt; run cts --package com.android.afwtest.NfcProvisioning
 </pre>要查看所有测试包,请使用命令 <code>list packages</code>。要查看更多选项,请使用命令 <code>run cts --help</code>。</li>
 </ol>
 
@@ -132,12 +144,19 @@
 <ul>
 
 <li>使用 <code>-l INFO</code> 或 <code>-l
-DEBUG</code> 标记显示更多信息。示例:<pre>$ cts-tf &gt; run cts ‐‐plan afw-userdebug-build -l DEBUG</pre></li>
-
-<li>在具有 <code>-s</code> 标记的设备上运行自动化测试框架。示例:<pre>$ cts-tf &gt; run cts ‐‐plan afw-userdebug-build -l DEBUG -s device_sn</pre>
+DEBUG</code> 标记显示更多信息。示例:<pre class="devsite-click-to-copy">
+cts-tf&gt; run cts ‐‐plan afw-userdebug-build -l DEBUG
+</pre>
 </li>
 
-<li>在具有 <code>--all-devices</code> 标记的所有连接设备上运行自动化测试框架。示例:<pre>$ cts-tf &gt; run cts ‐‐plan afw-userdebug-build -l DEBUG --all-devices</pre>
+<li>在具有 <code>-s</code> 标记的设备上运行自动化测试框架。示例:<pre class="devsite-click-to-copy">
+cts-tf&gt; run cts ‐‐plan afw-userdebug-build -l DEBUG -s device_sn
+</pre>
+</li>
+
+<li>在具有 <code>--all-devices</code> 标记的所有连接设备上运行自动化测试框架。示例:<pre class="devsite-click-to-copy">
+cts-tf&gt; run cts ‐‐plan afw-userdebug-build -l DEBUG --all-devices
+</pre>
 </li>
 
 <li>使用 <code>list invocations</code> 或 <code>l i</code> 查看当前正在运行的执行程序。</li>
@@ -158,7 +177,8 @@
 </li>
 </ul>
 </li>
-<li>测试包通过以下方式将 AfW 的配置流程自动化:访问界面页面,并将导航日志记录在每个页面的设备 logcat 文件中。示例:<code>afwtest.AutomationDriver:
+<li>测试包通过以下方式将 AfW 的配置流程自动化:访问界面页面,并将导航日志记录在每个页面的设备 logcat 文件中。
+示例:<code>afwtest.AutomationDriver:
 Navigating:com.android.afwtest.uiautomator.pages.gms.AddAccountPage</code>
 <br />用于测试包 <code>com.android.afwtest.NfcProvisioning</code> 的界面页面包括:<ul>
 <li>
@@ -168,15 +188,20 @@
 <li><code>com.android.afwtest.uiautomator.pages.LandingPage</code></li>
 </ul>
 </li>
-<li>如果测试在配置过程中失败,logcat 将包含类似于以下内容的错误消息:<pre>TestRunner: java.lang.RuntimeException: Failed to load page: com.android.afwtest.uiautomator.pages.packageinstaller.DeviceAccessPage
+<li>如果测试在配置过程中失败,logcat 将包含类似于以下内容的错误消息:<pre class="devsite-click-to-copy">
+TestRunner: java.lang.RuntimeException: Failed to load page: com.android.afwtest.uiautomator.pages.packageinstaller.DeviceAccessPage
 </pre>这类错误通常是由之前的界面网页或加载失败的网页中的错误所导致,因此,请尝试在 logcat 中找到出现该错误之前的其他错误消息,然后按照配置流程手动重现该错误。</li>
 <li>如果测试包运行失败:<ul>
-<li>系统会使用以下语法将屏幕截图保存到 <code>out/host/linux-x86/afw-th/android-cts/repository/logs/<em>start-time</em></code>:<code>screenshot-test_<em>test_class_full_name</em>_<em>test_case_name</em>-<em>random_number</em>.png</code>。该信息也会记录在主机日志中。</li>
-<li>错误报告会以 <code>bug-<em>test_class_full_name</em>_<em>test_case_name</em>-<em>random_number</em>.zip</code> 的形式保存到 <code>out/host/linux-x86/afw-th/android-cts/repository/logs/<em>start-time</em></code>。
+<li>系统会使用以下语法将屏幕截图保存到 <code>out/host/linux-x86/afw-th/android-cts/repository/logs/<em>start-time</em></code>:
+<code>screenshot-test_<em>test_class_full_name</em>_<em>test_case_name</em>-<em>random_number</em>.png</code>。
+该信息也会记录在主机日志中。</li>
+<li>错误报告会以下列形式保存到 <code>out/host/linux-x86/afw-th/android-cts/repository/logs/<em>start-time</em></code>:
+<code>bug-<em>test_class_full_name</em>_<em>test_case_name</em>-<em>random_number</em>.zip</code>。
 </li>
 </ul>
 </li>
-<li>执行完所有测试包后,系统会进行屏幕截图,并以 <code>screenshot-<em>random_number</em>.png</code> 的形式将其保存到 <code>out/host/linux-x86/afw-th/android-cts/repository/logs/<em>start-time</em></code>。该信息也会记录在主机日志中。</li>
+<li>所有测试包均执行完毕后,屏幕截图会以 <code>screenshot-<em>random_number</em>.png</code> 的形式保存到 <code>out/host/linux-x86/afw-th/android-cts/repository/logs/<em>start-time</em></code>。
+该信息也会记录在主机日志中。</li>
 </ul>
 
 <h2 id="faq">常见问题解答</h2>
@@ -189,17 +214,18 @@
 <p><strong>我是否可以在使用 userdebug 版本刷机的设备上运行测试计划 <code>afw-user-build</code>?</strong></p>
 <p><em>可以,但我们建议您在 user 版本中运行该测试计划。</em></p>
 
-<p><strong>有时候我的测试会因为界面加载时间过长而失败。该怎么解决这个问题?</strong></p><em>在 <code>./android-cts/repository/testcases/afw-test.props</code> 中配置 <code>timeout_size</code> 设置。有效设置为:S、M、L、XL 和 XXL。</em><p></p>
+<p><strong>有时候我的测试会因为界面加载时间过长而失败。该怎么解决这个问题?</strong></p>
+<p><em>在 <code>./android-cts/repository/testcases/afw-test.props</code> 中配置 <code>timeout_size</code> 设置。有效设置为:S、M、L、XL 和 XXL。</em></p>
 
 <p><strong>测试包 <code>com.android.afwtest.NfcProvisioning</code>(或 <code>SuwDoProvisioning</code>)无法在我的设备上成功运行,因为安装的初始设置(即设置向导)会在配置完成后显示自定义界面(例如“条款及条件”)。如何才能跳过该自定义界面?</strong></p>
 <p><em>在配置过程结束后,系统应显示最小化界面。如果界面所包含的按钮包含有意义的文本或内容描述,且文本或内容描述含有以下任何字词,则自动化测试框架将自动跳过此类界面:“跳过”、“结束”、“完成”、“接受”、“同意”、“下一步”、“继续”、“前进”。或者,您可以在 <code>afw-test.props</code> 中定义一个按钮,以便将自动化测试框架配置为跳过您的界面。示例:</em></p>
-<pre>
+<pre class="devsite-click-to-copy">
 oem_widgets=your_btn
 your_btn.text=your_customized_text
 your_btn.package=your_package
 your_btn.action=click
 </pre>
-<em></em><p><em>要定义多个微件,请使用逗号分隔。</em></p>
+<p><em>要定义多个微件,请使用逗号分隔。</em></p>
 
 <p><strong>测试包 <code>com.android.afwtest.NfcProvisioning</code>(或 <code>SuwDoProvisioning</code>)运行失败,最后的界面屏幕显示“验证您的帐号”。为什么会发生这种情况?怎样才能恢复测试设备?
 </strong></p>
diff --git a/zh-cn/devices/tech/admin/testing-setup.html b/zh-cn/devices/tech/admin/testing-setup.html
index 8565854..150b0a9 100644
--- a/zh-cn/devices/tech/admin/testing-setup.html
+++ b/zh-cn/devices/tech/admin/testing-setup.html
@@ -23,46 +23,44 @@
 <p>为确保为受管理个人资料提供最基本的支持,原始设备制造商 (OEM) 设备必须包含以下基本元素:</p>
 
 <ul>
-  <li>个人资料所有者(如<a href="https://developer.android.com/training/enterprise/app-compatibility.html">确保与受管理个人资料的兼容性</a>中所述)</li>
-  <li>设备所有者</li>
-  </ul>
+<li>个人资料所有者(如<a href="https://developer.android.com/training/enterprise/app-compatibility.html" class="external">确保与受管理个人资料的兼容性</a>中所述)</li>
+<li>设备所有者</li>
+</ul>
 
-<p>要查看完整的要求列表,请参阅<a href="/devices/tech/admin/implement.html">实现设备管理</a>。</p>
-
-<p>要测试设备管理功能,设备所有者可以使用 TestDPC 应用(如下所述),也可以考虑直接与其他企业移动管理 (EMM) 提供商合作。</p>
+<p>要查看完整的要求列表,请参阅<a href="/devices/tech/admin/implement.html">实现设备管理</a>。要测试设备管理功能,设备所有者可以使用 TestDPC 应用(如下所述)。</p>
 
 <h2 id="set_up_the_device_owner_for_testing">设置设备所有者以进行测试</h2>
 <p>请按照以下说明设置设备所有者测试环境。</p>
 
 <ol>
-  <li>设置设备:<ol>
-  <li style="list-style-type: lower-alpha">将目标设备恢复出厂设置。</li>
-  <li style="list-style-type: lower-alpha">确保您未向设备添加任何用户帐号(例如,用于登录在线服务的用户帐号)。您可以依次转到“设置”-&gt;“帐号”进行确认。<em></em></li>
-  </ol></li>
-  <li>使用以下某种方法设置测试应用:<ul>
-  <li><a href="https://play.google.com/store/apps/details?id=com.afwsamples.testdpc&hl=zh-cn">下载 TestDPC 应用</a>(可从 Google Play 下载)。</li>
-  <li><a href="https://github.com/googlesamples/android-testdpc/">编译 TestDPC 应用</a>(可从 github.com 编译)。</li>
+<li>将目标设备恢复出厂设置。</li>
+<li>确保设备不含任何用户帐号(例如,用于登录在线服务的用户帐号)。要进行验证,请依次选择“设置”&gt;“帐号”<em></em>。</li>
+<li>使用以下某种方法设置测试应用:<ul>
+  <li><a href="https://play.google.com/store/apps/details?id=com.afwsamples.testdpc&hl=zh-cn" class="external">下载 TestDPC 应用</a>(可从 Google Play 下载)。</li>
+  <li><a href="https://github.com/googlesamples/android-testdpc/" class="external">编译 TestDPC 应用</a>(可从 github.com 编译)。</li>
   </ul>
-  </li>
-  <li>使用以下命令将 TestDPC 应用设置为设备所有者:<br />
-  <pre>$ adb shell dpm set-device-owner "com.afwsamples.testdpc/.DeviceAdminReceiver"</pre>
-  </li>
-  <li>在设备上完成设备所有者设置(加密、选择 WLAN 等)</li>
+</li>
+<li>使用以下命令将 TestDPC 应用设置为设备所有者:
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell dpm set-device-owner "com.afwsamples.testdpc/.DeviceAdminReceiver"
+</pre>
+</li>
+<li>在设备上完成设备所有者设置(加密、选择 WLAN 等)。
+</li>
 </ol>
 
 <h2 id="verify_the_device_owner_was_correctly_setup">验证设备所有者设置</h2>
 <p>要验证设备所有者是否已正确设置,请依次转到“设置”&gt;“安全”&gt;“设备管理器”,并确认 TestDPC 是否已在列表中。<em></em>验证它无法被停用(这表明它就是设备所有者)。</p>
 
 <h2 id="automate">自动配置测试</h2>
-<p>要自动化企业配置进程的测试,请使用 Android for Work (AfW) 自动化测试框架。如需了解详情,请参阅<a href="/devices/tech/admin/testing-provision.html">测试设备配置</a>。</p>
+<p>要自动化企业配置测试过程,请使用 Android for Work (AfW) 自动化测试框架。如需了解详情,请参阅<a href="/devices/tech/admin/testing-provision.html">测试设备配置</a>。</p>
 
 <h2 id="troubleshooting">错误报告和日志</h2>
-<p>在 Android 7.0 中,设备所有者 Device Policy Client (DPC) 可以获取受管理设备上企业进程的错误报告并查看日志。</p>
+<p>自 Android 7.0 起,设备所有者 Device Policy Client (DPC) 可以获取受管理设备上企业进程的错误报告并查看日志。</p>
 
-<p>要触发错误报告(即由 <code>adb
-bugreport</code> 收集的包含 dumpsys、dumpstate 和 logcat 数据的对应数据),请使用 <code>DevicePolicyController.requestBugReport</code>。收集错误报告后,系统会提示用户同意发送错误报告数据。结果将由 <code>DeviceAdminReceiver.onBugreport[Failed|Shared|SharingDeclined]</code> 接收。要详细了解错误报告内容,请参阅<a href="/source/read-bug-reports.html">读取错误报告</a>。
+<p>要触发错误报告(即由 <code>adb bugreport</code> 收集的包含 <code>dumpsys</code>、dumpstate 和 logcat 数据的对应数据),请使用 <code>DevicePolicyController.requestBugReport</code>。收集错误报告后,系统会提示用户同意发送错误报告数据。结果将由 <code>DeviceAdminReceiver.onBugreport[Failed|Shared|SharingDeclined]</code> 接收。要详细了解错误报告内容,请参阅<a href="/source/read-bug-reports.html">读取错误报告</a>。</p>
 
-</p><p>此外,设备所有者 DPC 还可以收集与用户在受管理设备上执行的操作相关的日志。所有报告 device_admin 的设备均必须进行企业进程日志记录,且通过新的日志安全缓冲区(仅供系统服务器读取)进行启用(也就是说,<code>adb logcat -b security</code> 无法读取该缓冲区)。ActivityManager 服务和 Keyguard 组件会将以下事件记录到安全缓冲区:</p>
+<p>此外,设备所有者 DPC 还可以收集与用户在受管理设备上执行的操作相关的日志。所有报告 device_admin 的设备均必须进行企业进程日志记录,且通过新的日志安全缓冲区(仅供系统服务器读取)进行启用(也就是说,<code>$ adb logcat -b security</code> 无法读取该缓冲区)。ActivityManager 服务和 Keyguard 组件会将以下事件记录到安全缓冲区:</p>
 
 <ul>
 <li>应用进程启动</li>
diff --git a/zh-cn/devices/tech/config/carrier.html b/zh-cn/devices/tech/config/carrier.html
index e690a84..75f0498 100644
--- a/zh-cn/devices/tech/config/carrier.html
+++ b/zh-cn/devices/tech/config/carrier.html
@@ -31,7 +31,7 @@
   </li><li>VoLTE/即时通讯配置
 </li></ul>
 
-<p class="note"><strong>注意</strong>:此应用必须使用证书进行签名,且所用证书的签名要与 SIM 卡上的签名一致。有关详情,请参阅<a href="#how_privilege_is_granted_to_a_carrier_app">如何向运营商应用授予权限</a>一节。</p>
+<p class="note"><strong>注意</strong>:此应用必须使用证书进行签名,且所用证书的签名要与 SIM 卡上的签名一致。有关详情,请参阅<a href="#how_privilege_is_granted_to_a_carrier_app">如何向运营商应用授予权限</a>部分。</p>
 
 <p>返回值的选择完全取决于运营商应用,并且可以根据通过平台传递给应用的详细信息做出动态抉择。</p>
 
@@ -109,7 +109,7 @@
 
 <h3 id="configuration_keys">配置密钥</h3>
 
-<p>密钥列表被定义为 <code><a href="http://developer.android.com/reference/android/telephony/CarrierConfigManager.html">android.telephony.CarrierConfigManager</a></code> 中公共 SDK 的一部分,并且不能在相同的 API 级别中更改。有关密钥的摘要,请参见下表。</p>
+<p>密钥列表被定义为 <code><a href="http://developer.android.com/reference/android/telephony/CarrierConfigManager.html">android.telephony. CarrierConfigManager</a></code> 中公共 SDK 的一部分,而且无法在相同的 API 级别中更改。有关密钥的摘要,请参见下表。</p>
 
 <h2 id="how_to_build_your_application">如何构建应用</h2>
 
@@ -120,13 +120,13 @@
 <h3 id="declare_a_class_that_overrides_android_service_carrier_carrierservice">声明一个替换 android.service.CarrierCarrierService 的类</h3>
 
 <ol>
-  <li>替换 <code>onLoadConfig</code> 以根据传递的 <code>service.carrier.CarrierIdentifier</code> 对象返回您希望提供的值
+  <li>替换 <code>onLoadConfig</code> 以根据传递的 <code>service.carrier.CarrierIdentifier</code> 对象返回您希望提供的值。
   </li><li>添加逻辑以在运营商配置可能随时间发生改变的情况下调用 <code>notifyConfigChangedForSubId</code>(例如,当用户向其帐号添加额外服务时)
 </li></ol>
 
 <p>请参阅以下示例:</p>
 
-<pre>
+<pre class="prettyprint">
 public class SampleCarrierConfigService extends CarrierService {
 
     private static final String TAG = "SampleCarrierConfigService";
@@ -156,7 +156,7 @@
 
 <p>请参阅以下示例:</p>
 
-<pre>
+<pre class="prettyprint">
 &lt;service android:name=".SampleCarrierConfigService"
 android:label="@string/service_name"
 android:permission="android.permission.BIND_CARRIER_SERVICES"&gt;
diff --git a/zh-cn/devices/tech/config/filesystem.html b/zh-cn/devices/tech/config/filesystem.html
index c47a4b0..5cf8fbf 100644
--- a/zh-cn/devices/tech/config/filesystem.html
+++ b/zh-cn/devices/tech/config/filesystem.html
@@ -20,59 +20,226 @@
       limitations under the License.
   -->
 
-<p>早期版本的 Android 使用不可扩展的系统配置文件,导致设备制造商无法通过添加具名二进制文件来指定所有权、访问模式或可执行权限的自主访问控制 (DAC)。设置这种限制的原因是为了支持 Linux 内核 3.14 及更高版本,这些版本通过 <code>CAP_SUSPEND_BLOCK</code> 功能启用唤醒锁定;要保持此唤醒锁定(从而在文件系统中设置此功能),需要合作伙伴提供的 GPS 守护进程。</p>
+<p>将文件系统对象和服务添加到编译环境中时,您通常需要分别为此类项目指定唯一 ID,称为 Android ID (AID)。目前,文件和服务等很多资源不需要一定使用 Android 定义的核心 AID;在很多情况下,您可以改为使用 OEM 定义的 AID。</p>
 
-<p>从 Android 6.0 开始,<code>fs_config</code> 和相关结构定义 (<code>system/core/include/private/android_filesystem_config.h</code>) 位于 <code>system/core/libcutils/fs_config.c</code> 中,可以由安装在 <code>/system/etc/fs_config_dirs</code> 和 <code>/system/etc/fs_config_files</code> 中的二进制文件进行更新或替换。为明确起见,Android 针对目录和文件采用单独的匹配和解析规则(可以使用其它全局表达式),并在两个不同的表格中处理目录和文件。<code>system/core/libcutils/fs_config.c</code> 中的结构定义不仅允许运行时读取目录和文件,而且主机在构建时也可以使用相同的文件来构建文件系统映像,比方说 <code>${OUT}/system/etc/fs_config_dirs</code> 和 <code>${OUT}/system/etc/fs_config_files</code>。</p>
+<p>在早期版本的 Android 中,对 AID 机制进行扩展时,是使用设备专属的 <code>android_filesystem_config.h</code> 文件来指定文件系统权能和/或自定义 OEM AID。但是,此机制不够直观,因为它不支持 OEM AID 使用好记的名称,而是要求您为用户和群组字段指定原始数字,这样一来,便无法将好记的名称与数字 AID 关联起来。</p>
 
-<h2 id="gen-files">生成替换文件</h2>
+<p>Android 8.0 及更高版本中采取了一种新的 AID 机制来扩展文件系统权能。这种新方法支持:</p>
+<ul>
+<li>配置文件可以有多个源位置(支持可扩展的编译环境配置)。</li>
+<li>在编译时对 OEM AID 值进行健全性检查。</li>
+<li>生成可视需要在源文件中使用的自定义 OEM AID 标头。</li>
+<li>将好记的名称与实际的 OEM AID 值相关联。支持为用户和群组指定非数字的字符串参数,即“foo”而不是“2901”。</li>
+</ul>
+
+<p>其他改进包括从 <code>system/core/include/private/android_filesystem_config.h</code> 中移除了 <code>android_ids[]</code> 数组。
+该数组现在作为完全自行生成的数组存在于 Bionic 中,并具有通过 <code>getpwnam()</code> 和 <code>getgrnam()</code> 提取数据的访问器。(此改进还有另一个作用,即使核心 AID 发生更改,生成的二进制文件也可保持稳定。)如需了解这种机制以及查看包含更多详情的 README 文件,请参阅 <code>build/make/tools/fs_config</code>。</p>
+
+<aside class="note"><strong>注意</strong>:虽然您仍可以使用<a href="#older">旧版 Android 中的文件系统替换方法</a>,但不能同时再使用新的 AID 机制。建议您尽可能使用新的机制。</aside>
+
+<h2 id="adding-android-ids-aids">添加 Android ID (AID)</h2>
+<p>Android 8.0 从 Android 开放源代码项目 (AOSP) 中移除了 <code>android_ids[]</code> 数组。所有适合 AID 的名称都改为在生成 Bionic <code>android_ids[]</code> 数组时从 <code>system/core/include/private/android_filesystem_config.h</code> 标头文件生成。这种机制会提取与 <code>AID_*</code> 匹配的所有 <code>define</code>,且 <strong>*</strong> 会变为小写名称。</p>
+
+<p>例如,在 <code>private/android_filesystem_config.h</code> 中:</p>
+
+<pre class="prettyprint">#define AID_SYSTEM 1000</pre>
+
+<p>会变为:</p>
+<ul>
+<li>好记的名称:system</li>
+<li>uid:1000</li>
+<li>gid:1000</li>
+</ul>
+
+<p>要添加新的 AOSP 核心 AID,只需将 <code>#define</code> 添加到 <code>android_filesystem_config.h</code> 标头文件中即可。AID 在编译环境中生成,并会提供给使用用户和群组参数的接口。这种机制会确认新的 AID 不在应用或 OEM 范围内;此外,它还会接受对此类范围的更改,并自动根据相应更改或新的 OEM 保留范围重新进行配置。</p>
+
+<h2 id="configuring-aids">配置 AID</h2>
+<p>
+要启用新的 AID 机制,请在 <code>BoardConfig.mk</code> 文件中设置 <code>TARGET_FS_CONFIG_GEN</code>。此变量含有配置文件列表,使您可以根据需要附加文件。</p>
+
+<aside class="caution"><strong>注意</strong>:请勿通过旧版 Android 中早期的 <code>TARGET_ANDROID_FILESYSTEM_CONFIG_H</code> 方法使用 <code>TARGET_FS_CONFIG_GEN</code>!否则,您会收到错误提示。</aside>
+
+<p>按照惯例,配置文件使用名称 <code>config.fs</code>,但在实践中,您可以使用任何名称。<code>config.fs</code> 文件采用 <a href="https://docs.python.org/2/library/configparser.html" class="external">Python ConfigParser ini 格式</a>,并包含大写部分(用于配置文件系统权能)和 AID 部分(用于配置 OEM 专属 AID)。
+</p>
+
+<h3 id="configuring-the-caps-section">配置大写部分</h3>
+<p>大写部分支持在编译环境中对文件系统对象设置<a href="http://man7.org/linux/man-pages/man7/capabilities.7.html" class="external">文件系统权能</a>(文件系统本身也必须支持此功能)。</p>
+
+<p>由于在 Android 中以 Root 身份运行稳定的服务会导致<a href="/compatibility/cts/index.html">兼容性测试套件 (CTS)</a> 失败,因此在之前有关在运行进程或服务时保留权能的要求中,您需要先设置权能,然后使用 <code>setuid</code>/<code>setgid</code> 设置适当的 AID 以运行程或服务。借助大写部分,您可以跳过这些要求,让内核为您代劳。当控制权交给 <code>main()</code> 时,您的进程就已拥有所需的权能,因此您的服务可以使用非 Root 用户和群组(这是启动特权服务的首选方式)。</p>
+
+<p>大写部分使用以下语法:</p>
+<table>
+  <tbody><tr>
+   <th>部分</th>
+   <th>值</th>
+   <th>定义</th>
+  </tr>
+  <tr>
+   <td><code>[path]</code></td>
+   <td></td>
+   <td>要配置的文件系统路径。以 / 结尾的路径被视为目录,否则,将被视为文件。
+   <br /><br />在不同文件中使用同一 <code>[path]</code> 指定多个部分的做法是错误的。在 Python 3.2 之前的版本中,同一文件中包含的某些部分可替换它之前的部分;而在 Python 3.2 中,系统设置了严格模式。</td>
+  </tr>
+  <tr>
+   <td><code>mode</code></td>
+   <td>八进制文件模式</td>
+   <td>至少为 3 位数的有效八进制文件模式。如果指定 3,则会附上前缀 0,否则系统会按原样使用模式。</td>
+  </tr>
+  <tr>
+  <td><code>user</code></td>
+   <td>AID_&lt;user&gt;</td>
+   <td>有效 AID 的 C 样式的 <code>define</code> 或好记的名称(例如 <code>AID_RADIO</code> 和 <code>radio</code> 皆可)。要指定自定义 AID,请参阅<a href="#configuring-the-aid-section">配置 AID 部分</a>。</td>
+  </tr>
+  <tr>
+   <td><code>group</code></td>
+   <td>AID_&lt;group&gt;</td>
+   <td>和用户一样。</td>
+  </tr>
+  <tr>
+  <td><code>caps</code></td>
+   <td>cap*</td>
+   <td><code>system/core/include/private/android_filesystem_capability.h</code> 中所声明的名称,不含前导 <code>CAP_</code>。允许大小写混用。大写也可以是原始值:<ul>
+   <li>binary (0b0101)</li>
+   <li>octal (0455)</li>
+   <li>int (42)</li>
+   <li>hex (0xFF)</li>
+  </ul>
+  可以使用空格隔开多个大写字母。</td>
+  </tr>
+</tbody></table>
+
+<p>有关使用示例,请参阅<a href="#using-file-system-capabilities">使用文件系统权能</a>。</p>
+
+<h3 id="configuring-the-aid-section">配置 AID 部分</h3>
+<p>AID 部分包含 OEM 专属 AID,并使用以下语法:</p>
+
+<table>
+  <tbody><tr>
+   <th>部分</th>
+   <th>值</th>
+   <th>定义</th>
+  </tr>
+  <tr>
+  <td><code>[AID_&lt;name&gt;]</code></td>
+   <td></td>
+   <td><code>&lt;name&gt;</code> 可以包含大写字母、数字和下划线字符。小写版本作为好记的名称使用。生成的用于代码收录的标头文件使用确切的 <code>AID_&lt;name&gt;</code>。
+   <br /><br />使用同一 <code>AID_&lt;name&gt;</code> 指定多个部分(不区分大小写,限制条件与 <code>[path]</code> 相同)是错误的做法。</td>
+  </tr>
+  <tr>
+  <td><code>value</code></td>
+  <td>&lt;number&gt;</td>
+  <td>有效的 C 样式的数字字符串(十六进制、八进制、二进制和十进制)。
+  <br /><br />使用同一值选项指定多个部分<strong>或</strong>指定超出收录的 OEM 范围(在 <code>system/core/include/private/android_filesystem_config.h</code> 中指定)的值,属于错误的做法:<ul>
+  <li>AID_OEM_RESERVED_START(2900) - AID_OEM_RESERVED_END(2999)</li>
+  <li>AID_OEM_RESERVED_2_START(5000) - AID_OEM_RESERVED_2_END(5999)</li>
+  </ul>
+  </td>
+  </tr>
+</tbody></table>
+
+<p>有关使用示例,请参阅<a href="#defining-an-oem-specific-aid">定义 OEM 专属 AID</a> 和<a href="#using-an-oem-specific-aid">使用 OEM 专属 AID</a>。</p>
+
+<h2 id="usage-examples">用法示例</h2>
+<p>以下示例详细介绍了如何定义和使用 OEM 专属 AID,以及如何启用文件系统权能。</p>
+
+<h3 id="defining-an-oem-specific-aid">定义 OEM 专属 AID</h3>
+<p>要定义 OEM 专属 AID,请创建一个 <code>config.fs</code> 文件并设置 AID 值。例如,在 <code>device/x/y/config.fs</code> 中设置以下内容:</p>
+
+<pre class="prettyprint">
+[AID_FOO]
+value: 2900
+</pre>
+
+<p>创建好文件后,设置 <code>TARGET_FS_CONFIG_GEN</code> 变量并在 <code>BoardConfig.mk</code> 指向它。例如,在 <code>device/x/y/BoardConfig.mk</code> 中设置以下内容:</p>
+
+<pre class="prettyprint">TARGET_FS_CONFIG_GEN += device/x/y/config.fs</pre>
+
+<p>总的来说,现在系统已经可以在新编译环境中使用您的自定义 AID 了。
+</p>
+
+<h3 id="using-an-oem-specific-aid">使用 OEM 专属 AID</h3>
+<p>要通过 C 或 C++ 代码访问 AID 的 <code>#define</code> 值,请使用自动生成的标头文件,方法是:将其添加到模块的 <code>Android.mk</code> 中并纳入空的仿库。例如,在 <code>Android.mk</code> 中添加以下内容:</p>
+
+<pre class="prettyprint"> LOCAL_STATIC_LIBRARIES := liboemaids</pre>
+<p>在您的 C 代码中,<code>#include "generated_oem_aid.h"</code> 并开始使用所声明的标识符。例如,在 <code>my_file.c</code> 中添加以下内容:</p>
+
+<pre class="prettyprint">
+#include "generated_oem_aid.h"
+
+…
+
+If (ipc-&gt;uid == AID_FOO) {
+  // Do something
+...
+</pre>
+
+<p>在 Android 8.0 中,您必须配合 <code>oem_####</code> 使用 <code>getpwnam</code> 和类似函数,在通过 <code>getpwnam</code>(如 init 脚本)处理查询时也是如此。例如,在 <code>some/init.rc</code> 中使用以下内容:</p>
+
+<pre class="prettyprint">
+service foo /vendor/bin/foo_service
+    user: oem_2900
+    group: oem_2900
+</pre>
+
+<h3 id="using-file-system-capabilities">使用文件系统权能</h3>
+<p>要启用文件系统权能,请在 <code>config.fs</code> 文件中创建一个大写部分。例如,在 <code>device/x/y/config.fs</code> 中添加以下部分:</p>
+
+<pre class="prettyprint">
+[system/bin/foo_service]
+mode: 0555
+user: AID_FOO
+group: AID_SYSTEM
+caps: SYS_ADMIN | SYS_NICE
+</pre>
+
+<aside class="note"><strong>注意</strong>:此处也可以使用好记的名称 <code>foo</code> 和 <code>system</code>。</aside>
+
+<p>创建好文件后,设置 <code>TARGET_FS_CONFIG_GEN</code> 并在 <code>BoardConfig.mk</code> 中指向它。例如,在 <code>device/x/y/BoardConfig.mk</code> 中设置以下内容:</p>
+
+<pre class="prettyprint">TARGET_FS_CONFIG_GEN += device/x/y/config.fs</pre>
+
+<p>当执行服务 <code>foo</code> 时,它会先使用权能 <code>CAP_SYS_ADMIN</code> 和 <code>CAP_SYS_NICE</code>,而不使用 <code>setuid</code> 和 <code>setgid</code> 调用。此外,<code>foo</code> 服务的 SELinux 策略也不再需要 <code>setuid</code> 和 <code>setgid</code>,因此,可以从 <code>foo</code> 的 SELinux 策略中移除这些权能。</p>
+
+<h2 id="older">配置替换(Android 6.x 到 7.x 版本)</h2>
+
+<p>Android 6.0 将 <code>fs_config</code> 和关联的结构定义 (<code>system/core/include/private/android_filesystem_config.h</code>) 转移到了 <code>system/core/libcutils/fs_config.c</code>。在此处,可使用安装在 <code>/system/etc/fs_config_dirs</code> 和 <code>/system/etc/fs_config_files</code> 中的二进制文件来更新或替换它们。针对目录和文件分别采用单独的匹配和解析规则(可能会使用其他全局表达式),这样一来,Android 就能够在两个不同的表中处理目录和文件。<code>system/core/libcutils/fs_config.c</code> 中的结构定义不仅可让系统在运行时读取目录和文件,而且主机在编译时也可以使用相同的文件来构建文件系统映像,比方说 <code>${OUT}/system/etc/fs_config_dirs</code> 和 <code>${OUT}/system/etc/fs_config_files</code>。</p>
+
+<p>虽然扩展文件系统时采用的替换方法已被 Android 8.0 中推出的模块化配置系统所取代,但如果需要,您仍可以使用原来的方法。以下部分将详细介绍如何生成和纳入替换文件以及如何配置文件系统。</p>
+
+<h3 id="older-generate">生成替换文件</h3>
 
 <p>您可以使用 <code>build/tools/fs_config</code> 中的 <code>fs_config_generate</code> 工具生成相应的二进制文件 <code>/system/etc/fs_config_dirs</code> 和 <code>/system/etc/fs_config_files</code>。该工具使用 <code>libcutils</code> 库函数 (<code>fs_config_generate()</code>) 管理放入缓冲区内的 DAC 需求,并为头文件定义规则来规定 DAC 规则的用法。</p>
 
-<p>要使用此工具,请在 <code>device/<em>vendor</em>/<em>device</em>/android_filesystem_config.h</code> 中创建头文件作为替换。该文件必须使用 <code>system/core/include/private/android_filesystem_config.h</code> 中定义的 <code>structure fs_path_config</code> 格式,并对目录和文件符号进行以下结构初始化:</p>
+<p>要使用该工具,请在 <code>device/<em>vendor</em>/<em>device</em>/android_filesystem_config.h</code> 中创建头文件以用作替换文件。该文件必须使用 <code>system/core/include/private/android_filesystem_config.h</code> 中定义的 <code>structure fs_path_config</code> 格式,并对目录和文件符号进行以下结构初始化:</p>
 <ul>
 <li>对于目录,请使用 <code>android<strong>_device</strong>_dirs[]</code>。</li>
 <li>对于文件,请使用 <code>android<strong>_device</strong>_files[]</code>。</li>
 </ul>
 
-<p>在不使用 <code>android_device_dirs[]</code> 和 <code>android_device_files[]</code> 时,您可以定义 <code>NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS</code> 和 <code>NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES</code>(请参见下面的<a href="#example">示例</a>)。</p>
+<p>在不使用 <code>android_device_dirs[]</code> 和 <code>android_device_files[]</code> 时,您可以定义 <code>NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS</code> 和 <code>NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES</code>(请参阅下面的<a href="#older-example">示例</a>)。您还可以使用板级配置中的 <code>TARGET_ANDROID_FILESYSTEM_CONFIG_H</code> 指定强制基本名称为 <code>android_filesystem_config.h</code> 的替换文件。</p>
 
-<p>您还可以使用单板配置中的 <code>TARGET_ANDROID_FILESYSTEM_CONFIG_H</code> 指定强制基本名称为 <code>android_filesystem_config.h</code> 的替换文件。
+<h3 id="older-include">包含替换文件</h3>
+<p>要包含文件,请确保 <code>PRODUCT_PACKAGES</code> 包含 <code>fs_config_dirs</code> 和/或 <code>fs_config_files</code>,以便它可以分别将其安装到 <code>/system/etc/fs_config_dirs</code> 和 <code>/system/etc/fs_config_files</code> 中。编译系统会在 <code>BoardConfig.mk</code> 所在的 <code>$(TARGET_DEVICE_DIR)</code> 中搜索自定义 <code>android_filesystem_config.h</code>。如果此文件位于其他位置,请设置板级配置变量 <code>TARGET_ANDROID_FILESYSTEM_CONFIG_H</code> 来指向该位置。</p>
 
-</p><h2 id="include-files">包含的文件</h2>
-
-<p><code>PRODUCT_PACKAGES</code> 必须包含 <code>fs_config_dirs</code> 和/或 <code>fs_config_files</code>,才能分别将它们安装到 <code>/system/etc/fs_config_dirs</code> 和 <code>/system/etc/fs_config_files</code>。</p>
-
-<p>构建系统会在 <code>BoardConfig.mk</code> 所在的 <code>$(TARGET_DEVICE_DIR)</code> 中搜索自定义 <code>android_filesystem_config.h</code>。如果此文件位于其他位置,请设置单板配置变量 <code>TARGET_ANDROID_FILESYSTEM_CONFIG_H</code> 来指向该位置。</p>
-
-<h2 id="configuring">配置</h2>
-<p>要在 Android 6.0 及更高版本中配置文件系统,请按以下步骤操作:</p>
+<h3 id="older-configure">配置文件系统</h3>
+<p>要在 Android 6.0 及更高版本中配置文件系统,请执行以下操作:</p>
 
 <ol>
 <li>创建 <code>$(TARGET_DEVICE_DIR)/android_filesystem_config.h</code> 文件。</li>
-<li>将 <code>fs_config_dirs</code> 和/或 <code>fs_config_files</code> 添加到单板配置文件(例如 <code>$(TARGET_DEVICE_DIR)/device.mk</code>)中的 <code>PRODUCT_PACKAGES </code>。</li>
+<li>将 <code>fs_config_dirs</code> 和/或 <code>fs_config_files</code> 添加到板级配置文件(例如 <code>$(TARGET_DEVICE_DIR)/device.mk</code>)中的 <code>PRODUCT_PACKAGES </code>。</li>
 </ol>
 
-<h2 id="migration-concerns">迁移问题</h2>
-<p>将系统配置从 Android 5.0 及更早版本中迁出会造成干扰。在规划此类迁移时,请注意以下事项:</p>
-<ul>
-<li>Android 6.0 会移除部分头文件、结构和内嵌定义。</li>
-<li>Android 6.0 需要引用 <code>libcutils</code>,而不是直接从 <code>system/core/include/private/android_filesystem_config.h</code> 运行。依赖于 <code>system/code/include/private_filesystem_config.h</code> 的文件/目录结构或者 <code>fs_config</code> 的设备制造商私有可执行文件必须添加 <code>libcutils</code> 库依赖关系。</li>
-<li>Android 6.0 需要使用 <code>system/core/include/private/android_filesystem_config.h</code> 的设备制造商私有分支副本,该副本应包含有关现有目标的附加内容,以便移至 <code>device/<em>vendor</em>/<em>device</em>/android_filesystem_config.h</code>。
-</li>
-<li>由于 Android 保留将 SELinux 强制访问控制 (MAC) 应用于目标系统中配置文件的权利,因此包含使用 <code>fs_config()</code> 的自定义目标可执行文件的实现必须确保具有访问权限。</li>
-</ul>
+<h3 id="older-example">替换示例</h3>
 
-<h2 id="example">示例</h2>
-
-<p>此示例展示了用于替换 <code>system/bin/glgps</code> 守护进程以在 <code>device/<em>vendor</em>/<em>device</em></code> 目录中添加唤醒锁定支持的补丁。请注意以下几点:</p>
+<p>此示例展示了用于替换 <code>system/bin/glgps</code> 守护进程以在 <code>device/<em>vendor</em>/<em>device</em></code> 目录中添加唤醒锁定支持的补丁程序。请注意以下几点:</p>
 
 <ul>
-<li>每个结构条目都包含模式、uid、gid、功能和名称。
+<li>每个结构条目都包含模式、uid、gid、权能和名称。
 已自动包含 <code>system/core/include/private/android_filesystem_config.h</code> 来提供清单 #defines(<code>AID_ROOT</code>、<code>AID_SHELL</code>、<code>CAP_BLOCK_SUSPEND</code>)。</li>
-<li><code>android_device_files[]</code> 区段包含在未指定时禁止访问 <code>system/etc/fs_config_dirs</code> 的操作,其作用是在缺少目录替换内容时提供额外 DAC 保护。但此保护的强度较弱;如果有人拥有超过 <code>/system</code> 的控制权,那么他通常可以执行任何操作。</li>
+<li><code>android_device_files[]</code> 区段包含在未指定时禁止访问 <code>system/etc/fs_config_dirs</code> 的操作,其作用是在缺少目录替换内容时提供额外 DAC 保护。但此保护的强度较弱;如果有人拥有对 <code>/system</code> 的控制权,那么他通常可以执行任何操作。</li>
 </ul>
 
-<pre>
+<pre class="devsite-click-to-copy">
 diff --git a/android_filesystem_config.h b/android_filesystem_config.h
 new file mode 100644
 index 0000000..874195f
@@ -133,4 +300,15 @@
  ifeq ($(USE_SVELTE_KERNEL), true)
 </pre>
 
+<h3 id="older-migration">从早期版本迁移文件系统</h3>
+<p>当从 Android 5.x 及更低版本迁移文件系统时,请注意以下事项:</p>
+<ul>
+<li>Android 6.x 移除了部分头文件、结构和内嵌定义。</li>
+<li>Android 6.x 需要引用 <code>libcutils</code>,而不是直接从 <code>system/core/include/private/android_filesystem_config.h</code> 运行。依赖于 <code>system/code/include/private_filesystem_config.h</code> 的文件/目录结构或者 <code>fs_config</code> 的设备制造商私有可执行文件必须添加 <code>libcutils</code> 库依赖关系。</li>
+<li>Android 6.x 需要 <code>system/core/include/private/android_filesystem_config.h</code> 的设备制造商专有分支副本,该副本应包含有关现有目标的附加内容,以便移至 <code>device/<em>vendor</em>/<em>device</em>/android_filesystem_config.h</code>。
+</li>
+<li>由于 Android 保留将 SELinux 强制访问控制 (MAC) 应用于目标系统中配置文件的权利,因此包含使用 <code>fs_config()</code> 的自定义目标可执行文件的实现必须确保具有访问权限。
+</li>
+</ul>
+
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/config/perms-whitelist.html b/zh-cn/devices/tech/config/perms-whitelist.html
new file mode 100644
index 0000000..19bda94
--- /dev/null
+++ b/zh-cn/devices/tech/config/perms-whitelist.html
@@ -0,0 +1,150 @@
+<html devsite><head>
+    <title>特许权限白名单要求</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+    <p>
+过去,设备实现人员几乎无法控制可以向特权应用授予哪些签名|特许权限。
+特权应用是位于系统映像上 <code>/system/priv-app</code> 目录下的系统应用。
+    </p>
+
+    <p>
+从 Android 8.0 开始,所有特权应用均必须显式加入到 <code>/etc/permissions</code> 目录下的系统配置 XML 文件的白名单中。
+如果不这样做,则设备可以启动,但设备实现将无法通过 CTS。</p>
+
+    <h2 id="adding-the-whitelists">添加白名单</h2>
+
+    <p>
+
+应用的权限白名单可列在位于 <code>frameworks/base/etc/permissions</code> 目录下的单个或多个 XML 文件中,如下所示:
+    </p>
+
+    <ul>
+      <li><code>/etc/permissions/privapp-permissions-&lt;OEM_NAME&gt;.xml</code>
+      </li><li><code>/etc/permissions/privapp-permissions-&lt;DEVICE_NAME&gt;.xml</code>。
+    </li></ul>
+
+    <p>
+对于如何组织内容,没有任何严格的规则,只要将 <code>/system/priv-app</code> 下的所有应用均列入白名单,设备实现人员就可以自行决定如何组织内容。例如,Google 会针对由 Google 开发的所有特权应用提供一个白名单。
+    </p>
+
+    <p>
+建议使用以下组织方式:
+    </p>
+
+    <ul>
+      <li>对于已包含在 AOSP 树中的应用,将其权限列在以下文件中:<code>/etc/permissions/privapp-permissions-platform.xml</code>
+      </li><li>对于 Google 应用,将其权限列在以下文件中:<code>/etc/permissions/privapp-permissions-google.xml </code>
+      </li><li>对于其他应用,使用以下格式的文件:<code>
+      /etc/permissions/privapp-permissions-&lt;device_name&gt;.xml</code></li>
+    </ul>
+
+    <h3 id="whitelist-generation-tool">白名单生成工具</h3>
+
+    <p>
+可使用 AOSP 中提供的命令行工具在以下位置自动生成系统映像上提供的针对所有应用的白名单:
+    </p>
+
+    <pre class="prettyprint">development/tools/privapp_permissions/privapp_permissions.py
+    </pre>
+
+    <p>
+要生成特定于设备的 <code>privapp-permissions.xml</code> 的初始版本,请完成以下步骤:
+
+    </p>
+    <ol>
+      <li>编译系统映像,如下所示:<br />
+        <pre>$ . build/envsetup.sh
+$ lunch product_name
+$ make -j</pre>
+      </li>
+
+      <li>运行以下工具以生成一个 <code>privapp-permissions.xml
+      </code> 文件,该文件会列出需要列入白名单的所有签名|特许权限。<br />
+      <pre>$ development/tools/privapp_permissions/privapp_permissions.py</pre><br />
+
+此工具会打印可在 <code>/etc/permissions</code> 下用作单个文件或拆分为多个文件的 XML 内容。<br /><br />
+如果设备已在 <code>/etc/permissions</code> 目录下包含白名单,则该工具将打印出差异内容,也就是说只打印缺少的需要列入白名单的签名|特许权限。这对审核也很有用,当添加新版本的应用时,该工具将检测所需的其他权限。
+      </li>
+      <li>将生成的文件复制到 <code>/etc/permissions</code> 目录下,系统将在这里读取该文件(在启动过程中)。</li>
+    </ol>
+    <h3 id="whitelist-format">白名单格式</h3>
+    <ul>
+      <li>由于实现已在 AOSP 中,因此只需进行自定义即可。
+      </li><li>AOSP 树中包含的应用的权限已在 <code>/etc/permissions/privapp-permissions-platform.xml</code> 下列入白名单
+      </li>
+    </ul>
+
+    <pre class="prettyprint">&lt;!--
+    This XML file declares which signature|privileged permissions should be granted to privileged
+    applications that come with the platform
+    --&gt;
+    &lt;permissions&gt;
+	&lt;privapp-permissions package="com.android.backupconfirm"&gt;
+	    &lt;permission name="android.permission.BACKUP"/&gt;
+	    &lt;permission name="android.permission.CRYPT_KEEPER"/&gt;
+	&lt;/privapp-permissions&gt;
+	&lt;privapp-permissions package="com.android.cellbroadcastreceiver"&gt;
+	    &lt;permission name="android.permission.INTERACT_ACROSS_USERS"/&gt;
+	    &lt;permission name="android.permission.MANAGE_USERS"/&gt;
+	    &lt;permission name="android.permission.MODIFY_PHONE_STATE"/&gt;
+	    &lt;permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/&gt;
+	    &lt;permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/&gt;
+	&lt;/privapp-permissions&gt;
+    ...</pre>
+
+    <h3 id="enabling-logs-to-find-missing-permissions">启用日志以查找缺少的权限</h3>
+    <p>
+在启动新设备时,我们建议首先启用过渡日志模式,如下所示:
+    </p>
+    <p>
+    <strong> <code>ro.control_privapp_permission=log</code> </strong>
+
+    </p><p>
+违规行为将在日志文件中予以报告,但所授予的权限仍将有效。这样可使设备处于工作状态,同时又能提供违规行为列表。
+    </p>
+    <p>
+错误消息格式如下:
+    </p>
+    <p>
+
+    <code>PackageManager: Privileged permission {PERMISSION_NAME} for package
+    {PACKAGE_NAME} - not in privapp-permissions whitelist</code>
+    </p>
+    <p>
+所有违规行为均必须通过列入白名单来予以解决。否则,设备将无法通过 CTS 测试。
+    </p>
+    <h2 id="cts-tests-for-whitelists">针对白名单的 CTS 测试</h2>
+    <p>
+如果您的设备实现包含未显示在 <code>/etc/permissions.</code> 下的白名单中的特权应用,则该实现不会通过 CTS 测试。
+    </p>
+    <p>
+    <code>The </code>PrivappPermissionsTest.java 测试会强制执行签名|特许权限白名单,具体方式如下:
+    </p><ul>
+    <li>报告已向 CTS 日志授予的权限。
+    </li><li>确保所有特许权限只向在 <code>&lt;privapp-permissions&gt;,</code> 中声明的应用授予,即如果特权应用请求获取未列入白名单的签名|特许权限或系统未授予的白名单权限,则请求会失败。</li></ul>
+    <h2 id="run-time-enforcement-of-whitelists">运行时强制执行白名单</h2>
+    <p>
+白名单列好后,可通过设置版本属性 <code>ro.control_privapp_permission=enforce</code> 来启用运行时强制执行。
+    </p>
+    <p>
+    <strong>注意</strong>:无论 <code>ro.control_privapp_permission</code> 属性状态如何,只有已针对所有特权应用将特许权限正确列入白名单的设备才能通过 CTS 测试。
+    </p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/config/timezone-rules.html b/zh-cn/devices/tech/config/timezone-rules.html
new file mode 100644
index 0000000..c6b9d32
--- /dev/null
+++ b/zh-cn/devices/tech/config/timezone-rules.html
@@ -0,0 +1,470 @@
+<html devsite><head>
+    <title>时区规则</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>Android 8.1 为 OEM 提供了一种新机制:无需进行系统更新就可以将更新的时区规则数据推送至设备中。此机制使用户能够及时获得更新(从而延长 Android 设备的使用期限),并且使 OEM 能够独立于系统映像更新来测试时区更新。</p>
+
+<p>Android 核心库团队将提供必要的数据文件,用于更新原生 Android 设备上的时区规则。OEM 在为其设备创建时区更新时可以选择使用这些数据文件,也可以根据需要创建自己的数据文件。在任何情况下,OEM 都可以自己掌控其受支持设备的时区规则更新的质量保证/测试、时间规划及发布。</p>
+
+<h2 id="source-code">Android 时区源代码和数据</h2>
+<p>所有原生 Android 设备(即使是不使用此功能的设备)都需要时区规则数据,并且必须在 <code>/system</code> 分区中提供一组默认的时区规则数据。然后,这些数据将供 Android 源代码树中以下库中的代码使用:</p>
+
+<ul>
+<li><code>libcore/</code> 中的受管理代码(例如 <code>java.util.TimeZone</code>)使用 <code>tzdata</code> 和 <code>tzlookup.xml</code> 文件。</li>
+<li><code>bionic/</code> 中的原生库代码(例如,对于 <code>mktime</code>,本地时间系统调用)使用 <code>tzdata</code> 文件。</li>
+<li><code>external/icu/</code> 中的 ICU4J/ICU4C 库代码使用 ICU .dat 文件。</li>
+</ul>
+
+<p>这些库经过配置,能够发现 <code>/data/misc/zoneinfo/current</code> 目录中可能存在的叠加层文件。叠加层文件中应包含经过改进的时区规则数据,从而能够在不更改 <code>/system</code> 的情况下更新设备。</p>
+
+<p>需使用时区规则数据的 Android 系统组件首先检查以下位置:</p>
+
+<ul>
+<li><code>libcore/</code> 和 <code>bionic/</code> 代码使用 <code>tzdata</code> 和 <code>tzlookup.xml</code> 文件的 <code>/data</code> 副本。</li>
+<li>ICU4J/ICU4C 代码使用 <code>/data</code> 中的文件,如果在其中找不到特定数据(针对格式、本地化的字符串等),则回退到 <code>/system</code> 文件。</li>
+</ul>
+
+<h2 id="distro-files">发行版文件</h2>
+<p>发行版 .zip 文件包含填充 <code>/data/misc/zoneinfo/current</code> 目录时所需的数据文件。发行版文件还包含用于供设备检测版本问题的元数据。</p>
+<p>由于发行版文件的内容会随 ICU 版本、Android 平台要求等因素而改变,因此发行版文件的格式取决于 Android 版本。Android 会为每次 IANA 更新(在更新系统平台文件之外)提供所支持 Android 版本的发行版文件。为了使设备保持最新状态,OEM 可以选择使用此发行版文件,也可以使用 Android 源代码树(包含生成发行版文件所需的脚本和其他文件)创建自己的发行版文件。</p>
+
+<h2>时区更新组件</h2>
+<p>时区规则更新过程会将发行版文件传输到设备,并且安全地安装其中所含的文件。传输和安装过程需用到以下组件:</p>
+
+<ul>
+<li>平台服务功能 (<a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/timezone/RulesManagerService.java">timezone.RulesManagerService</a>),其在默认情况下处于停用状态。OEM 必须通过相应配置来启用该功能。RulesManagerService 在系统服务器进程中运行,并通过写入 <code>/data/misc/zoneinfo/staged</code> 来暂存时区更新操作。它也可以替换或删除已经暂存的操作。</li>
+<li>
+<a href="https://android.googlesource.com/platform/packages/apps/TimeZoneUpdater/">Time Zone Updater</a>,一个不可更新的系统应用(又名 Updater App)。<em></em>OEM 必须将此应用包含在要使用该功能的设备的系统映像中。</li>
+<li>OEM <a href="https://android.googlesource.com/platform/packages/apps/TimeZoneData/">Time Zone Data</a>,一个可更新的系统应用(又名 Data App),它将发行版文件传输到设备中并使其可供 Updater App 使用。OEM 必须将此应用包含在要使用该功能的设备的系统映像中。<em></em></li>
+<li>
+<a href="https://android.googlesource.com/platform/system/timezone/+/master/tzdatacheck/">tzdatacheck</a>,一个启动时二进制文件,用于正确、安全地执行时区更新。</li>
+</ul>
+
+<p>Android 源代码树中包含上述组件的通用源代码,OEM 可以选择使用这些代码,无需做出变更。
+为使 OEM 能够自动检查是否已正确启用该功能,我们专门提供了<a href="https://android.googlesource.com/platform/packages/apps/TimeZoneData/+/master/testing/">测试代码</a>。</p>
+
+<h3 id="distro-install">发行版安装</h3>
+<p>发行版安装过程包括以下步骤:</p>
+
+<ol>
+<li>通过从应用商店下载或旁加载来<strong>更新 Data App</strong>。系统服务器进程(通过 <code>timezone.RulesManagerServer/timezone.PackageTracker</code> 类)监控对已配置的 OEM 专属 Data App 软件包名称的更改。
+<figure>
+<img src="images/tz_data_app_updates.png" alt="Data App 更新" id="data-app-updates"/>
+<figcaption><strong>图 1.</strong> Data App 更新。</figcaption></figure>
+</li>
+<li><strong>系统服务器进程触发更新检查</strong>,方法是向 Updater App 广播一个包含独一无二的一次性令牌的定向 Intent。系统服务器会持续跟踪自己生成的最新令牌,从而稍后能够确定最近一次触发的检查操作完成的时间;其他令牌一概会被忽略。
+<figure>
+<img src="images/tz_trigger_update.png" alt="触发更新" id="trigger-update"/>
+<figcaption><strong>图 2.</strong> 触发更新检查。</figcaption>
+</figure>
+</li>
+<li><strong>更新检查</strong>。在此期间,Updater App 会执行以下任务:<ul>
+<li>通过调用 RulesManagerService 来查询当前的设备状态。
+<figure>
+<img src="images/tz_call_rulesmanagerservice.png" alt="调用 RulesManagerService" id="call-rulesmanagerservice"/>
+<figcaption><strong>图 3.</strong> Data App 更新,调用 RulesManagerService。</figcaption></figure>
+</li>
+<li>通过查询明确定义的 ContentProvider URL 和列规范来查询 Data App,从而获取有关发行版的信息:<figure>
+<img src="images/tz_get_info_distro.png" alt="获取发行版信息" id="get-distro-info"/>
+<figcaption><strong>图 4.</strong> Data App 更新,获取有关发行版的信息。
+</figcaption></figure>
+</li>
+</ul>
+</li><li><strong>Updater App 执行适当的操作</strong>(根据其获得的信息)。可用的操作包括:<ul>
+<li><em></em>请求安装。从 Data App 中读取发行版数据并将此数据传递给系统服务器中的 RulesManagerService。RulesManagerService 重新确认发行版格式版本和内容是否适用于设备,然后准备安装。</li>
+<li><em></em>请求卸载(这种情况很少出现)。例如,如果要停用或卸载 <code>/data</code> 中已更新的 .apk,并且设备将退回到 <code>/system</code> 中的现有版本。</li>
+<li><em></em>不执行任何操作。在 Data App 发行版无效时会发生此情况。
+</li>
+</ul>
+在所有情况下,Updater App 都会使用检查令牌调用 RulesManagerService,以便系统服务器知道检查已成功完成。
+<figure>
+<img src="images/tz_check_complete.png" alt="检查完成" id="check-complete"/>
+<figcaption><strong>图 5.</strong> 检查完成。</figcaption></figure>
+</li>
+<li><strong>重新启动并运行 tzdatacheck</strong>。当设备下次启动时,tzdatacheck 二进制文件将执行所有暂存操作。tzdatacheck 二进制文件可以执行以下任务:<ul>
+<li>在其他系统组件打开并开始使用 <code>/data/misc/zoneinfo/current</code> 文件之前,根据暂存操作相应地创建、替换和/或删除这些文件。</li>
+<li>检查 <code>/data</code> 中的文件是否适合当前平台版本。如果设备刚刚收到系统更新并且发行版格式版本已更改,则可能不适合。</li>
+<li>确保 IANA 规则版本不低于 <code>/system</code> 中的版本。这样可防止在系统更新后设备拥有的时区规则数据版本低于 <code>/system</code> 映像中的时区规则数据版本。
+</li>
+</ul>
+</li>
+</ol>
+
+<h3 id="reliability">可靠性</h3>
+<p>端到端安装过程是异步进行的,可以分为三个操作系统进程。在安装过程中的任何时刻,如果出现设备断电、磁盘空间不足等情况,都将导致安装检查无法成功完成。在情况最好的失败案例中,Updater App 能够通知系统服务器检查失败;在情况最坏的失败案例中,RulesManagerService 不会收到任何调用。</p>
+<p>为了解决此问题,系统服务器代码会持续跟踪所触发的更新检查是否已完成,以及上次检查到的 Data App 版本号是什么。当设备空闲并在充电时,系统服务器代码可以检查当前状态。如果发现更新检查未完成或发现非预期的 Data App 版本,它会自发地触发更新检查。</p>
+
+<h3 id="security">安全性</h3>
+<p>系统服务器中的 RulesManagerService 代码在启用后会执行多项检查,以确保可以安全使用系统。</p>
+<ul>
+<li>表明系统映像配置有误的问题将导致设备无法正常启动;示例包括 Updater App 或 Data App 配置错误,或者 Updater App 或 Data App 不在 <code>/system/priv-app</code> 中。</li>
+<li>表明所安装的 Data App 有误的问题不会阻碍设备启动,但会阻碍触发更新检查;示例包括缺少必要的系统权限,或者 Data App 没有在预期的 URI 上提供 ContentProvider。</li>
+</ul>
+
+<p><code>/data/misc/zoneinfo</code> 目录的文件权限通过 SELinux 规则强制执行。与任何 APK 一样,Data App 必须使用 <code>/system/priv-app</code> 版本所用的同一密钥签名。Data App 应采用专属的 OEM 软件包名称和密钥。</p>
+
+<h2 id="integrating">集成时区更新</h2>
+<p>为了启用时区更新功能,OEM 通常要执行以下操作:</p>
+<ul>
+<li>创建自己的 Data App。</li>
+<li>在系统映像编译中加入 Updater App 和 Data App。</li>
+<li>配置系统服务器以启用 RulesManagerService。</li>
+</ul>
+
+<h3 id="preparing">准备工作</h3>
+<p>开始操作前,请查看以下政策、质量保证和安全注意事项:</p>
+<ul>
+<li>OEM 应当为其 Data App 创建该应用专用的签名密钥。</li>
+<li>OEM 应当针对时区更新拟订版本发布和版本控制策略,以了解将更新哪些设备以及如何确保只在需要的设备上安装更新。例如,OEM 可能希望为所有设备使用相同的 Data App,或者为各个设备使用不同的 Data App。相关决定会影响所选择的软件包名称和质量保证策略,还有可能影响所使用的版本号。</li>
+<li>OEM 应明确自己是要使用 AOSP 的原生 Android 时区数据,还是要创建自己的 Android 时区数据。</li>
+</ul>
+
+<h3 id="creating-data-app">创建 Data App</h3>
+<p>AOSP 在 <code>packages/apps/TimeZoneData</code> 中提供了创建 Data App 所需的所有源代码和编译规则,还提供了针对 <code>AndroidManifest.xml</code> 文件以及 <code>packages/apps/TimeZoneData/oem_template</code> 中的其他文件的说明和示例模板。示例模板包括用于实际 Data App .apk 文件的编译目标,以及用于创建 Data App 测试版本的额外目标。</p>
+<p>OEM 可以使用自己的图标、名称、翻译等内容自定义 Data App。但是,由于 Data App 无法启动,图标仅会显示在“设置 &gt; 应用”屏幕中。<em></em></p>
+<p>Data App 按计划应采用 <strong>Tapas</strong> 编译进程进行编译。该编译进程生成的 .apk 适合添加到系统映像(针对初始版本)并适合通过应用商店进行签名和分发(针对后续更新)。要详细了解如何使用 Tapas,请参阅<a href="#building-tapas">使用 Tapas 编译 Data App</a>。</p>
+
+<aside class="note"><strong>注意</strong>:如何对 APK 进行安全签名和如何进行密钥管理不在本文讨论范围之内。</aside>
+
+<p>OEM 必须在 <code>/system/priv-app</code> 中安装设备的系统映像中预编译的 Data App。要在系统映像中包含预编译的 .apk(由 Tapas 编译进程生成),OEM 可以复制 <code>packages/apps/TimeZoneData/oem_template/data_app_prebuilt</code> 中的示例文件。示例模板还包括编译目标,以便在测试套件中包含 Data App 的测试版本。</p>
+
+<h3 id="including">在系统映像中加入 Updater App 和 Data App</h3>
+<p>OEM 必须将 Updater App 和 Data App .apk 文件放在系统映像的 <code>/system/priv-app</code> 目录中。为此,系统映像编译必须明确包含 Updater App 和 Data App 预编译目标。</p>
+<p>Updater App 应使用平台密钥进行签名,并与其他系统应用一样包含在映像内。目标在 <code>packages/apps/TimeZoneUpdater</code> 中定义为 <code>TimeZoneUpdater</code>。将 Data App 加入映像的方式因 OEM 而异,并取决于为预编译选择的目标名称。</p>
+
+<h3 id="configuring-system-server">配置系统服务器</h3>
+<p>为了启用时区更新,OEM 可以通过替换在 <code>frameworks/base/core/res/res/values/config.xml</code> 中定义的配置属性来配置系统服务器。</p>
+
+<table>
+<thead>
+<tr>
+<th>属性</th>
+<th width="20%">需要替换?</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<pre class="prettyprint">
+
+config_enableUpdateableTimeZoneRules</pre>
+必须设置为 true 才能启用 RulesManagerService。</td>
+<td>是</td>
+</tr>
+<tr>
+<td><pre class="prettyprint">
+
+config_timeZoneRulesUpdateTrackingEnabled</pre>
+必须设置为 true 才能让系统监听对 Data App 的更改。</td>
+<td>是</td>
+</tr>
+<tr>
+<td><pre class="prettyprint">
+
+config_timeZoneRulesDataPackage</pre>
+OEM 专属 Data App 的软件包名称。</td>
+<td>是</td>
+</tr>
+<tr>
+<td><pre class="prettyprint">
+
+config_timeZoneRulesUpdaterPackage</pre>
+针对默认 Updater App 的配置。仅在提供不同的 Updater App 实现时才更改。</td>
+<td>否</td>
+</tr>
+<tr>
+<td><pre class="prettyprint">
+
+config_timeZoneRulesCheckTimeMillisAllowed</pre>
+RulesManagerService 触发更新检查的操作与安装、卸载或无操作响应之间所允许的间隔时间。在此时间之后,可能会自发地触发可靠性检查。</td>
+<td>否</td>
+</tr>
+<tr>
+<td><pre class="prettyprint">
+
+config_timeZoneRulesCheckRetryCount</pre>
+在 RulesManagerService 停止触发更多更新检查前所允许的连续失败更新检查次数。</td>
+<td>否</td>
+</tr>
+</tbody>
+</table>
+
+<p>配置替换文件应位于系统映像(而非 vendor 或 other 目录)中,因为配置错误的设备可能会无法启动。如果配置替换文件位于 <code>/vendor</code> 中,则更新到不含 Data App(或所含的 Data App/Updater App 具有不同的软件包名称)的系统映像将被视为配置错误。</p>
+
+<h3 id="xts-testing">xTS 测试</h3>
+<p>xTS 是指任何 OEM 专属测试套件,类似于采用 Tradefed 的标准 Android 测试套件(例如 CTS 和 VTS)。具有此类测试套件的 OEM 可添加以下位置中提供的 Android 时区更新测试:</p>
+
+<ul>
+<li><code>packages/apps/TimeZoneData/testing/xts</code>。包含自动执行基本功能测试所需的代码。</li>
+<li><code>packages/apps/TimeZoneData/oem_template/xts</code>。包含一个示例目录结构,用于将测试添加到类似 Tradefed 的 xTS 套件中。与其他模板目录一样,OEM 应根据自己的需求复制和自定义代码。</li>
+<li><code>packages/apps/TimeZoneData/oem_template/data_app_prebuilt</code>。包含编译时配置,用于纳入测试所需的预编译测试 .apk 文件。</li>
+</ul>
+
+<aside class="note"><strong>注意</strong>:设置 OEM 专属测试套件不在本文的讨论范围内。</aside>
+
+<h2 id="creating-updates">创建时区更新</h2>
+<p>当 IANA 发布一组新时区规则时,Android 核心库团队将生成补丁程序来更新 AOSP 中的版本。那些采用原生 Android 系统和发行版文件的 OEM 可提取这些变更,用它们来创建新版 Data App,然后发布新版本来更新其正式版设备。</p>
+
+<aside class="note"><strong>注意</strong>:以下步骤未说明如何更新 <code>/system</code> 映像中的基础数据文件,这是在准备出厂映像或系统更新时需要执行的工作。该过程还会生成要包含在 Data App 中的发行版文件。有关如何更新平台文件的说明,请参阅 <code>/system/timezone/README.android</code>。</aside>
+
+<p>由于 Data App 包含与 Android 版本紧密关联的发行版文件,OEM 必须为其要更新的每个受支持的 Android 版本创建一个新的 Data App 版本。<em></em>例如,如果 OEM 想要更新 O-MR1、P 和 Q 设备,则必须完成该过程三次。</p>
+
+<h3 id="step1">第 1 步:更新 system/timezone 和 external/icu 数据文件</h3>
+<p>在此步骤中,OEM 从 AOSP 的 release-dev 分支中提取 <code>system/timezone</code> 和 <code>external/icu</code> 的原生 Android 代码变更,并将这些变更应用到其 Android 源代码副本中。<em></em></p>
+<p>system/timezone AOSP 修补程序更新后的文件位于 <code>system/timezone/input_data</code> 和 <code>system/timezone/output_data</code> 中。需要在本地进行其他修复的 OEM 可以修改输入文件,然后使用 <code>system/timezone/input_data</code> 和 <code>external/icu</code> 中的文件生成 <code>output_data</code> 中的文件。</p>
+<p>最重要的文件是 <code>system/timezone/output_data/distro/distro.zip</code>。编译 Data App .apk 时,会自动包含该文件。</p>
+
+<h3 id="step2">第 2 步:更新 Data App 的版本号</h3>
+<p>在此步骤中,OEM 将更新 Data App 的版本号。编译进程会自动选取 <code>distro.zip</code>,但新版 Data App 必须具有新的版本号,以便被识别为新版本并用于替换预加载的 Data App 或之前的设备更新所安装的 Data App。</p>
+<p>使用从 <code>package/apps/TimeZoneData/oem_template/data_app</code> 复制的文件编译 Data App 时,可以在 <code>Android.mk</code> 中查找应用于 .apk 的版本号/版本名称:
+</p>
+
+<pre class="prettyprint">
+TIME_ZONE_DATA_APP_VERSION_CODE :=
+TIME_ZONE_DATA_APP_VERSION_NAME :=
+</pre>
+
+<p>类似的条目可以在 <code>testing/Android.mk</code> 中找到(但是,测试版本号必须高于系统映像版本)。要了解详情,请参阅<a href="#example-version-code-strategy">示例版本号策略方案</a>;如果使用示例方案或类似方案,则不需要更新测试版本号,因为它们肯定高于实际版本号。</p>
+
+<h3 id="step3">第 3 步:重新编译、签名、测试和发布</h3>
+<p>在此步骤中,OEM 使用 Tapas 重新编译 .apk 文件,对生成的 .apk 文件进行签名,然后测试并发布 .apk:</p>
+<ul>
+<li>对于未发布的设备(或准备已发布设备的系统更新时),请在 Data App 预编译目录中提交新的 .apk 文件,以确保系统映像和 xTS 测试具有最新的 .apk。OEM 应测试新文件能否正常工作(通过 CTS 和任何 OEM 专属的自动和手动测试)。</li>
+<li>对于不再接收系统更新的已发布设备,可能只能通过应用商店发布已签名的 .apk。</li>
+</ul>
+<p>OEM 全权负责质量保证以及在发布之前在其设备上测试更新的 Data App。</p>
+
+<h2 id="version-code-strategy">Data App 版本号策略</h2>
+<p>Data App 必须具有<a href="https://developer.android.com/google/play/publishing/multiple-apks.html#VersionCodes">适当的版本控制策略</a>,以确保设备接收正确的 .apk 文件。例如,如果收到的系统更新中包含的 .apk 版本低于从应用商店下载的版本,则应保留应用商店版本。</p>
+<p>.apk 版本号应包含以下信息:</p>
+<ul>
+<li>发行版格式版本 (Major + Minor)</li>
+<li>递增(不透明)版本号</li>
+</ul>
+<p>目前,平台 API 级别与发行版格式版本密切相关,因为每个 API 级别通常都与新版本的 ICU 相关联(这会造成发行版文件不兼容)。将来的 Android 版本可能会改变这一情况,使得一个发行版文件适用于多个 Android 平台版本(并且不在 Data App 版本号方案中使用 API 级别)。</p>
+
+<h3 id="example-version-code-strategy">版本号策略示例</h3>
+<p>此示例版本号方案可确保较高的发行版格式版本优先于较低的发行版格式版本。<code>AndroidManifest.xml</code> 使用 <code>android:minSdkVersion</code> 来确保旧版设备不会收到高于其可处理的版本的发行版格式版本。</p>
+
+<figure>
+<img src="images/tz_version_check.png" alt="版本检查" id="version-check"/>
+<figcaption><strong>图 6.</strong> 版本号策略示例。
+</figcaption></figure>
+
+<table>
+<thead>
+<tr>
+<th>示例</th>
+<th width="20%">值</th>
+<th>用途</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td><strong>Y</strong></td>
+<td>保留</td>
+<td>用于在将来指定替代方案和/或测试 APK。该值最初(隐式)为 0。由于基础类型是一个带符号的 32 位整数类型,因此该方案未来最多支持两种编号方案修订版本。</td>
+</tr>
+<tr>
+<td><strong>01</strong></td>
+<td>Major 格式版本</td>
+<td>用于跟踪 3 位十进制数字 Major 格式版本。发行版格式支持 3 位十进制数字,但在此处仅使用 2 位。根据每个 API 级别的 Major 版本号预期递增情况,此数字不太可能达到 100。Major 版本 1 == API 级别 27。</td>
+</tr>
+<tr>
+<td><strong>1</strong></td>
+<td>Minor 格式版本</td>
+<td>用于跟踪 3 位十进制数字 Minor 格式版本。发行版格式支持 3 位十进制数字,但在此处仅使用 1 位。此数字不太可能达到 10。</td>
+</tr>
+<tr>
+<td><strong>X</strong></td>
+<td>保留</td>
+<td>正式版为 0(对于测试 APK,可为不同的值)。</td>
+</tr>
+<tr>
+<td><strong>ZZZZZ</strong></td>
+<td>不透明版本号</td>
+<td>按需分配的十进制数字。可存在间隙,以便在需要时执行间隙式更新。</td>
+</tr>
+</tbody>
+</table>
+
+<p>如果采用二进制而非十进制,则可以更好地打包该方案,但在可读性方面,十进制方案更具优势。如果整个范围的数字已用尽,则将来的版本可以更改 Data App 软件包名称并重新开始编号。</p>
+
+<p>版本名称将采用相关详情的可读表示法,例如:<code>major=001,minor=001,iana=2017a, revision=1,respin=2</code>。示例:</p>
+
+<table>
+<thead>
+<tr>
+<th>编号</th>
+<th>版本号</th>
+<th>minSdkVersion</th>
+<th>{Major 格式版本}.{Minor 格式版本}.{IANA 规则版本}.{修订版本}</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>1</td>
+<td>11000010</td>
+<td>O-MR1</td>
+<td>major=001,minor=001,iana=2017a,revision=1</td>
+</tr>
+<tr>
+<td>2</td>
+<td>21000010</td>
+<td>P</td>
+<td>major=002,minor=001,iana=2017a,revision=1</td>
+</tr>
+<tr>
+<td>3</td>
+<td>11000020</td>
+<td>O-MR1</td>
+<td>major=001,minor=001,iana=2017a,revision=2</td>
+</tr>
+<tr>
+<td>4</td>
+<td>11000030</td>
+<td>O-MR1</td>
+<td>major=001,minor=001,iana=2017b,revision=1</td>
+</tr>
+<tr>
+<td>5</td>
+<td>21000020</td>
+<td>P</td>
+<td>major=002,minor=001,iana=2017b,revision=1</td>
+</tr>
+<tr>
+<td>6</td>
+<td>11000040</td>
+<td>O-MR1</td>
+<td>major=001,minor=001,iana=2018a,revision=1</td>
+</tr>
+<tr>
+<td>7</td>
+<td>21000030</td>
+<td>P</td>
+<td>major=002,minor=001,iana=2018a,revision=1</td>
+</tr>
+<tr>
+<td>8</td>
+<td>1123456789</td>
+<td>-</td>
+<td>-</td>
+</tr>
+<tr>
+<td>9</td>
+<td>11000021</td>
+<td>O-MR1</td>
+<td>major=001,minor=001,iana=2017a,revision=2,respin=2</td>
+</tr>
+</tbody>
+</table>
+
+<ul>
+<li>示例 1 和示例 2 分别显示了同一 2017a IANA 版本的两个具有不同 Major 格式版本的 .apk 版本。示例 2 在数值上高于示例 1,这是为了确保较新的设备接收较高的格式版本。minSdkVersion 可确保不会将 P 版本提供给 O 设备。</li>
+<li>示例 3 是示例 1 的示例修订版本/修复版本,在数值上高于示例 1。
+</li>
+<li>示例 4 和示例 5 显示用于 O-MR1 和 P 的 2017b 版本。由于在数值上更高,这两个示例取代了各自之前的 IANA 版本/Android 修订版本。</li>
+<li>示例 6 和示例 7 显示用于 O-MR1 和 P 的 2018a 版本。</li>
+<li>示例 8 演示使用 Y 来完全替换 Y=0 方案。
+</li>
+<li>示例 9 演示使用示例 3 和示例 4 之间的间隙来重制 apk。</li>
+</ul>
+
+<p>由于每个设备在出厂时,其系统映像中都会附带适当版本的默认 .apk,因此在 P 设备上安装 O-MR1 版本不会有任何风险,因为它的版本号低于 P 系统映像的版本。如果设备在 <code>/data</code> 中安装了 O-MR1 版本,随后又收到了更新至 P 版本的系统更新,则该设备将优先使用 <code>/system</code> 版本而非 <code> /data</code> 中的 O-MR1 版本,因为 P 版本将始终高于旨在用于 O-MR1 的任何应用版本。</p>
+
+<h2 id="building-tapas">使用 Tapas 编译 Data App</h2>
+<p>OEM 负责管理时区 Data App 的大部分内容,并负责正确配置系统映像。Data App 按计划应采用 <strong>Tapas</strong> 编译进程进行编译。该编译进程生成的 .apk 适合添加到系统映像(针对初始版本)并适合通过应用商店进行签名和分发(针对后续更新)。</p><p>
+</p><p><strong>Tapas</strong> 是 Android 编译系统的精简版本,它使用简化的源代码树来生成可分发的应用版本。熟悉常规 Android 编译系统的 OEM 可认出其编译文件与常规 Android 平台编译文件的不同之处。</p>
+
+<h3 id="creating-manifest">创建清单</h3>
+<p>简化的源代码树通常可通过自定义清单文件来实现,该文件仅会引用编译系统及编译应用所需的 Git 项目。按照<a href="#creating-data-app">创建 Data App</a> 中的说明操作后,OEM 应至少有两个使用 <code>packages/apps/TimeZoneData/oem_template</code> 下的模板文件创建的 OEM 专属 Git 项目:</p>
+
+<ul>
+<li>一个 Git 项目中包含应用文件,例如创建应用 .apk 文件(如 <code>vendor/<em>oem</em>/apps/TimeZoneData</code>)时所需的清单和编译文件。此项目还包含可供 xTS 测试使用的测试 APK 的编译规则。</li>
+<li>一个 Git 项目中包含由应用编译生成的已签名 .apk 文件,以将其包含在系统映像编译和 xTS 测试中。</li>
+</ul>
+
+<p>应用编译会用到几个其他的 Git 项目,这些 Git 项目要么与平台编译共享,要么包含独立于 OEM 的代码库。</p>
+<p>以下清单代码段包含时区 Data App 的 O-MR1 编译在最低限度下所需的一组 Git 项目(将来的 Android 版本将采用不同的列表,甚至可能会更改编译系统)。OEM 必须将其 OEM 专属 Git 项目(通常包括一个含签名证书的项目)添加到此清单,并可以相应地配置不同的分支。</p>
+
+<pre class="prettyprint">
+   &lt;!-- Tapas Build --&gt;
+    &lt;project
+        path="build"
+        name="platform/build"&gt;
+        &lt;copyfile src="core/root.mk" dest="Makefile" /&gt;
+    &lt;/project&gt;
+    &lt;project
+        path="prebuilts/build-tools"
+        name="platform/prebuilts/build-tools"
+        clone-depth="1" /&gt;
+    &lt;project
+        path="prebuilts/go/linux-x86"
+        name="platform/prebuilts/go/linux-x86"
+        clone-depth="1" /&gt;
+    &lt;project
+        path="build/blueprint"
+        name="platform/build/blueprint" /&gt;
+    &lt;project
+        path="build/kati"
+        name="platform/build/kati" /&gt;
+    &lt;project
+        path="build/soong"
+        name="platform/build/soong"&gt;
+        &lt;linkfile src="root.bp" dest="Android.bp" /&gt;
+        &lt;linkfile src="bootstrap.bash" dest="bootstrap.bash" /&gt;
+    &lt;/project&gt;
+
+    &lt;!-- SDK for system / public API stubs --&gt;
+    &lt;project
+        path="prebuilts/sdk"
+        name="platform/prebuilts/sdk"
+        clone-depth="1" /&gt;
+    &lt;!-- App source --&gt;
+    &lt;project
+        path="system/timezone"
+        name="platform/system/timezone" /&gt;
+    &lt;project
+        path="packages/apps/TimeZoneData"
+        name="platform/packages/apps/TimeZoneData" /&gt;
+    &lt;!-- Enable repohooks --&gt;
+    &lt;project
+        path="tools/repohooks"
+        name="platform/tools/repohooks"
+        revision="master"
+        clone_depth="1" /&gt;
+    &lt;repo-hooks
+        in-project="platform/tools/repohooks"
+        enabled-list="pre-upload" /&gt;
+</pre>
+
+<h3 id="running-tapas">运行 Tapas 编译</h3>
+<p>建立源代码树之后,使用以下命令调用 <strong>Tapas</strong> 编译:</p>
+
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">source build/envsetup.sh</code>
+<code class="devsite-terminal">tapas</code>
+<code class="devsite-terminal">make -j30 showcommands dist TARGET_BUILD_APPS='TimeZoneData TimeZoneData_test1 TimeZoneData_test2'  TARGET_BUILD_VARIANT=userdebug</code>
+</pre>
+
+<p>成功的编译将在 <code>out/dist</code> 目录中生成用于测试的文件。可以将这些文件放在预编译目录中,以便加入到系统映像中,和/或通过应用商店分发到兼容设备。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/connect/block-numbers.html b/zh-cn/devices/tech/connect/block-numbers.html
index 991cbb0..1fea01c 100644
--- a/zh-cn/devices/tech/connect/block-numbers.html
+++ b/zh-cn/devices/tech/connect/block-numbers.html
@@ -51,7 +51,7 @@
 
 <h2 id="data-flow">数据流</h2>
 
-<img src="images/block-numbers-flow.png" alt="屏蔽号码数据流" id="block-numbers-flow"/>
+<img src="/devices/tech/connect/images/block-numbers-flow.png" alt="屏蔽号码数据流" id="block-numbers-flow"/>
 <p class="img-caption">
   <strong>图 1.</strong> 屏蔽电话号码数据流</p>
 
@@ -63,13 +63,13 @@
 
 <h3 id="launch-from-app">从应用启动屏蔽号码管理程序</h3>
 
-<pre>
+<pre class="prettyprint">
 Context.startActivity(telecomManager.createManageBlockedNumbersIntent(), null);
 </pre>
 
 <h3 id="query-blocked-numbers">查询屏蔽号码</h3>
 
-<pre>
+<pre class="prettyprint">
 Cursor c = getContentResolver().query(BlockedNumbers.CONTENT_URI,
          new String[]{BlockedNumbers.COLUMN_ID,
          BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
@@ -78,7 +78,7 @@
 
 <h3 id="put-blocked-number">添加屏蔽号码</h3>
 
-<pre>
+<pre class="prettyprint">
 ContentValues values = new ContentValues();
 values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890");
 Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values);
@@ -86,7 +86,7 @@
 
 <h3 id="delete-blocked-number">删除屏蔽号码</h3>
 
-<pre>
+<pre class="prettyprint">
 ContentValues values = new ContentValues();
 values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890");
 Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values);
@@ -112,7 +112,7 @@
 </p>
 
 <p>
-如果设备之前配备了呼叫/短信限制功能,请调整该功能,以便所有严格匹配的屏蔽电话号码都存储在 <code>BlockedNumberProvider,</code> 中,并且围绕提供程序的行为满足 Android 兼容性定义文档 (CDD) 中针对此功能的要求。<em></em>
+如果设备之前配备了呼叫/短信限制功能,请调整该功能,以便所有严格匹配的屏蔽电话号码都存储在 <code>BlockedNumberProvider,</code> 中,并且围绕该提供程序的行为满足 Android 兼容性定义文档 (CDD) 中针对此功能的要求。<em></em>
 </p>
 
 <p>
@@ -164,7 +164,7 @@
 实现人员可以通过运行以下 CTS 测试来确保其功能版本能够按预期运转:
 </p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 android.provider.cts.BlockedNumberContractTest
 com.android.cts.numberblocking.hostside.NumberBlockingTest
 android.telecom.cts.ExtendedInCallServiceTest#testIncomingCallFromBlockedNumber_IsRejected
@@ -174,11 +174,11 @@
 <p>
 在运行 <code>$ adb root</code> 之后,可以使用 <code>adb</code> 命令来操作 <code>BlockedNumberProvider</code>。例如:
 </p>
-<pre>
-$ adb root
-$ adb shell content query --uri content://com.android.blockednumber/blocked
-$ adb shell content insert --uri / content://com.android.blockednumber/blocked --bind / original_number:s:'6501002000'
-$ adb shell content delete --uri / content://com.android.blockednumber/blocked/1
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb root</code>
+<code class="devsite-terminal">adb shell content query --uri content://com.android.blockednumber/blocked</code>
+<code class="devsite-terminal">adb shell content insert --uri / content://com.android.blockednumber/blocked --bind / original_number:s:'6501002000'</code>
+<code class="devsite-terminal">adb shell content delete --uri / content://com.android.blockednumber/blocked/1</code>
 </pre>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/connect/connect_tests.html b/zh-cn/devices/tech/connect/connect_tests.html
new file mode 100644
index 0000000..d6c89fb
--- /dev/null
+++ b/zh-cn/devices/tech/connect/connect_tests.html
@@ -0,0 +1,66 @@
+<html devsite><head>
+    <title>网络连接测试</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>Android Connectivity Testing Suite (ACTS) 测试填补了 Android 框架 API 和芯片组认证之间的测试空白。这些测试可验证 Android 框架所用的蓝牙、WLAN 和移动网络各方面的功能。</p>
+
+<h2 id="users">哪些人应该运行 ACTS 测试?</h2>
+
+<p>应该由负责 Android 堆栈的连接(蓝牙、WLAN 和移动网络)部分的开发者和集成人员运行 ACTS 测试。如果您要添加新功能、集成芯片组或驱动程序变更,这些测试可帮助您确保所做的更改功能和稳定性正常且符合基本的性能标准。</p>
+
+<p>这些测试为可选测试,任何 Android 设备认证都不强制要求完成这些测试。</p>
+
+<h2 id="how">如何运行 ACTS</h2>
+
+<p>ACTS 测试利用特权 Android API 解锁原本不可用的更深层次的测试。因此,只能使用 ACTS 来测试工程和 userdebug 版本。</p>
+
+<p>ACTS 测试旨在以最少且通常是现成的硬件运行,不过,测试也需要一些设备(因测试类型而异)。对于很多测试,两台 Android 设备或一台设备以及一个 WLAN 接入点就足够了。请参阅针对其中一个主要测试方面(蓝牙、WLAN 或移动网络)的文档,以确定具体的设置要求。</p>
+
+<h2 id="test-types">测试类型</h2>
+
+<h3 id="script-android">Android 脚本层</h3>
+
+<p><code><a href="https://android.googlesource.com/platform/external/sl4a/"><platform>/external/sl4a</platform></a></code> 中的 <a href="https://android.googlesource.com/platform/external/sl4a/+/master/README.md">Android 脚本层</a>是来自同名开放源代码项目的一个分支。该工具提供精简型 RPC 服务器来公开 Android 的 Java API。它允许测试脱机驻留,支持设备的协同自动化,从而实现更丰富的动态测试。在过去的 18 个月中,Google 已经调整、更新、扩展并使用该项目来远程运用 Android 的 Java API 测试无线连接。</p>
+
+<h3 id="script-native">原生脚本层</h3>
+
+<p><code><a href="https://android.googlesource.com/platform/packages/apps/Test/connectivity/"><platform>/packages/apps/Test/connectivity</platform></a></code> 中的<a href="https://android.googlesource.com/platform/packages/apps/Test/connectivity/+/master/sl4n/README.md">原生脚本层</a>是全新的内部发展型 RPC 服务器,用于以 Android 脚本层公开 Java API 的方式公开 Android 的原生 API。该工具目前用于测试 Brillo,我们预计该项目将迅速扩展,以满足越来越重要的原生无线 API 的测试需求。</p>
+
+<h3 id="script-android">Android 通讯测试套件</h3>
+
+<p><code><a href="https://android.googlesource.com/platform/tools/test/connectivity/"><platform>/tools/test/connectivity</platform></a></code> 中的 <a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/README.md">Android 通讯测试套件</a>为基于 Python 的轻量级自动化工具集,用于针对当前和即将推出的 Android 设备执行自动化测试。它提供了简洁的执行界面、一组用于访问衰减器等设备和 Android 设备的可插拔库,以及一些可进一步简化测试开发的实用函数。我们认为它是一种非常适合无线堆栈开发者或集成人员的桌面工具,无论他们是创建新的代码路径、执行基本的完整性测试,还是运行扩展的回归测试套件都没问题。</p>
+
+<p>本测试套件还包括一系列测试,很多测试在一台或两台具有 WLAN、移动网络或蓝牙连接的 Android 设备上即可运行,其中包括:</p>
+
+<ul>
+<li>针对 AP IOT、企业连接、WifiScanner、Autojoin 和 RTT 的 WLAN 测试。</li><li>针对 BLE、GATT、SPP 和 Bonding 的蓝牙测试。
+</li><li>针对 CS 和 IMS 呼叫、数据网络连接、短信、网络切换和热点的移动网络测试。</li>
+</ul>
+
+<p>我们相信,通过降低基本测试的门槛,并作为整个社区基于改进的系统测试进行协作的聚合点,这些工具的发布将帮助开发者、集成人员和测试人员等。</p>
+
+<h2 id="failures-contributors">失败和贡献</h2>
+
+<p>ACTS 测试并非认证套件,严格意义上来说,发布 Android 设备无需通过这些测试,但是,测试失败可能说明用户体验不佳。也就是说,如果测试失败,也无需感到失望。一些测试有意让您很难通过。其目的是帮助开发者推出高性能设备。</p>
+
+<p>ACTS 是一项相对较新的举措,并且来自开发社区的参与至关重要。如需添加测试、报告问题或提出问题,请在 <a href="https://code.google.com/p/android/issues/entry">Android 问题跟踪器</a>上使用连接性测试模板新开一个错误,以发起相关交流。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/connect/data-saver.html b/zh-cn/devices/tech/connect/data-saver.html
index 9ae8253..eb46d9e 100644
--- a/zh-cn/devices/tech/connect/data-saver.html
+++ b/zh-cn/devices/tech/connect/data-saver.html
@@ -45,19 +45,19 @@
 <p>这些屏幕截图显示了使用中的流量节省程序模式。
 </p>
 
-<img src="images/data-saver-use.png" width="397" alt="关闭/开启流量节省程序"/>
+<img src="/devices/tech/connect/images/data-saver-use.png" width="397" alt="关闭/开启流量节省程序"/>
 <p class="img-caption">
   <strong>图 1.</strong> 关闭/打开流量节省程序</p>
 
-<img src="images/data-battery-saver.png" width="641" alt="省电模式和流量节省程序同时开启"/>
+<img src="/devices/tech/connect/images/data-battery-saver.png" width="641" alt="省电模式和流量节省程序同时开启"/>
 <p class="img-caption">
   <strong>图 2.</strong> 省电模式和流量节省程序同时开启</p>
 
-<img src="images/data-saver-app.png" width="376" alt="特定应用流量使用情况屏幕"/>
+<img src="/devices/tech/connect/images/data-saver-app.png" width="376" alt="特定应用流量使用情况屏幕"/>
 <p class="img-caption">
   <strong>图 3.</strong> 特定应用流量使用情况屏幕:“设置”&gt;“应用”&gt;“流量使用情况”</p>
 
-<img src="images/data-saver-quick-settings.png" width="446" alt="“快捷设置”中的流量节省程序"/>
+<img src="/devices/tech/connect/images/data-saver-quick-settings.png" width="446" alt="“快捷设置”中的流量节省程序"/>
 <p class="img-caption">
   <strong>图 4.</strong> “快捷设置”菜单中的流量节省程序状态</p>
 
@@ -92,16 +92,18 @@
 
 <p>实现人员可以运行以下 CTS 测试,从而确保其功能版本能够按预期运行。</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 com.android.cts.net.HostsideRestrictBackgroundNetworkTests
 </pre>
 
-<p>此外,还可以先运行以下命令来查看所有可用选项,从而使用 <code>adb</code> 命令手动执行测试:<br />
-<code>$ adb shell cmd netpolicy</code>
-</p>
+<p>此外,还可以先运行以下命令来查看所有可用选项,从而使用 <code>adb</code> 命令手动执行测试:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell cmd netpolicy
+</pre>
 
-<p>例如,执行此命令可返回白名单应用的 UID:<br />
-<code>$ adb shell cmd netpolicy list restrict-background-whitelist</code>
-</p>
+<p>例如,执行此命令可返回白名单应用的 UID:</p>
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell cmd netpolicy list restrict-background-whitelist
+</pre>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/connect/wifi-aware.html b/zh-cn/devices/tech/connect/wifi-aware.html
new file mode 100644
index 0000000..102cc97
--- /dev/null
+++ b/zh-cn/devices/tech/connect/wifi-aware.html
@@ -0,0 +1,85 @@
+<html devsite><head>
+    <title>WLAN 感知</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+Android 8.1 (O MR1) 版本中的 <a href="https://developer.android.com/guide/topics/connectivity/wifi-aware.html">WLAN 感知</a>功能支持多个设备直接通过 WLAN 进行互连(无需连接到互联网或移动网络)。此功能是基于 <a href="https://www.wi-fi.org/">WLAN 联盟</a> <a href="https://www.wi-fi.org/discover-wi-fi/wi-fi-aware">WLAN 感知规范</a>(2.0 版)构建的,它支持在断开网络的情况下,在可信设备与应用之间轻松共享高吞吐量数据。
+</p>
+
+<h2 id="examples-and-source">示例和源代码</h2>
+
+<p>
+要使用此功能,设备制造商应采用在 Android 开源项目 (AOSP) 中提供的 WLAN 硬件接口设计语言 (HIDL)。在 Android 8.0 (O) 版本中,HIDL 取代了之前使用的硬件抽象层 (HAL) 结构,以便通过指定收集到接口和软件包的类型和方法调用来简化实现流程。
+</p>
+
+<p>
+借助 WLAN HIDL 使用 WLAN 感知功能:hardware/interfaces/wifi/1.0。WLAN 感知 HAL 表面非常大;<a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/wifi/1.0/README-NAN.md">hardware/interfaces/wifi/1.0/README-NAN.md</a> 文件描述了当前使用的子集。
+</p>
+
+<p>
+您可以参考旧版 WLAN HAL 来了解它与新 HIDL 接口之间的关系:<a href="https://android.googlesource.com/platform/hardware/libhardware_legacy/+/master/include/hardware_legacy/wifi_nan.h">hardware/libhardware_legacy/+/master/include/hardware_legacy/wifi_nan.h</a>。
+</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>
+设备制造商需要提供框架和 HAL/固件支持:</p>
+<ul>
+  <li>框架:
+  <ul>
+    <li>AOSP 代码</li>
+    <li>启用感知功能:需要功能标记和 HIDL 编译标记</li>
+  </ul>
+    </li><li>WLAN 感知 (NAN) HAL 支持(意味着固件支持)</li>
+
+</ul>
+
+<p>
+为实现此功能,设备制造商需采用 WLAN HIDL,另外还要启用两个功能标记:</p>
+
+<p>
+在 <code>BoardConfig.mk</code> 中,添加此标记可指示 WLAN HIDL 包含 WLAN 感知功能:<code>WIFI_HIDL_FEATURE_AWARE := true</code>
+</p>
+
+<p>
+在 <code>device.mk</code> 中,修改 <code>PRODUCT_COPY_FILES</code> 环境变量以提供对 WLAN 感知功能的支持:
+<code>PRODUCT_COPY_FILES +=
+frameworks/native/data/etc/android.hardware.wifi.aware.xml:system/etc/permissions/android.hardware.wifi.aware.xml</code>
+</p>
+
+<p>
+否则,实现此功能所需的所有内容都会包含在 AOSP 中。</p>
+
+<h2 id="validation">验证</h2>
+
+<p>
+这项功能有适用的 Android 兼容性测试套件 (CTS) 测试。CTS 会检测何时启用了这项功能,并会自动包含相关测试。
+</p>
+
+<p>
+您也可以使用<a href="/devices/tech/test_infra/tradefed/fundamentals/vts">供应商测试套件 (VTS) </a>和 <a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/wifi/">acts/sl4a</a>(用于执行扩展程序集成测试的测试套件)来测试此功能。
+</p>
+
+<p>
+acts/sl4a 测试套件(在 <a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/wifi/aware/README.md">tools/test/connectivity/acts/tests/google/wifi/aware/README.md</a> 中有相应说明)提供了功能测试、性能测试和压力测试。
+</p>
+
+</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 2827db7..674c6d0 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 运行时 (ART) 上验证应用行为</a>。</p>
 
 <h2 id="art_gc_overview">ART GC 概述</h2>
 
@@ -36,8 +36,9 @@
 
 <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 改进的最后一个方面是粘性 CMS 回收器增加了 GC 吞吐量。不同于普通的分代 GC,粘性 CMS 不移动。年轻对象被保存在一个分配堆栈(基本上是 <code>java.lang. Object</code> 数组)中,而非为其设置一个专用区域。这样可以避免移动所需的对象以维持低暂停次数,但缺点是容易在堆栈中加入大量复杂对象图像而使堆栈变长。
+  </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>
 
 <p>ART GC 与 Dalvik 的另一个主要区别在于 ART GC 引入了移动垃圾回收器。使用移动 GC 的目的在于通过堆压缩来减少后台应用使用的内存。目前,触发堆压缩的事件是 ActivityManager 进程状态的改变。当应用转到后台运行时,它会通知 ART 已进入不再“感知”卡顿的进程状态。此时 ART 会进行一些操作(例如,压缩和监视器压缩),从而导致应用线程长时间暂停。目前正在使用的两个移动 GC 是同构空间压缩和半空间压缩。</p>
@@ -93,12 +94,15 @@
 
 <p>通过将 SIGQUIT 发送到已运行的应用,或在启动命令行程序时通过将 -<code>XX:DumpGCPerformanceOnShutdown</code> 传递给 <code>dalvikvm</code>,可以获得应用的 GC 性能时序。当应用获得 ANR 请求信号 (SIGQUIT) 时,它将转储与锁定、线程堆栈和 GC 性能相关的信息。</p>
 
-<p>获取 GC 时序转储的方法是使用以下命令:<br />
-<code>$ adb shell kill -S QUIT <pid></pid></code></p>
+<p>获取 GC 时序转储的方法是使用以下命令:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell kill -S QUIT <var>PID</var>
+</pre>
 
 <p>该操作将在 <code>/data/anr/</code> 中创建一个 <code>traces.txt</code> 文件。此文件包含一些 ANR 转储信息以及 GC 时序。您可以通过搜索“转储累计 GC 时序”来确定 GC 时序。这些时序会显示一些相关内容。它会显示各 GC 类型的阶段和暂停的直方图信息。暂停信息通常比较重要。例如:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 sticky concurrent mark sweep paused:	Sum: 5.491ms 99% C.I. 1.464ms-2.133ms Avg: 1.830ms Max: 2.133ms
 </pre>
 
@@ -106,26 +110,26 @@
 
 <p>需要关注的另一个问题是挂起时间。挂起时间测量在 GC 要求某个线程挂起后,线程到达挂起点所需的时间。该时间包含在 GC 暂停中,所以可用于确定长时间暂停是否是由 GC 缓慢或线程挂起缓慢造成。以下是 Nexus 5 上的正常挂起时间示例:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 suspend all histogram:	Sum: 1.513ms 99% C.I. 3us-546.560us Avg: 47.281us Max: 601us
 </pre>
 
 <p>还有一些其他要关注的方面,例如总耗时、GC 吞吐量等。示例如下:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 Total time spent in GC: 502.251ms
 Mean GC size throughput: 92MB/s
 Mean GC object throughput: 1.54702e+06 objects/s
 </pre>
 
-<p>转储已运行应用的 GC 时序的示例如下:</p><pre>
-$ adb shell kill -s QUIT &lt;pid&gt;
-$ adb pull /data/anr/traces.txt
+<p>转储已运行应用的 GC 时序的示例如下:</p><pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb shell kill -s QUIT <var>PID</var></code>
+<code class="devsite-terminal">adb pull /data/anr/traces.txt</code>
 </pre>
 
 <p>此时,GC 时序包含在 trace.txt 中。Google 地图的输出示例如下:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 Start Dumping histograms for 34 iterations for sticky concurrent mark sweep
 ScanGrayAllocSpaceObjects:	Sum: 196.174ms 99% C.I. 0.011ms-11.615ms Avg: 1.442ms Max: 14.091ms
 FreeList:	Sum: 140.457ms 99% C.I. 6us-1676.749us Avg: 128.505us Max: 9886us
@@ -194,17 +198,17 @@
 
 <p>验证应用行为的另一种方法是使用 CheckJNI。CheckJNI 是一种添加额外 JNI 检查的模式;出于性能考虑,这些选项在默认情况下并不会启用。此类检查将捕获一些可能导致堆损坏的错误,例如使用无效/过时的局部和全局引用。启用 CheckJNI 的方法如下:</p>
 
-<pre>
-$ adb shell setprop dalvik.vm.checkjni true
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell setprop dalvik.vm.checkjni true
 </pre>
 
 <p>Forcecopy 模式是 CheckJNI 的另一部分,对检测超出数组区域末端的写入非常有用。启用后,forcecopy 会促使数组访问 JNI 函数时始终返回带有红色区域的副本。<em></em>红色区域是返回指针结束/开始处的一个区域,该区域具有特殊值,并在数组释放时得到验证。如果红色区域中的值与预期值不匹配,则通常意味着发生缓冲区溢出或欠载。这将导致 CheckJNI 中止。启用 forcecopy 模式的方法如下:</p>
 
-<pre>
-$ adb shell setprop dalvik.vm.jniopts forcecopy
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell setprop dalvik.vm.jniopts forcecopy
 </pre>
 
-<p>CheckJNI 应捕获错误的一个示例是超出从 <code>GetPrimitiveArrayCritical</code> 获取的数组末端的写入。该操作很可能会破坏 Java 堆。如果写入位于 CheckJNI 红色区域内,则在调用相应 <code>ReleasePrimitiveArrayCritical</code> 时,CheckJNI 将会捕获该问题。否则,写入将最终损坏 Java 堆中的一些随机对象,并可能会导致之后出现 GC 崩溃。如果崩溃的内存是引用字段,则 GC 可能会捕获错误并输出“Tried to mark not contained by any spaces<em></em><ptr></ptr>”的错误消息。</p>
+<p>CheckJNI 应捕获错误的一个示例是超出从 <code>GetPrimitiveArrayCritical</code> 获取的数组末端的写入。该操作很可能会破坏 Java 堆。如果写入位于 CheckJNI 红色区域内,则在调用相应 <code>ReleasePrimitiveArrayCritical</code> 时,CheckJNI 将会捕获该问题。否则,写入将最终损坏 Java 堆中的一些随机对象,并可能会导致之后出现 GC 崩溃。如果崩溃的内存是引用字段,则 GC 可能会捕获错误并输出“Tried to mark <ptr>not contained by any spaces</ptr>”的错误消息。<em></em></p>
 
 <p>当 GC 尝试标记无法找到空间的对象时,就会发生此错误。在此检查失败后,GC 会遍历根,并尝试查看无效对象是否为根。结果共有两个选项:对象为根或非根。</p>
 
@@ -214,18 +218,18 @@
 
 <p>以下是一个使用示例:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 # build and install
-$ mmm external/valgrind
-$ adb remount &amp;&amp; adb sync
+<code class="devsite-terminal">mmm external/valgrind</code>
+<code class="devsite-terminal">adb remount &amp;&amp; adb sync</code>
 # disable selinux
-$ adb shell setenforce 0
-$ adb shell setprop wrap.com.android.calculator2
+<code class="devsite-terminal">adb shell setenforce 0</code>
+<code class="devsite-terminal">adb shell setprop wrap.com.android.calculator2</code>
 "TMPDIR=/data/data/com.android.calculator2 logwrapper valgrind"
 # push symbols
-$ adb shell mkdir /data/local/symbols
-$ adb push $OUT/symbols /data/local/symbols
-$ adb logcat
+<code class="devsite-terminal">adb shell mkdir /data/local/symbols</code>
+<code class="devsite-terminal">adb push $OUT/symbols /data/local/symbols</code>
+<code class="devsite-terminal">adb logcat</code>
 </pre>
 
 <h3 id="invalid_root_example">无效的根示例</h3>
@@ -234,7 +238,7 @@
 <code>art E  5955  5955 art/runtime/gc/collector/mark_sweep.cc:383] Tried to mark 0x2
 not contained by any spaces</code></p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 art E  5955  5955 art/runtime/gc/collector/mark_sweep.cc:384] Attempting see if
 it's a bad root
 art E  5955  5955 art/runtime/gc/collector/mark_sweep.cc:485] Found invalid
@@ -245,13 +249,13 @@
 (native PC 0xf19609d9) vreg=1
 </pre>
 
-<p>在这种情况下,<code>vreg 1</code>(在 <code>com.google.gwt.corp.collections.JavaReadableJsArray.get</code> 内)应该包含一个堆引用,但实际上包含地址 <code>0x2</code> 的一个无效指针。这显然是一个无效根。要调试此问题,下一步是在 oat 文件中使用 <code>oatdump</code>,并查看具有无效根的方法。在这种情况下,结果证明错误在于 x86 后端的编译器错误。修正该错误的更改列表如下:<a href="https://android-review.googlesource.com/#/c/133932/">https://android-review.googlesource.com/#/c/133932/</a></p>
+<p>在这种情况下,<code>vreg 1</code>(在 <code>com.google.gwt.corp.collections.JavaReadableJsArray.get</code> 内)应该包含一个堆引用,但实际上却包含了地址 <code>0x2</code> 的一个无效指针。这显然是一个无效根。要调试此问题,下一步是在 oat 文件中使用 <code>oatdump</code>,并查看具有无效根的方法。在这种情况下,结果证明错误在于 x86 后端的编译器错误。修正该错误的更改列表如下:<a href="https://android-review.googlesource.com/#/c/133932/">https://android-review.googlesource.com/#/c/133932/</a></p>
 
 <h3 id="corrupted_object_example">损坏的对象示例</h3>
 
 <p>如果对象不是根,则会输出类似于以下打印内容的消息:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 01-15 12:38:00.196  1217  1238 E art     : Attempting see if it's a bad root
 01-15 12:38:00.196  1217  1238 F art     :
 art/runtime/gc/collector/mark_sweep.cc:381] Can't mark invalid object
diff --git a/zh-cn/devices/tech/dalvik/improvements.html b/zh-cn/devices/tech/dalvik/improvements.html
new file mode 100644
index 0000000..8c82e4d
--- /dev/null
+++ b/zh-cn/devices/tech/dalvik/improvements.html
@@ -0,0 +1,147 @@
+<html devsite><head>
+    <title>Android 8.0 中的 ART 功能改进</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+在 Android 8.0 版本中,Android Runtime (ART) 有了极大改进。下面的列表总结了设备制造商可以在 ART 中获得的增强功能。
+</p>
+
+<h2 id="loop-optimizations">循环优化</h2>
+
+<p>
+在 Android 8.0 版本中,ART 采用了多种循环优化,具体如下:
+</p>
+   <ul>
+     <li>消除边界检查
+       <ul>
+         <li>静态:证明范围在编译时位于边界内
+         </li><li>动态:运行时测试确保循环始终位于边界内(否则就是逆优化)
+       </li></ul>
+     </li><li>消除归纳变量
+       <ul>
+         <li>移除无用归纳</li><li>用封闭式表达式替换仅在循环后使用的归纳
+       </li></ul>
+     </li><li>消除循环主体内的无用代码,移除整个死循环</li><li>强度减少
+     </li><li>循环转换:逆转、交换、拆分、展开、单模等。
+     </li><li>SIMDization(也称为矢量化)</li>
+   </ul>
+
+<p>
+循环优化器位于 ART 编译器中其自身的优化遍数中。
+大多数循环优化与其他方面的优化和简化类似。由于大多数 CFG 实用工具(请参阅 nodes.h)侧重于编译而不是重写 CFG,因此通过更复杂(与平时相比)的方式进行一些重写 CFG 的优化时,会面临挑战。
+</p>
+
+<h2 id="class-hierarchy-analysis">类层次结构分析</h2>
+
+<p>
+在 Android 8.0 中,ART 会使用类层次结构分析 (CHA),这是一种编译器优化,可基于通过分析类层次结构所生成的信息,将虚拟调用去虚拟化为直接调用。虚拟调用代价高昂,因为它们围绕 vtable 查找来实现,且会占用几个依赖负载。另外,虚拟调用也不能内嵌。
+</p>
+
+<p>
+以下是对相关增强功能的总结:
+</p>
+   <ul>
+     <li>动态单一实现方法状态更新 - 在类关联时间结束时,如果 vtable 已被填充,ART 会按条目对超类的 vtable 进行比较。</li>
+     <li>编译器优化 - 编译器会利用某种方法的单一实现信息。如果方法 A.foo 设置了单一实现标记,则编译器会将虚拟调用去虚拟化为直接调用,并借此进一步尝试内联直接调用。</li>
+     <li>已编译代码无效 - 另外,在类关联时间结束时,如果单一实现信息进行了更新,且方法 A.foo 之前拥有单一实现,但该状态现已变为无效,则依赖方法 A.foo 拥有单一实现这一假设的所有已编译代码都需要变为无效代码。</li>
+     <li>去优化 - 对于堆栈上已编译的有效代码,系统会启动去优化功能,以强制使已编译代码进入解释器模式,从而确保正确性。系统会采用结合了同步和异步去优化的全新去优化机制。</li>
+</ul>
+
+<h2 id="inline-caches-in-oat-files">.oat 文件中的内联缓存</h2>
+
+<p>
+ART 现在采用的是内联缓存,并优化了有足够数据可用的调用站点。内联缓存功能会将额外的运行时信息记录到配置文件中,并会利用这类信息将动态优化添加到预先编译中。
+</p>
+
+<h2 id="dexlayout">Dexlayout</h2>
+
+<p>
+Dexlayout 是在 Android 8.0 中引入的一个库,用于分析 dex 文件,并根据配置文件对其进行重新排序。Dexlayout 旨在使用运行时配置信息对 dex 文件的各个部分进行重新排序(在设备的空闲维护编译期间)。通过将经常一起访问的部分 dex 文件集中在一起,程序可以因改进文件位置而拥有更好的内存访问模式,从而节省 RAM 并缩短启动时间。
+</p>
+
+<p>
+由于配置文件信息目前仅在运行应用后可用,因此系统会在空闲维护期间将 dexlayout 集成到 dex2oat 的设备编译中。
+</p>
+
+<h2 id="dex-cache-removal">Dex 缓存移除</h2>
+
+<p>
+在 Android 7.0 及更早版本中,DexCache 对象拥有四个大型数组,与 DexFile 中特定元素的数量成正比,即:
+</p>
+
+<ul>
+  <li>字符串(每个 DexFile :: StringId 一个引用),
+  </li>
+  <li>类型(每个 DexFile :: TypeId 一个引用),
+  </li>
+  <li>方法(每个 DexFile :: MethodId 一个原生指针),
+  </li>
+  <li>字段(每个 DexFile :: FieldId 一个原生指针)。
+  </li>
+</ul>
+
+<p>
+  这些数组用于快速检索我们以前解决的对象。在 Android 8.0 中,除方法数组外,所有数组都已移除。
+</p>
+
+<h2 id="interpreter-performance">解释器性能</h2>
+
+<p>
+通过引入 Mterp(一种解释器,具有以汇编语言编写的核心提取/解码/解释机制),Android 7.0 版本中的解释器性能得以显著提升。Mterp 模仿了快速的 Dalvik 解释器,并支持 arm、arm64、x86、x86_64、mips 和 mips64。对于计算代码而言,ART 的 Mterp 大致相当于 Dalvik 的快速解释器。不过,有时候,它的速度可能会显著变慢,甚至急剧变慢:
+</p>
+
+   <ol>
+     <li>调用性能。</li>
+     <li>字符串操作和 Dalvik 中其他被视为内联函数的高频用户方法。</li>
+     <li>堆栈内存使用量较高。</li>
+   </ol>
+
+<p>
+Android 8.0 解决了这些问题。
+</p>
+
+<h2 id="more-inlining">详细了解内联</h2>
+
+<p>
+从 Android 6.0 开始,ART 可以内联同一个 dex 文件中的任何调用,但只能内联来自其他 dex 文件的叶方法。实施此项限制的两个原因如下:
+</p>
+
+   <ol>
+     <li>从其他 dex 文件进行内联需要使用该 dex 文件的 dex 缓存,这与同一 dex 文件内联(只能重复使用调用程序的 dex 缓存)有所不同。已编译代码中需要具有 dex 缓存,以便执行一系列指令,例如静态调用、字符串加载或类加载。
+     </li><li>堆栈映射只对当前 dex 文件中的方法索引进行编码。</li>
+   </ol>
+
+<p>
+为了取消这些限制,Android 8.0 做出了以下改进:
+</p>
+
+   <ol>
+     <li>从已编译代码中移除 dex 缓存访问(另请参阅“Dex 缓存移除”部分)</li>
+     <li>扩展堆栈映射编码。</li>
+   </ol>
+
+<h2 id="synchronization-improvements">同步方面的改进</h2>
+
+<p>
+ART 团队调整了 MonitorEnter/MonitorExit 代码路径,并减少了我们对 ARMv8 上传统内存屏障的依赖,尽可能将其替换为较新的(获取/释放)指令。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/dalvik/index.html b/zh-cn/devices/tech/dalvik/index.html
index d808ab5..2c2deab 100644
--- a/zh-cn/devices/tech/dalvik/index.html
+++ b/zh-cn/devices/tech/dalvik/index.html
@@ -42,7 +42,7 @@
   <li>采用一个而非两个 GC 暂停</li>
   <li>在 GC 保持暂停状态期间并行处理</li>
   <li>采用总 GC 时间更短的回收器清理最近分配的短时对象这种特殊情况</li>
-  <li>优化了垃圾回收人机工程学,这样能够更加及时地进行并行垃圾回收,这使得 <a href="http://developer.android.com/tools/debugging/debugging-memory.html#LogMessages"><code>GC_FOR_ALLOC</code></a> 事件在典型用例中极为罕见</li>
+  <li>优化了垃圾回收人机工程学,这样能够更加及时地进行并行垃圾回收,而这使得 <a href="http://developer.android.com/tools/debugging/debugging-memory.html#LogMessages"><code>GC_FOR_ALLOC</code></a> 事件在典型用例中极为罕见</li>
   <li>压缩 GC 以减少后台内存使用和碎片</li>
 </ul>
 
@@ -70,9 +70,10 @@
 
 <h4 id="Crash_Reports">优化了异常和崩溃报告中的诊断详细信息</h4>
 
-<p>当发生运行时异常时,ART 会为您提供尽可能多的上下文和详细信息。ART 会提供 <code><a href="http://developer.android.com/reference/java/lang/ClassCastException.html">java.lang.ClassCastException</a></code>、<code><a href="http://developer.android.com/reference/java/lang/ClassNotFoundException.html">java.lang.ClassNotFoundException</a></code> 和 <code><a href="http://developer.android.com/reference/java/lang/NullPointerException.html">java.lang.NullPointerException</a></code> 的更多异常详细信息。(更高版本的 Dalvik 提供 <code><a href="http://developer.android.com/reference/java/lang/ArrayIndexOutOfBoundsException.html">java.lang.ArrayIndexOutOfBoundsException</a></code> 和 <code><a href="http://developer.android.com/reference/java/lang/ArrayStoreException.html">java.lang.ArrayStoreException</a></code> 的更多异常详细信息,现在包括数组大小和超出范围的偏移量。同样,ART 也提供此类信息。)</p>
+<p>当发生运行时异常时,ART 会为您提供尽可能多的上下文和详细信息。ART 会提供 <code><a href="http://developer.android.com/reference/java/lang/ClassCastException.html">java.lang.ClassCastException</a></code>、<code><a href="http://developer.android.com/reference/java/lang/ClassNotFoundException.html">java.lang.ClassNotFoundException</a></code> 和 <code><a href="http://developer.android.com/reference/java/lang/NullPointerException.html">java.lang.NullPointerException</a></code> 的更多异常详细信息。
+(更高版本的 Dalvik 提供 <code><a href="http://developer.android.com/reference/java/lang/ArrayIndexOutOfBoundsException.html">java.lang.ArrayIndexOutOfBoundsException</a></code> 和 <code><a href="http://developer.android.com/reference/java/lang/ArrayStoreException.html">java.lang.ArrayStoreException</a></code> 的更多异常详细信息,这些信息现在包括数组大小和超出范围的偏移量。同样,ART 也提供此类信息。)</p>
 
-<p>例如,<code><a href="http://developer.android.com/reference/java/lang/NullPointerException.html">java.lang.NullPointerException</a></code> 现在显示有关应用尝试处理 null 指针所进行操作(例如应用尝试写入的字段或尝试调用的方法)的信息。一些典型常见示例如下:</p>
+<p>例如,<code><a href="http://developer.android.com/reference/java/lang/NullPointerException.html">java.lang.NullPointerException</a></code> 现在会显示有关应用尝试处理 null 指针所进行操作(例如应用尝试写入的字段或尝试调用的方法)的信息。一些典型常见示例如下:</p>
 
 <pre class="no-pretty-print">
 java.lang.NullPointerException: Attempt to write to field 'int
@@ -87,6 +88,8 @@
 
 <h2 id="Reporting_Problems">报告问题</h2>
 
-<p>如果您遇到任何并非由应用 JNI 问题导致的问题,请访问 <a href="http://b.android.com">http://b.android.com</a>,通过 Android 开放源代码项目问题跟踪器报告这些问题。请包含 <code>"adb bugreport"</code> 和应用在 Google Play 商店中的链接(如果有)。否则,如果可能,请附加可重现该问题的 APK。请注意,这些问题(包括附件)都是公开可见的。</p>
+<p>如果您遇到任何并非由应用 JNI 问题导致的问题,请通过 <a href="/source/report-bugs#platform">Android 开放源代码项目问题跟踪器</a>报告这些问题。请包含 <code>adb bugreport</code> 和应用在 Google Play 商店中的链接(如果有)。否则,如果可能,请附加可重现该问题的 APK。</p>
+
+<aside class="caution"><strong>提醒</strong>:这些问题(包括附件)都是公开可见的。</aside>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/datausage/tags-explained.html b/zh-cn/devices/tech/datausage/tags-explained.html
index 2f25b96..fee1478 100644
--- a/zh-cn/devices/tech/datausage/tags-explained.html
+++ b/zh-cn/devices/tech/datausage/tags-explained.html
@@ -22,10 +22,11 @@
 
 <p>标签是跟踪流量消耗计数器的指标之一。默认情况下,标签仅以隐性方式基于 UID。UID 被用作监管的基础,不容忽视。因此,标签始终至少代表一个 UID (uid_tag)。可以通过与 UID 关联的“帐号标签”明确增强某个标签。用户空间可以使用 <code>TrafficStats.setThreadStatsTag()</code> 设置标签的 acct_tag 部分,然后将标签与套接字配合使用:属于相应套接字的所有数据都将被计入该标签。之后,监管基于该标签的 uid_tag 部分,并单独收集 acct_tag 部分的统计信息。</p>
 <p>如果没有显式标记,则 qtaguid 模块将假设 <code>default_tag:  {acct_tag=0, uid_tag=10003}</code></p>
-<pre><code>    a:  {acct_tag=1, uid_tag=10003}
+<pre class="devsite-click-to-copy">
+    a:  {acct_tag=1, uid_tag=10003}
     b:  {acct_tag=2, uid_tag=10003}
     c:  {acct_tag=3, uid_tag=10003}
-</code></pre>
+</pre>
 <p><code>a, b, c…</code> 表示与特定套接字关联的显式标签。</p>
 <p><code>default_tag (acct_tag=0)</code> 是包含相应 uid 的总流量(包括所有未标记的流量)的默认帐号标签,通常用于强制执行监管/配额规则。</p>
 <p>这些标签可用于将应用的网络流量划分到独立的逻辑类别中(在网络套接字级别)。可在运行时移除、重新应用或修改这些标签。</p>
diff --git a/zh-cn/devices/tech/debug/eval_perf.html b/zh-cn/devices/tech/debug/eval_perf.html
index 4ae4050..38a0c17 100644
--- a/zh-cn/devices/tech/debug/eval_perf.html
+++ b/zh-cn/devices/tech/debug/eval_perf.html
@@ -42,7 +42,7 @@
 <p>特定时间内所需的容量在绝大多数情况下取决于正在运行的应用。因此,平台几乎不能调整特定工作负载所需的容量,调整所用的方式也仅限于运行时改进(Android 框架、ART、Bionic、GPU 编译器/驱动程序、内核)。</p>
 
 <h3 id="jitter">抖动</h3>
-<p>工作负载所需的容量很容易看出来,抖动却是一个比较模糊的概念。有关抖动是快速系统的一种障碍的介绍,请参阅 <em><a href="http://permalink.lanl.gov/object/tr?what=info:lanl-repo/lareport/LA-UR-03-3116">THE CASE OF THE MISSING SUPERCOMPUTER PERFORMANCE: ACHIEVING OPTIMAL PERFORMANCE ON THE 8,192 PROCESSORS OF ASCl Q</a></em>。(这是一项针对 ASCI Q 超级计算机为何达不到预期性能的调查,同时充分介绍了如何优化大型系统。)</p>
+<p>工作负载所需的容量很容易看出来,抖动却是一个比较模糊的概念。有关抖动是快速系统的一种障碍的详细介绍,请参阅 <em><a href="http://permalink.lanl.gov/object/tr?what=info:lanl-repo/lareport/LA-UR-03-3116">THE CASE OF THE MISSING SUPERCOMPUTER PERFORMANCE: ACHIEVING OPTIMAL PERFORMANCE ON THE 8,192 PROCESSORS OF ASCl Q</a></em>。(这是一项针对 ASCI Q 超级计算机为何达不到预期性能的调查,同时充分介绍了如何优化大型系统。)</p>
 
 <p>本页使用“抖动”这一术语来介绍 ASCI Q 论文中提到的噪点。<em></em>抖动是一种随机的系统行为,会阻止可察觉任务的运行。通常是必须运行的任务,但可能对在任一特定时间运行没有严格的定时要求。因为抖动具有随机性,所以很难证明某一特定工作负载不存在抖动,也很难证明某已知抖动源是导致某个特定性能问题的原因。诊断抖动原因最常用的工具(如跟踪或日志记录)可能会引入它们自己的抖动。</p>
 
@@ -76,7 +76,7 @@
 <ol>
 <li>使系统启动到所有驱动程序运行的界面和一些基本的频率调节器设置(如果更改频率调节器设置,请重复以下所有步骤)。</li>
 <li>确保内核支持 <code>sched_blocked_reason</code> 跟踪点以及显示通道中指示何时将帧发送到显示屏的其他跟踪点。</li>
-<li>在运行轻量级的一致性工作负载(如 <a href="https://android.googlesource.com/platform/frameworks/base.git/+/master/tests/UiBench/">UiBench</a> 或 <a href="#touchlatency">TouchLatency 中的球测试</a>)的同时,对整个界面通道(从通过 IRQ 接收输入到最终的扫描输出)进行长时间的跟踪。</li>
+<li>在运行轻量级的一致性工作负载(如 <a href="https://android.googlesource.com/platform/frameworks/base.git/+/master/tests/UiBench/">UiBench</a> 或 <a href="#touchlatency">TouchLatency</a> 中的球测试)的同时,对整个界面通道(从通过 IRQ 接收输入到最终的扫描输出)进行长时间的跟踪。</li>
 <li>修复在轻量级的一致性工作负载中检测到的帧丢失。</li>
 <li>重复执行第 3-4 步,直到您可以在零丢帧的情况下一次运行 20 秒以上的时间。</li>
 <li>转向用户可见的其他卡顿源。</li>
@@ -87,8 +87,10 @@
 <ul>
 <li>确保您的内核有 <a href="https://android.googlesource.com/kernel/msm/+/c9f00aa0e25e397533c198a0fcf6246715f99a7b%5E!/">sched_blocked_reason 跟踪点补丁程序</a>。该跟踪点通过 systrace 中的 sched 跟踪类别启用,并在线程进入不间断休眠时提供负责休眠的函数。它对性能分析非常重要,因为不间断休眠是非常常见的抖动指标。</li>
 <li>确保您拥有足够的 GPU 和显示通道的跟踪。在最近的 Qualcomm SOC 上,跟踪点的启用方法是:</li>
-<pre>$ adb shell "echo 1 &gt; /d/tracing/events/kgsl/enable"
-$ adb shell "echo 1 &gt; /d/tracing/events/mdss/enable"</pre>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb shell "echo 1 &gt; /d/tracing/events/kgsl/enable"</code>
+<code class="devsite-terminal">adb shell "echo 1 &gt; /d/tracing/events/mdss/enable"</code>
+</pre>
 
 <p>运行 systrace 时,这些事件将保持启用状态,以便您在 <code>mdss_fb0</code> 部分的跟踪记录中查看有关显示通道 (MDSS) 的其他信息。在 Qualcomm SOC 上,您无法在 systrace 标准视图下看到有关 GPU 的其他信息,只能看到跟踪记录本身所显示的结果(如需了解详情,请参阅<a href="/devices/tech/debug/systrace.html">了解 systrace</a> 一文)。</p>
 
diff --git a/zh-cn/devices/tech/debug/fuzz-sanitize.html b/zh-cn/devices/tech/debug/fuzz-sanitize.html
new file mode 100644
index 0000000..f24e41f
--- /dev/null
+++ b/zh-cn/devices/tech/debug/fuzz-sanitize.html
@@ -0,0 +1,35 @@
+<html devsite><head>
+    <title>模糊测试和排错程序</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          //www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<p>
+模糊测试(仅仅是将可能无效的数据、异常数据或随机数据输入到程序中)是在大型软件系统中查找错误的一种非常有效的方法,也是软件开发生命周期的重要组成部分。
+</p>
+<p>
+LLVM 是用于编译 Android 的编译器基础架构,它包含可执行静态和动态分析的多个组件,其中排错程序可用于消除错误和改进 Android。
+</p>
+<p>
+尽管 Android 的多个版本都支持模糊测试工具,但 Android 8.0 可提供更多模糊测试方面的支持,并可在 Android 编译系统中提供更紧密的模糊测试工具,还能针对 Android 内核提供更有力的动态分析支持。
+</p>
+<p>
+本部分介绍了如何设置和使用各种模糊测试和排错工具。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/debug/index.html b/zh-cn/devices/tech/debug/index.html
index aaee824..c315317 100644
--- a/zh-cn/devices/tech/debug/index.html
+++ b/zh-cn/devices/tech/debug/index.html
@@ -22,9 +22,9 @@
 
 <p>本部分总结了开发平台级功能时,可用于调试、跟踪和分析原生 Android 平台代码的实用工具和相关命令。</p>
 
-<p class="note"><strong>注意</strong>:本节和本网站其他部分的页面建议您使用 <code>adb</code> 与 <code>setprop</code> 参数一起调试 Android 的某些方面。请注意,在 Android 操作系统的 O 版本之前,属性名称的长度上限为 32 个字符。也就是说,要创建一个包含应用名称的 wrap 属性,您需要截断该名称以使其符合字符数限制。在 Android O 及更高版本中,此字符数上限值要大得多,应该不需要截断。</p>
+<p class="note"><strong>注意</strong>:本部分和本网站其他部分的页面建议您使用 <code>adb</code> 和 <code>setprop</code> 参数一起调试 Android 的某些方面。请注意,在 Android 操作系统的 O 版本之前,属性名称的长度上限为 32 个字符。也就是说,要创建一个包含应用名称的 wrap 属性,您需要截断该名称以使其符合字符数限制。在 Android O 及更高版本中,此字符数上限值要大得多,应该不需要截断。</p>
 
-<p>本页面介绍了 <code>debuggerd</code> 的用法,debuggerd 是一种用于在应用崩溃后收集错误信息的守护进程。本部分的其他页面介绍了如何通过 <a href="https://developer.android.com/studio/command-line/dumpsys.html">Dumpsys</a> 了解系统服务状况,其中包括查看<a href="/devices/tech/debug/native-memory.html">本地内存</a>、<a href="https://developer.android.com/studio/command-line/dumpsys.html#network">网络</a>和 <a href="https://developer.android.com/studio/command-line/dumpsys.html#procstats">RAM</a> 使用情况、使用 <a href="/devices/tech/debug/asan.html">AddressSanitizer</a> 检测原生代码中的内存错误、评估<a href="/devices/tech/debug/eval_perf.html">性能问题</a>(包括 <a href="/devices/tech/debug/systrace">systrace</a>),以及使用 <a href="/devices/tech/debug/gdb.html">GNU 项目调试程序 (GDB)</a> 和其他调试工具。</p>
+<p>本页面介绍了 <code>debuggerd</code> 的用法,debuggerd 是一种用于在应用崩溃后收集错误信息的守护进程。其他页面介绍了如何通过 <a href="https://developer.android.com/studio/command-line/dumpsys.html"><code>dumpsys</code></a> 了解系统服务状况,其中包括查看<a href="/devices/tech/debug/native-memory.html">本地内存</a>、<a href="https://developer.android.com/studio/command-line/dumpsys.html#network">网络</a>和 <a href="https://developer.android.com/studio/command-line/dumpsys.html#procstats">RAM</a> 使用情况、使用 <a href="/devices/tech/debug/asan.html">AddressSanitizer</a> 检测原生代码中的内存错误、评估<a href="/devices/tech/debug/eval_perf.html">性能问题</a>(包括 <a href="/devices/tech/debug/systrace">systrace</a>),以及使用 <a href="/devices/tech/debug/gdb.html">GNU 项目调试程序 (GDB)</a> 和其他调试工具。</p>
 
 <h2 id="debuggerd">使用 debuggerd</h2>
 
diff --git a/zh-cn/devices/tech/debug/libfuzzer.html b/zh-cn/devices/tech/debug/libfuzzer.html
new file mode 100644
index 0000000..3bd133a
--- /dev/null
+++ b/zh-cn/devices/tech/debug/libfuzzer.html
@@ -0,0 +1,247 @@
+<html devsite><head>
+    <title>通过 libFuzzer 进行模糊测试</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>
+模糊测试(只是将可能无效的数据、异常数据或随机数据作为输入内容提供给程序)是在大型软件系统中查找错误的一种非常有效的方式,也是软件开发生命周期的重要组成部分。
+</p>
+<p>
+Android 编译系统通过从 LLVM 编译器基础架构项目纳入 <a href="http://llvm.org/docs/LibFuzzer.html">libFuzzer 项目</a>来支持模糊测试。LibFuzzer 会与被测函数相关联,并会处理在模糊测试会话期间出现的所有输入选择、变更和崩溃报告。LLVM 的排错程序用于协助内存损坏检测以及提供代码覆盖率指标。
+</p>
+<p>
+本文介绍了 Android 上的 libFuzzer 以及如何执行插桩编译,还介绍了如何编写、运行和自定义模糊测试工具。
+</p>
+<h3 id="setup-and-build">设置和编译</h3>
+<p>
+为了确保映像能够在设备上正常运行,请按照以下设置和编译示例进行操作。
+</p>
+<aside class="note"><strong>提示</strong>:要详细了解设置信息,请参阅<a href="/setup/requirements">下载和编译</a>部分。
+请按照说明<a href="/setup/initializing">设置</a>您的编译环境,<a href="/setup/downloading">下载</a>源代码,然后编译 Android(借助 <a href="/setup/building.html#build-the-code">make 命令</a>)。</aside>
+
+<p>使用标准的 Android 编译系统刷写您的设备后,请按照说明刷写 <a href="/devices/tech/debug/asan.html#sanitize_target">AddressSanitizer 编译</a>,然后通过使用 <code>SANITIZE_TARGET='address
+coverage'</code>(而非 <code>SANITIZE_TARGET='address'</code>)来开启覆盖率。
+</p>
+<h4 id="setup-example">设置示例</h4>
+<p>
+本例假设目标设备为 Pixel (<code>sailfish</code>),且已为 USB 调试 (<code>aosp_sailfish-userdebug</code>) 做好准备。
+</p>
+
+<pre class="prettyprint"><code class="devsite-terminal">mkdir ~/bin</code>
+<code class="devsite-terminal">export PATH=~/bin:$PATH</code>
+<code class="devsite-terminal">curl https://storage.googleapis.com/git-repo-downloads/repo &gt; ~/bin/repo</code>
+<code class="devsite-terminal">chmod a+x ~/bin/repo</code>
+<code class="devsite-terminal">repo init -u https://android.googlesource.com/platform/manifest -b master</code>
+<code class="devsite-terminal">repo sync -c -j8</code>
+<code class="devsite-terminal">wget https://dl.google.com/dl/android/aosp/google_devices-sailfish-nde63p-c36cb625.tgz</code>
+<code class="devsite-terminal">tar xvf google_devices-sailfish-nde63p-c36cb625.tgz</code>
+<code class="devsite-terminal">extract-google_devices-sailfish.sh</code>
+<code class="devsite-terminal">wget https://dl.google.com/dl/android/aosp/qcom-sailfish-nde63p-50a5f1e0.tgz</code>
+<code class="devsite-terminal">tar xvf qcom-sailfish-nde63p-50a5f1e0.tgz</code>
+<code class="devsite-terminal">extract-qcom-sailfish.sh</code>
+<code class="devsite-terminal">. build/envsetup.sh</code>
+<code class="devsite-terminal">lunch aosp_sailfish-userdebug</code>
+</pre>
+
+<h4 id="build-example">编译示例</h4>
+<p>
+要创建支持可重现模糊测试会话的插桩系统映像,您需要完成具有两个步骤的编译过程。
+</p>
+<p>
+首先,请执行完整的 Android 编译,并将其刷写到设备。接下来,以现有编译为起点,编译 Android 的插桩版本。编译系统要足够复杂,以便只编译所需的二进制文件并将其放在正确的位置。
+</p>
+
+<ol>
+<li>通过执行以下命令来执行初始编译:
+<pre class="devsite-terminal devsite-click-to-copy">make -j$(nproc)</pre></li>
+<li>要刷写设备,请在启动设备后使用<a href="/source/running.html#booting-into-fastboot-mode">相应的键组合</a>进入 fastboot 模式。</li>
+<li>解锁引导加载程序,并使用下列命令刷写新编译的映像(<code>-w</code> 选项可用于擦除用户数据,以确保干净的初始状态)。
+<pre class="prettyprint"><code class="devsite-terminal">fastboot oem unlock</code>
+<code class="devsite-terminal">fastboot flashall -w</code>
+</pre></li>
+<li>执行插桩编译,并将修改后的二进制文件刷写到设备:
+<pre class="prettyprint"><code class="devsite-terminal">make -j$(nproc) SANITIZE_TARGET='address coverage'</code>
+<code class="devsite-terminal">fastboot flash userdata</code>
+<code class="devsite-terminal">fastboot flashall</code></pre>
+</li>
+</ol>
+
+<p>
+目标设备现在应该已经准备好进行 libFuzzer 模糊测试。为了确保您的编译是插桩编译,请将 adb 作为根来检查 <code>/data/asan/lib</code> 是否存在:
+</p>
+
+<pre class="prettyprint"><code class="devsite-terminal">adb root</code>
+<code class="devsite-terminal">adb shell ls -ld /data/asan/lib*
+drwxrwx--x 6 system system 8192 2016-10-05 14:52 /data/asan/lib
+drwxrwx--x 6 system system 8192 2016-10-05 14:52 /data/asan/lib64</code>
+</pre>
+<p>
+常规的非插桩编译中不存在这类目录。
+</p>
+
+<h2 id="write-a-fuzzer">编写模糊测试工具</h2>
+<p>
+为了说明如何在 Android 中使用 libFuzzer 编写端到端的模糊测试工具,请将以下易受攻击的代码作为测试用例。这样做有助于对模糊测试工具进行测试,确保一切运行正常,并说明崩溃数据是什么样的。
+</p>
+<p>
+以下是测试函数。
+</p>
+
+<pre class="prettyprint">#include &lt;stdint.h&gt;
+#include &lt;stddef.h&gt;
+bool FuzzMe(const uint8_t *Data, size_t DataSize) {
+   return DataSize &gt;= 3 &amp;&amp;
+          Data[0] == 'F' &amp;&amp;
+          Data[1] == 'U' &amp;&amp;
+          Data[2] == 'Z' &amp;&amp;
+          Data[3] == 'Z';  // ← Out of bounds access
+}
+</pre>
+
+<p>
+要编译并运行此模糊测试工具,请执行以下操作:</p>
+<ol>
+<li>在 Android 源代码树中创建一个目录,例如,<code>tools/fuzzers/fuzz_me_fuzzer</code>。后续文件都将在此目录下创建。</li>
+<li>使用 libFuzzer 编写模糊测试目标。模糊测试目标是一个函数,该函数可接收指定大小的 blob 数据,并将其传递给要接受模糊测试的函数。以下是针对易受攻击的测试函数的基本模糊测试工具:
+
+<pre class="prettyprint">extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
+  FuzzMe(buf, len);
+  return 0;
+}
+</pre></li>
+<li>指示 Android 的编译系统创建模糊测试工具二进制文件。
+要编译模糊测试工具,请将此代码添加到 <code>Android.mk</code> 文件:
+
+<pre class="prettyprint">LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := fuzz_me_fuzzer.cpp
+LOCAL_CFLAGS += -Wno-multichar -g -O0
+LOCAL_MODULE_TAGS := optional
+LOCAL_CLANG := true
+LOCAL_MODULE:= fuzz_me_fuzzer
+
+Include $(BUILD_FUZZ_TEST)
+</pre>
+<p>
+实现这个目的所需的大部分逻辑都包含在 BUILD_FUZZ_TEST 宏(在 <code>build/core/fuzz_test.mk.</code> 中进行定义)中</p></li>
+
+<li>使用以下代码编译模糊测试工具:
+
+<pre class="devsite-terminal devsite-click-to-copy">make -j$(nproc) fuzz_me_fuzzer SANITIZE_TARGET="address coverage"
+</pre></li>
+</ol>
+<p>
+完成这些步骤之后,您便会得到一个编译好的模糊测试工具。模糊测试工具的默认位置(本例中为 Pixel 编译)为 <code>out/target/product/sailfish/data/nativetest/fuzzers/fuzz_me_fuzzer/fuzz_me_fuzzer</code>
+</p>
+<h2 id="run-your-fuzzer">运行您的模糊测试工具</h2>
+<p>
+编译好模糊测试工具之后,请上传该工具和易受攻击的库以进行关联。</p>
+<ol>
+<li>要将这些文件上传到设备上的某个目录下,请运行以下命令:
+
+<pre class="prettyprint"><code class="devsite-terminal">adb root</code>
+<code class="devsite-terminal">adb shell mkdir -p /data/tmp/fuzz_me_fuzzer/corpus</code>
+<code class="devsite-terminal">adb push $OUT/data/asan/nativetest/fuzzers/fuzz_me_fuzzer/fuzz_me_fuzzer
+ /data/tmp/fuzz_me_fuzzer/</code>
+ </pre>
+</li>
+<li>使用以下命令运行模糊测试工具:
+
+<pre class="devsite-terminal devsite-click-to-copy">adb shell /data/tmp/fuzz_me_fuzzer/fuzz_me_fuzzer /data/tmp/fuzz_me_fuzzer/corpus</pre>
+</li></ol>
+<p>
+执行此操作后,系统将输出类似于下方示例输出的内容。
+</p>
+<aside class="note"><strong>提示</strong>:要详细了解如何读取 libFuzzer 输出,请参阅 <a href="http://llvm.org/docs/LibFuzzer.html">LibFuzzer 文档</a>。
+</aside>
+
+<pre class="prettyprint">
+INFO: Seed: 702890555
+INFO: Loaded 1 modules (9 guards): [0xaaac6000, 0xaaac6024),
+Loading corpus dir: /data/tmp/fuzz_me_fuzzer/corpus
+INFO: -max_len is not provided, using 64
+INFO: A corpus is not provided, starting from an empty corpus
+#0
+READ units: 1
+#1
+INITED cov: 5 ft: 3 corp: 1/1b exec/s: 0 rss: 11Mb
+#6
+NEW    cov: 6 ft: 4 corp: 2/62b exec/s: 0 rss: 11Mb L: 61 MS: 1 InsertRepeatedBytes-
+#3008
+NEW    cov: 7 ft: 5 corp: 3/67b exec/s: 0 rss: 11Mb L: 5 MS: 1 CMP- DE: "F\x00\x00\x00"-
+#7962
+NEW    cov: 8 ft: 6 corp: 4/115b exec/s: 0 rss: 11Mb L: 48 MS: 1 InsertRepeatedBytes-
+#35324
+NEW    cov: 9 ft: 7 corp: 5/163b exec/s: 0 rss: 13Mb L: 48 MS: 1 ChangeBinInt-
+=================================================================
+==28219==ERROR: AddressSanitizer: heap-buffer-overflow on address 0xe6423fb3 at pc 0xaaaae938 bp 0xffa31ab0 sp 0xffa31aa8
+READ of size 1 at 0xe6423fb3 thread T0
+#0 0xef72f6df in __sanitizer_print_stack_trace [asan_rtl] (discriminator 1)
+    #1 0xaaab813d in fuzzer::Fuzzer::CrashCallback() external/llvm/lib/Fuzzer/FuzzerLoop.cpp:251
+    #2 0xaaab811b in fuzzer::Fuzzer::StaticCrashSignalCallback() external/llvm/lib/Fuzzer/FuzzerLoop.cpp:240
+    #3 0xef5a9a2b in $a.0 /proc/self/cwd/bionic/libc/arch-arm/bionic/__restore.S:48
+    #4 0xef5dba37 in tgkill /proc/self/cwd/bionic/libc/arch-arm/syscalls/tgkill.S:9
+    #5 0xef5ab511 in abort bionic/libc/bionic/abort.cpp:42 (discriminator 2)
+    #6 0xef73b0a9 in __sanitizer::Abort() external/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cc:141
+    #7 0xef73f831 in __sanitizer::Die() external/compiler-rt/lib/sanitizer_common/sanitizer_termination.cc:59
+    #8 0xef72a117 in ~ScopedInErrorReport [asan_rtl]
+    #9 0xef72b38f in __asan::ReportGenericError(unsigned long, unsigned long, unsigned long, unsigned long, bool, unsigned long, unsigned int, bool) [asan_rtl]
+    #10 0xef72bd33 in __asan_report_load1 [asan_rtl]
+    #11 0xaaaae937 in FuzzMe(unsigned char const*, unsigned int) tools/fuzzers/fuzz_me_fuzzer/fuzz_me_fuzzer.cpp:10
+    #12 0xaaaaead7 in LLVMFuzzerTestOneInput tools/fuzzers/fuzz_me_fuzzer/fuzz_me_fuzzer.cpp:15
+    #13 0xaaab8d5d in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned int) external/llvm/lib/Fuzzer/FuzzerLoop.cpp:515
+    #14 0xaaab8f3b in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned int) external/llvm/lib/Fuzzer/FuzzerLoop.cpp:469
+    #15 0xaaab9829 in fuzzer::Fuzzer::MutateAndTestOne() external/llvm/lib/Fuzzer/FuzzerLoop.cpp:701
+    #16 0xaaab9933 in fuzzer::Fuzzer::Loop() external/llvm/lib/Fuzzer/FuzzerLoop.cpp:734
+    #17 0xaaab48e5 in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned int)) external/llvm/lib/Fuzzer/FuzzerDriver.cpp:524
+    #18 0xaaab306f in main external/llvm/lib/Fuzzer/FuzzerMain.cpp:20
+    #19 0xef5a8da1 in __libc_init bionic/libc/bionic/libc_init_dynamic.cpp:114
+
+SUMMARY: AddressSanitizer: heap-buffer-overflow
+...
+==28219==ABORTING
+MS: 1 CrossOver-; base unit: 10cc0cb80aa760479e932609f700d8cbb5d54d37
+0x46,0x55,0x5a,
+FUZ
+artifact_prefix='./'; Test unit written to ./crash-0eb8e4ed029b774d80f2b66408203801cb982a60
+Base64: RlVa
+</pre>
+
+<p>
+在示例输出中,崩溃是由第 10 行中的 <code>fuzz_me_fuzzer.cpp</code> 导致的:</p>
+<pre class="prettyprint">      Data[3] == 'Z';  // :(
+</pre>
+<p>
+如果数据长度为 3,则这属于简单的出界读取。
+</p>
+<p>
+运行模糊测试工具后,输出常常会导致系统崩溃,而攻击性输入则会保存到语料库中,并被指定一个 ID。在本示例输出中,ID 为 <code>crash-0eb8e4ed029b774d80f2b66408203801cb982a60</code>。
+</p>
+<p>
+要检索崩溃信息,请运行以下命令(先指定好您的崩溃 ID):</p>
+<pre class="devsite-terminal devsite-click-to-copy">adb pull
+/data/tmp/fuzz_me_fuzzer/corpus/<var>CRASH_ID</var></pre>
+
+<p>
+要详细了解 libFuzzer,请参阅<a href="http://llvm.org/docs/LibFuzzer.html">上游文档</a>。由于 Android 的 libFuzzer 是上游之后的几个版本,请检查 <a href="https://android.googlesource.com/platform/external/llvm/+/master/lib/Fuzzer/">external/llvm/lib/Fuzzer</a> 以确保接口支持您正尝试执行的操作。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/debug/rescue-party.html b/zh-cn/devices/tech/debug/rescue-party.html
new file mode 100644
index 0000000..184b3a3
--- /dev/null
+++ b/zh-cn/devices/tech/debug/rescue-party.html
@@ -0,0 +1,75 @@
+<html devsite><head>
+    <title>救援程序</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+很多用户严重依赖他们的手机,需要一台始终可以正常工作的设备。然而,有时设备会陷入重新启动循环僵局,这样,用户便需要提交支持服务单据或保修咨询。这个过程会让用户不舒服,而对于设备制造商和运营商来说,则需要支付高昂的费用。
+</p>
+<p>
+Android 8.0 中纳入了一个功能,当该功能注意到核心系统组件陷入崩溃循环僵局时,就会派出“救援程序”。然后救援程序会通过一系列操作来上报相关情况,以期恢复设备。最后的解决方法是,救援程序使设备重新启动并进入恢复模式,然后提示用户恢复出厂设置。
+</p>
+<p>
+<a href="/compatibility/android-cdd">Android 兼容性定义文档</a>并未要求提供此类救援功能,但此类功能对减少邮件支持记录来说非常有用。
+</p>
+
+<h2 id="implementation">实现</h2>
+<p>
+在 Android 8.0 中,救援程序默认处于启用状态,其实现位于 <code>/services/core/java/com/android/server/RescueParty.java</code> 中。
+在出现以下情况时,救援程序会收到有关启动和崩溃事件的信息,然后即会启动:
+</p>
+<ul>
+  <li>system_server 在 5 分钟内重启 5 次以上。</li>
+  <li>永久性系统应用在 30 秒内崩溃 5 次以上。</li>
+</ul>
+<p>
+当检测到上述某种情况时,救援程序会将其上报给下一救援级别、处理与该级别相关联的任务,并让设备继续运行,看看能否恢复。清除或重置内容的程度随级别而增加。最高级别会提示用户将设备恢复出厂设置。
+</p>
+<p>
+要支持救援程序,无需特别的硬件支持。实现后,设备的恢复系统必须响应 <code>--prompt_and_wipe_data</code> 命令,且设备必须先提供一种方法,让用户确认用户数据是否有任何损坏,然后再继续运行。此外,恢复系统还应为用户提供有关尝试再次启动设备的选项。
+</p>
+<p>
+由于每个救援级别都会使设备再次变为可运行状态的时间延后(可能长达 5 分钟),因此设备制造商不应添加自定义救援级别。设备处于不可运行的状态的时间越长,用户发出支持请求或保修咨询,而不是自行恢复其设备的可能性就越大。
+</p>
+<h2 id="validation">验证</h2>
+<p>
+当设备具有有效的 USB 数据连接时,系统会停止所有救援事件,因为这是一个较强的信号,表示有人正在调试设备。
+</p>
+<p>
+要停止此类抑制行为,请运行:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">adb shell setprop persist.sys.enable_rescue 1</pre>
+<p>
+在此处,您可以触发系统或界面崩溃循环。
+</p>
+<p>
+要触发低级 <code>system_server</code> 崩溃循环,请运行:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">adb shell setprop debug.crash_system 1</pre>
+<p>
+要触发中级 SystemUI 崩溃循环,请运行:</p>
+
+<pre class="devsite-terminal devsite-click-to-copy">adb shell setprop debug.crash_sysui 1</pre>
+<p>
+这两个崩溃循环都会启动救援逻辑。所有的救援操作也都会记录到存储在 <code>/data/system/uiderrors.txt</code> 中的永久性的 PackageManager 日志中,以供日后进行检查和调试。
+此外,“软件包警告消息”部分下的每个错误报告中也会包含这些永久性的日志。
+</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
new file mode 100644
index 0000000..0747ebd
--- /dev/null
+++ b/zh-cn/devices/tech/debug/sanitizers.html
@@ -0,0 +1,256 @@
+<html devsite><head>
+    <title>LLVM 排错程序</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+LLVM 是用于编译 Android 的编译器基础架构,包含可执行静态和动态分析的多个组件。在这些组件中,排错程序(特别是 AddressSanitizer 和 UndefinedBehaviorSanitizer)可以广泛用于分析 Android。排错程序是包含在 external/compiler-rt 中的基于编译器的插桩组件,可用于在开发和测试期间消除错误和改进 Android。Android 目前的排错程序系列可以发现和诊断许多内存滥用错误以及可能危险的未定义行为。
+</p>
+<p>
+Android 编译版本最好在启用排错程序(如 AddressSanitizer 和 UndefinedBehaviorSanitizer)的情况下启动并运行。本页面介绍了 AddressSanitizer、UndefinedBehaviorSanitizer 和 KernelAddressSanitizer,展示了如何在 Android 编译系统中使用它们,并且提供了在启用这些排错程序的情况下编译原生组件的 Android.mk 和 Android.bp 示例文件。
+</p>
+
+<h2 id="addresssanitizer">AddressSanitizer</h2>
+<p>
+<a href="https://clang.llvm.org/docs/AddressSanitizer.html">AddressSanitizer</a> (ASan) 是一种基于编译器的插桩功能,可在运行时检测 C/C++ 代码中许多类型的内存错误。ASan 可以检测许多类别的内存错误,包括:
+</p>
+<ul>
+  <li>出界内存访问</li>
+  <li>双重释放</li>
+  <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>。
+</p>
+<p>
+AddressSanitizer 对所有与内存相关的函数调用(包括 alloca、malloc 和 free)进行插桩,并使用被读取或写入时会触发 ASan 回调的内存填充所有变量和已分配的内存区域。
+</p>
+<p>
+这种插桩使 ASan 能够检测无效内存使用错误,包括双重释放以及 UAS (use-after-scope)、UAR (use-after-return) 和 UAF (use-after-free) 错误,而内存区域填充会检测出界读取或写入错误。如果出现对此填充区域的读取或写入操作,则 ASan 会捕获这一情况并输出信息以帮助诊断内存违规行为,包括调用堆栈、影子内存映射、内存违规的类型、读取或写入的内容、导致违规的指令以及内存内容。
+</p>
+
+<pre class="devsite-click-to-copy">
+pixel-xl:/ # sanitizer-status
+=================================================================
+==14164==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x0032000054b0 at pc 0x005df16ffc3c bp 0x007fc236fdf0 sp 0x007fc236fdd0
+WRITE of size 1 at 0x0032000054b0 thread T0
+    #0 0x5df16ffc3b in test_crash_malloc sanitizer-status/sanitizer-status.c:36:13
+    #1 0x5df17004e3 in main sanitizer-status/sanitizer-status.c:76:7
+    #2 0x794cf665f3 in __libc_init (/system/lib64/libc.so+0x1b5f3)
+    #3 0x5df16ffa53 in do_arm64_start (/system/bin/sanitizer-status+0xa53)
+
+0x0032000054b0 is located 0 bytes to the right of 32-byte region [0x003200005490,0x0032000054b0)
+allocated by thread T0 here:
+    #0 0x794d0bdc67 in malloc (/system/lib64/libclang_rt.asan-aarch64-android.so+0x74c67)
+    #1 0x5df16ffb47 in test_crash_malloc sanitizer-status/sanitizer-status.c:34:25
+    #2 0x5df17004e3 in main sanitizer-status/sanitizer-status.c:76:7
+    #3 0x794cf665f3 in __libc_init (/system/lib64/libc.so+0x1b5f3)
+    #4 0x5df16ffa53 in do_arm64_start (/system/bin/sanitizer-status+0xa53)
+    #5 0x794df78893  (&lt;unknown module&gt;)
+
+SUMMARY: AddressSanitizer: heap-buffer-overflow sanitizer-status/sanitizer-status.c:36:13 in test_crash_malloc
+</pre>
+
+<p>
+有时,错误发现过程可能看起来具有不确定性,特别是对于需要特殊设置或更先进技术的错误,例如堆启动或竞态条件利用。许多这样的错误并不能立即显现出来,而且可能需要从成千上万条指令中找出作为真正根本原因的内存违规行为。ASan 对所有与内存相关的函数进行插桩,并为数据填充无法在不触发 ASan 回调的情况下访问的区域。这意味着,内存违规行为一旦出现即被捕获,不用等待出现会导致崩溃的损坏。这在发现错误和诊断根本原因过程中非常有用。
+</p>
+<p>
+为了验证 ASAN 在目标设备上能否正常运行,Android 已经包含了 asan_test 可执行文件。asan_test 可执行文件会测试并验证目标设备上的 ASAN 功能,并提供诊断消息(包括每个测试的状态)。使用 ASAN Android 编译版本时,它默认位于 <code>/data/nativetest/asan_test/asan_test</code> 或 <code>/data/nativetest64/asan_test/asan_test</code> 中。
+</p>
+
+<h2 id="undefinedbehaviorsanitizer">UndefinedBehaviorSanitizer</h2>
+<p>
+UndefinedBehaviorSanitizer (UBSan) 会执行编译时插桩,以检查各种类型的未定义行为。UBSan 能够检测<a href="https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html">许多未定义行为</a>,而 Android 支持 alignment、bool、bounds、enum、float-cast-overflow、float-divide-by-zero、integer-divide-by-zero、nonnull-attribute、null、return、returns-nonnull-attribute、shift-base、shift-exponent、signed-integer-overflow、unreachable、unsigned-integer-overflow 和 vla-bound。虽然 unsigned-integer-overflow 在技术上不是未定义行为,但其包含在排错程序中,并用在许多 Android 模块(包括 mediaserver 组件)中,以消除任何潜在的整数溢出漏洞。
+</p>
+
+<h3 id="ubsan-implementation">实现</h3>
+<p>
+在 Android 编译系统中,您可以全局或局部地启用 UBSan。要全局启用 UBSan,请在 Android.mk 中设置 SANITIZE_TARGET。要在每个模块级别启用 UBSan,请在 Android.mk 中设置 LOCAL_SANITIZE 并指定要查找的未定义行为。例如:
+</p>
+
+<pre class="devsite-click-to-copy">LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_CFLAGS := -std=c11 -Wall -Werror -O0
+
+LOCAL_SRC_FILES:= sanitizer-status.c
+
+LOCAL_MODULE:= sanitizer-status
+LOCAL_MODULE_TAGS := debug
+
+LOCAL_SANITIZE := alignment bounds null unreachable integer
+LOCAL_SANITIZE_DIAG := alignment bounds null unreachable integer
+
+include $(BUILD_EXECUTABLE)
+</pre>
+
+<p>
+Android 编译系统尚不支持像对 Makefile 那样在蓝图文件中进行详细诊断。以下是编写为蓝图 (Android.bp) 的最接近等同项:
+</p>
+
+<pre class="devsite-click-to-copy">cc_binary {
+
+    cflags: [
+        "-std=c11",
+        "-Wall",
+        "-Werror",
+        "-O0",
+    ],
+
+    srcs: ["sanitizer-status.c"],
+
+    name: "sanitizer-status",
+    tags: ["debug"],
+
+    sanitize: {
+        misc_undefined: [
+            "alignment",
+            "bounds",
+            "null",
+            "unreachable",
+            "integer",
+        ],
+        diag: {
+            undefined : true
+        },
+    },
+
+}
+</pre>
+
+<h3 id="ubsan-shortcuts">UBSan 快捷方式</h3>
+<p>
+Android 还有两种快捷方式 - <code>integer</code> 和 <code>default-ub</code>,它们可同时启用一组排错程序。integer 会启用<code> integer-divide-by-zero</code>、<code>signed-integer-overflow</code> 和 <code>unsigned-integer-overflow</code>。
+<code>default-ub</code> 会启用编译器性能问题极小的检查:bool、integer-divide-by-zero、return、returns-nonnull-attribute、shift-exponent、unreachable 和 vla-bound。integer 排错程序类可以与 SANITIZE_TARGET 和 LOCAL_SANITIZE 一起使用,而default-ub 只能与 SANITIZE_TARGET 一起使用。
+</p>
+
+<h3 id="better-error-reporting">更好的错误报告</h3>
+<p>
+Android 的默认 UBSan 实现在遇到未定义行为时会调用指定的函数。默认情况下,此函数被中止。但是,从 2016 年 10 月开始,Android 上的 UBSan 有一个可选的运行时库,可以提供更详细的错误报告,包括遇到的未定义行为的类型、文件和源代码行信息。要对 integer 检查启用此错误报告,请将以下内容添加到 Android.mk 文件中:
+</p>
+
+<pre class="devsite-click-to-copy">LOCAL_SANITIZE:=integer
+LOCAL_SANITIZE_DIAG:=integer
+</pre>
+
+<p>
+LOCAL_SANITIZE 值在编译过程中启用排错程序。LOCAL_SANITIZE_DIAG 为指定排错程序开启诊断模式。可以将 LOCAL_SANITIZE 和 LOCAL_SANITIZE_DIAG 设置为不同的值,但系统只启用 LOCAL_SANITIZE 中的检查。如果某个检查未在 LOCAL_SANITIZE 中指定,但在 LOCAL_SANITIZE_DIAG 中指定了,则系统不会启用该检查,且不会提供诊断消息。
+</p>
+<p>
+以下是由 UBSan 运行时库提供的信息示例:
+</p>
+
+<pre class="devsite-click-to-copy">pixel-xl:/ # sanitizer-status ubsan
+sanitizer-status/sanitizer-status.c:53:6: runtime error: unsigned integer overflow: 18446744073709551615 + 1 cannot be represented in type 'size_t' (aka 'unsigned long')
+</pre>
+
+<h2 id="kernel-address-sanitizer">内核地址排错程序</h2>
+<p>
+与针对用户空间组件的基于 LLVM 的排错程序一样,Android 包括内核地址排错程序 (KASAN)。KASAN 是内核与编译时修改的组合,形成了一个插桩系统,可以实现更简单的错误发现和根本原因分析。
+</p>
+<p>
+KASAN 可以检测内核中许多类型的内存违规行为。它还可以检测堆栈、堆和全局变量中的出界读取和写入操作,并可检测释放后再使用和双重释放错误。
+</p>
+<p>
+与 ASAN 一样,KASAN 将编译时内存函数插桩与影子内存相结合,以便跟踪运行时的内存访问。在 KASAN 中,八分之一的内核内存空间专用于影子内存,以确定内存访问是否有效。
+</p>
+<p>
+KASAN 在 x86_64 和 arm64 架构中受支持。自 4.0 以来,它一直是上游内核的一部分,并且已经反向移植到基于 Android 3.18 的内核。KASAN 已在基于 4.9.2 通过 gcc 编译的 Android 内核上进行了测试。
+</p>
+<p>
+除了 KASAN,kcov 是另一个对测试非常有用的内核修改。kcov 旨在允许在内核中进行覆盖率引导模糊测试。它会测量在系统调用输入方面的覆盖率,对于模糊系统(如 <a href="https://github.com/google/syzkaller">syzkaller</a>)非常有用。
+</p>
+
+<h3 id="kasan-implementation">实现</h3>
+<p>
+要在启用 KASAN 和 kcov 的情况下编译内核,请将以下编译标记添加到内核编译配置:
+</p>
+<pre class="devsite-click-to-copy">
+CONFIG_KASAN
+CONFIG_KASAN_INLINE
+CONFIG_TEST_KASAN
+CONFIG_KCOV
+CONFIG_SLUB
+CONFIG_SLUB_DEBUG
+CONFIG_CC_OPTIMIZE_FOR_SIZE
+</pre>
+
+<p>
+并移除以下内容:
+</p>
+<pre class="devsite-click-to-copy">
+CONFIG_SLUB_DEBUG_ON
+CONFIG_SLUB_DEBUG_PANIC_ON
+CONFIG_KASAN_OUTLINE
+CONFIG_KERNEL_LZ4
+</pre>
+<p>
+然后照常编译和刷写内核。KASAN 内核比原始内核大得多。考虑到这一点,请修改任何启动参数和引导加载程序设置(如果适用)。
+</p>
+<p>
+刷写内核后,检查内核启动日志,看看 KASAN 是否已启用并正在运行。内核将启动并显示 KASAN 的内存映射信息,例如:
+</p>
+
+<pre class="devsite-click-to-copy">
+...
+[    0.000000] c0      0 Virtual kernel memory layout:
+[    0.000000] c0      0     kasan   : 0xffffff8000000000 - 0xffffff9000000000   (    64 GB)
+[    0.000000] c0      0     vmalloc : 0xffffff9000010000 - 0xffffffbdbfff0000   (   182 GB)
+[    0.000000] c0      0     vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000   (     8 GB maximum)
+[    0.000000] c0      0               0xffffffbdc0000000 - 0xffffffbdc3f95400   (    63 MB actual)
+[    0.000000] c0      0     PCI I/O : 0xffffffbffa000000 - 0xffffffbffb000000   (    16 MB)
+[    0.000000] c0      0     fixed   : 0xffffffbffbdfd000 - 0xffffffbffbdff000   (     8 KB)
+[    0.000000] c0      0     modules : 0xffffffbffc000000 - 0xffffffc000000000   (    64 MB)
+[    0.000000] c0      0     memory  : 0xffffffc000000000 - 0xffffffc0fe550000   (  4069 MB)
+[    0.000000] c0      0       .init : 0xffffffc001d33000 - 0xffffffc001dce000   (   620 KB)
+[    0.000000] c0      0       .text : 0xffffffc000080000 - 0xffffffc001d32284   ( 29385 KB)
+...
+</pre>
+
+<p>
+错误将如下所示:
+</p>
+
+<pre class="devsite-click-to-copy">
+[   18.539668] c3      1 ==================================================================
+[   18.547662] c3      1 BUG: KASAN: null-ptr-deref on address 0000000000000008
+[   18.554689] c3      1 Read of size 8 by task swapper/0/1
+[   18.559988] c3      1 CPU: 3 PID: 1 Comm: swapper/0 Tainted: G        W      3.18.24-xxx #1
+[   18.569275] c3      1 Hardware name: Android Device
+[   18.577433] c3      1 Call trace:
+[   18.580739] c3      1 [&lt;ffffffc00008b32c&gt;] dump_backtrace+0x0/0x2c4
+[   18.586985] c3      1 [&lt;ffffffc00008b600&gt;] show_stack+0x10/0x1c
+[   18.592889] c3      1 [&lt;ffffffc001481194&gt;] dump_stack+0x74/0xc8
+[   18.598792] c3      1 [&lt;ffffffc000202ee0&gt;] kasan_report+0x11c/0x4d0
+[   18.605038] c3      1 [&lt;ffffffc00020286c&gt;] __asan_load8+0x20/0x80
+[   18.611115] c3      1 [&lt;ffffffc000bdefe8&gt;] android_verity_ctr+0x8cc/0x1024
+[   18.617976] c3      1 [&lt;ffffffc000bcaa2c&gt;] dm_table_add_target+0x3dc/0x50c
+[   18.624832] c3      1 [&lt;ffffffc001bdbe60&gt;] dm_run_setup+0x50c/0x678
+[   18.631082] c3      1 [&lt;ffffffc001bda8c0&gt;] prepare_namespace+0x44/0x1ac
+[   18.637676] c3      1 [&lt;ffffffc001bda170&gt;] kernel_init_freeable+0x328/0x364
+[   18.644625] c3      1 [&lt;ffffffc001478e20&gt;] kernel_init+0x10/0xd8
+[   18.650613] c3      1 ==================================================================
+</pre>
+
+<p>
+此外,如果在内核中启用了模块,则可以加载 test_kasan 内核模块以供进一步测试。该模块会尝试出界内存访问和释放后再使用,有助于在目标设备上测试 KASAN。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/debug/systrace.html b/zh-cn/devices/tech/debug/systrace.html
index 2cff4c6..d0dba1c 100644
--- a/zh-cn/devices/tech/debug/systrace.html
+++ b/zh-cn/devices/tech/debug/systrace.html
@@ -29,7 +29,9 @@
 <h2 id="running_systrace">运行 systrace</h2>
 <p>要在 Pixel/Pixel XL 上调试抖动问题,请从以下命令开始:</p>
 
-<pre>$ ./systrace.py sched freq idle am wm gfx view sync binder_driver irq workq input -b 96000</pre>
+<pre class="devsite-terminal devsite-click-to-copy">
+./systrace.py sched freq idle am wm gfx view sync binder_driver irq workq input -b 96000
+</pre>
 
 <p>当将该命令用于 GPU 活动和显示通道活动所需的附加跟踪点时,您将能够跟踪从用户输入直到屏幕上显示的帧。将缓冲区大小设为较大的值,以避免丢失事件(通常表现为一些 CPU 在跟踪记录中的某个点之后不包含任何事件)。</p>
 
@@ -54,7 +56,7 @@
 
 <p>下面我们详细介绍一下从 15409 毫秒开始的帧:</p>
 
-<p><img src="images/perf_trace_normal_pipeline.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_normal_pipeline.png"/></p>
 <p class="img-caption"><strong>图 1. </strong> 正常界面通道(EventThread 正在运行)。</p>
 
 <p>图 1 显示了一个由多个正常帧围绕的正常帧,因此对于理解界面通道的工作原理来说,它是一个很好的切入点。TouchLatency 的界面线程所在行在不同的时间显示为不同的颜色。柱形表示线程的不同状态:</p>
@@ -72,96 +74,96 @@
 <p>要查看不可中断休眠的原因(可从 <code>sched_blocked_reason</code> 跟踪点获取),请选择红色的不可中断休眠图块。</p>
 <p>当 EventThread 运行时,TouchLatency 的界面线程会变为可运行。要查看是什么唤醒的它,请点击蓝色部分:</p>
 
-<p><img src="images/perf_trace_tl.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_tl.png"/></p>
 <p class="img-caption"><strong>图 2. </strong> TouchLatency 的界面线程。</p>
 
 <p>图 2 显示了 TouchLatency 的界面线程被与 EventThread 对应的 tid 6843 唤醒。界面线程被唤醒:</p>
 
-<p><img src="images/perf_trace_wake_render_enqueue.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_wake_render_enqueue.png"/></p>
 <p class="img-caption"><strong>图 3. </strong> 界面线程被唤醒、渲染一个帧,并将其加入队列以供 SurfaceFlinger 使用。</p>
 
 <p>如果跟踪记录中的 <code>binder_driver</code> 标记已启用,则您可以选择一个 Binder 事务,并查看该事务涉及的所有进程的相关信息:</p>
 
-<p><img src="images/perf_trace_binder_trans.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_binder_trans.png"/></p>
 <p class="img-caption"><strong>图 4. </strong> Binder 事务。</p>
 
 <p>图 4 显示了在 15423.65 毫秒,SurfaceFlinger 中的 Binder:6832_1 由于 tid 9579(即 TouchLatency 的 RenderThread)变为可运行。此外,您还可以在 Binder 事务的两侧看到 queueBuffer。</p>
 
 <p>在 SurfaceFlinger 端的 queueBuffer 期间,TouchLatency 中待处理帧的数量从 1 变为 2:</p>
 
-<p><img src="images/perf_trace_pending_frames.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_pending_frames.png"/></p>
 <p class="img-caption"><strong>图 5. </strong> 待处理帧从 1 个变为 2 个。</p>
 
 <p>图 5 显示了三重缓冲,其中两个帧已完成渲染,应用将很快开始渲染第三个帧。这是因为一些帧已经丢弃,所以应用保留两个待处理的帧而不是一个,以避免以后再丢弃帧。</p>
 
 <p>稍后,SurfaceFlinger 的主线程会被第二个 EventThread 唤醒,以便它可以将较早的待处理帧输出到显示部分:</p>
 
-<p><img src="images/perf_trace_sf_woken_et.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_sf_woken_et.png"/></p>
 <p class="img-caption"><strong>图 6. </strong> SurfaceFlinger 的主线程被第二个 EventThread 唤醒。</p>
 
 <p>SurfaceFlinger 首先锁定较早的待处理缓冲区,而这将导致待处理缓冲区的计数从 2 减为 1:</p>
 
-<p><img src="images/perf_trace_sf_latches_pend.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_sf_latches_pend.png"/></p>
 <p class="img-caption"><strong>图 7. </strong> SurfaceFlinger 首先锁定较早的待处理缓冲区。</p>
 
 <p>锁定缓冲区后,SurfaceFlinger 会设置构图并将最终帧提交给显示部分(其中某些区段作为 <code>mdss</code> 跟踪点的一部分启用,因此它们可能不在您 SOC 的相应位置上)。</p>
 
-<p><img src="images/perf_trace_sf_comp_submit.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_sf_comp_submit.png"/></p>
 <p class="img-caption"><strong>图 8. </strong> SurfaceFlinger 设置构图并提交最终帧。</p>
 
 <p>接下来,<code>mdss_fb0</code> 在 CPU 0 上被唤醒。<code>mdss_fb0</code> 是显示通道的内核线程,用于将渲染过的帧输出到显示部分。我们可以看到 <code>mdss_fb0</code> 位于跟踪记录中其自己所在行中的情形(向下滚动即可查看)。</p>
 
-<p><img src="images/perf_trace_wake_cpu0.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_wake_cpu0.png"/></p>
 <p class="img-caption"><strong>图 9</strong>. <code>mdss_fb0</code> 在 CPU 0 上被唤醒。</p>
 
 <p><code>mdss_fb0</code> 被唤醒,短暂运行,进入不可中断休眠状态,然后再次被唤醒。</p>
 
-<p class="note"><strong>注意</strong>:从此时起,跟踪记录将变得更为复杂,因为最后的工作会在 <code>mdss_fb0</code>、中断和工作队列函数之间划分。如果您需要该级别的详细信息,请参阅您的 SOC 的驱动程序堆栈的确切特性(因为了解 Pixel XL 上发生的活动可能对您并无帮助)。</p>
+<p class="note"><strong>注意</strong>:从现在开始,跟踪记录将变得更为复杂,因为最后的工作会在 <code>mdss_fb0</code>、中断和工作队列函数之间划分。如果您需要该级别的详细信息,请参阅您的 SOC 的驱动程序堆栈的确切特性(因为了解 Pixel XL 上发生的活动可能对您并无帮助)。</p>
 
 <h2 id="example_2">示例:非工作帧</h2>
-<p>该示例介绍了用于调试 Pixel/Pixel XL 抖动问题的 systrace。要按照示例操作,请<a href="perf_traces.zip">下载跟踪记录的 ZIP 文件</a>(包括本节中提及的其他跟踪记录),将文件解压缩,然后在浏览器中打开 systrace_tutorial.html 文件。</p>
+<p>该示例介绍了用于调试 Pixel/Pixel XL 抖动问题的 systrace。要按照示例操作,请<a href="/devices/tech/debug/perf_traces.zip">下载跟踪记录的 ZIP 文件</a>(包括本节中提及的其他跟踪记录),将文件解压缩,然后在浏览器中打开 systrace_tutorial.html 文件。</p>
 
 <p>首次打开 systrace 时,您会看到如下内容:</p>
 
-<p><img src="images/perf_trace_tl_pxl.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_tl_pxl.png"/></p>
 <p class="img-caption"><strong>图 10</strong>. 在 Pixel XL 上运行的 TouchLatency(大多数选项已启用,包括 mdss 和 kgsl 跟踪点)。</p>
 
 <p>查找卡顿时,请检查 SurfaceFlinger 下的 FrameMissed 行。FrameMissed 是一项可提升用户体验的改进,由硬件合成器 2 (HWC2) 提供。自 2016 年 12 月起,HWC2 只能用于 Pixel/Pixel XL;当您查看其他设备的 systrace 时,可能不会看到 FrameMissed 行。在任一情况下,FrameMissed 都会与具有以下特点的 SurfaceFlinger 相关联:缺少一个很常用的运行时,以及在 vsync 时的应用 (<code>com.prefabulated.touchlatency</code>) 存在未更改的待处理缓冲区计数:</p>
 
-<p><img src="images/perf_trace_fm_sf.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_fm_sf.png"/></p>
 <p class="img-caption"><strong>图 11</strong>. FrameMissed 与 SurfaceFlinger 的关联。</p>
 
 <p>图 11 显示了 15598.29 毫秒处的已丢失帧。SurfaceFlinger 在 vsync 间隔时间被短暂唤醒,并在未执行任何任务的情况下返回休眠状态,这意味着 SurfaceFlinger 确定不值得再次向显示部分发送帧。为什么?</p>
 
 <p>要了解在渲染此帧时通道是如何出现故障的,请先回顾上面的工作帧示例,了解正常界面通道是如何在 systrace 中出现的。准备就绪后,返回到丢失的帧并进行反推。请注意,SurfaceFlinger 被唤醒后立即进入休眠状态。查看来自 TouchLatency 的待处理帧的数量时,可以看到有两个帧(这是一条很好的线索,可帮助弄清楚发生的实际情况)。</p>
 
-<p><img src="images/perf_trace_sf_wake_sleep.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_sf_wake_sleep.png"/></p>
 <p class="img-caption"><strong>图 12. </strong> SurfaceFlinger 被唤醒后立即进入休眠状态。</p>
 
 <p>因为我们在 SurfaceFlinger 中有一些帧,所以这不是一个应用问题。此外,SurfaceFlinger 在正确的时间被唤醒,所以这也不是一个 SurfaceFlinger 问题。如果 SurfaceFlinger 和应用看起来都正常,那么这可能是一个驱动程序问题。</p>
 
 <p>因为启用了 <code>mdss</code> 和 <code>sync</code> 跟踪点,所以我们可以获得有关相应栅栏(在显示驱动程序和 SurfaceFlinger 之间共享,控制帧实际提交到显示部分的时间)的信息。我们关心的栅栏列于 <code>mdss_fb0_retire</code> 下,它指示帧实际在显示部分出现的时间。这些栅栏作为 <code>sync</code> 跟踪类别的一部分提供。哪些栅栏与 SurfaceFlinger 中的特定事件相对应,取决于您的 SOC 和驱动程序堆栈,因此请与您的 SOC 供应商联系,以了解您的跟踪记录中栅栏类别的含义。</p>
 
-<p><img src="images/perf_traces_fences.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_traces_fences.png"/></p>
 <p class="img-caption"><strong>图 13</strong>. <code>mdss_fb0_retire</code> 栅栏。</p>
 
 <p>图 13 显示的帧显示了 33 毫秒,而不是预期的 16.7 毫秒。图块前进到中途时,该帧应该被新帧替换,但实际上没有。请查看上一帧,看看是否可以找到蛛丝马迹:</p>
 
-<p><img src="images/perf_trace_frame_previous.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_frame_previous.png"/></p>
 <p class="img-caption"><strong>图 14. </strong> 被损坏帧的上一帧。</p>
 
 <p>图 14 显示了时长为 14.482 毫秒的一个帧。被损坏的两帧片段是 33.6 毫秒,这和我们预期的两帧时长大致接近(我们以 60Hz 渲染,每帧 16.7 毫秒,很接近)。但是 14.482 毫秒与 16.7 毫秒相去甚远,这表明显示通道存在严重错误。</p>
 
 <p>调查栅栏的确切结束位置,以确定是什么在控制它:</p>
 
-<p><img src="images/perf_trace_fence_end.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_fence_end.png"/></p>
 <p class="img-caption"><strong>图 15. </strong> 调查栅栏的结束位置。</p>
 
 <p>工作队列包含一个 <code>__vsync_retire_work_handler</code>,它在栅栏发生变化时运行。通过浏览内核源代码,您可以看到它是显示驱动程序的一部分。它显然位于显示通道的关键路径上,所以必须以尽可能快的速度运行。它可运行约 70 微秒(不是很长的调度延迟),但它是一个工作队列,系统可能无法准确地排定其运行时间。</p>
 
 <p>检查上一帧,以确定它是否会导致该问题;有时抖动会随时间而累加,最终导致我们错过最后期限。</p>
 
-<p><img src="images/perf_trace_previous_frame.png"/></p>
+<p><img src="/devices/tech/debug/images/perf_trace_previous_frame.png"/></p>
 <p class="img-caption"><strong>图 16. </strong> 上一帧。</p>
 
 <p>kworker 上的可运行行不可见,因为当该行被选择时,查看器会将它变为白色,不过,通过统计数据,我们可以了解到问题所在:部分显示通道关键路径的 2.3 毫秒调度程序延迟时间<strong>很不乐观</strong>。在执行任何其他操作之前,我们应该先解决该问题,方法是:将显示通道关键路径的这一部分从工作队列(作为 <code>SCHED_OTHER</code> CFS 线程运行)移动到专用的 <code>SCHED_FIFO</code> kthread。这一功能需要时间保证,而工作队列不能(也不打算)提供这一保证。</p>
diff --git a/zh-cn/devices/tech/debug/valgrind.html b/zh-cn/devices/tech/debug/valgrind.html
index 94ac00e..971790a 100644
--- a/zh-cn/devices/tech/debug/valgrind.html
+++ b/zh-cn/devices/tech/debug/valgrind.html
@@ -22,20 +22,20 @@
 
 <p><a href="http://valgrind.org/">Valgrind</a> 工具套件包括 Memcheck(用于检测 C 和 C ++ 中与内存相关的错误)、Cachegrind(缓存分析器)、Massif(堆分析器)和其他几种工具。</p>
 
-<p class="note"><strong>注意</strong>:尽管您可以使用 Valgrind 对 Android 进行调试,但大多数 Android 平台开发人员都会使用 <a href="/devices/tech/debug/asan.html">AddressSanitizer</a>。</p>
+<p class="note"><strong>注意</strong>:尽管您可以使用 Valgrind 对 Android 进行调试,但大多数 Android 平台开发者会改用 <a href="/devices/tech/debug/asan.html">AddressSanitizer</a>。</p>
 
 <h2 id="build-valgrind">构建 Valgrind</h2>
 <p>要构建 Valgrind,请运行以下命令:</p>
-<pre class="no-pretty-print">
-$ mmma -j6 external/valgrind
+<pre class="devsite-terminal devsite-click-to-copy">
+mmma -j6 external/valgrind
 </pre>
 
 <h2 id="app-valgrind">在应用上使用</h2>
 <p>要在某个应用上使用 Valgrind,请运行以下命令:</p>
 
-<pre class="no-pretty-print">
-$ adb shell setprop wrap.<em>app_name</em> "logwrapper valgrind"
-$ adb shell am start -a android.intent.action.MAIN -n <em>app_name</em>/.MainActivity
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb shell setprop wrap.<em>app_name</em> "logwrapper valgrind"</code>
+<code class="devsite-terminal">adb shell am start -a android.intent.action.MAIN -n <em>app_name</em>/.MainActivity</code>
 </pre>
 
 <code><em>app_name</em></code> 必须是一个完全符合要求的名称,例如 <strong>com.google.example_app</strong>。
@@ -43,23 +43,23 @@
 <h2 id="server-valgrind">在系统服务器上使用</h2>
 <p>要使用 Valgrind 运行系统服务器,请运行以下命令:</p>
 
-<pre class="no-pretty-print">
-$ adb shell setprop wrap.system_server "logwrapper valgrind"
-$ adb shell stop &amp;&amp; adb shell start
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb shell setprop wrap.system_server "logwrapper valgrind"</code>
+<code class="devsite-terminal">adb shell stop &amp;&amp; adb shell start</code>
 </pre>
 
 <h2 id="symbols-valgrind">获取调试符号</h2>
 <p>要获取调试符号,请将未剥离的库推送到 <code>/data/local/symbols</code>:</p>
-<pre class="no-pretty-print">
-$ adb shell mkdir /data/local/symbols
-$ adb push $OUT/symbols /data/local/symbols
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">adb shell mkdir /data/local/symbols</code>
+<code class="devsite-terminal">adb push $OUT/symbols /data/local/symbols</code>
 </pre>
 
 <h2 id="boot-valgrind">在启动过程中使用</h2>
 <p>要在启动过程中使用 Valgrind,请修改 <code>out/target/product/XXXX/root/init.rc</code>,具体方法是将</p>
-<p><code>service example /system/bin/foo --arg1 --arg2</code></p>
+<pre class="devsite-click-to-copy">service example /system/bin/foo --arg1 --arg2</pre>
 <p>更改为:</p>
-<p><code>service example /system/bin/logwrapper /system/bin/valgrind /system/bin/foo --arg1 --arg2</code></p>
+<pre class="devsite-click-to-copy">&gt;service example /system/bin/logwrapper /system/bin/valgrind /system/bin/foo --arg1 --arg2</pre>
 <p>要查看效果,请创建一个 <code>boot.img</code> 并重新刷入设备。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/adaptive-icons.html b/zh-cn/devices/tech/display/adaptive-icons.html
new file mode 100644
index 0000000..c28254b
--- /dev/null
+++ b/zh-cn/devices/tech/display/adaptive-icons.html
@@ -0,0 +1,108 @@
+<html devsite><head>
+    <title>实现自适应图标</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>
+如果开发者仅提供一个图标素材资源,自适应图标的形状在设备内会保持一致,但在设备之间会有所差异。此外,图标支持可用于实现动作的两个层(前台和后台),以便为用户提供愉悦的视觉体验。
+    </p>
+    <p>
+设备实现人员会提供一个设备遮罩,该遮罩将决定设备上所有图标的形状。该图标将在任何使用启动器图标(例如,启动器、概览、设置和分享表单)的系统界面上使用。
+    </p>
+    <h2 id="examples-and-source">示例和源代码</h2>
+    <p>
+代码示例:</p><ul>
+      <li><code>platform/development/samples/AdaptiveIconSample/</code></li></ul>
+    <p>
+
+开发者文档:
+    </p><ul>
+    <li><a href="https://developer.android.com/preview/features/adaptive-icons.html">https://developer.android.com/preview/features/adaptive-icons.html</a>
+    </li><li><a href="https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html">https://developer.android.com/reference/android/graphics/drawable/AdaptiveIconDrawable.html</a>
+    </li><li><a href="https://developer.android.com/reference/android/graphics/drawable/Icon.html#createWithAdaptiveBitmap(android.graphics.Bitmap)">https://developer.android.com/reference/android/graphics/drawable/Icon.html#createWithAdaptiveBitmap(android.graphics.Bitmap)</a></li></ul>
+    <p>
+
+源代码:
+    </p><ul>
+    <li><code>platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java</code></li></ul>
+    <h2 id="implementation">实现</h2>
+    <p>
+要更改平台上图标的形状,请替换 <code>framework/base/core/res/res/values/config.xml</code> 中的一个字符串,如下所示:</p>
+
+    <pre class="prettyprint">&lt;!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. --&gt;
+	&lt;string name="config_icon_mask" translatable="false"&gt;"M50,0L100,0 100,100 0,100 0,0z"&lt;/string&gt;</pre>
+    <p>
+该字符串的格式和语法均遵循<a href="https://www.w3.org/TR/SVG/paths.html">路径定义的 W3-SVG 标准</a>。Android 矢量可绘制资源也支持 PathData 的这种格式。
+    </p>
+    <p>
+这个路径应该是上凸的,且应考虑视图边界范围内的安全区 (66/71 = 91%)。此要求在其中一项 CTS 测试中强制执行。
+    </p>
+    <p>
+如果您决定使用圆形作为平台遮罩,请确保也要替换 config_useRoundIcon = true。否则,请将此配置值设为 false 或不指定此配置值。
+    </p>
+    <h2>自适应图标 API</h2>
+    <p>
+<code>AdaptiveIconDrawable</code> 类的 API 如下所示:</p>
+
+    <pre class="prettyprint">package  android.graphics.drawable;
+    public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback {
+	method public Drawable getBackground();
+	method public Drawable getForeground();
+	method public Path getIconMask();
+	method public Region getSafeZone();
+	method public float getExtraInsetFraction();
+	method public int getOpacity();
+	method public void invalidateDrawable(Drawable);
+	method public void scheduleDrawable(Drawable, Runnable, long);
+	method public void setAlpha(int);
+	method public void setColorFilter(ColorFilter);
+	method public void setOpacity(int);
+	method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable);
+    }</pre>
+
+    <pre class="prettyprint">public class Icon extends Parceleable {
+	method public Bitmap createWithAdaptiveBitmap();
+    }</pre>
+    <h2>参考实现</h2>
+    <p>
+无需执行任何操作,即可在任何系统界面上呈现静态自适应图标。当 PackageManager 返回可绘制资源时,只需将它绑定到 ImageView 即可。这就是图标在 Android O 之前版本的平台上呈现的方式。
+    </p>
+    <p>
+关于如何呈现动态动画效果,Launcher3 (platform/packages/apps/Launcher3) 中会提供相应的参考实现来说明如何在 O-MR1 中实现这种效果。
+    </p>
+    <h2 id="validation">验证</h2>
+    <p>
+要验证实现,请在替换其需要的遮罩后,查看图标是否可以在 Launcher3、设置、概览和设置中正确呈现。此外,您还可以在图形 CTS TestCase 中运行 AdaptiveIconDrawableTest.java 和 AdaptiveIconMaskTest.java 来测试实现。
+    </p>
+    <p>
+推荐的手动测试用例可以在以下位置找到:platform/development/samples/AdaptiveIconSample/。
+    </p>
+    <h2>已知问题</h2>
+    <p>
+已知问题包括:</p><ul>
+    <li>图标模糊(取决于遮罩路径的定义方式)。
+    </li><li>快捷方式图标被放大(如果应用开发者未使用 <code>Icon.createWithAdaptiveBitmap()</code> 方法或未正确使用此方法)。为使此方法正常发挥作用,如果图标是以位图形式传递的,则图标的四边应各保留 25% 的内边距。</li></ul>
+    <p>
+这些问题可以通过以下方式解决:</p><ul>
+    <li>应在 [0,100] x [0,100] 坐标系中定义遮罩。
+    </li><li>确保用于自适应图标(启动器图标、快捷方式)的图片的四边均保留了充足的内边距 (25%)。</li></ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/app-shortcuts.html b/zh-cn/devices/tech/display/app-shortcuts.html
index 4e51a52..4f9c418 100644
--- a/zh-cn/devices/tech/display/app-shortcuts.html
+++ b/zh-cn/devices/tech/display/app-shortcuts.html
@@ -39,7 +39,8 @@
 
 <p>您可以在以下文件中找到此功能的主要实现方式:</p>
 
-<pre>frameworks/base/services/core/java/com/android/server/policy/ShortcutManager.java
+<pre class="devsite-click-to-copy">
+frameworks/base/services/core/java/com/android/server/policy/ShortcutManager.java
 frameworks/base/services/core/java/com/android/server/pm/ShortcutPackage.java
 frameworks/base/services/core/java/com/android/server/pm/ShortcutUser.java
 frameworks/base/services/core/java/com/android/server/pm/ShortcutPackageInfo.java
@@ -58,7 +59,7 @@
 <p>
 以下文件可提供支持功能(在 <code>ShortcutManager.java</code> 中称为隐藏 API):</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java
 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
 </pre>
@@ -67,7 +68,7 @@
 另外,Android 开放源代码项目启动器版本 3 支持以下快捷方式:
 </p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 packages/apps/Launcher3/
 </pre>
 
@@ -75,7 +76,8 @@
 最后,有关公共 Javadoc,请查看以下文件:
 </p>
 
-<pre>frameworks/base/core/java/android/content/pm/ShortcutManager.java
+<pre class="devsite-click-to-copy">
+frameworks/base/core/java/android/content/pm/ShortcutManager.java
 frameworks/base/core/java/android/content/pm/ShortcutInfo.java
 frameworks/base/core/java/android/content/pm/LauncherApps.java
 </pre>
@@ -106,7 +108,7 @@
 <p>
 使用以下 Android 兼容性测试套件 (CTS) 测试来确保您的功能(ShortcutManager 和 LauncherApps)版本可以正常运行:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 cts/tests/tests/shortcutmanager/
 cts/hostsidetests/shortcuts/
 </pre>
@@ -114,19 +116,21 @@
 <p>
 请在以下位置查找用于实现 AOSP 的单元测试:</p>
 
-<pre>frameworks/base/services/tests/servicestests/
+<pre class="devsite-click-to-copy">
+frameworks/base/services/tests/servicestests/
 </pre>
 
 <p>
 其中包括:</p>
 
-<pre>src/com/android/server/pm/ShortcutManagerTest*.java
+<pre class="devsite-click-to-copy">
+src/com/android/server/pm/ShortcutManagerTest*.java
 </pre>
 <p>
-您还可以针对快捷方式管理器采用 CTS Verifier 测试:
+您还可以针对快捷方式管理器部署 CTS 验证程序测试:
 </p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 cts/apps/CtsVerifier/src/com/android/cts/verifier/notifications/ShortcutThrottlingResetActivity.java
 </pre>
 
diff --git a/zh-cn/devices/tech/display/color-mgmt.html b/zh-cn/devices/tech/display/color-mgmt.html
new file mode 100644
index 0000000..f6c3bcf
--- /dev/null
+++ b/zh-cn/devices/tech/display/color-mgmt.html
@@ -0,0 +1,87 @@
+<html devsite><head>
+    <title>颜色管理</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<p>Android 8.1 新增了对颜色管理功能的支持,此功能可用于在采用不同显示技术的设备间提供一致的体验。在 Android 8.1 上运行的应用可以访问广色域显示屏的所有功能,以便充分利用显示设备。</p>
+
+<p>之前的 Android 版本不支持颜色管理功能,而是依赖于内容和显示屏之间的兼容性(这个目标通常需要借助电视行业的帮助才能得以实现)。不过,最新的显示技术可让不能按预期显示现有内容的显示屏具有更广的色域。在使用 Android 8.1 时,采用广色域显示屏(例如有机发光二极管有源阵列或 AMOLED 及某些 LCD)的设备将能够从应用中查看到广色域内容。</p>
+
+<h2>确定设备支持</h2>
+<p>运行 Android 8.1 且采用广色域显示屏的设备应支持颜色管理(广色域)。在启用这项功能之前,请确保设备符合以下要求:</p>
+<ul>
+<li>设备显示屏符合硬件要求,其中包括可支持 Display-P3 颜色空间的性能良好的显示屏。如果显示屏不符合此要求,请勿启用颜色管理。为了降低 CPU 和 GPU 影响,有必要在显示通道中支持扩展的 sRGB 和 HDR10。</li>
+<li>设备支持出厂校准流程,该流程可生成校准数据(存储在设备上)来调整显示行为中的制造差异。校准数据至少应允许显示屏准确显示 sRGB 内容以及 D65 和 D73 白点(Android 的后续版本可能会针对每个设备支持完整 ICC 配置文件)。</li>
+</ul>
+<p>如果满足上述要求,您就可以为设备启用颜色管理功能。</p>
+
+<h2>实现颜色管理</h2>
+<p>要实现颜色管理,您必须先更新 <a href="/devices/graphics/implement-hwc">Hardware Composer 2 (HWC2)</a> 驱动程序,以便了解颜色模式并将这些模式应用到硬件。具体而言,HWC2 制作程序必须使用 <code>HWCDisplay::GetColorModes</code> 报告 Display-P3 和 sRGB 颜色模式。</p>
+
+<aside class="key-term"><strong>关键术语:</strong>Display-P3 使用数字电影院线联盟基元和 sRGB 传输功能。</aside>
+
+<p>接下来,启用必需的 OpenGL 扩展程序和库支持,以将 OpenGL 颜色空间转换为 HAL 数据空间。必需的 OpenGL 扩展程序包括:</p>
+<ul>
+<li>
+<a href="https://www.khronos.org/registry/egl/extensions/EXT/EGL_EXT_pixel_format_float.txt" class="external">EGL_EXT_pixel_format_float</a>。允许应用使用 16 位浮点颜色组件创建可呈现的 EGLSurface。优先级:高(建议将这项作为宽色域感知应用的默认像素格式)。需要驱动程序支持。</li>
+<li>
+<a href="https://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_gl_colorspace.txt" class="external">EGL_KHR_gl_colorspace</a>。对于需要使用 sRGB 格式默认帧缓冲区来轻松实现显示设备的 sRGB 渲染的应用,此扩展程序允许创建将由支持该功能的 OpenGL 上下文采用 sRGB 格式进行渲染的 EGLSurface。需要驱动程序支持 sRGB 行为。</li>
+</ul>
+<p>Android 还提供以下可选的扩展程序:</p>
+<ul>
+<li>
+<a href="https://www.khronos.org/registry/egl/extensions/EXT/EGL_EXT_gl_colorspace_scrgb_linear.txt" class="external">EGL_EXT_colorspace_scrgb_linear</a>。该扩展程序可提供一个新的颜色空间选项 (scRGB),供应用在创建 EGLSurface 时进行选择。scRGB 颜色空间可定义与 sRGB 具有相同白点和颜色基准(以便与 sRGB 向后兼容)的线性显示引用空间。此扩展程序应该不需要驱动程序支持,而且可以在 Android EGL 封装容器中实现。为了正常发挥作用,此扩展程序需支持 16 位浮点 (FP16)。</li>
+<li>
+<a href="https://github.com/KhronosGroup/EGL-Registry/pull/10/files" class="external">EGL_KHR_gl_colorspace_display_p3
+和 EGL_EXT_gl_colorspace_display_p3_linear</a>。对于需要使用 Display-P3 格式默认帧缓冲区来轻松实现显示设备的 sRGB 渲染的应用,此扩展程序允许创建将由支持该功能的 OpenGL 上下文采用 Display-P3 格式进行渲染的 EGLSurface。此扩展程序可以在 EGL 驱动程序封装容器中实现。</li>
+<li>
+<a href="https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VK_EXT_swapchain_colorspace" class="external">VK_EXT_swapchain_colorspace</a> (Vulkan)。可让应用通过它们正在使用的颜色空间来标记交换链。包括一些常见颜色空间,例如 DCI-P3、Display-P3、AdobeRGB、BT2020 等。</li>
+</ul>
+
+<h2>自定义</h2>
+<p>您可以通过提供对各种颜色标准(例如 DCI-P3、AdobeRGB、Rec709、Rec2020)的支持来自定义颜色管理功能。其他自定义项包括:</p>
+<ul>
+<li><strong>针对显示通道中颜色转换的硬件支持</strong>。在硬件中支持多种颜色转换。
+</li>
+<li><strong>支持在多个图层上进行独立的颜色转换</strong>(例如,某些图层可以是 sRGB,其他图层是扩展的 sRGB,每个图层都具有自己的颜色管道)。如果有多个颜色空间可见时,需要将某些颜色空间转换为显示屏的颜色空间。理想情况下,此转换最好由显示引擎提供(否则 Android 必须执行 GPU 合成)。</li>
+</ul>
+
+<h2>测试</h2>
+<p>要测试颜色管理,请使用 <code>opengl/tests</code> 中的以下资源:</p>
+<ul>
+<li><code>gl2_basic</code>。用于请求 Display-P3 颜色空间的简单 OpenGL 演示。</li>
+<li><code>
+<a href="https://android.googlesource.com/platform/frameworks/native/+/master/opengl/tests/EGLTest/EGL_test.cpp">EGL_test</a></code>。测试必要的扩展程序和配置支持(10:10:10:2 和 FP16)。</li>
+<li><code>test_wide_color</code>。以与 SurfaceFlinger 创建 surface 的方式相同的方式创建 surface(例如配置、颜色空间、像素格式)。</li>
+</ul>
+
+<h2>参考实现</h2>
+<p>有关参考实现,请参阅 <code>frameworks/native</code>。有关标题,请参阅:</p>
+<ul>
+<li>
+<code><a href="https://android.googlesource.com/platform/system/core/+/master/libsystem/include/system/graphics.h">system/core/include/system/graphics.h</a></code></li>
+<li>
+<code><a href="https://android.googlesource.com/platform/system/core/+/master/libsystem/include/system/graphics-base.h">system/core/include/system/graphics-base.h</a></code><ul>
+<li><code>HAL_DATASPACE_*</code></li>
+<li><code>HAL_COLOR_MODE_*</code></li>
+</ul>
+</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/night-light.html b/zh-cn/devices/tech/display/night-light.html
index b2d0a11..242bbcc 100644
--- a/zh-cn/devices/tech/display/night-light.html
+++ b/zh-cn/devices/tech/display/night-light.html
@@ -24,11 +24,12 @@
 研究表明,屏幕的蓝光会对睡眠质量造成不良影响。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>
-设备制造商可以使用以下路径中定义的下列标记来启用该功能的默认实现:<code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">
+设备制造商可以使用以下路径中定义的下列标记来启用该功能的默认实现:
+<code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">
 /android/frameworks/base/core/res/res/values/config.xml</a></code>
 
 </p><pre class="devsite-click-to-copy">
@@ -95,7 +96,7 @@
 
 <h2 id="ui-features">界面功能</h2>
 <p>
-由于夜间模式是面向用户的功能,因此用户需要能够掌控这项功能。Android 开放源代码项目 (AOSP) <a href="https://android.googlesource.com/platform/packages/apps/Settings/">packages/apps/Settings</a> 项目中提供了全面的设置实现方法,以供设备制造商在实现其设置时参考。实现人员必须处理 <code><a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_NIGHT_DISPLAY_SETTINGS">Settings.ACTION_NIGHT_DISPLAY_SETTINGS</a></code> intent 才能显示此设置。
+由于夜间模式是面向用户的功能,因此用户需要能够掌控这项功能。Android 开源项目 (AOSP) 的 <a href="https://android.googlesource.com/platform/packages/apps/Settings/">packages/apps/Settings</a> 项目中提供了全面的设置实现方法,以供设备制造商在实现其设置时参考。实现人员必须处理 <code><a href="https://developer.android.com/reference/android/provider/Settings.html#ACTION_NIGHT_DISPLAY_SETTINGS">Settings.ACTION_NIGHT_DISPLAY_SETTINGS</a></code> intent 才能显示此设置。
 </p>
 <h3 id="settings">设置</h3>
 <p>
@@ -119,7 +120,7 @@
 </p>
 <h3 id="quick-settings-tile">“快捷设置”图块</h3>
 <p>
-您可以通过“快捷设置”图块执行相应操作,也可以通过“设置”&gt;“显示”&gt;“夜间模式”中的<strong>开启/关闭</strong>切换开关执行相应操作,两者效果是一样的。<em></em>
+用户可以通过“快捷设置”图块执行相应操作,也可以通过“设置”&gt;“显示”&gt;“夜间模式”中的<strong>开启/关闭</strong>切换开关执行相应操作,两者效果是一样的。<em></em>
 </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/pip.html b/zh-cn/devices/tech/display/pip.html
new file mode 100644
index 0000000..b9f6824
--- /dev/null
+++ b/zh-cn/devices/tech/display/pip.html
@@ -0,0 +1,95 @@
+<html devsite><head>
+    <title>画中画</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<p>
+Android 8.0 支持在 Android 手持设备上使用画中画 (PIP) 功能。借助画中画功能,用户可以将有正在进行的活动的应用调整到一个小窗口中。画中画对视频应用来说尤其有用,因为用户可以随时执行其他操作,而不会打断内容播放。用户可以通过 SystemUI 操控该窗口的位置,并通过应用提供的操作(最多三项)与当前处于画中画模式的应用流畅地互动。
+</p>
+<p>
+有关详情,请参阅 Android 开发者<a href="https://developer.android.com/training/tv/playback/picture-in-picture.html">画中画</a>文档。
+</p>
+
+<h2 id="overview">概览</h2>
+<p>画中画功能需要在支持它的应用中明确选择启用,并按 Activity 运作(一个应用可以有多个 Activity ,但其中只有一个可处于画中画模式)。Activity 通过调用 <code>enterPictureInPictureMode()</code> 来请求进入画中画模式,并以 <code>onPictureInPictureModeChanged()</code> 的形式接收 Activity 回调。
+</p>
+<p>
+Android 8.0 中新增了更多方法,包括 <code>setPictureInPictureParams()</code>,借助这种方法,Activity 可以控制其在画中画模式下的宽高比和自定义操作,这样一来,用户无需展开 Activity 便可以与之互动。在画中画中,Activity 处于暂停但继续呈现的状态,并且不直接接收触摸输入或窗口焦点。在同一时间点,只能有一项任务处于画中画模式。
+</p>
+<h2 id="device-requirements">设备要求</h2>
+<p>
+要支持画中画功能,请在 <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/pm/PackageManager.java">/android/frameworks/base/core/java/android/content/pm/PackageManager.java</a></code> 中启用 <code>PackageManager#FEATURE_PICTURE_IN_PICTURE</code> 系统功能。
+支持画中画功能的设备的最小屏幕宽度必须大于 220dp。与分屏多窗口类似,画中画支持多个 Activity 同时在屏幕上运行。因此,设备的 CPU 和 RAM 要足以支持这类使用情形。
+</p>
+<h2 id="implementation">实现</h2>
+<p>
+大多数 Activity 生命周期管理都是由系统的 <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/am/">ActivityManager</a></code> 和 <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/wm/">WindowManager</a></code> 组件协作完成的。
+相应的参考界面实现位于 <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/">SystemUI</a></code> 软件包中。
+</p>
+
+<p>
+对系统所做的修改不应影响其内在行为(如<a href="#cts-tests">兼容性测试套件 (CTS) 测试</a>中所定义)。画中画的系统逻辑主要围绕“置顶”堆栈中的任务和 Activity 管理而展开。以下是对系统逻辑类的简单介绍:
+</p>
+<ul>
+  <li><strong><code>ActivityRecord</code></strong>:跟踪每个 Activity 的画中画状态。为了防止用户在某些情况下(例如从锁定屏幕或在观看 VR 视频期间)进入画中画,请向 <code>checkEnterPictureInPictureState()</code> 添加用例。</li>
+  <li><strong><code>ActivityManagerService</code></strong>:Activity 在请求进入画中画模式时所调用的主接口,也是 <code>WindowManager</code> 和 <code>SystemUI</code> 在更改画中画 Activity 状态时所调用的接口。</li>
+  <li><strong><code>ActivityStackSupervisor</code></strong>:从 <code>ActivityManagerService</code> 调用,以向置顶堆栈移入任务或从中移出任务,必要时会更新 <code>WindowManager</code>。</li>
+  <li><strong><code>PinnedStackWindowController</code></strong>:来自 <code>ActivityManager</code> 的 <code>WindowManager</code> 接口。</li>
+  <li><strong><code>PinnedStackController</code></strong>:将系统中的变化告知 <code>SystemUI</code>,例如 IME 显示/隐藏、宽高比变化、操作变化。</li>
+  <li><strong><code>BoundsAnimationController</code></strong>:以调整大小时不触发配置更改的方式,对画中画 Activity 窗口进行动画处理。</li>
+  <li><strong><code>PipSnapAlgorithm</code></strong>:系统和 SystemUI 中使用的共享类,可控制屏幕边缘附近的画中画窗口的贴靠行为。</li>
+</ul>
+
+<p>
+参考 <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/">SystemUI</a></code> 中提供了画中画功能的完整实现(支持向用户呈现自定义操作并执行展开和关闭等常规操控)。
+设备制造商可以在该实现的基础上做进一步的开发,只要所做更改不影响 CDD 所定义的内在行为即可。以下是对相关类的简单介绍:</p>
+<ul>
+  <li><strong><code>PipManager</code></strong>:随 <code>SystemUI</code> 启动的 <code>SystemUI</code> 组件。</li>
+  <li><strong><code>PipTouchHandler</code></strong>:触摸处理程序,用于控制操纵画中画窗口的手势。仅在画中画的输入使用方处于活动状态时使用(请参阅 <code>InputConsumerController</code>)。在此处理程序中可添加新手势。</li>
+  <li><strong><code>PipMotionHelper</code></strong>:一个辅助类,用于跟踪画中画位置和屏幕上允许的区域。通过这个类调用 <code>ActivityManagerService</code> 可更新或调整画中画的位置和大小。</li>
+  <li><strong><code>PipMenuActivityController</code></strong>:用于启动一个 Activity,以便显示当前画中画中的 Activity 提供的操作。所启动的 Activity 属于任务叠加层 Activity,会移除上层的输入使用方,以使自身进入可互动状态。</li>
+  <li><strong><code>PipMenuActivity</code></strong>:菜单 Activity 的实现。</li>
+  <li><strong><code>PipMediaController</code></strong> :当媒体会话的变化可能会影响画中画上的默认操作时更新 <code>SystemUI</code> 的侦听器。</li>
+  <li><strong><code>PipNotificationController</code></strong>:确保在用户使用画中画功能时显示一条处于活动状态的通知的控制器。</li>
+  <li><strong><code>PipDismissViewController</code></strong>:当用户开始与画中画进行互动时向用户显示的叠加层,提示用户可以关闭画中画。</li>
+</ul>
+<h2 id="default-placement">默认显示位置</h2>
+<p>
+用于控制画中画的默认显示位置的系统资源有多项:
+</p>
+<ul>
+  <li><strong><code>config_defaultPictureInPictureGravity</code></strong>:<a href="https://developer.android.com/reference/android/view/Gravity.html">gravity</a> 整数,可控制放置画中画的角落,如 <code>BOTTOM|RIGHT</code>。</li>
+  <li><strong><code>config_defaultPictureInPictureScreenEdgeInsets</code></strong>:画中画的放置位置相对于屏幕侧边的偏移量。</li>
+  <li><strong><code>config_pictureInPictureDefaultSizePercent</code></strong> 和 <strong><code>config_pictureInPictureDefaultAspectRatio</code></strong>:占屏幕宽度的百分比与宽高比的组合,用于控制画中画的大小。计算得出的默认画中画大小不应小于 <code>@dimen/default_minimal_size_pip_resizable_task</code>(如 CTS 和 CDD 中所定义)。</li>
+  <li><strong><code>config_pictureInPictureSnapMode</code></strong>:贴靠行为(如 <code>PipSnapAlgorithm</code> 中所定义)。</li>
+</ul>
+<p>
+设备实现不应更改 CDD 和 CTS 中定义的宽高比上限和下限。
+</p>
+<h2 id="permissions">权限</h2>
+<p>
+Android 8.0 在 <code>AppOpsManager</code> (<code>master/core/java/android/app/AppOpsManager.java)</code> 中新增了基于软件包的“应用操作”(<code>OP_PICTURE_IN_PICTURE</code>),这样一来,用户便可以通过系统设置在应用级别控制画中画。
+当 Activity 请求进入画中画模式时,设备实现需要遵循此检查要求。
+</p>
+<h2 id="cts-tests">测试</h2>
+<p>
+要测试画中画实现,请运行主机端 CTS 测试中 <code><a href="https://android.googlesource.com/platform/cts/+/master/hostsidetests/services/activitymanager/src/android/server/cts">/cts/hostsidetests/services/activitymanager</a></code>(尤其是 <code>ActivityManagerPinnedStackTests.java</code> 中)下所有与画中画相关的测试。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/retail-mode.html b/zh-cn/devices/tech/display/retail-mode.html
index b637ac3..0d581a4 100644
--- a/zh-cn/devices/tech/display/retail-mode.html
+++ b/zh-cn/devices/tech/display/retail-mode.html
@@ -21,24 +21,87 @@
   -->
 
 <p>
-Android 7.1.1 及更高版本可为零售模式提供系统级支持,以便用户可以轻松检测运行中的设备。通过该功能,零售环境中的任何人都可以观看快速、安全、一致的 Android 设备演示,而原始设备制造商 (OEM) 也可以借此大幅降低零售模式的成本和复杂度,实现演示设备的普通化。
+Android 7.1.1 及更高版本可为零售模式提供系统级支持,以便用户可以轻松检测运行中的设备。Android 8.1 对这项支持进行了修订,以通过设备政策管理器创建演示用户。这有利于对标准零售模式进行更灵活的 OEM 自定义。
 </p>
 
-<h2 id="key-use-cases">关键用例</h2>
+<h2 id="android-8-1-and-later">Android 8.1 及更高版本</h2>
 
+<p>Android 8.1 支持通过设备政策管理器向零售店用户展示设备功能。尽管设备政策管理器的 API 可以在 8.1 之前的版本上使用,但是对于 8.1 之前的版本,无法使用 <a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html#createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int)">createAndManageUser</a> 创建演示类型的用户。
+</p>
+
+<h3 id="implementation">实现</h3>
+
+<h4 id="provisioning">配置</h4>
+<p>
+在配置前将 <code>Settings.Global.DEVICE_DEMO_MODE</code> 设置为 1,以表示设备应进入零售模式。系统服务器将使用此标记来管理零售模式的各个方面,例如电源配置文件。此外,零售员工必须向演示应用授予设备所有权。完成消费者设置后,将无法设置设备所有者。
+</p>
+
+<h4 id="create-demo-app">创建演示应用</h4>
+<p>
+设备所有者应用无需在系统映像上进行提权或预安装。一般来说,这类应用的实现方式与传统应用是一样的;以下是它们之间的差异:</p>
 <ul>
-<li>任何现成的 Android 设备都可以通过向 build 添加一个演示视频来设置为零售模式。
-</li><li>所有设备上都具有突出设备独特功能的视频。
-</li><li>无论是在线还是离线环境,设备都可以运行。
-</li><li>设备可以进行自我维护,所需的员工互动极少。</li></ul>
+  <li>所有的设备所有者应用都必须扩展 <code>DeviceAdminReceiver</code> 组件,该组件可作为所有设备政策管理器 API 的授权令牌。该组件必须具有 <code>android.permission.BIND_DEVICE_ADMIN</code> 权限,包含请求的特殊政策(作为元数据),并过滤 <code>android.app.action.PROFILE_PROVISIONING_COMPLETE</code> 和 <code>android.app.action.DEVICE_ADMIN_ENABLED</code> intent。</li>
+  <li><code>DevicePolicyManager#MAKE_USER_DEMO</code> 标记是一个隐藏 API。设置此标记可以创建特殊的演示类型用户。此标记是一个常量 0x4。</li>
+  <li>设备所有权只能通过托管配置进行分配。</li>
+</ul>
 
-<h2 id="lifecycle">生命周期</h2>
+<h4 id="device-policy-manager">设备政策管理器</h4>
+<p>
+设备政策管理器 API 会授予所有的设备所有者 (DO) 和配置文件所有者 (PO) 权限(软件包安装权限除外,因为系统会自动授予这项权限)。与 DO 关联的 PO 可以使用 AIDL 接口来访问仅向 DO 授予的权限。可用的功能包括:</p>
+<ul>
+ <li>创建用户。通过 DevicePolicyManager 创建的用户将自动设置为 PO。</li>
+ <li>切换用户。</li>
+ <li>将权限政策设置为 <code>PERMISSION_POLICY_AUTO_GRANT</code>,这样可以自动授予所有运行时权限。权限的授予范围也可以缩小:单项权限授予单一应用。这不适用于 Appops 权限(用户仍必须基于每个用户、每个应用授予权限)。</li>
+ <li>添加用户限制。与零售模式相关的限制可能包括但不限于:<ul>
+     <li><code>DISALLOW_MODIFY_ACCOUNTS</code></li>
+     <li><code>DISALLOW_USB_FILE_TRANSFER</code></li>
+     <li><code>DISALLOW_DEBUGGING_FEATURES</code></li>
+     <li><code>DISALLOW_CONFIG_WIFI</code></li>
+     <li><code>DISALLOW_CONFIG_BLUETOOTH</code></li>
+     <li><code>DISALLOW_INSTALL_UNKNOWN_SOURCES</code></li>
+     <li><code>DISALLOW_CONFIG_MOBILE_NETWORKS</code></li>
+   </ul>
+ </li>
+ <li>启用自动系统更新。设备将自动下载并应用 OTA 更新。</li>
+ <li>设置 LockTask 允许的软件包。</li>
+ <li>将设备恢复出厂设置。</li>
+ <li>停用锁屏功能。</li>
+ <li>阻止设置密码/指纹。</li>
+ <li>控制 WLAN 网络更改。与用户限制 <code>DISALLOW_CONFIG_WIFI</code> 一起使用时,设备所有者应用可以控制对 WLAN 网络选择设置的访问权限。</li>
+ <li>重新启动设备。</li>
+ <li>通过 <a href="https://developer.android.com/reference/android/content/pm/PackageInstaller.html">PackageInstaller</a> 安装软件包。</li>
+ <li>设置一组已加入白名单的 <a href="https://developer.android.com/reference/android/provider/Settings.Global.html">
+Settings.Global</a>、<a href="https://developer.android.com/reference/android/provider/Settings.Secure.html">
+Settings.Secure</a> 和 <a href="https://developer.android.com/reference/android/provider/Settings.System.html">
+Settings.System</a> 设置。</li>
+ <li>阻止卸载软件包。</li>
+</ul>
+
+<h3 id="examples-additional-resources">示例和其他资源</h3>
+<ul>
+ <li>用户、配置文件和帐号的 <a href="/devices/tech/admin/multi-user">Android 开发者定义</a></li>
+ <li><a href="https://developer.android.com/reference/android/app/admin/DevicePolicyManager.html">设备政策管理器 API 文档</a></li>
+ <li><a href="https://developer.android.com/samples/DeviceOwner/index.html">示例设备所有者应用</a></li>
+</ul>
+
+<h3 id="validation">验证</h3>
+<p>
+CTS 不涵盖零售演示模式,因为该模式是一项可选功能。测试应手动进行,或对演示应用进行单元测试。
+</p>
+
+<h2 id="retail-demo-mode-8-and-earlier">Android 8.0 及更早版本</h2>
+
+<p>
+Android 7.1.1 引入了零售演示模式,并提供了一个简单 API 来播放演示视频。该实现已在 Android 8.1 中移除。
+</p>
+
+<h3 id="lifecycle">生命周期</h3>
 
 <img src="/devices/tech/display/images/retail-demo-flow.png" alt="零售演示模式流程" width="XXX" id="retail-demo-flow"/>
 <p class="img-caption">
   <strong>图 1.</strong> 语言选择中的零售演示模式选项</p>
 
-<h3 id="setup-wizard-suw">设置向导 (SUW)</h3>
+<h4 id="setup-wizard-suw">设置向导 (SUW)</h4>
 
 <p>零售员工可以从任何设置向导的首屏直接启用零售模式,具体方法是选择列表底部的语言 <strong>Retail demo</strong>。此选项适用于全新出厂的设备。一旦消费者完成设置,零售模式将不再可用。选择后,设备将完成具有简短流程的 SUW。
 </p>
@@ -47,7 +110,7 @@
 <p class="img-caption">
   <strong>图 2.</strong> 语言选择中的零售演示模式选项</p>
 
-<h3 id="guest-session">访客会话</h3>
+<h4 id="guest-session">访客会话</h4>
 
 <p>设备进入零售模式后,会切换到新的演示用户,并自动启动覆盖层资源中指定的自定义启动器(如“实现”部分所述)。默认情况下,此自定义启动器会重复播放演示视频,直至用户触摸屏幕开始访客会话。这时,自定义启动器会在启动系统启动器后退出。原始设备制造商 (OEM) 可以更改自定义启动器,使其在退出时额外启动其他服务或活动。有关详细信息,请参阅“实现”部分。<em></em>
 </p>
@@ -70,27 +133,27 @@
 <ul>
   <li>亮度</li><li>自动旋转</li><li>手电筒</li><li>语言</li><li>无障碍</li></ul>
 
-<h3 id="exiting-retail-mode">退出零售模式</h3>
+<h4 id="exiting-retail-mode">退出零售模式</h4>
 
 <p>要退出零售模式,零售员工必须从引导加载程序将设备恢复出厂设置。
 </p>
 
-<h2 id="examples-and-source">示例和源代码</h2>
+<h3 id="examples-and-source">示例和源代码</h3>
 
 <p>从以下位置查找循环播放视频的自定义启动器:</p>
 <pre class="devsite-click-to-copy">
 /packages/apps/RetailDemo
 </pre>
 
-<h2 id="implementation">实现</h2>
+<h3 id="implementation">实现</h3>
 
-<h3 id="enabling-retaildemomodeservice">启用 RetailDemoModeService</h3>
+<h4 id="enabling-retaildemomodeservice">启用 RetailDemoModeService</h4>
 
 <p>
-设置向导设置全局设置 <code>Global.DEVICE_DEMO_MODE=true</code>,以表示设备已进入零售模式。一遇到此设置,<code>RetailDemoModeService</code> 便会在用户 0 已启动时创建并切换至演示用户,启用覆盖层资源中指定的自定义启动器,并停用 SUW。系统服务器和 SystemUI 也会使用此标记来管理零售模式的各个方面。
+设置向导将设置全局设置 <code>Global.DEVICE_DEMO_MODE=true</code>,来表示设备已进入零售模式。一遇到此设置,<code>RetailDemoModeService</code> 便会在用户 0 已启动时创建并切换至演示用户,启用覆盖层资源中指定的自定义启动器,并停用 SUW。系统服务器和 SystemUI 也会使用此标记来管理零售模式的各个方面。
 </p>
 
-<h3 id="setting-custom-launcher-or-video-player">设置自定义启动器或视频播放器</h3>
+<h4 id="setting-custom-launcher-or-video-player">设置自定义启动器或视频播放器</h4>
 
 <p>原始设备制造商 (OEM) 可以通过覆盖 <code>/frameworks/base/core/res/res/config.xml</code> 中指定的框架资源 <code>config_demoModeLauncherComponent</code> 来指定自定义启动器
 </p>
@@ -107,25 +170,26 @@
 <p>自定义启动器必须将其自定义组件标记为默认停用,从而避免该组件在非演示情境下出现。在演示情境下,系统服务器会在启动新的演示会话时启用指定的 <code>config_demoModeLauncherComponent</code>。
 </p>
 
-<p>设置向导也会查找上述视频作为素材,以提供给零售模式进行播放。如果视频不是演示的一部分,则可以修改 SUW 以查找其他表明支持零售模式的原始设备制造商 (OEM) 特定标志。
+<p>设置向导也会查找上述视频作为素材,以提供给零售模式进行播放。如果视频不是演示的一部分,则可以修改 SUW 以查找其他表明支持零售模式的 OEM 特定标志。
 </p>
 
 <p>如果有 A/B 两个系统分区,则 B 系统分区的 <code>/preloads/demo</code> 中必须包含演示视频。在首次启动时,系统会将该视频复制到 <code>/data/preloads/demo</code>。
 </p>
 
 <p>
-要设置特定于零售模式的设置,请使用:<code>Settings.Global.retail_demo_mode_constants</code>。例如:<code>user_inactivity_timeout_ms=90000,warning_dialog_timeout_ms=10000</code>
+要设置特定于零售模式的设置,请使用:
+<code>Settings.Global.retail_demo_mode_constants</code>。例如:<code>user_inactivity_timeout_ms=90000,warning_dialog_timeout_ms=10000</code>
 </p>
 
 <p class="note"><strong>注意</strong>:目前的超时默认值为 90000 毫秒,但可对其进行配置。
 </p>
 
-<h3 id="finding-sample-images">查找示例图片</h3>
+<h4 id="finding-sample-images">查找示例图片</h4>
 
 <p>此功能可将示例照片放在对任何图库应用均可见的特殊文件夹中。这些照片仅在演示模式下可用,并且由于处在受保护的目录中,所以演示用户无法对其进行修改。
 </p>
 
-<h3 id="preventing-google-accounts">阻止 Google 帐号</h3>
+<h4 id="preventing-google-accounts">阻止 Google 帐号</h4>
 
 <p>访客用户中设置了一些限制,类似于通过托管设备/资料策略防止应用和用户执行某些操作。其中一项限制是 <code>DISALLOW_MODIFY_ACCOUNTS</code>。在此限制之下,AccountManager 和“设置”不允许添加帐号。某些 Google 应用会对此限制做出反应并显示一条错误消息,其他应用则不提示登录帐号(如 YouTube 和 Google 照片)。
 </p>
@@ -133,37 +197,38 @@
 <p>原始设备制造商 (OEM) 应用也应检查是否已设置 <code>DISALLOW_MODIFY_ACCOUNTS</code>。但这是一个一般问题,并非零售模式所独有。企业用例很可能已解决此问题。
 </p>
 
-<h3 id="customizing-the-system-launcher">自定义系统启动器</h3>
+<h4 id="customizing-the-system-launcher">自定义系统启动器</h4>
 
 <p>原始设备制造商 (OEM) 可以自由选择布局,但应该在主屏幕和底部区域包含正常运行的应用。
 </p>
 
-<h3 id="Customizing-built-in-apps">针对零售演示模式自定义内置应用</h3>
+<h4 id="Customizing-built-in-apps">针对零售演示模式自定义内置应用</h4>
 
 <p>内置应用可调用 API <code>UserManager.isDemoUser()</code> 来查看应用是否在演示环境中启动,以此针对零售演示模式自定义应用体验。
 </p>
 
-<h3 id="following-demo-video-guidelines">遵循演示视频指南</h3>
+<h4 id="following-demo-video-guidelines">遵循演示视频指南</h4>
 
 <p>演示视频应采用纵向布局(如果是平板电脑,则为设备的自然方向),且时长在 5 秒以上。由于视频将在展示期间全天候播放,因此视频内容不能导致烧机。
 </p>
 
-<h2 id="maintenance">维护</h2>
+<h3 id="maintenance">维护</h3>
 
-<h3 id="bringing-the-device-out-of-retail-mode">使设备退出零售模式</h3>
+<h4 id="bringing-the-device-out-of-retail-mode">使设备退出零售模式</h4>
 
 <p>只能通过从引导加载程序恢复出厂设置来实现。
 </p>
 
-<h3 id="auto-ota-of-system-software">系统软件的自动 OTA</h3>
+<h4 id="auto-ota-of-system-software">系统软件的自动 OTA</h4>
 
-<p>默认情况下,启用零售模式时,设备策略将被自动设置为无线 (OTA) 更新。零售设备将不经过确认,自动下载、重新启动并安装更新(考虑电池阈值),即使更新被标记为可选亦如此。
+<p>
+默认情况下,启用零售模式时,设备政策将自动设置为无线下载 (OTA) 更新。零售设备将不经过确认,自动下载、重新启动并安装更新(考虑电池阈值),即使更新被标记为可选亦如此。
 </p>
 
 <p class="caution"><strong>注意</strong>:如果针对 OTA 使用 A/B 系统分区,则接收 OTA 更新后,设备将无法在 B 系统分区中找到原始的零售模式资源。因此,之后的任何恢复出厂设置操作都会导致设备无法返回零售模式。
 </p>
 
-<h3 id="updating-demo-video-via-the-web">通过网络更新演示视频</h3>
+<h4 id="updating-demo-video-via-the-web">通过网络更新演示视频</h4>
 
 <p>只要有网络连接,<code>/packages/apps/RetailDemo</code> 中的 RetailDemo 应用便可以更新演示视频。通过在 RetailDemo 应用中替换以下字符串值,可配置下载视频的网址:</p>
 
@@ -189,7 +254,7 @@
 
 <p>每次设备重新启动时,此视频最多只能下载一次。视频在设备上播放时,RetailDemo 应用会在后台检查是否提供了下载网址以及网址中的视频是否比正在播放的视频新。
 
-</p><p>如果是,RetailDemo 应用就会下载该视频并开始播放。视频下载完成后,下载的视频将用于在之后的演示会话中播放。在下次重新启动之前,将不再执行此类检查。
+</p><p>如果是,RetailDemo 应用就会下载该视频并开始播放。视频下载完成后,下载的视频将用于在之后的演示会话中播放。在下次重新启动之前,将不再执行任何此类检查。
 </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/split-screen.html b/zh-cn/devices/tech/display/split-screen.html
new file mode 100644
index 0000000..64021c6
--- /dev/null
+++ b/zh-cn/devices/tech/display/split-screen.html
@@ -0,0 +1,81 @@
+<html devsite><head>
+    <title>分屏交互</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+<p>
+在 Android 7.0 及更高版本中,用户可以借助平台功能(<a href="/devices/tech/display/multi-window">多窗口模式</a>)在设备屏幕上同时显示多个应用。
+默认模式是分屏,该模式可为用户提供两个活动窗格供他们放置应用。
+</p>
+<p>
+Android 8.0 通过优化分屏功能并为其添加更多功能来改进分屏模式。在默认实现中,如果用户在进入分屏模式后点按<strong>主屏幕</strong>,则系统会压缩顶部窗格,并调整启动器的大小。这是为了向用户展示顶部应用依然处于打开状态,同时保持用户的启动器布局,以便用户从主屏幕中查找和启动应用。
+</p>
+<h2 id="examples-and-source">示例和源代码</h2>
+<p><code>/platform/packages/apps/Launcher3/</code> 中的 Launcher3 代码中有这项新功能的参考实现
+</p>
+<p>
+以下更改 ID 与在 Launcher3 中实现分屏相关,并且可供要对其启动器进行类似更新的设备制造商作为参考。
+</p>
+<ul>
+  <li>Change-Id:<code>I48e5cb3bd15e70627d9bf007d93bc731612fba2e</code></li>
+  <li>Change-Id:<code>I86753bab5b24aafc417e0f77d8c471fc4c0dc7f0</code></li>
+  <li>Change-Id:<code>Id6557d070edb664aa1f4851de7abf494cf8a0677</code></li>
+  <li>Change-Id:<code>Icdaf73ecd89a30e57fe7f405292d793f2d6a3ee8</code></li>
+  <li>Change-Id:<code>Ie50279f4edb94812120dea492aefa4f18218162f</code></li>
+  <li>Change-Id:<code>I6f9ee7be12d3266f021796576c771f86f6120246</code></li>
+  <li>Change-Id:<code>I106fe12041565a090047f146a07d4bc80a074b4a</code></li>
+  <li>Change-Id:<code>Ibb49c56aab29d1223a0ab36476a32d565566eb25</code></li>
+  <li>Change-Id:<code>Id60c793730d982277c9d91860e9fb0e6a0df7d38</code></li>
+  <li>Change-Id:<code>I9d358e74ab403989929dee87542d3dde78c2f229</code></li>
+  <li>Change-Id:<code>I925d5ac9d29439c5d61cf089e7784065a8cb5ebd</code></li>
+  <li>Change-Id:<code>I776c6f710e081645cff891487022cf787869ee3f</code></li>
+  <li>Change-Id:<code>I2d17c89db2eb8d60b3393c2abc3b026e5574085d</code></li>
+  <li>Change-Id:<code>Id6ee68826c4f3cc579880540812fd8ed834f8267</code></li>
+</ul>
+<h2 id="example-ux">UX 示例</h2>
+<p>
+以下是示例屏幕,用于展示此功能的默认实现的用户体验。
+</p>
+<p><img src="/devices/tech/display/images/split-screen-example-ux.png" alt="用于展示启动器调整大小行为的示例屏幕"/>
+</p>
+<p class="img-caption"><strong>图 1</strong>. 用于展示在分屏模式下调整启动器大小的示例屏幕。
+</p>
+<h2 id="implementation">实现</h2>
+<p>
+尽管 Android 8.0 可为此分屏更新提供参考实现,但设备制造商在其启动器中的实现还是要由他们自己来确定。为了支持此功能,请执行以下操作:
+</p>
+<ul>
+  <li>实现符合 Android 兼容性定义文档 (CDD) <a href="/compatibility/android-cdd#3814-multi-windows">多窗口要求</a>的多窗口(或具有多窗口的现有实现)。</li>
+  <li>使启动器可供调整大小。Launcher3 中的参考实现会在屏幕变小的情况下移除应用名称,但具体实现可能会因启动器压缩方式而异(特别是在存在自定义启动器代码的情况下)。</li>
+  <li>在启动器清单中设置最小指定高度值。为此,请在以下位置调整 <code>task_height_of_minimized_mode</code> 值:<code>frameworks/base/core/res/res/values/dimens.xml</code></li>
+</ul>
+<h2 id="testing">测试</h2>
+<p>
+使用手动测试来确保您的实现正常运行。
+</p>
+<ol>
+  <li>进入分屏模式。</li>
+  <li>按<strong>主屏幕</strong>按钮。</li>
+  <li>观察可调整大小的启动器。</li>
+</ol>
+<p>
+确保启动器在其支持的所有设备屏幕方向上均可正确调整大小。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/display/textclassifier.html b/zh-cn/devices/tech/display/textclassifier.html
new file mode 100644
index 0000000..0a2e20e
--- /dev/null
+++ b/zh-cn/devices/tech/display/textclassifier.html
@@ -0,0 +1,123 @@
+<html devsite><head>
+    <title>实现 TEXTCLASSIFIER</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<h2 id="overview">概览</h2>
+
+<p>
+Android 8.1 引入了 TextClassfier API,该 API 可以使用机器学习技术来协助开发者对文本进行分类:</p>
+
+<pre class="prettyprint">TextClassificationManager tcm =
+    context.getSystemService(TextClassificationManager.class);
+TextClassifier classifier = tcm.getTextClassifier();
+TextSelection selection = classifier.suggestSelection(...);
+TextClassification classification = classifier.classifyText(...);
+</pre>
+<p>
+开发者可以选择设置自定义文本分类程序:</p>
+<p>
+ <code>tcm.setTextClassifier(customTextClassifier);</code>
+</p>
+<p>
+但是,如果应用开发者将文本分类程序设置为 null,则系统会针对 <code>getTextClassifier()</code> 返回系统默认文本分类程序。
+</p>
+<p>
+请参阅:<code>android.view.textclassifier.TextClassifierImpl</code>
+</p>
+<p>
+TextView 和 WebView 会使用 TextClassifier 来实现智能选择和智能文本分享功能:</p>
+
+<img src="/devices/tech/display/images/textclassifier.png"/>
+<p class="img-caption">
+  <b>图 1.</b> TEXTCLASSIFIER 的用法。
+</p>
+
+<h2 id="textclassifier-neural-net-models">TextClassifier 神经网络模型</h2>
+<p>
+Android 开源项目 (AOSP) 具有多个用于文本分类的神经网络模型。每个模型文件都已针对单一语言进行训练。您可以选择安装任何组合的模型。模型会在以下位置进行定义:</p>
+<p>
+<code>external/libtextclassifier/Android.mk</code>
+</p>
+
+<h2 id="pre-installing-language-models-on-devices">在设备上预安装语言模型</h2>
+<p>
+您可以指定一组语言模型并将其安装在设备上:</p>
+
+<pre class="prettyprint"># -----------------------
+# Smart Selection bundles
+# -----------------------
+
+include $(CLEAR_VARS)
+LOCAL_MODULE           := textclassifier.smartselection.bundle1
+LOCAL_REQUIRED_MODULES := textclassifier.smartselection.en.model
+LOCAL_REQUIRED_MODULES += textclassifier.smartselection.es.model
+LOCAL_REQUIRED_MODULES += textclassifier.smartselection.de.model
+LOCAL_REQUIRED_MODULES += textclassifier.smartselection.fr.model
+include $(BUILD_STATIC_LIBRARY)
+</pre>
+
+<p>
+例如,安装在 <code>device/google/marlin/device-common.mk</code> 中
+</p>
+
+<pre class="prettyprint"># TextClassifier smart selection model files
+PRODUCT_PACKAGES += \
+    textclassifier.smartselection.bundle1
+</pre>
+
+<h2 id="inspecting-installed-language-modules">检查已安装的语言模块</h2>
+<p>
+使用 ADB 命令列出目录下的文件:</p>
+
+<pre class="prettyprint">$ adb shell ls -l /etc/textclassifier
+-rw-r--r-- 1 root root ... textclassifier.smartselection.de.model
+-rw-r--r-- 1 root root ... textclassifier.smartselection.en.model
+-rw-r--r-- 1 root root ... textclassifier.smartselection.es.model
+-rw-r--r-- 1 root root ... textclassifier.smartselection.fr.model
+</pre>
+
+<h2 id="gservices-model-updates">模型更新</h2>
+
+<p>
+要更新模型,您可以将新模型作为系统映像的一部分来更新,也可以通过使用系统 <code>API ACTION_UPDATE_SMART_SELECTION</code> intent 触发更新的系统组件来进行动态更新。通过广播该系统 API intent,框架得以更新当前所设置语言的语言模型。模型自身包含支持的语言和版本号,因此会使用最新的合适模型。
+</p>
+
+<p>
+因此,您无需预加载所有语言的模型,因为这些模型可以稍后再添加。如果未找到指定语言的模型文件,则文本分类将返回空操作值。
+</p>
+
+<h2 id="compatibility-test-suite-tests">兼容性测试套件测试</h2>
+<p>
+您可以在以下位置找到相关的 Android 兼容性测试套件 (CTS) 测试:</p>
+<p>
+<code>cts/tests/tests/view/src/android/view/textclassifier/cts/TextClassificationManagerTest.java</code>
+</p>
+<p>
+<code>cts/tests/tests/widget/src/android/widget/cts/TextViewTest.java</code>
+</p>
+
+<ul>
+<li><code>testSmartSelection</code></li>
+<li><code>testSmartSelection_dragSelection</code></li>
+<li><code>testSmartSelection_resetSelection</code></li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/index.html b/zh-cn/devices/tech/index.html
index 3ff8a90..fa1ce83 100644
--- a/zh-cn/devices/tech/index.html
+++ b/zh-cn/devices/tech/index.html
@@ -27,7 +27,7 @@
 <p><a href="/devices/tech/dalvik/index.html">» ART 和 Dalvik 信息</a></p>
 
 <h2 id="config">配置</h2>
-<p>要充分利用 Android,需要调整<a href="/devices/tech/config/kernel.html">内核</a>、<a href="/devices/tech/config/renderer.html">OpenGLRenderer</a> 等其它配置。如需了解详情,请参阅本部分的子页面。
+<p>要充分利用 Android,需要调整<a href="/devices/tech/config/kernel.html">内核</a>、<a href="/devices/tech/config/renderer.html">OpenGLRenderer</a> 等其他配置。如需了解详情,请参阅本部分的子页面。
 </p><p><a href="/devices/tech/config/index.html">» 配置信息</a></p>
 
 <h2 id="connect">网络连接</h2>
@@ -50,21 +50,33 @@
 <p>本部分将介绍各种 Android 显示设置的 AOSP 实现,其中包括应用快捷方式、圆形启动器图标、勿扰 (DND)、多窗口模式(分屏、自由格式和画中画)、高动态范围 (HDR) 视频、夜间模式和零售演示模式。</p>
 <p><a href="/devices/tech/display/index.html">» 显示设置信息</a></p>
 
-<h2 id="HAL-technical-information">HAL 文件参考</h2>
-<p>Android 的硬件抽象层 (HAL) 在软件 API 和硬件驱动程序之间提供了接口。本部分包含了带注释的 HAL 代码文件。</p>
-<p><a href="/reference/hal/">» HAL 参考</a></p>
-
 <h2 id="ota-technical-information">OTA 更新</h2>
 <p>正常使用的 Android 设备可以接收和安装系统和应用软件的无线 (OTA) 更新。本部分介绍了更新包的结构以及构建更新包时所用的工具,旨在供开发者为新的和已发布的 Android 设备构建 OTA 更新。</p>
 <p><a href="/devices/tech/ota/index.html">» OTA 信息</a>
 </p>
 
+<h2 id="performance">性能</h2>
+<p>本部分提供了可用于确保您的 Android 设备最大限度减少资源使用并优化性能的指导,其中包括有关优化启动时间、管理闪存磨损、配置低 RAM 设备等的详细信息。</p>
+<p><a href="/devices/tech/perf/index.html">» 性能信息</a>
+</p>
+
 <h2 id="power-technical-information">电源</h2>
 <p>Android 框架通过跟踪不同设备组件在不同状态下花费的时间来提供电池使用情况统计信息。本部分介绍了电源管理功能(如低电耗模式),提供了有关如何准确测量设备和组件电量消耗(以及如何确定电量值)的说明,并详细介绍了 <code>batterystats</code> 命令和输出。</p>
 <p><a href="/devices/tech/power/index.html">» 电源信息</a></p>
 
+<h2 id="settings">设置</h2>
+<p>本部分提供了有关在 Android“设置”菜单中实现功能的指导,其中包括有关“设置”应用的模式、组件和架构、如何自定义个性化设置以及如何将设置添加到通用搜索的详细信息。</p>
+<p><a href="/devices/tech/settings/index.html">» 设置信息</a>
+</p>
+
 <h2 id="tradefed-test-infrastructure">Trade Federation 测试基础架构</h2>
 <p>Trade Federation 是一种连续的测试框架,用于在 Android 设备上运行测试。使用 Trade Federation 的模块化功能可以非常直接地在当前产品的环境中进行测试和基础架构的报告。</p>
-<p><a href="/devices/tech/test_infra/tradefed/index.html">» Trade Federation 测试基础架构概览</a></p>
+<p><a href="/devices/tech/test_infra/tradefed/index.html">
+» Trade Federation 测试基础架构概览</a></p>
+
+<h2 id="vts">供应商测试套件 (VTS)</h2>
+<p>Android 供应商测试套件 (VTS) 提供了大量用于 Android 测试的新功能,对由测试驱动的开发流程起到了促进作用。本部分介绍了有助于 Android 开发社区与测试数据互动的可用测试工具和资源。</p>
+<p><a href="/devices/tech/vts/index.html">» VTS 信息</a>
+</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/ab_implement.html b/zh-cn/devices/tech/ota/ab_implement.html
index 2c884a1..55c5789 100644
--- a/zh-cn/devices/tech/ota/ab_implement.html
+++ b/zh-cn/devices/tech/ota/ab_implement.html
@@ -23,7 +23,7 @@
 <p>想要实现 A/B 系统更新的原始设备制造商 (OEM) 和 SoC 供应商必须确保其引导加载程序实现 boot_control HAL,并将<a href="#kernel">正确的参数</a>传递到内核。</p>
 
 <h2 id="bootcontrol">实现启动控件 HAL</h2>
-<p>支持 A/B 的引导加载程序必须在 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/boot_control.h" class="external">hardware/libhardware/include/hardware/boot_control.h</a></code> 实现 <code>boot_control</code> HAL。您可以使用 <code><a href="https://android.googlesource.com/platform/system/extras/+/master/bootctl/" class="external">system/extras/bootctl</a></code> 实用工具和 <code><a href="https://android.googlesource.com/platform/system/extras/+/refs/heads/master/tests/bootloader/" class="external">system/extras/tests/bootloader/</a></code> 来测试实现。
+<p>支持 A/B 更新的引导加载程序必须在 <code>boot_control</code> 实现 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/boot_control.h" class="external">hardware/libhardware/include/hardware/boot_control.h</a></code> HAL。您可以使用 <code><a href="https://android.googlesource.com/platform/system/extras/+/master/bootctl/" class="external">system/extras/bootctl</a></code> 实用工具和 <code><a href="https://android.googlesource.com/platform/system/extras/+/refs/heads/master/tests/bootloader/" class="external">system/extras/tests/bootloader/</a></code> 来测试实现。
 </p>
 
 <p>您还必须实现状态机,如下所示:</p>
@@ -35,8 +35,8 @@
 <ol>
 <li>择优挑选下列内核补丁程序系列(如果需要):
  <ul>
- <li>如果在没有使用 ramdisk 的情况下启动并使用“以恢复方式启动”,请择优挑选 <a href="https://android-review.googlesource.com/#/c/158491/" class="external">android-review.googlesource.com/#/c/158491/</a>。</li>
- <li>要在没有使用 ramdisk 的情况下设置 dm-verity,请择优挑选 <a href="https://android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18" class="external">android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18</a>。</li>
+ <li>如果在没有使用 ramdisk 的情况下启动并使用“以恢复方式启动”,请访问 <a href="https://android-review.googlesource.com/#/c/158491/" class="external">android-review.googlesource.com/#/c/158491/</a> 根据需要进行选择。</li>
+ <li>要在没有使用 ramdisk 的情况下设置 dm-verity,请访问 <a href="https://android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18" class="external">android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18</a> 根据需要进行选择。</li>
  </ul>
 </li>
 <li>确保内核命令行参数包含中以下额外参数:
@@ -49,7 +49,7 @@
  <pre class="devsite-terminal devsite-click-to-copy">
 openssl x509 -in &lt;x509-pem-certificate&gt; -outform der -out &lt;x509-der-certificate&gt;</pre>
  </li>
- <li>构建 <code>zImage</code> 以将该证书添加为系统密钥环的一部分。要验证,请检查 <code>procfs</code> 条目(需要启用 <code>KEYS_CONFIG_DEBUG_PROC_KEYS</code>):
+ <li>构建 <code>zImage</code> 以将该证书添加为系统密钥环的一部分。要进行验证,请检查 <code>procfs</code> 条目(需要启用 <code>KEYS_CONFIG_DEBUG_PROC_KEYS</code>):
 <pre class="devsite-click-to-copy">
 angler:/# cat /proc/keys
 
@@ -57,19 +57,19 @@
 Android: 7e4333f9bba00adfe0ede979e28ed1920492b40f: X509.RSA 0492b40f []
 2d454e3e I------     1 perm 1f030000     0     0 keyring
 .system_keyring: 1/4</pre>
-如果 .X509 证书添加成功,则表示系统密钥环中存在相应公钥(突出显示部分表示公钥 ID)。</li>
+如果 .X509 证书添加成功,则表示系统密钥环中存在相应公钥(突出显示的部分为公钥 ID)。</li>
  <li>将空格替换为 <code>#</code>,并将其作为 <code>&lt;public-key-id&gt;</code> 在内核命令行中传递。例如,传递 <code>Android:#7e4333f9bba00adfe0ede979e28ed1920492b40f</code> 而非 <code>&lt;public-key-id&gt;</code>。</li>
  </ol>
 </li>
 </ol>
 
-<h2 id="build-variables">设置构建变量</h2>
+<h2 id="build-variables">设置编译变量</h2>
 
-<p>支持 A/B 的引导加载程序必须满足以下构建变量条件:</p>
+<p>支持 A/B 更新的引导加载程序必须满足以下编译变量条件:</p>
 
 <table>
 <tbody><tr>
-<th>必须针对 A/B 目标定义的变量</th>
+<th>必须针对 A/B 更新目标定义的变量</th>
 <td>
 <ul>
 <li><code>AB_OTA_UPDATER := true</code></li>
@@ -112,18 +112,18 @@
 
 <h3 id="cache">缓存</h3>
 
-<p>对于非 A/B 更新,缓存分区用于存储下载的 OTA 软件包,并在应用更新时暂时隐藏块。调整缓存分区大小从来没有好办法:其缓存所需的大小取决于您想要应用的更新。最糟糕的情况是缓存分区与系统映像一样大。如果使用 A/B 更新,则无需隐藏块(因为您始终在写入当前未使用的分区);如果流式传输 A/B,则无需在应用之前下载整个 OTA 软件包。</p>
+<p>对于非 A/B 更新,缓存分区用于存储下载的 OTA 软件包,并在应用更新时暂时隐藏块。调整缓存分区大小从来没有好办法:所需的大小取决于您想要应用的更新。最糟糕的情况是缓存分区与系统映像一样大。如果使用 A/B 更新,则无需隐藏块(因为您始终在向当前未使用的分区写入数据);如果流式传输 A/B 更新,则无需在应用之前下载整个 OTA 软件包。</p>
 
 <h3 id="recovery">恢复</h3>
 
 <p>恢复 RAM 磁盘现已包含在 <code>boot.img</code> 文件中。
 进入恢复模式时,引导加载程序<strong>无法</strong>在内核命令行中添加 <code>skip_initramfs</code> 选项。</p>
 
-<p>对于非 A/B更新,恢复分区包含用于应用更新的代码。A/B 更新由在正常启动的系统映像中运行的 <code>update_engine</code> 应用。仍有一种用于实现恢复出厂设置和旁加载更新软件包的恢复模式(“恢复”就由此而来)。恢复模式的代码和数据存储在 ramdisk 的常规启动分区中;为启动进入系统映像,引导加载程序会指示内核跳过 ramdisk(否则,设备会启动进入恢复模式)。恢复模式很小(其中大部分已在启动分区上),所以启动分区的大小不会增加。</p>
+<p>对于非 A/B 更新,恢复分区包含用于应用更新的代码。A/B 更新由在正常启动的系统映像中运行的 <code>update_engine</code> 应用。同时,仍有一种用于实现恢复出厂设置和旁加载更新软件包的恢复模式(“恢复”就由此而来)。恢复模式的代码和数据存储在 ramdisk 的常规启动分区中;为启动进入系统映像,引导加载程序会指示内核跳过 ramdisk(否则,设备会启动进入恢复模式)。恢复模式很小(其中大部分已在启动分区上),所以启动分区的大小不会增加。</p>
 
 <h3 id="fstab">Fstab</h3>
 
-<p><code>slotselect</code> 参数<strong>必须</strong>位于 A/B 化分区对应的行中。例如:</p>
+<p><code>slotselect</code> 参数<strong>必须</strong>位于进行 A/B 更新的分区对应的行中。例如:</p>
 
 <pre class="devsite-click-to-copy">
 &lt;path-to-block-device&gt;/vendor  /vendor  ext4  ro
@@ -152,7 +152,7 @@
 <li><code>slot-count</code>。返回一个表示可用插槽数量的整数。目前支持两个插槽,因此该值为 <code>2</code>。</li>
 <li><code>slot-successful:&lt;slot-suffix&gt;</code>。如果指定插槽已标记为成功启动,则返回“yes”,否则返回“no”。</li>
 <li><code>slot-unbootable:&lt;slot-suffix&gt;</code>。如果指定插槽已标记为不可引导,则返回“yes”,否则返回“no”。</li>
-<li><code>slot-retry-count<slot suffix></slot></code>。可以尝试启动指定插槽的剩余重试次数。</li>
+<li><code>slot-retry-count<slot suffix></slot></code>。启动指定插槽的剩余重试次数。</li>
 </ul>
 
 <p>要查看所有变量,请运行 <code class="devsite-terminal devsite-click-to-copy">fastboot getvar all</code>。
@@ -160,17 +160,17 @@
 
 <h2 id="ota-package-generation">生成 OTA 软件包</h2>
 
-<p><a href="/devices/tech/ota/tools.html">OTA 软件包工具</a>遵循用于非 A/B 设备的相同命令。<code>target_files.zip</code> 文件必须通过为 A/B 目标定义构建变量生成。OTA 软件包工具会自动识别并生成格式适用于 A/B 更新程序的软件包。</p>
+<p><a href="/devices/tech/ota/tools.html">OTA 软件包工具</a>遵循的命令与不采取 A/B 更新的设备相同。<code>target_files.zip</code> 文件必须通过为 A/B 更新目标定义编译变量生成。OTA 软件包工具会自动识别并生成格式适用于 A/B 更新程序的软件包。</p>
 
 <p>例如:</p>
 <ul>
-<li>要生成完整 OTA:
+<li>生成完整 OTA:
 <pre class="devsite-terminal devsite-click-to-copy">
 ./build/tools/releasetools/ota_from_target_files \
   dist_output/tardis-target_files.zip ota_update.zip
 </pre>
 </li>
-<li>要生成增量 OTA:<pre class="devsite-terminal devsite-click-to-copy">
+<li>生成增量 OTA:<pre class="devsite-terminal devsite-click-to-copy">
 ./build/tools/releasetools/ota_from_target_files \
   -i PREVIOUS-tardis-target_files.zip \
   dist_output/tardis-target_files.zip incremental_ota_update.zip
@@ -195,10 +195,10 @@
 
 <h2 id="post-install">配置安装后步骤</h2>
 
-<p>对于每个已更新的分区,您可以使用一组键值对配置不同的安装后步骤。要在新映像中运行位于 <code>/system/usr/bin/postinst</code> 的程序,请相对于系统分区中的文件系统的根目录来指定路径。</p>
+<p>对于每个已更新的分区,您可以使用一组键值对配置不同的安装后步骤。要在新映像中运行位于 <code>/system/usr/bin/postinst</code> 的程序,请指定相对于系统分区中文件系统的根目录的路径。</p>
 
 <p>例如,<code>usr/bin/postinst</code> 的对应路径为 <code>system/usr/bin/postinst</code>(如果未使用 RAM 磁盘)。此外,请指定要传递到 <code>mount(2)</code> 系统调用的文件系统类型。
-将以下内容添加到产品或设备的 <code>.mk</code> 文件(如果适用):</p>
+请将以下代码添加到产品或设备的 <code>.mk</code> 文件中(如果适用):</p>
 
 <pre class="devsite-click-to-copy">
 AB_OTA_POSTINSTALL_CONFIG += \
@@ -219,7 +219,7 @@
   # A/B OTA dexopt package
   PRODUCT_PACKAGES += otapreopt_script
 </pre></li>
-<li>将编译脚本与 <code>update_engine</code> 相关联,以便它可以作为安装后步骤运行。
+<li>将编译脚本与 <code>update_engine</code> 相关联,以便后者可以作为安装后步骤运行。
 <pre class="devsite-click-to-copy">
   # A/B OTA dexopt update_engine hookup
   AB_OTA_POSTINSTALL_CONFIG += \
diff --git a/zh-cn/devices/tech/ota/device_code.html b/zh-cn/devices/tech/ota/device_code.html
index 575b157..bd49223 100644
--- a/zh-cn/devices/tech/ota/device_code.html
+++ b/zh-cn/devices/tech/ota/device_code.html
@@ -230,7 +230,8 @@
 <p>由于 <code>HandleMenuKey()</code> 隐含在可见参数中,因此,即使菜单不可见,也会进行调用。与 <code>CheckKey()</code> 不同的是,当恢复系统执行清除数据或安装软件包等操作时,系统不会调用该函数,只有恢复系统处于闲置状态或等待输入时才会调用该函数。<i></i></p>
 
 <h4 id="trackball-mechanism">轨迹球机制</h4>
-<p>如果您的设备采用类似于轨迹球的输入机制(生成类型为 EV_REL、代码为 REL_Y 的输入事件),那么,只要类似于轨迹球的输入设备报告 Y 轴的动作,恢复系统就会合成 KEY_UP 和 KEY_DOWN 按键。您只需将 KEY_UP 和 KEY_DOWN 事件映射到相应的菜单操作即可。无法针对 <code>CheckKey()</code> 实现此映射,因此,您无法将轨迹球动作用作重新启动或切换显示状态的触发器。<i></i></p>
+<p>如果您的设备采用类似于轨迹球的输入机制(生成类型为 EV_REL、代码为 REL_Y 的输入事件),那么,只要类似于轨迹球的输入设备报告 Y 轴的动作,恢复系统就会合成 KEY_UP 和 KEY_DOWN 按键。您只需将 KEY_UP 和 KEY_DOWN 事件映射到相应的菜单操作即可。
+无法针对 <code>CheckKey()</code> 实现此映射,因此,您无法将轨迹球动作用作重新启动或切换显示状态的触发器。<i></i></p>
 
 <h4 id="modifier-keys">辅助键</h4>
 <p>要查看作为辅助键按下的键,请调用您自己的界面对象的 <code>IsKeyPressed()
@@ -515,7 +516,8 @@
     }
 </pre>
 
-<p><code>ReadValueArgs()</code> 不执行类型检查,因此您必须在这里执行这项检查;使用 <b>if</b> 语句执行这项检查会更方便,不过,这样做也有一个弊端,那就是操作失败时所显示的错误消息会不够具体。不过,如果有任何评估失败,<code>ReadValueArgs()</code> 会处理每个参数的评估操作,并释放之前评估的所有参数(以及设置有用的错误消息)。您可以使用 <code>
+<p><code>ReadValueArgs()</code> 不执行类型检查,因此您必须在这里执行这项检查;使用 <b>if</b> 语句执行这项检查会更方便,不过,这样做也有一个弊端,那就是操作失败时所显示的错误消息会不够具体。
+不过,如果有任何评估失败,<code>ReadValueArgs()</code> 会处理每个参数的评估操作,并释放之前评估的所有参数(以及设置有用的错误消息)。您可以使用 <code>
 ReadValueVarArgs()</code> 便捷函数来评估数量不定的参数(它会返回 <code>Value*</code> 的数组)。</p>
 
 <p>对参数进行评估后,执行以下函数:</p>
@@ -554,7 +556,7 @@
 }
 </pre>
 
-<p>要将函数挂接到 edify 解释程序中,请提供函数 <code>Register_<i>foo</i></code>(其中 <i>foo</i> 是包含此代码的静态库的名称)。调用 <code>RegisterFunction()</code> 即可注册各个扩展函数。按照惯例,您需要对设备专属函数 <code><i>device</i>.<i>whatever</i></code> 进行命名,以免与将来添加的内置函数发生冲突。</p>
+<p>要将函数挂接到 edify 解释器中,请提供函数 <code>Register_<i>foo</i></code>(其中 <i></i>foo 是包含此代码的静态库的名称)。调用 <code>RegisterFunction()</code> 即可注册各个扩展函数。按照惯例,您需要对设备专属函数 <code><i>device</i>.<i>whatever</i></code> 进行命名,以免与将来添加的内置函数发生冲突。</p>
 
 <pre class="prettyprint">
 void Register_librecovery_updater_tardis() {
@@ -574,14 +576,14 @@
 LOCAL_C_INCLUDES += bootable/recovery
 </pre>
 
-<p>静态库的名称必须与其中所包含的 <code>Register_<i>libname</i></code> 函数的名称匹配。</p>
+<p>静态库的名称必须与其中包含的 <code>Register_<i>libname</i></code> 函数的名称相匹配。</p>
 
 <pre class="devsite-click-to-copy">
 LOCAL_MODULE := librecovery_updater_tardis
 include $(BUILD_STATIC_LIBRARY)
 </pre>
 
-<p>最后,配置 recovery 的版本号以拉入您的库。将您的库添加到 TARGET_RECOVERY_UPDATER_LIBS(它可能包含多个库;所有库均已注册)。如果您的代码依赖于本身不是 edify 扩展程序的其他静态库(即,它们没有 <code>Register_<i>libname</i></code> 函数),您可以将其列于 TARGET_RECOVERY_UPDATER_EXTRA_LIBS 中,以将其链接到更新程序,而无需调用其(不存在)的注册函数。例如,如果您的设备专属代码需要使用 zlib 解压缩数据,您可以在此处包含 libz。</p>
+<p>最后,配置 recovery 的版本号以拉入您的库。将您的库添加到 TARGET_RECOVERY_UPDATER_LIBS(它可能包含多个库;所有库均已注册)。如果您的代码依赖于本身不是 edify 扩展程序的其他静态库(即,它们没有 <code>Register_<i>libname</i></code> 函数),您可以将其列于 TARGET_RECOVERY_UPDATER_EXTRA_LIBS 中,以将其链接到更新程序,而无需调用其(不存在的)注册函数。例如,如果您的设备专属代码需要使用 zlib 解压缩数据,您可以在此处包含 libz。</p>
 
 <pre class="devsite-click-to-copy">
 device/yoyodyne/tardis/BoardConfig.mk
@@ -695,7 +697,7 @@
 </p>
 <ul>
 <li><b>info.input_zip</b>:(仅限完整 OTA)输入 target-files .zip 的 <code>zipfile.ZipFile</code> 对象。</li>
-<li><b>info.source_zip</b>:(仅限增量 OTA)源 target-files .zip <code>zipfile.ZipFile
+<li><b>info.source_zip</b>:(仅限增量 OTA)源 target-files .zip 的 <code>zipfile.ZipFile
 </code> 对象(安装增量包时版本号已在设备上)。</li>
 <li><b>info.target_zip</b>:(仅限增量 OTA)目标 target-files .zip 的 <code>zipfile.ZipFile
 </code> 对象(增量包置于设备上的版本号)。</li>
@@ -752,7 +754,7 @@
 </code> 通常不可用于恢复系统,因为它可能会被加密。恢复界面会显示 <code>/sdcard</code> 中的 .zip 文件菜单,以便用户进行选择。</li>
 <li><b>APPLY_CACHE</b>:类似于从 <code>/sdcard</code> 加载更新包,不过使用的是 <code>/cache</code> 目录(一律可用于恢复系统)。<i></i>在常规系统中,<code>/cache
 </code> 只能由特权用户写入;如果设备不可启动,则完全无法写入 <code>/cache</code> 目录(这样一来,该机制的效用就会有所限制)。</li>
-<li><b>APPLY_ADB_SIDELOAD</b>:允许用户通过 USB 数据线和 adb 开发工具将软件包发送到设备。调用此机制时,恢复系统将启动自身的迷你版 adbd 守护程序,以便已连接的主机上的 adb 与其进行对话。该迷你版守护程序仅支持一个命令:<code>adb sideload <i>filename</i></code>。已命名的文件会从主机发送到设备,然后对其进行验证和安装(如同文件在本地存储区中一样)。</li>
+<li><b>APPLY_ADB_SIDELOAD</b>:允许用户通过 USB 数据线和 adb 开发工具将软件包发送到设备。调用此机制时,恢复系统将启动自身的迷你版 adbd 守护进程,以便已连接的主机上的 adb 与其进行对话。该迷你版守护进程仅支持一个命令:<code>adb sideload <i>filename</i></code>。已命名的文件会从主机发送到设备,然后对其进行验证和安装(如同文件在本地存储区中一样)。</li>
 </ul>
 
 <p>一些注意事项:</p>
diff --git a/zh-cn/devices/tech/ota/inside_packages.html b/zh-cn/devices/tech/ota/inside_packages.html
index c91b7af..51103f8 100644
--- a/zh-cn/devices/tech/ota/inside_packages.html
+++ b/zh-cn/devices/tech/ota/inside_packages.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>OTA 软件包内部探秘</title>
+    <title>OTA 软件包内部</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
@@ -73,14 +73,16 @@
 <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>
 <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>),并返回给定 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>重新格式化给定的分区。支持的分区类型如下:
diff --git a/zh-cn/devices/tech/ota/nonab_updates.html b/zh-cn/devices/tech/ota/nonab_updates.html
index 5e773aa..a5bbbbc 100644
--- a/zh-cn/devices/tech/ota/nonab_updates.html
+++ b/zh-cn/devices/tech/ota/nonab_updates.html
@@ -45,7 +45,7 @@
 
       <dt>缓存</dt>
       <dd>
-        几个应用使用的临时保留区域(访问此分区需要使用特殊的应用权限),用于存储下载的 OTA 更新包。其他程序也可使用该空间,但是此类文件可能会随时消失。安装某些 OTA 更新包可能会导致此分区被完全擦除。
+        几个应用使用的临时保留区域(访问此分区需要使用特殊的应用权限),用于存储下载的 OTA 更新包。其他程序也可使用该空间,但是此类文件可能会随时消失。安装某些 OTA 更新包可能会导致此分区被完全擦除。缓存还包含 OTA 更新的更新日志。
       </dd>
 
       <dt>恢复</dt>
@@ -94,7 +94,7 @@
         </li>
       </ol>
 
-      <p>系统更新完成!</p>
+      <p>系统更新完成!更新日志可以在 <code>/cache/recovery/last_log.<var>#</var></code> 中找到。</p>
 
     <h2 id="migrating">从更早版本迁移</h2>
 
diff --git a/zh-cn/devices/tech/ota/reduce_size.html b/zh-cn/devices/tech/ota/reduce_size.html
index 7d1d453..d2e35db 100644
--- a/zh-cn/devices/tech/ota/reduce_size.html
+++ b/zh-cn/devices/tech/ota/reduce_size.html
@@ -20,119 +20,128 @@
       limitations under the License.
   -->
 
-<p>本页介绍了为减少不同构建之间的不必要文件变更,而添加到 AOSP 的构建变更。维护自己的构建系统的设备实现人员,可依照此信息减小无线 (OTA) 更新的大小。</p>
+<p>本页介绍了为减少不同编译之间不必要的文件变更而添加到 AOSP 的编译变更。负责自行维护编译系统的设备实现人员可根据这项信息减小无线下载 (OTA) 更新的大小。
+</p>
 
-<p>有时 Android OTA 包含的变更文件并非对应于代码变更,而是对应于构建系统的软件工件。在不同时间、不同目录或不同机器上构建相同代码时,会产生大量变更文件,这时便会发生上述情况。这些多余的文件不仅会增加 OTA 的大小,而且会导致难以确定 OTA 中发生变更的代码。</p>
+<p>有时,Android OTA 包含的变更文件并非对应于代码变更,而是对应于编译系统的软件工件。在不同时间、不同目录或不同机器上编译相同的代码时会产生大量变更文件,这时便会发生上述情况。这些多余的文件不仅会增加 OTA 的大小,还会导致难以确定 OTA 中发生变更的代码。</p>
 
-<p>为了使 OTA 的内容更加透明,AOSP 加入了构建系统变更,旨在通过消除不同构建之间不必要的文件变更来减小 OTA 的大小。这样做是为了减小 OTA 的大小,使其只包括与 OTA 中包含的补丁程序相关的文件。AOSP 还会加入<a href="#the_build_diff_tool">构建 diff 工具</a>,以过滤出常见的构建相关文件变更并提供更加清晰的构建文件 diff。</p>
+<p>为了使 OTA 的内容更加透明,AOSP 纳入了编译系统变更,目的是通过消除不同编译之间不必要的文件变更来减小 OTA 的大小。这样做是为了减小 OTA 的大小,使其只包含与 OTA 中所含补丁程序相关的文件。AOSP 还会加入<a href="#the_build_diff_tool">编译 diff 工具</a>(可过滤出常见的编译相关文件变更,并提供更清晰的编译文件 diff)以及<a href="#block-mapping-tool">块映射工具</a>(协助您确保块分配的一致性)。</p>
 
-<p>构建系统可能会通过多种方式创建不必要的文件 diff。下文讨论了其中一些问题和解决方案,并尽可能提供了 AOSP 中的修复示例。</p>
+<p>编译系统可能会通过多种方式创建不必要的文件 diff。下文讨论了其中一些问题和解决方案,并尽可能提供了 AOSP 中的修复示例。</p>
 
 <h2 id="file_order">文件顺序</h2>
 
-<p><strong>问题</strong>:文件系统在请求目录中的文件列表时,并不保证文件顺序,尽管对于同一查询,文件顺序通常是相同的。诸如 <code>ls</code> 之类的工具在默认情况下会对结果进行排序,但 <code>find</code> 和 <code>make</code> 之类的命令使用的通配符函数却不会对结果进行排序。用户在使用此类工具之前,必须对输出进行排序。</p>
+<p><strong>问题</strong>:文件系统在请求目录中的文件列表时,并不保证文件顺序,尽管对于同一项查询,文件顺序通常是相同的。<code>ls</code> 等工具在默认情况下会对结果进行排序,但 <code>find</code> 和 <code>make</code> 等命令使用的通配符函数却不会对结果进行排序。用户在使用这类工具之前,务必要对输出进行排序。
+</p>
 
-<p><strong>解决方案</strong>:用户在使用带有通配符的 <code>find</code> 和 <code>make</code> 之类的工具之前,必须对这些命令的输出进行排序。要在 Android.mk 文件中使用 <code>$(wildcard )</code> 或 <code>$(shell find )</code>,也应该进行排序。有些工具(例如 Java)确实会对输入进行排序,因此有必要对排序进行验证。</p>
+<p><strong>解决方案</strong>:用户在使用带通配符的 <code>find</code> 和 <code>make</code> 等工具之前,务必要对这些命令的输出进行排序。要在 <code>Android.mk</code> 文件中使用 <code>$(wildcard)</code> 或 <code>$(shell find)</code>,也应该进行排序。有些工具(如 Java)确实会对输入进行排序,因此有必要先对排序进行验证。</p>
 
-<p><strong>示例</strong>:很多实例使用内建的 <code>all-*-files-under</code> 宏固定在核心构建系统中,其中包括 <code>all-cpp-files-under</code>(一些定义分散在其他 makefile 中)。有关详情,请参阅以下 CL:</p>
+<p><strong>示例</strong>:很多实例使用内建的 <code>all-*-files-under</code> 宏固定在核心编译系统中,其中包括 <code>all-cpp-files-under</code>(一些定义分散在其他 makefile 中)。有关详情,请参阅以下 CL:</p>
 
 <ul>
-  <li><a href="https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f">https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f</a>
-  </li><li><a href="https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410">https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410</a>
-  </li><li><a href="https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653">https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653</a>
-  </li><li><a href="https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c">https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c</a>
+  <li><a href="https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f" class="external">https://android.googlesource.com/platform/build/+/4d66adfd0e6d599d8502007e4ea9aaf82e95569f</a>
+  </li><li><a href="https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410" class="external">https://android.googlesource.com/platform/build/+/379f9f9cec4fe1c66b6d60a6c19fecb81b9eb410</a>
+  </li><li><a href="https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653" class="external">https://android.googlesource.com/platform/build/+/7c3e3f8314eec2c053012dd97d2ae649ebeb5653</a>
+  </li><li><a href="https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c" class="external">https://android.googlesource.com/platform/build/+/5c64b4e81c1331cab56d8a8c201f26bb263b630c</a>
 </li></ul>
 
-<h2 id="build_directory">构建目录</h2>
+<h2 id="build_directory">编译目录</h2>
 
-<p><strong>问题</strong>:变更构建内容所在的目录会导致二进制文件有所变化。Android 构建中的大多数路径是相对路径,因此 C/C ++ 中的 <code>__FILE__</code> 不是问题。不过,默认情况下调试符号会对完整的路径名进行编码,而对预剥离二进制文件进行哈希处理会生成 <code>.note.gnu.build-id</code>,因此调试符号变更会使二进制文件发生变化。</p>
+<p><strong>问题</strong>:变更编译内容所在的目录会导致二进制文件有所不同。Android 编译中的大多数路径都是相对路径,因此 C/C++ 中的 <code>__FILE__</code> 不是问题。不过,默认情况下调试符号会对完整的路径名进行编码,而对预剥离二进制文件进行哈希处理会生成 <code>.note.gnu.build-id</code>,因此调试符号发生变更会致使二进制文件发生变化。</p>
 
-<p><strong>解决方案</strong>:AOSP 现在会使调试路径变成相对路径。有关详情,请参阅 CL:
-<a href="https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02">https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02</a>。</p>
+<p><strong>解决方案</strong>:AOSP 现在会使调试路径变成相对路径。有关详情,请参阅 CL:<a href="https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02" class="external">https://android.googlesource.com/platform/build/+/6a66a887baadc9eb3d0d60e26f748b8453e27a02</a>。
+</p>
 
 <h2 id="timestamps">时间戳</h2>
 
-<p><strong>问题</strong>:构建输出中的时间戳会导致不必要的文件变更。这可能发生在以下位置:</p>
+<p><strong>问题</strong>:编译输出中的时间戳会导致不必要的文件变更。这可能发生在以下位置:</p>
 
 <ul>
-  <li>C 或 C++ 代码中的<code> __DATE__/__TIME__/__TIMESTAMP__ </code>宏。</li>
+  <li>C 或 C++ 代码中的 <code>__DATE__/__TIME__/__TIMESTAMP__</code> 宏。</li>
   <li>基于 ZIP 的归档中嵌入的时间戳。</li>
 </ul>
 
-<p><strong>解决方案/示例</strong>:要从构建输出中移除时间戳,请遵循下文中的说明操作。</p>
+<p><strong>解决方案/示例</strong>:要从编译输出中移除时间戳,请遵循下文中的说明操作。</p>
 
 <h3 id="date_time_timestamp_in_c_c">C/C++ 中的 __DATE__/__TIME__/__TIMESTAMP__</h3>
 
-<p>这些宏总是会为不同的构建生成不同的输出,因此不应使用。
-  您可选择以下方法来消除这些宏:</p>
+<p>这些宏总是为不同的编译生成不同的输出,因此不建议使用。您可以选择通过以下方法来移除这些宏:</p>
 
 <ul>
-  <li>直接移除,这些宏通常并非必需。要查看示例,请参阅:
-<a href="https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f">https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f</a></li>
+  <li>直接将其移除(这些宏通常不是必需的)。要查看示例,请参阅:<a href="https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f" class="external">https://android.googlesource.com/platform/system/core/+/30622bbb209db187f6851e4cf0cdaa147c2fca9f</a>。</li>
   <li>要对运行中的二进制文件进行唯一标识,请从 ELF 标头中读取 build-id。</li>
-  <li>要了解操作系统的构建时间,请读取 <code>ro.build.date</code>(应该适合除增量构建之外的所有项目,增量构建可能不会更新此日期)。要查看示例,请参阅:
-<a href="https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84">https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84</a></li>
+  <li>要了解操作系统的编译时间,请读取 <code>ro.build.date</code>(应该会对除增量编译之外的所有内容都适用;增量编译可能不会更新此日期)。要查看示例,请参阅:<a href="https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84" class="external">https://android.googlesource.com/platform/external/libchrome/+/8b7977eccc94f6b3a3896cd13b4aeacbfa1e0f84</a>。</li>
 </ul>
 
-    <p class="note"><strong>注意</strong>:我们开启了 <code>-Werror=date-time</code>,因此使用时间戳是一种构建错误。</p>
+<aside class="note"><strong>注意</strong>:Android 7.0 开启了 <code>-Werror=date-time</code>,因此使用时间戳是一种编译错误。</aside>
 
-<h3 id="embedded_timestamps_in_zip-based_archives_zip_jar">归档(zip、jar)中的嵌入时间戳</h3>
+<h3 id="embedded_timestamps_in_zip-based_archives_zip_jar">归档文件(zip、jar)中的嵌入时间戳</h3>
 
-<p>我们通过将 <code>-X</code> 添加到 <code>zip</code> 命令的所有用例中,解决了嵌入时间戳的问题,因此构建工具的 UID/GID 和扩展的 Unix 时间戳不会嵌入到 ZIP 文件中。</p>
+<p>Android 7.0 通过将 <code>-X</code> 添加到 <code>zip</code> 命令的所有用例中,解决了 zip 归档文件中嵌入时间戳的问题,因此编译工具的 UID/GID 和扩展的 Unix 时间戳不会嵌入到 ZIP 文件中。</p>
 
-<p>新工具 <code>ziptime</code>(位于 <code>
-  <a href="https://android.googlesource.com/platform/build/+/master/tools/ziptime/">/platform/build/+/master/tools/ziptime/</a></code>)会重置 zip 标头中的正常时间戳。有关详情,请参阅 <a href="https://android.googlesource.com/platform/build/+/master/tools/ziptime/README.txt">README 文件</a>。</p>
+<p>新工具 <code>ziptime</code>(位于 <code><a href="https://android.googlesource.com/platform/build/+/master/tools/ziptime/" class="external">/platform/build/+/master/tools/ziptime/</a></code> 下)会重置 zip 标头中的正常时间戳。有关详情,请参阅 <a href="https://android.googlesource.com/platform/build/+/master/tools/ziptime/README.txt" class="external">README 文件</a>。</p>
 
-<p><code>signapk</code> 工具为 APK 文件设置的时间戳可能因服务器所在的时区而异。有关详情,请参阅 CL:
-<a href="https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028">https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028</a>。</p>
+<p><code>signapk</code> 工具为 APK 文件设置的时间戳可能会因服务器所在的时区而异。有关详情,请参阅 CL:<a href="https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028" class="external">https://android.googlesource.com/platform/build/+/6c41036bcf35fe39162b50d27533f0f3bfab3028</a>。
+</p>
 
 <h2 id="version_strings">版本字符串</h2>
 
-<p><strong>问题</strong>:APK 版本字符串通常包含附加到硬编码版本的 BUILD_NUMBER。即使 APK 中并未发生任何其他变更,APK 仍然会有所不同。</p>
+<p><strong>问题</strong>:APK 版本字符串通常包含附加到硬编码版本的 <code>BUILD_NUMBER</code>。即使 APK 中并未发生任何其他变更,APK 也仍然会有所不同。</p>
 
 <p><strong>解决方案</strong>:从 APK 版本字符串中移除版本号。</p>
 
 <p><strong>示例:</strong></p>
 
 <ul>
-  <li><a href="https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27">https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27</a></li>
-  <li><a href="https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c">https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c</a></li>
+  <li><a href="https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27" class="external">https://android.googlesource.com/platform/packages/apps/Camera2/+/5e0f4cf699a4c7c95e2c38ae3babe6f20c258d27</a></li>
+  <li><a href="https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c" class="external">https://android.googlesource.com/platform/build/+/d75d893da8f97a5c7781142aaa7a16cf1dbb669c</a></li>
 </ul>
 
-<h2 id="consistent_build_tools">一致的构建工具</h2>
+<h2 id="consistent_build_tools">一致的编译工具</h2>
 
-<p><strong>问题</strong>:生成安装文件的工具必须一致(相同的输入应始终产生相同的输出)。</p>
+<p><strong>问题</strong>:生成安装文件的工具必须一致(相同的输入应始终生成相同的输出)。</p>
 
-<p><strong>解决方案/示例</strong>:以下构建工具需要进行变更:</p>
+<p><strong>解决方案/示例</strong>:以下编译工具需要进行变更:</p>
 
 <ul>
-  <li><strong>NOTICE 文件创建工具</strong>。NOTICE 文件创建工具需要变更。请参阅 CL:
-<a href="https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64">https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64</a></li>
-  <li><strong>Java Android 编译器套件 (Jack)</strong>。Jack 工具链需要更新,才能处理生成的构造函数排序的偶然性变更。请参阅 CL:
-<a href="https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b">https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b</a></li>
-  <li><strong>ART AOT 编译器 (dex2oat)</strong>。ART 编译器二进制文件需要更新才能创建确定性图像。请参阅 CL:
-<a href="https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9">https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9</a></li>
-  <li><strong>libpac.so 文件 (V8)</strong>。每个构建会创建不同的 <code>/system/lib/libpac.so</code> 文件,因为 V8 快照会针对每个构建发生变化。解决方案是移除快照。请参阅 CL:
-<a href="https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29">https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29</a></li>
-  <li><strong>预先经过 dexopt 处理 (.odex) 的应用文件</strong>。预先经过 dexopt 处理 (.odex) 的文件包含 64 位系统上的未初始化填充。请参阅 CL:
-<a href="https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029">https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029</a></li>
+  <li><strong>NOTICE 文件创建工具</strong>。NOTICE 文件创建工具需要变更。请参阅 CL:<a href="https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64" class="external">https://android.googlesource.com/platform/build/+/8ae4984c2c8009e7a08e2a76b1762c2837ad4f64</a>。
+  </li>
+  <li><strong>Java Android 编译器套件 (Jack)</strong>。Jack 工具链需要更新才能处理生成的构造函数排序的偶然性变更。请参阅 CL:<a href="https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b" class="external">https://android.googlesource.com/toolchain/jack/+/056a5425b3ef57935206c19ecb198a89221ca64b</a>。</li>
+  <li><strong>ART AOT 编译器 (dex2oat)</strong>。ART 编译器二进制文件需要更新才能创建确定性图像。请参阅 CL:<a href="https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9" class="external">https://android.googlesource.com/platform/art/+/ace0dc1dd5480ad458e622085e51583653853fb9</a>。
+  </li>
+  <li><strong>libpac.so 文件 (V8)</strong>。每项编译会创建不同的 <code>/system/lib/libpac.so</code> 文件,因为 V8 快照会针对每项编译发生变更。解决方案是移除快照。请参阅 CL:<a href="https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29" class="external">https://android.googlesource.com/platform/external/v8/+/e537f38c36600fd0f3026adba6b3f4cbcee1fb29</a>。
+  </li>
+  <li><strong>预先经过 dexopt 处理 (.odex) 的应用文件</strong>。预先经过 dexopt 处理 (.odex) 的文件包含 64 位系统上的未初始化填充。请参阅 CL:<a href="https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029" class="external">https://android.googlesource.com/platform/art/+/34ed3afc41820c72a3c0ab9770be66b6668aa029</a>。
+  </li>
 </ul>
 
-<h2 id="the_build_diff_tool">使用构建 diff 工具</h2>
+<h2 id="the_build_diff_tool">使用编译 diff 工具</h2>
 
-<p>对于无法消除构建相关文件变更的情况,我们提供构建 diff 工具 <code><a href="https://android.googlesource.com/platform/build/+/master/tools/releasetools/target_files_diff.py">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>
-  <li>由于当前构建系统中的已知问题所导致的变更。</li>
+  <li>编译输出中的预期变更(例如,由于版本号变更所导致)。</li>
+  <li>由于当前编译系统中的已知问题所导致的变更。</li>
 </ul>
 
-<p>要使用构建 diff 工具,请运行以下命令:</p>
+<p>要使用编译 diff 工具,请运行以下命令:</p>
 
-<pre class="prettyprint">
-$ target_files_diff.py dir1 dir2
+<pre class="devsite-terminal devsite-click-to-copy">
+target_files_diff.py dir1 dir2
 </pre>
 
-<p><code>dir1</code> 和 <code>dir2</code> 是包含每个构建的提取目标文件的基础目录。</p>
+<p><code>dir1</code> 和 <code>dir2</code> 是包含每个编译的提取目标文件的基础目录。</p>
+
+<h2 id="block-mapping-tool">使块分配保持一致</h2>
+<p>在非 A/B OTA 中,影响时间的因素之一是块移动。对于给定的文件,尽管其内容在两个编译之间会保持不变,但实际持有数据的块可能已发生变化。因此,更新程序会在 OTA 期间执行不必要的 I/O 来四处移动块。</p>
+
+<p>为了解决这个问题,我们在 Android 7.0 中扩展了 <code>make_ext4fs</code> 工具,该工具会尝试使块分配在各编译之间保持一致。<code>make_ext4fs</code> 会接受可选的 <code>-d base_fs</code> 标记,该标记会在生成 <code>ext4</code> 映像时尝试将文件分配给相同的块。您可以从上一个编译的目标文件 zip 文件(<code>IMAGES/system.map</code> 和 <code>IMAGES/vendor.map</code>)中提取块映射文件(即 <code>base_fs</code> 映射文件)。接下来,<code>base_fs</code> 文件便可以通过 <code>PRODUCT_SYSTEM_BASE_FS_PATH</code> 和 <code>PRODUCT_VENDOR_BASE_FS_PATH</code> 进行记录并指定。例如,</p>
+
+<pre class="devsite-click-to-copy">
+  PRODUCT_SYSTEM_BASE_FS_PATH := path/to/base_fs_files/base_system.map
+  PRODUCT_VENDOR_BASE_FS_PATH := path/to/base_fs_files/base_vendor.map
+</pre>
+
+<p>虽然这对减小整体的 OTA 更新包大小来说并无帮助,但它确实可以通过减少 I/O 量来改善 OTA 性能。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/tools.html b/zh-cn/devices/tech/ota/tools.html
index 5943e41..01a3154 100644
--- a/zh-cn/devices/tech/ota/tools.html
+++ b/zh-cn/devices/tech/ota/tools.html
@@ -26,26 +26,18 @@
 <p>完整更新是指软件包将对设备的整个最终状态(系统分区、启动分区和恢复分区)进行更新。<i></i>只要设备能够接收软件包并启动恢复系统,软件包就可以安装所需的版本,而不受设备当前状态的影响。</p>
 <p>示例:使用发布工具为假设的 <b>tardis</b> 设备构建完整更新:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 # first, build the target-files .zip
-% <b>. build/envsetup.sh &amp;&amp; lunch tardis-eng</b>
-% <b>mkdir dist_output</b>
-% <b>make dist DIST_DIR=dist_output</b>
-  [...]
-% <b>ls -l dist_output/*target_files*</b>
--rw-r----- 1 user eng  69965275 Sep 29 15:51 tardis-target_files.zip
+<code class="devsite-terminal">. build/envsetup.sh &amp;&amp; lunch tardis-eng</code>
+<code class="devsite-terminal">mkdir dist_output</code>
+<code class="devsite-terminal">make dist DIST_DIR=dist_output</code>
 </pre>
 
 <p>target_files .zip 包含构建 OTA 软件包所需的所有内容。
 </p>
 
-<pre>
-% <b>./build/tools/releasetools/ota_from_target_files \
-    dist_output/tardis-target_files.zip ota_update.zip</b>
-unzipping target target-files...
-done.
-% <b>ls -l ota_update.zip</b>
--rw-r----- 1 user eng 62236561 Sep 29 15:58 ota_update.zip
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">./build/tools/releasetools/ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip</code>
 </pre>
 
 <p>ota_update.zip 现已准备就绪,可以发送到测试设备(所有内容均使用测试密钥进行签名)。对于用户设备,请生成并使用自己的私钥,有关详情,请参阅<a href="/devices/tech/ota/sign_builds.html">签名版本以供发布</a>。
@@ -57,16 +49,8 @@
 <li>更改的文件通常与之前的版本非常相似,因此软件包中只需包含针对两个文件之间的不同之处进行的编码。</li></ul>
 <p>只有当设备具有构建相应软件包所使用的旧版本或源版本时,您才能在设备上安装增量更新软件包。要构建增量更新,您需要拥有上一个版本(您要更新的版本)中的 target_files .zip 以及新版本中的 target_files .zip。<i></i></p>
 
-<pre>
-% <b>./build/tools/releasetools/ota_from_target_files \
-    -i PREVIOUS-tardis-target_files.zip \  </b># make incremental from this older version<b>
-    dist_output/tardis-target_files.zip incremental_ota_update.zip</b>
-unzipping target target-files...
-unzipping source target-files...
-   [...]
-done.
-% <b>ls -l incremental_ota_update.zip</b>
--rw-r----- 1 user eng 1175314 Sep 29 16:10 incremental_ota_update.zip
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">./build/tools/releasetools/ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip # make incremental from the older version</code>
 </pre>
 
 <p>该版本与上一个版本非常类似,而且增量更新软件包(约 1 MB)比对应的完整更新软件包 (60 MB) 小得多。</p>
@@ -77,10 +61,10 @@
 <p>更新软件包(<code>ota_update.zip</code>、<code>incremental_ota_update.zip</code>)是包含可执行二进制文件 <code>META-INF/com/google/android/update-binary</code> 的 .zip 文件。对软件包上的签名进行验证后,恢复进程会将该二进制文件解压到 <code>/tmp</code> 并运行它,然后传递以下参数:</p>
 <ul>
 <li><b>更新二进制 API 版本号</b>。如果向更新二进制文件传递的参数发生变化,此数字将递增。</li>
-<li><b>命令管道的文件描述符</b>。<i></i>更新程序可以使用此管道将命令发送回恢复二进制文件(主要用于界面变化,例如向用户指示进度)。</li>
+<li><b>命令管道的文件描述符</b><i></i>。更新程序可以使用此管道将命令发送回恢复二进制文件(主要用于界面变化,例如向用户指示进度)。</li>
 <li><b>更新软件包 .zip 文件的文件名</b>。</li>
 </ul>
 <p>恢复软件包可以使用任何静态链接的二进制文件作为更新二进制文件。OTA 软件包构建工具使用更新程序(<code>bootable/recovery/updater</code> 中的源),该程序提供一种可以执行很多安装任务的简单脚本语言。您可以替换设备上运行的任何其他二进制文件。</p>
-<p>要详细了解更新程序二进制文件、edify 语法和内置函数,请参阅 <a href="/devices/tech/ota/inside_packages.html">OTA 软件包内部</a>。
+<p>要详细了解更新程序二进制文件、edify 语法和内置函数,请参阅 <a href="/devices/tech/ota/inside_packages.html">OTA 软件包内部探秘</a>。
 
 </p></body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/perf/boot-times.html b/zh-cn/devices/tech/perf/boot-times.html
index 8b0baf2..9b07cb3 100644
--- a/zh-cn/devices/tech/perf/boot-times.html
+++ b/zh-cn/devices/tech/perf/boot-times.html
@@ -212,7 +212,7 @@
 <h3 id="deferring-initialization">延迟初始化</h3>
 
 <p>
-很多进程都在设备启动期间启动,但只有关键路径 (bootloader &gt; kernel &gt; init &gt; file system mount &gt; zygote &gt; system server) 中的组件才会直接影响启动时间。使用早期内核日志来识别对启动 init 进程不重要的外设/组件,然后将这些外设/组件延迟到启动过程的后期来启动。
+很多进程都在设备启动期间启动,但只有关键路径 (bootloader &gt; kernel &gt; init &gt; file system mount &gt; zygote &gt; system server) 中的组件才会直接影响启动时间。在内核启动期间执行 <strong>initcall</strong> 来识别对启动 init 进程不重要的外设/组件,然后将这些外设/组件延迟到启动过程的后期来启动。
 </p>
 
 <h2 id="optimizing-i-o-efficiency">优化 I/O 效率</h2>
@@ -377,6 +377,45 @@
 采用文件级加密的设备可以在 zygote-start 触发器的早期阶段启动 zygote(默认情况下,zygote 会在 main 类中启动,比 zygote-start 晚得多)。这样做时,请确保允许 zygote 在所有 CPU 中运行(因为错误的 cpuset 设置可能会强制 zygote 在特定 CPU 中运行)。
 </p>
 
+<h3 id="disable-power-saving">停用节电设置</h3>
+
+<p>
+在设备启动期间,可以停用 UFS 和/或 CPU 调节器等组件的节电设置。
+</p>
+<p class="aside"><strong>请注意</strong>:为了提高效率,应在充电器模式下启用节电设置。</p>
+
+<pre class="prettyprint">
+on init
+    # Disable UFS powersaving
+    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 0
+    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 0
+    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 0
+    write /sys/module/lpm_levels/parameters/sleep_disabled Y
+on property:sys.boot_completed=1
+    # Enable UFS powersaving
+    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 1
+    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 1
+    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1
+    write /sys/module/lpm_levels/parameters/sleep_disabled N
+on charger
+    # Enable UFS powersaving
+    write /sys/devices/soc/${ro.boot.bootdevice}/clkscale_enable 1
+    write /sys/devices/soc/${ro.boot.bootdevice}/clkgate_enable 1
+    write /sys/devices/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1
+    write /sys/class/typec/port0/port_type sink
+    write /sys/module/lpm_levels/parameters/sleep_disabled N</pre>
+
+<h3 id="defer-non-critical-initialization">推迟非关键初始化</h3>
+
+<p>
+非关键初始化(如 ZRAM)可以推迟到 boot_complete。
+</p>
+
+<pre class="prettyprint">
+on property:sys.boot_completed=1
+   # Enable ZRAM on boot_complete
+   swapon_all /vendor/etc/fstab.${ro.hardware}</pre>
+
 <h2 id="optimizing-boot-animation">优化启动动画</h2>
 
 <p>
@@ -415,7 +454,8 @@
 </p>
 
 <ul>
-<li><strong>使用简洁的正则表达式 (regex)</strong>。在为 <code>file_contexts</code> 中的 <code>sys/devices</code> 匹配 SELinux 政策时,格式糟糕的正则表达式可能会导致大量开销。例如,正则表达式 <code>/sys/devices/.*abc.*(/.*)?</code>  错误地强制扫描包含“abc”的所有 <code>/sys/devices</code> 子目录,导致 <code>/sys/devices/abc</code> 和 <code>/sys/devices/xyz/abc</code> 都成为匹配项。如果将此正则表达式修正为 <code>/sys/devices/[^/]*abc[^/]*(/.*)?</code> ,则只有 <code>/sys/devices/abc</code> 会成为匹配项。
+<li><strong>使用简洁的正则表达式 (regex)</strong>。在为 <code>file_contexts</code> 中的 <code>sys/devices</code> 匹配 SELinux 政策时,格式糟糕的正则表达式可能会导致大量开销。例如,正则表达式 <code>/sys/devices/.*abc.*(/.*)?</code>  错误地强制扫描包含“abc”的所有 <code>/sys/devices</code> 子目录,导致 <code>/sys/devices/abc</code> 和 <code>/sys/devices/xyz/abc</code> 都成为匹配项。
+如果将此正则表达式修正为 <code>/sys/devices/[^/]*abc[^/]*(/.*)?</code> ,则只有 <code>/sys/devices/abc</code> 会成为匹配项。
 </li><li><strong>将标签移动到 </strong><a href="https://selinuxproject.org/page/FileStatements#genfscon">genfscon</a>。这一现有的 SELinux 功能会将文件匹配前缀传递到 SELinux 二进制文件的内核中,而内核会将这些前缀应用于内核生成的文件系统。这也有助于修复错误标记的内核创建的文件,从而防止用户空间进程之间可能出现的争用情况(试图在重新标记之前访问这些文件)。</li>
 </ul>
 
diff --git a/zh-cn/devices/tech/perf/flash-wear.html b/zh-cn/devices/tech/perf/flash-wear.html
new file mode 100644
index 0000000..8635010
--- /dev/null
+++ b/zh-cn/devices/tech/perf/flash-wear.html
@@ -0,0 +1,113 @@
+<html devsite><head>
+    <title>Android Automotive 中的闪存磨损管理</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+Android Automotive 内部存储设备使用了支持上千次清空/写入周期的嵌入式多媒体卡 (eMMC);如果 eMMC 发生故障,系统可能会变得无法使用。由于汽车的使用寿命较长(通常为 10 年以上),因此 eMMC 必须非常稳定可靠。本页面介绍了 eMMC 行为,以及 OEM 如何降低 eMMC 发生故障的风险(从而避免 Android Automotive 系统发生故障)。
+</p>
+
+<h2 id="emmc-behavior">eMMC 行为</h2>
+
+<p>
+eMMC 设备使用耗损均衡技术来解决清空/写入限制的问题,具体方法是在整个系统内均匀地放置数据和分配写入操作(避免单个块因密集写入而发生故障)。eMMC 的预计使用寿命取决于以下因素:</p>
+
+<ul>
+<li><strong>写入量</strong>。在手机上,每天写入内部存储设备的数据量可能会超过 10GB。在 Android Automotive 实现中,由于应用数量有限,我们无法提供有关会有多少数据写入的真实数据。不过,据我们观察,当用户流式传输高品质音乐和使用导航时,每分钟写入 eMMC 的数据有 50MB。未来,可能会出现其他类型的写入密集型应用,例如持续录制和存储视频的中控台摄像头应用。另外,有些汽车是每天都会有几个小时处于行使状态的共享车辆。由于这些原因及其他原因,我们预计 Android Automotive 实现会面临比手机更多的 eMMC 写入量。</li>
+<li><strong>写入模式</strong>。写入和清空操作是在块中进行的。
+与不太频繁地在较大的区块中写入数据相比,在较小的区块中频繁地写入相同的数据量会更快地磨损 eMMC。</li>
+<li><strong>eMMC 的可用空间</strong>。较大的存储空间意味着耗损均衡算法可以将写入分摊到较多的块中。
+</li><li>耗损均衡技术。</li>
+<li><strong>环境因素</strong>。例如:工作温度范围通常介于 -20 和 85 摄氏度之间;如果温度超出此范围,eMMC 的使用寿命会进一步缩短。</li>
+</ul>
+
+<p>
+对于具有 16GB 可用空间和 3000 次清空/写入周期的 eMMC,我们估算的数据如下:</p>
+<table>
+  <tbody><tr>
+   <th>日写入量</th>
+   <td>16GB</td>
+   <td>32GB</td>
+  </tr>
+  <tr>
+   <th>预计使用寿命</th>
+   <td>10 年</td>
+   <td>5 年</td>
+  </tr>
+</tbody></table>
+
+<p>
+不过,随着可用存储空间的减少,系统可能会早在 eMMc 彻底磨损之前就停止正常运行,并且根据所使用的均衡技术和写入模式,eMMC 的使用寿命甚至可能会更短。此外,这方面的估算并没有将行为异常的应用或恶意应用的影响考虑在内,这些应用可能会在没有特殊权限的情况下将大量垃圾数据写入 eMMC 来攻击 Automotive 系统。
+</p>
+
+<p>
+要在潜在的 eMMC 故障实际发生之前就检测出来,应将适当的存储设备运行状况监控功能整合到整体系统运行状况监控功能中。
+</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>
+借助 Android O 支持的功能,OEM 可以保护和监控 Android Automotive 的内部存储设备,并延长其使用寿命。
+</p>
+
+<h3 id="restricting-third-party-apps">限制第三方应用</h3>
+
+<p>
+为了保护 Android Automotive 系统的内部存储设备,Android O 支持 OEM 配置是否允许第三方应用安装在内部存储设备中(应用只能向其安装所在的分区写入数据)。要进行配置,请在资源叠加层中设置以下配置:
+</p>
+
+<pre class="prettyprint notranslate">&lt;bool name="config_allow3rdPartyAppOnInternal"&gt;false&lt;/bool&gt;
+</pre>
+
+<h3 id="reducing-flash-wear">减少闪存磨损</h3>
+
+<p>
+如果 OEM 担心内部存储设备上的闪存磨损问题,也可以增加 SD 卡,SD 卡支持足够快的数据写入速度,可用作合并存储设备。SD 卡具有以下行为:
+</p>
+
+<ul>
+<li>合并时,SD 卡会被加密,可以安全存储应用数据。</li>
+<li>SD 卡槽必须位于安全的位置(不要让用户频繁移除 SD 卡)。</li>
+<li>SD 卡不能用于在 Automotive 系统和计算机之间传输数据。</li>
+<li>弹出 SD 卡不会影响正在运行的系统。不过,除非需要更换,否则不应移除 SD 卡。</li>
+</ul>
+
+<p>
+要确保第二方应用(由汽车应用开发者构建的应用)可以安装在 SD 卡上(如果汽车提供授权的话),汽车应用开发者必须将 <code>android:<a href="https://developer.android.com/guide/topics/manifest/manifest-element.html#install">installLocation</a>=["auto"
+| "preferExternal"] </code> 纳入应用的清单文件中。
+</p>
+
+<p>
+如果汽车禁止将第三方应用安装在内部存储设备上(如<a href="#restricting-third-party-apps">限制第三方应用</a>中所述),则在没有上述标记(或者如果配置了 <code><a href="https://developer.android.com/guide/topics/manifest/manifest-element.html#install">installLocation</a>=internalOnly</code> 设置)的情况下,应用安装将会失败。
+</p>
+
+<h3 id="getting-disk-metrics-with-storaged">使用 storaged 获取磁盘指标</h3>
+
+<p>
+Android O 中引入了 storaged,这是一个新的系统服务,会对磁盘指标和 eMMc 指标进行采样并发布,例如有关总体磁盘使用情况、估算的 eMMC 使用寿命和磁盘 I/O 统计数据(按应用统计)的信息。<em></em>当内部存储设备开始出现故障或特定应用执行的磁盘 I/O 过多时,OEM 可以使用这些信息来向用户发出警告。有关详情,请参阅<a href="/devices/tech/debug/storaged">实现 storaged</a>。
+</p>
+
+<h2 id="validation">验证</h2>
+
+<p>
+此功能在 <code>PackageManager</code> 测试中进行测试。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/power/component.html b/zh-cn/devices/tech/power/component.html
index 8ae1344..7ce7842 100644
--- a/zh-cn/devices/tech/power/component.html
+++ b/zh-cn/devices/tech/power/component.html
@@ -57,16 +57,16 @@
 
 <p>系统挂起可能会给功率测量造成不必要的误差,并使系统组件处于低功耗状态,而在这种状态下不适合测量活跃状态的功耗。要防止系统在屏幕关闭时进入挂起状态,请暂时使用部分唤醒锁。使用 USB 电缆将设备连接到开发主机,然后发出以下命令:</p>
 
-<pre>
-$ adb shell "echo temporary &gt; /sys/power/wake_lock"
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell "echo temporary &gt; /sys/power/wake_lock"
 </pre>
 
 <p>当使用 <code>wake_lock</code> 时,屏幕进入关闭状态不会触发系统挂起。(请记得在测量功耗之前先断开 USB 电缆与设备的连接。)</p>
 
 <p>要移除唤醒锁,请使用以下命令:</p>
 
-<pre>
-$ adb shell "echo temporary &gt; /sys/power/wake_unlock"
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell "echo temporary &gt; /sys/power/wake_unlock"
 </pre>
 
 <h3 id="measure-suspend">测量系统挂起状态下的功耗</h3>
@@ -90,7 +90,7 @@
 
 <p>您必须在电源配置文件的 <code>cpu.speeds</code> 条目中指定设备的可用 CPU 速率。要获取可用 CPU 速率列表,请运行以下命令:</p>
 
-<pre>
+<pre class="devsite-terminal devsite-click-to-copy">
 adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
 </pre>
 
@@ -98,12 +98,12 @@
 
 <p>如果某个平台的在线内核数量对功耗有很大的影响,您可能需要修改该平台的 cpufreq 驱动程序或调节器。大多数平台支持使用用户空间 cpufreq 调节器控制 CPU 速率以及使用 sysfs 接口来设置速率。例如,要在只有 1 个 CPU 的系统上或者所有 CPU 共享一个公共 cpufreq 策略的系统上将速率设为 200MHz,请使用系统控制台或 adb shell 运行以下命令:</p>
 
-<pre>
-echo userspace &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
-echo 200000 &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
-echo 200000 &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
-echo 200000 &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
-cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">echo userspace &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor</code>
+<code class="devsite-terminal">echo 200000 &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq</code>
+<code class="devsite-terminal">echo 200000 &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq</code>
+<code class="devsite-terminal">echo 200000 &gt; /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed</code>
+<code class="devsite-terminal">cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq</code>
 </pre>
 
 <p class="note">
@@ -113,7 +113,7 @@
 <p>这些命令可确保新的速率不超出允许的范围,并设置新的速率,然后输出 CPU 实际运行的速率(用于验证)。如果执行前的当前最小速率高于 200000,则可能需要交换前两行的顺序,或者再次执行第一行,以在设置最大速率之前降低最小速率。</p>
 
 <p>要测量 CPU 在不同速率下运行时所消耗的电流,请使用以下命令通过系统控制台将 CPU 置于 CPU 限制循环中:</p>
-<pre>
+<pre class="devsite-click-to-copy">
 # while true; do true; done
 </pre>
 
@@ -146,7 +146,7 @@
 
 <p><code>wifi.on</code> 值测量 Wi-Fi 在启用但未主动发送或接收数据的状态下的功耗。该值通常是测量系统挂起(休眠)状态下启用/禁用 Wi-Fi 之间产生的电流增量。</p>
 
-<p><code>wifi.scan</code> 值测量接入点 Wi-Fi 扫描时的功耗。应用可以使用 WifiManager 类 <a href="http://developer.android.com/reference/android/net/wifi/WifiManager.html"><code>startScan()</code> API</a> 来触发 Wi-Fi 扫描。您也可以依次打开“设置”&gt;“Wi-Fi”,这样 Wi-Fi 每隔几秒执行一次接入点扫描,扫描时功耗会明显上升,但必须从这些测量值中减去屏幕功率。</p>
+<p><code>wifi.scan</code> 值可测量接入点 WLAN 扫描时的功耗。应用可以使用 WifiManager 类 <a href="http://developer.android.com/reference/android/net/wifi/WifiManager.html"><code>startScan()</code></a> API 来触发 WLAN 扫描。您也可以依次打开“设置”&gt;“WLAN”,这样 WLAN 每隔几秒执行一次接入点扫描,扫描时功耗会明显上升,但必须从这些测量值中减去屏幕功率。</p>
 
 <p class="note">
 <strong>注意</strong>:请使用受控设置(如 <a href="http://en.wikipedia.org/wiki/Iperf">iperf</a>)来生成网络收发流量。</p>
diff --git a/zh-cn/devices/tech/power/index.html b/zh-cn/devices/tech/power/index.html
index 1fea242..bdfe9be 100644
--- a/zh-cn/devices/tech/power/index.html
+++ b/zh-cn/devices/tech/power/index.html
@@ -47,6 +47,6 @@
 
 <p>例如,显示屏电源配置文件列出了当显示屏开启状态下保持最低亮度和最高亮度时需消耗的电流量 (mA)。为了确定显示屏常亮时所需的电源成本(即由显示屏组件所消耗的电池量),框架会跟踪在各个亮度级别下维持的时间,然后将这些时间间隔乘以通过插值算法计算的显示亮度成本。</p>
 
-<p>该框架还会将每个应用的 CPU 时间乘以在特定速度运行 CPU 所需的毫安量。通过该计算方法可以创建一个应用电池消耗量(通过执行 CPU 代码)的相对排名(应用在前台的时间和包括后台活动在内的总时间将分别进行报告)。</p>
+<p>该框架还会将每个应用的 CPU 时间乘以在特定速度运行 CPU 所需的毫安量。通过该计算方法可以创建一个应用电池消耗量(通过执行 CPU 代码)的相对排名(应用在前台的时间和包括后台活动在内的总时间将分开报告)。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/power/values.html b/zh-cn/devices/tech/power/values.html
index 9e1385c..1f82da0 100644
--- a/zh-cn/devices/tech/power/values.html
+++ b/zh-cn/devices/tech/power/values.html
@@ -47,7 +47,7 @@
 
 </p><p>集群中激活的 CPU 以及速率示例:</p>
 
-<pre>
+<pre class="devsite-click-to-copy">
 &lt;array name="cpu.active.cluster0"&gt;
 &lt;value&gt;200&lt;/value&gt;
 &lt;value&gt;300&lt;/value&gt;
@@ -291,7 +291,7 @@
 
 <tr>
   <td>电池容量</td>
-  <td>总电池容量 (以毫安时为单位)。</td>
+  <td>总电池容量(以毫安时为单位)。</td>
   <td>3000 毫安时</td>
   <td></td>
 </tr>
diff --git a/zh-cn/devices/tech/settings/info-architecture.html b/zh-cn/devices/tech/settings/info-architecture.html
new file mode 100644
index 0000000..6deb57e
--- /dev/null
+++ b/zh-cn/devices/tech/settings/info-architecture.html
@@ -0,0 +1,224 @@
+<html devsite><head>
+    <title>已更新的信息架构</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+Android 8.0 为“设置”应用引入了全新的信息架构。新信息架构的目标是简化设置的整理方式,便于用户快速查找自定义 Android 设备所需的设置。
+</p>
+
+<h2 id="examples-and-source">示例和源代码</h2>
+
+<p>
+“设置”中的大多数页面目前都是使用新框架实现的。一个很好的例子是 DisplaySettings:<code>packages/apps/Settings/src/com/android/settings/DisplaySettings.java</code>
+</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>
+
+<h2 id="implementation">实现</h2>
+
+<p>
+建议设备制造商调整现有的“设置”信息架构,并根据需要插入其他设置页面以适应合作伙伴的特定功能。将偏好设置从旧页面(实现为 SettingsPreferencePage)移到新页面(使用 DashboardFragment 实现)可能很复杂。旧页面的偏好设置在实现时可能没有创建 PreferenceController。
+</p>
+
+<p>
+因此将偏好设置移到 DashboardFragment 中时,合作伙伴需要创建一个 PreferenceController,并且先将代码移到控制器中,然后在新的 DashboardFragment 中对偏好设置实例化。重构过程相当简单,因为大部分操作只是移动现有代码。
+</p>
+
+<p>
+完成重构后,原始设备制造商 (OEM) 应提交带有测试的补丁程序 CL 以将其更改合并到上游。
+</p>
+
+<h3 id="plugin">插件样式信息架构</h3>
+
+<p>
+每个设置项都作为偏好设置进行实现。可以轻松地将偏好设置从一个页面移到另一个页面。
+</p>
+
+<p>
+为了方便移动多个设置,Android O 引入了包含设置项的插件样式托管方片段。设置项被建模为插件样式控制器。因此,设置页面由单个托管方片段和多个设置控制器构成。
+</p>
+
+<h3 id="dashboard-fragment">DashboardFragment</h3>
+
+<p>
+这是插件样式偏好设置控制器的托管方。该片段继承自 PreferenceFragment,并具有用于放大和更新静态偏好设置列表与动态偏好设置列表的钩子。
+</p>
+
+<h3 id="static-preferences">静态偏好设置</h3>
+
+<p>
+静态偏好设置列表在 XML 中使用<preference>
+标记定义。DashboardFragment 实现使用 getPreferenceScreenResId() 方法来定义哪个 XML 文件包含要显示的偏好设置静态列表。
+</preference></p>
+
+<h3 id="dynamic-preferences">动态偏好设置</h3>
+
+<p>
+动态项表示具有 intent 的图块,会引向外部或内部 Activity。通常,intent 会引向不同的设置页面。例如,“设置”首页中的“Google”设置项就是一个动态项。动态项在 AndroidManifest 中定义(参见下文),并通过 FeatureProvider(定义为 DashboardFeatureProvider)加载。
+</p>
+
+<p>
+请注意,动态设置的负载高于静态配置的设置,因此通常开发者应将设置实现为静态设置。但是,在以下任一情况下,动态设置非常有用:
+</p>
+
+<ul>
+<li>设置未在“设置”应用中直接实现(例如,注入由 OEM/运营商应用实现的设置)。</li>
+<li>设置应显示在“设置”首页上。</li>
+<li>您已具有设置的 Activity,不想要实现额外的静态配置。</li>
+</ul>
+
+<p>
+要将 Activity 配置为动态设置,您需要执行以下操作:
+</p>
+
+<ul>
+<li>将该 Activity 标记为动态设置。为此,只需将 intent 过滤器添加到该 Activity 即可。</li>
+<li>告诉“设置”应用其所属的类别。该类别是在 <strong>CategoryKey</strong> 中定义的常量。</li>
+<li>可选:显示设置时,添加总结文本。</li>
+</ul>
+
+<p>
+以下是从“设置”应用的 DisplaySettings 中摘取的示例。
+</p>
+
+<pre class="prettyprint">
+&lt;activity android:name="Settings$DisplaySettingsActivity"
+                   android:label="@string/display_settings"
+                   android:icon="@drawable/ic_settings_display"&gt;
+             &lt;!-- Mark the activity as a dynamic setting --&gt;
+              &lt;intent-filter&gt;
+                     &lt;action android:name="com.android.settings.action.IA_SETTINGS" /&gt;
+              &lt;/intent-filter&gt;
+             &lt;!-- Tell Settings app which category it belongs to --&gt;
+              &lt;meta-data android:name="com.android.settings.category"
+                     android:value="com.android.settings.category.ia.homepage" /&gt;
+             &lt;!-- Add a summary text when the setting is displayed --&gt;
+              &lt;meta-data android:name="com.android.settings.summary"
+                     android:resource="@string/display_dashboard_summary"/&gt;
+             &lt;/activity&gt;
+</pre>
+
+<p>
+在呈现时,片段将请求在 AndroidManifest 中定义的静态 XML 和动态设置偏好设置列表。无论在哪个来源中加载设置,DashboardFragment 都通过 PreferenceController 管理每个设置的处理逻辑(参见下文)。<strong></strong>然后,它们将以混合列表的形式显示在界面上。
+</p>
+
+<h3 id="preference-controller">PreferenceController</h3>
+
+<p>
+PreferenceController 包含与偏好设置互动的所有逻辑,包括显示/更新/编入搜索索引等。
+</p>
+
+<p>
+相应地,PreferenceController 的接口具有 isAvailable()、displayPreference()、handlePreferenceTreeClicked() 等的 API。有关每个 API 的详细文档可以在相应接口类中找到。
+</p>
+
+<p>
+在为片段安装偏好设置时,信息中心会提供一种在显示之前附加 PreferenceController 的方法。在安装时,控制器将连接到片段,以便将来的所有相关事件均发送到控制器。
+</p>
+
+<p>
+DashboardFragment 将在屏幕中保留 PreferenceController 的列表。在片段的 onCreate() 中,将为 isAvailable() 方法调用所有控制器,如果其返回 true,将调用 displayPreference() 来处理显示逻辑。
+</p>
+
+<h2 id="using-dashboardfragment">使用 DashboardFragment</h2>
+
+<h3 id="moving-preference">将偏好设置从页面 A 移到页面 B</h3>
+
+<p>
+如果偏好设置静态地列在原始页面的偏好设置 XML 文件中,请遵循下面的<strong>静态</strong>路径。否则,请遵循<strong>动态</strong>路径。
+</p>
+
+<h4 id="static-move">静态</h4>
+
+<ol>
+<li>查找原始页面和目标页面的偏好设置 XML 文件。</li>您可以从页面的 getPreferenceScreenResId() 方法中找到此信息。
+<li>移除原始页面的 XML 中的偏好设置。</li>
+<li>将偏好设置添加到目标页面的 XML 中。</li>
+<li>在原始页面的 Java 实现中移除此偏好设置的 PreferenceController。通常它在 getPreferenceController() 中。</li>
+<strong>注意</strong>:偏好设置可能没有 PreferenceController。
+<li>在目标页面的 getPreferenceController() 中实例化 PreferenceController。</li>
+</ol>
+
+<h4 id="dynamic-move">动态</h4>
+
+<ol>
+<li>查找原始页面和目标页面托管的类别。您可以在 <code>DashboardFragmentRegistry</code> 中找到此信息。</li>
+<li>打开包含您需要移动的设置的 <code>AndroidManifest.xml</code> 文件,并找到表示此设置的 Activity 条目。</li>
+<li>更改该 Activity 的“com.android.settings.category”元数据值,将值设置为新页面的类别键。</li>
+</ol>
+
+<h3 id="creating-a-new-preference">在页面中创建新的偏好设置</h3>
+
+<p>
+如果偏好设置静态地列在原始页面的偏好设置 XML 文件中,请遵循下面的<strong>静态</strong>路径。否则,请遵循<strong>动态</strong>路径。
+</p>
+
+<h4 id="static-create">静态</h4>
+
+<ol>
+<li>找到页面的偏好设置 XML 文件。您可以从页面的 getPreferenceScreenResId() 方法中找到此信息。</li>
+<li>在 XML 中添加一个新的偏好设置项。确保其具有独特的 android:key。</li>
+<li>在页面的 getPreferenceControllers() 方法中为此偏好设置实例化一个 PreferenceController。</li>如果该偏好设置已存在于其他地方,则表示其可能已具有 PreferenceController。您可以重新使用该 PreferenceController,无需构建新的 PreferenceController。
+</ol>
+
+<h4 id="dynamic-create">动态</h4>
+
+<ol>
+<li>查找原始页面和目标页面托管的类别。您可以在 <code>DashboardFragmentRegistry</code> 中找到此信息。</li>
+<li>在 AndroidManifest 中创建一个新的 Activity,并添加必要的元数据来定义设置。将“com.android.settings.category”的元数据值设置为与第 1 步中定义的值相同。</li>
+</ol>
+
+<h3 id="create-new-page">新建页面</h3>
+<ol>
+<li>创建一个继承自 DashboardFragment 的新片段。</li>
+<li>在 <code>DashboardFragmentRegistry</code> 中定义其类别。
+<p class="note"><strong>注意</strong>:此步骤是可选的。如果您在此页面中不需要任何动态偏好设置,则不需要提供类别键。</p></li>
+<li>遵循添加此页面所需设置的步骤进行操作。</li>
+</ol>
+
+<h2 id="validation">验证</h2>
+
+<ul>
+<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
new file mode 100644
index 0000000..c57937a
--- /dev/null
+++ b/zh-cn/devices/tech/settings/patterns-components.html
@@ -0,0 +1,131 @@
+<html devsite><head>
+    <title>格式和组件</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+在 Android 8.0 中,“设置”菜单中增加了一些能够涵盖常见使用情况的组件和微件。我们鼓励设备制造商和开发者在扩展“设置”应用时使用常用组件,以便新界面与现有的“设置”界面保持一致。
+</p>
+
+<p>
+以下是改进摘要:
+</p>
+
+<ul>
+<li>支持库偏好设置框架中的分隔线行为变化。现在,分隔线绘制在类别之间。</li>
+<li>ActionBar 主题背景变化。现在,ActionBar 使用浅色主题背景,且带有强调色文本。</li>
+<li>新的偏好设置布局。图标空间仍然存在,即使偏好设置没有图标时也是如此。</li>
+</ul>
+
+<p>
+新的微件:
+</p>
+
+<ul>
+<li>应用详细信息的标头微件。显示应用图标、应用标签等信息。</li>
+<li>某些页面上具有展开按钮。页面在打开时可以是收起形式,隐藏不太重要的项目,直到用户点击展开按钮。</li>
+<li>默认应用选择器界面:
+  <ul>
+  <li>该界面用于选择默认浏览器、默认手机应用等。</li>
+  <li>以前是一个对话框,现在是一个基于单选按钮的全屏界面。</li>
+  </ul>
+</li><li>“MasterSwitch”样式偏好设置。这是具有两个点击目标的偏好设置。左侧目标会导致子集化的片段或 intent。右侧目标是一个切换开关,针对整个页面控制开启/关闭。</li>
+</ul>
+
+<h2 id="examples-and-source">示例和源代码</h2>
+<ul>
+<li>分隔线行为
+  <ul>
+  <li>“设置”中的所有页面均经过修改以使用新的分隔线行为。</li>
+  <li>分隔线行为在以下文件中定义为一个 ThemeOverlay:<br />
+<code>packages/apps/Settings/res/values/styles_preference.xml</code></li>
+  </ul>
+</li>
+<li>ActionBar 主题背景变化
+  <ul>
+  <li>“设置”中的所有页面均经过修改以使用新的 ActionBar 主题背景。</li>
+  <li>主题背景在 Theme.DeviceDefault.Settings 中进行定义</li>
+  </ul>
+</li>
+<li>新的偏好设置布局
+  <ul>
+  <li>现在,“设置”中的许多页面都使用新的偏好设置布局。</li>
+  <li>您可以在以下位置找到代码:<br />
+<code>packages/apps/Settings/res/values/styles_preference.xml</code></li>
+  </ul>
+</li>
+<li>应用标头微件
+  <ul>
+  <li>“设置”中的大多数应用信息页面都已实现新的应用标头。</li>
+  <li>相关示例和代码可以在以下位置找到:<br />
+<code>packages/apps/Settings/src/com/android/settings/applications/AppHeaderController.java</code></li>
+  </ul>
+</li>
+<li>展开按钮
+  <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>
+  </li>
+  </ul>
+</li><li>默认应用选择器
+  <ul>
+  <li>您可以在以下位置找到基类的代码:<br />
+<code>packages/apps/Settings/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java</code>  </li>
+  <li>DefaultAppPickerFragment 有多个子类,每个子类均实现一个选择器用于不同的 intent。</li>
+  </ul>
+</li>
+<li>MasterSwitch 样式偏好设置<em></em>
+  <ul>
+  <li>代码位于以下位置:<code>packages/apps/Settings/src/com/android/settings/widget/MasterSwitchPreference.java</code></li>
+  <li>WLAN 主开关就是一个示例用例。您可以在以下位置找到示例:<code>packages/apps/Settings/src/com/android/settings/wifi/WifiMasterSwitchPreferenceController.java</code></li>
+  </ul>
+</li>
+</ul>
+
+<h2 id="implementation">实现</h2>
+
+<p>
+设备制造商可以开始使用所有新的组件,无需额外设置。如果原始设备制造商 (OEM) 决定实现新的“MasterSwitch”样式偏好设置或默认应用选择器,则应查看本文档中的示例以及为每个组件编写的参考文件 (Javadoc),以获取更多详细信息。
+</p>
+
+<h2 id="customizing">自定义</h2>
+
+<ul>
+<li>分隔线行为。要更改分隔线的绘制方式,请更新“设置”分隔线的样式并更改以下各项的值:
+  <ul>
+  <li>allowDividerAbove</li>
+  <li>allowDividerBelow</li>
+  <li>allowDividerAfterLastItem</li>
+  </ul>
+</li>
+<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>
+  </ul>
+</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/settings/personalized.html b/zh-cn/devices/tech/settings/personalized.html
new file mode 100644
index 0000000..5bf32e4
--- /dev/null
+++ b/zh-cn/devices/tech/settings/personalized.html
@@ -0,0 +1,54 @@
+<html devsite><head>
+    <title>个性化设置</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+Android 的“设置”应用为 Android 8.0 用户提供了一系列建议。
+这些建议通常有助于改进手机功能,而且可以自定义(例如“设置‘勿扰’时间安排”或“开启 WLAN 通话功能”)。该功能会对建议进行排名(基于任何上下文信号或用户以往的建议采用情况)。
+</p>
+
+<p>
+当前的默认 Android 开放源代码项目 (AOSP) 排名模型基于用户以往的建议采用情况;这是一个简单的线性模型,它通过逻辑回归进行训练,从而正确地对互动信号进行加权。默认实现会使用显示、点击或拒绝的建议作为指标,同时根据这些事件的新近度对建议进行排名,并提高正确预测用户对这些建议的采用情况的概率。该模型是利用有限的已记录用户数据构建而成的。设备制造商 (OEM) 可以根据收集的任何数据开发自己的排名模型,并可能会在后期根据上下文信号校准排名。
+</p>
+
+<h2 id="implementation">实现</h2>
+
+<p>
+在 AOSP 中查找默认 <code>packages/apps/Settings/src/com/android/settings/dashboard/suggestions/SuggestionRanker.java</code> 实现。
+</p>
+
+<p>
+此功能由标记 <code>isSmartSuggestionEnabled</code> 进行保护,该标记默认情况下设置为 false。如果启用该功能(设置为 true),则该功能可使用默认 AOSP 实现运行,无需进行其他修改。原始设备制造商 (OEM) 可以使用默认实现或引入自己的实现来启用此功能。
+</p>
+
+<p>
+原始设备制造商 (OEM) 可以通过实现 <code>platform/packages/apps/Settings/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
+</code> 功能并替换文件的 <code>rankSuggestions</code> 方法来自定义该功能。
+该方法会获得两个列表,其中包含建议图块及相应的 suggestionId。该方法应仅根据所需排名得分重新排列相应列表中图块的顺序。suggestionId 可以用于唯一标识建议,并根据排名实现(例如,与此特定建议的互动新近度)提取关于该建议的所需过往信息。
+</p>
+
+<h2 id="validation">验证</h2>
+
+<p>
+实现人员可以自行编写类似于 <code>packages/apps/Settings/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionRankerTest.java</code> 的单元测试以验证排名,从而确保其功能版本能够按预期运行。
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/settings/universal-search.html b/zh-cn/devices/tech/settings/universal-search.html
new file mode 100644
index 0000000..da7c78b
--- /dev/null
+++ b/zh-cn/devices/tech/settings/universal-search.html
@@ -0,0 +1,175 @@
+<html devsite><head>
+    <title>通用搜索</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+Android 8.0 为“设置”菜单添加了经过扩展的搜索功能。<em></em>本文档介绍了如何添加设置,以及如何确保正确地将其加入“设置”搜索的索引中。
+</p>
+
+<h2 id="indexable-settings">创建可编入索引的设置</h2>
+
+<p>
+需要编入索引的每个“设置”片段都会实现 <code>Indexable</code> 接口,并且需要静态字段:
+
+</p><pre class="prettyprint">public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER
+</pre>
+
+<p>
+为您的片段进行设置以编入索引后,将其添加到以下位置中的 <code>SearchIndexableResources</code>:<br />
+<code>packages/apps/Settings/src/com/android/settings/search/SearchIndexableResources.java
+</code>
+</p>
+
+<h2 id="optional-methods">可选方法</h2>
+
+<p>该 <code>SearchIndexProvider</code> 接口有四种可选方法。</p>
+
+<h3 id="getXmlResourcesToIndex">getXmlResourcesToIndex</h3>
+  <ul>
+    <li>如果您的片段内容来自 <code>preference xml</code>,则替换此方法</li>
+    <li>以要编入索引的列表形式返回 XML 偏好设置。</li>
+  </ul>
+
+ <p>XML 资源示例:</p>
+
+<pre class="prettyprint">public List&lt;SearchIndexableResource&gt; getXmlResourcesToIndex(Context context, boolean enabled) {
+    ArrayList&lt;SearchIndexableResource&gt; result =  new ArrayList&lt;SearchIndexableResource&gt;();
+SearchIndexableResource sir = new SearchIndexableResource(context);
+	sir.xmlResId = R.xml.display_settings;
+	result.add(sir);
+
+    return result;
+}</pre>
+
+<h3 id="getRawDataToIndex">getRawDataToIndex</h3>
+  <ul>
+    <li>如果您的片段内容并非来自 <code>preference
+xml</code>,则替换此方法</li>
+    <li>返回要编入索引的原始数据 (<code>SearchIndexableRaw</code>) 的列表。</li>
+  </ul>
+
+<p>原始数据示例:</p>
+
+<pre class="prettyprint">
+public List&lt;SearchIndexableRaw&gt; getRawDataToIndex(Context context, boolean enabled) {
+              final List&lt;SearchIndexableRaw&gt; result = new ArrayList&lt;&gt;();
+              final Resources res = context.getResources();
+
+              // Add fragment title
+       SearchIndexableRaw data = new SearchIndexableRaw(context);
+       data.title = res.getString(R.string.wifi_settings);
+       data.screenTitle = res.getString(R.string.wifi_settings);
+       data.keywords = res.getString(R.string.keywords_wifi);
+       data.key = DATA_KEY_REFERENCE;
+       result.add(data);
+
+       return result;
+}
+</pre>
+
+<h3 id="getRawDataToIndex">getNonIndexableKeys</h3>
+  <ul>
+   <li>如果您的片段为 <code>DashboardFragment</code>,则很少需要替换该方法。</li>
+   <li>返回不应针对给定用户、设备、配置等显示的结果相对应的键列表。此处提供的键应与 <code>SearchIndexableResource</code> 和 <code>SearchIndexableRaw</code> 中的 KEY 字段匹配。<em></em></li>
+   <li>例如:不应向从未在其设备中使用 SIM 卡的用户显示“流量消耗”。</li>
+  </ul>
+
+<p>不可编入索引的键示例:</p>
+
+<pre class="prettyprint">
+public List&lt;String&gt; getNonIndexableKeys(Context context) {
+      final List&lt;String&gt; keys = super.getNonIndexableKeys(context);
+              if (!checkIntentAction(context, "android.settings.TERMS")) {
+                  keys.add(KEY_TERMS);
+              }
+              if (!checkIntentAction(context, "android.settings.LICENSE")) {
+                  keys.add(KEY_LICENSE);
+              }
+              if (!checkIntentAction(context, "android.settings.COPYRIGHT")) {
+                  keys.add(KEY_COPYRIGHT);
+              }
+              if (!checkIntentAction(context, "android.settings.WEBVIEW_LICENSE")) {
+                  keys.add(KEY_WEBVIEW_LICENSE);
+              }
+              return keys;
+}</pre>
+
+<h3 id="getPreferenceControllers">getPreferenceControllers</h3>
+
+<p>
+返回与此片段相关联的偏好设置控制器列表。此列表用于形成内嵌结果、更新不可编入索引的内容等。
+</p>
+
+<p>
+因此,您希望在搜索中显示的所有内容都必须包含在 <code>getXmlResourcesToIndex</code> 或 <code>getRawDataToIndex</code> 中。
+</p>
+
+<h2 id="keywords">为您的设置添加关键字</h2>
+
+<p>
+为确保设置易于搜索,请添加与设置相关、用户可能用来搜索该设置的关键字。
+</p>
+
+<p>
+添加关键字时请注意以下事项:
+</p>
+   <ul>
+     <li>关键字是具有以下特征的词语的列表:用户不一定会看到,但可能属于在脑中构想相应设置的工作原理时会用到的字词。</li>
+     <li>关键字是用户可能会输入以访问您的设置的字词。</li>
+     <li>关键字可以是同义词,或者与设置相关联的任何字词。</li>
+     <li>例如,可以使用“静音”来查找“音量”设置。</li>
+   </ul>
+
+<h2 id="duplication">避免重复内容</h2>
+
+<p>
+如果您要无条件地排除某个设置页面,请移除原始页面的索引,以避免出现重复的结果。
+</p>
+
+   <ol>
+     <li>找到您要排除的页面的 <code>PreferenceFragment</code>。</li>
+     <li>移除 <code>SearchIndexProvider</code>。</li>
+   </ol>
+
+<h2 id="validation">验证</h2>
+
+<p>
+要测试新设置的可搜索性,请执行以下操作:
+</p>
+
+   <ol>
+     <li>在设备上安装最新版本的 Android O。</li>
+     <li>通过依次选择以下各项让数据库重新编制索引:</li>
+<em>设置 &gt; 应用和通知 &gt; 应用信息 &gt; 设置 &gt; 存储 &gt; <strong>清除数据</strong></em>
+     <li>验证目标设置是否显示在搜索结果中。<br />
+     搜索设置的标题前缀将与该设置匹配。</li>
+   </ol>
+
+<p>
+可以运行以下 robolectric 测试来验证此功能的实现:<br />
+<code>packages/apps/Settings/tests/robotests/src/com/android/settings/search</code>
+</p>
+
+<p>
+编译目标为:<code>RunSettingsRoboTests</code>
+</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/lifecycle.html b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/lifecycle.html
index df07502..8b0c1ec 100644
--- a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/lifecycle.html
+++ b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/lifecycle.html
@@ -32,7 +32,8 @@
 
 <p>对测试生命周期进行独立分段的目的是方便重复使用。使用该设计,开发者可以创建一次测试,然后集成者可以创建不同的配置,以便在不同环境中运行该测试。例如,他们可以创建一项配置,该配置可以在本地计算机上运行测试并将测试结果转储到 stdout。然后,他们可以创建执行相同测试的第二个配置,但使用不同的测试调用监听器将测试结果存储在数据库中。他们还可能设计第三个配置,用于从某处的测试实验室进行连续测试。</p>
 
-<p>这里顺便说明一下,一个配置加上相关命令行参数(由测试运行者提供)一起称为<b>命令</b>。当 TF 将 <code>ITestDevice</code> 与命令配对并执行该命令时,后续对象称为<b>调用</b>。简而言之,调用包含贯穿整个生命周期的完整 TF 测试执行过程。</p>
+<p>这里顺便说明一下,一个配置加上相关命令行参数(由测试运行者提供)一起称为<b>命令</b>。当 TF 将某个命令与 <code>ITestDevice</code> 配对并执行该命令时,后续对象称为<b>调用</b>。
+简而言之,调用包含贯穿整个生命周期的完整 TF 测试执行过程。</p>
 
 <h3>配置的附加组件</h3>
 <ul>
diff --git a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/machine_setup.html b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/machine_setup.html
index 780ee22..4b7c460 100644
--- a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/machine_setup.html
+++ b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/machine_setup.html
@@ -26,7 +26,7 @@
 <h2>创建 TradeFed</h2>
 
 <p>在 Android 源代码树的根目录处:</p>
-<pre>
+<pre class="devsite-click-to-copy">
 <code class="devsite-terminal">source ./build/make/envsetup.sh</code>
 <code class="devsite-terminal">lunch &lt;device-target&gt;</code>
 <code class="devsite-terminal">make tradefed-all -j8</code>
@@ -35,12 +35,12 @@
 <h2>使用命令行运行</h2>
 
 <p>TradeFed 要求使用 <code>$PATH</code> 中的实用工具 <code>adb</code>:</p>
-<pre class="devsite-terminal">
+<pre class="devsite-terminal devsite-click-to-copy">
 export PATH=$PATH:&lt;path/to/adb&gt;
 </pre>
 
 <p>创建 TradeFed 后,<code>tradefed.sh</code> 启动器脚本便可供从您的路径进行访问。要启动 Trade Federation 控制台:</p>
-<pre class="devsite-terminal">
+<pre class="devsite-terminal devsite-click-to-copy">
 tradefed.sh
 </pre>
 <p>现在,您的 Trade Federation 环境即已搭建完毕。
diff --git a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/options.html b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/options.html
index 88277ff..6e8ecde 100644
--- a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/options.html
+++ b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/options.html
@@ -22,13 +22,14 @@
 
 <p>选项处理是 Trade Federation 模块化方法的核心。具体而言,选项是一种机制,让开发者、集成者和测试运行者通过该机制可以共同协作,而不会重复相互的工作。简单地说,实现选项处理后,开发者可将 Java 类成员标记为可配置,届时该成员的值可被集成者增强或覆盖,并且随后可被测试运行者增强或覆盖。该机制适用于所有 Java 固有类型,以及固有类型的任何 <code>Map</code> 或 <code>Collection</code>。</p>
 
-<p class="note"><strong>注意</strong>:选项处理机制仅适用于实现<a href="lifecycle.html">测试生命周期</a>内包含的接口之一的类,并且仅当该类由生命周期机制实例化时才适用。<em></em></p>
+<p class="note"><strong>注意</strong>:选项处理机制仅适用于实现<a href="lifecycle.html">测试生命周期</a>中包含的接口之一的类,并且仅当该类由生命周期系统实例化后才适用。<em></em></p>
 
 <h2 id="developer">开发者</h2>
-<p>要开始使用,开发者需要为成员添加 <code><a href="https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/config/Option.java">@Option</a></code> 注释。<!-- note: javadoc for the Option class is broken -->开发者需要至少指定 <code>name</code> 和 <code>description</code> 值,这两个值指定与该选项关联的参数名称和说明(后者在命令使用 <code>--help</code> 或 <code>--help-all</code> 运行时在 TF 控制台中显示)。</p>
+<p>要开始使用,开发者需要为成员添加 <code><a href="https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/config/Option.java">@Option</a></code> 注释。<!-- note: javadoc for the Option class is broken -->开发者需要至少指定 <code>name</code> 和 <code>description</code> 值,这两个值指定了与该选项关联的参数名称和说明(后者在命令使用 -<code>--help</code> 或 <code>--help-all</code> 运行时会在 TF 控制台中显示)。</p>
 
 <p>举例来说,假设我们要构建一个功能完善的电话测试,我们会在测试中拨打各种电话号码,并预期在每个号码连接后收到一系列 DTMF 音。</p>
-<code><pre>public class PhoneCallFuncTest extends IRemoteTest {
+<pre class="prettyprint">
+public class PhoneCallFuncTest extends IRemoteTest {
     @Option(name = "timeout", description = "How long to wait for connection, in millis")
     private long mWaitTime = 30 * 1000;  // 30 seconds
 
@@ -38,36 +39,43 @@
 
     public PhoneCallFuncTest() {
         mCalls.add("123-456-7890", "01134");  // default
-    }</pre></code>
+    }
+</pre>
 
 <p>以上就是开发者为该测试设置两个配置点的所有要求。开发者随后可以正常离开并使用 <code>mWaitTime</code> 和 <code>mCalls</code>,无需特别留意它们可进行配置这一事实。由于 <code>@Option</code> 字段在类实例化之后、<code>run</code> 方法调用之前设置,因此实现人员可以轻松为 <code>Map</code> 和 <code>Collection</code> 字段设置默认值或执行某类筛选操作,否则只能附加这些字段。</p>
 
 <h2 id="integrator">集成者</h2>
 <p>集成者的工作重心是编写 XML 格式的配置。该配置格式允许集成者为任何 <code>@Option</code> 字段设置(或附加)值。例如,假设集成者想要定义调用默认数值的低延迟测试,以及调用各种数值的运行时间较长的测试。集成者可以创建一对配置,可能如下所示:</p>
 
-<code><pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+<pre class="prettyprint">
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
 &lt;configuration description="low-latency default test; low-latency.xml"&gt;
     &lt;test class="com.example.PhoneCallFuncTest"&gt;
         &lt;option name="timeout" value="5000" /&gt;
     &lt;/test&gt;
-&lt;/configuration&gt;</pre></code>
+&lt;/configuration&gt;</pre>
 
-<code><pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+<pre class="prettyprint">
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
 &lt;configuration description="call a bunch of numbers; many-numbers.xml"&gt;
     &lt;test class="com.example.PhoneCallFuncTest"&gt;
         &lt;option name="call" key="111-111-1111" value="#*#*TEST1*#*#" /&gt;
         &lt;option name="call" key="222-222-2222" value="#*#*TEST2*#*#" /&gt;
         &lt;!-- ... --&gt;
     &lt;/test&gt;
-&lt;/configuration&gt;</pre></code>
+&lt;/configuration&gt;
+</pre>
 
 <h2 id="testrunner">测试运行者</h2>
 <p>测试运行者也可以通过 Trade Federation 控制台访问这些配置点。首先也是最重要的是,他们要使用 <code>run command &lt;name&gt;</code>(简称 <code>run &lt;name&gt;</code>)指令运行一个命令(即一个配置及其所有参数)。除此之外,他们可以指定任何参数列表作为命令的一部分,这可能替换或附加到各个配置内的生命周期对象指定的字段。</p>
 
 <p>要使用 <code>many-numbers</code> 电话号码运行低延迟测试,测试运行者可以执行:</p>
-<code><pre>tf &gt;run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#</pre></code>
+<pre class="devsite-click-to-copy">
+tf&gt; run low-latency.xml --call 111-111-1111 #*#*TEST1*#*# --call 222-222-2222 #*#*TEST2*#*#
+</pre>
 
 <p>或者,要从相反方向获得类似的效果,测试运行者可以减少 <code>many-numbers</code> 测试的等待时间:</p>
-<code></code><pre><code>tf &gt;run many-numbers.xml --timeout 5000</code></pre>
+<pre class="devsite-click-to-copy">
+tf&gt; run many-numbers.xml --timeout 5000</pre>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/vts.html b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/vts.html
index ef2a501..cf8a9df 100644
--- a/zh-cn/devices/tech/test_infra/tradefed/fundamentals/vts.html
+++ b/zh-cn/devices/tech/test_infra/tradefed/fundamentals/vts.html
@@ -26,27 +26,41 @@
 <p>要设置测试环境,请按以下步骤操作:</p>
 <ol>
 <li>安装 Python 开发工具包:
-<pre><code>$ sudo apt-get install python-dev</code></pre></li>
+<pre class="devsite-terminal devsite-click-to-copy">
+sudo apt-get install python-dev
+</pre>
+</li>
 <li>安装协议缓冲区工具(适用于 Python):
-<pre><code>$ sudo apt-get install python-protobuf<br />
-$ sudo apt-get install protobuf-compiler
-</code></pre></li>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">sudo apt-get install python-protobuf</code>
+<code class="devsite-terminal">sudo apt-get install protobuf-compiler</code>
+</pre>
+</li>
 <li>安装 Python 虚拟环境相关工具:
-<pre><code>$ sudo apt-get install python-virtualenv<br />
-$ sudo apt-get install python-pip
-</code></pre></li></ol>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">sudo apt-get install python-virtualenv</code>
+<code class="devsite-terminal">sudo apt-get install python-pip</code>
+</pre>
+</li>
+</ol>
 
 <h2 id="test">测试补丁</h2>
 <p>要测试补丁,请按以下步骤操作:</p>
 <ol>
 <li>构建 VTS 主机端软件包:
-<pre><code>$ . build/envsetup.sh
-$ lunch aosp_arm64-userdebug
-$ make vts -j</code></pre></li>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">. build/envsetup.sh</code>
+<code class="devsite-terminal">lunch aosp_arm64-userdebug</code>
+<code class="devsite-terminal">make vts -j</code>
+</pre>
+</li>
 <li>运行默认的 VTS 测试:
-<pre><code>$ vts-tradefed<br />
-&gt; run vts     // where vts is the test plan name
-</code></pre></li></ol>
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">vts-tradefed</code>
+tf&gt; run vts     // where vts is the test plan name
+</pre>
+</li>
+</ol>
 
 <h2 id="plans">VTS 计划</h2>
 <p>可用的 VTS 测试计划包括:</p>
@@ -77,6 +91,6 @@
 <p>要查看所有计划的列表,请参阅 <code><a href="https://android.googlesource.com/platform/test/vts/+/master/tools/vts-tradefed/res/config/plans.md">/test/vts/tools/vts-tradefed/res/config.md</a></code>。</p>
 
 <h2 id="support">支持</h2>
-<p>您可以在 <code><a href=" https://android.googlesource.com/platform/test/vts/+/master/README.md">/test/vts/doc</a></code> 中查看用户手册。有关 VTS 的问题,请加入 <a href="https://groups.google.com/forum/#!forum/android-vts">[email protected]</a> 网上论坛。</p>
+<p>您可以在 <code><a href=" https://android.googlesource.com/platform/test/vts/+/master/README.md">/test/vts/doc</a></code> 下查看用户手册。有关 VTS 的问题,请加入 <a href="https://groups.google.com/forum/#!forum/android-vts">[email protected]</a> 网上论坛。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/vts/performance.html b/zh-cn/devices/tech/vts/performance.html
index a2c14dc..31eaa4e 100644
--- a/zh-cn/devices/tech/vts/performance.html
+++ b/zh-cn/devices/tech/vts/performance.html
@@ -117,8 +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>
@@ -289,7 +289,7 @@
 
 </dl>
 
-<p class="note"><strong>注意</strong>:后台负荷可能会影响延迟测试中的吞吐量结果和 <code>other_ms</code> 元组。只要后台负荷的优先级低于 <code>fifo_ms</code>,就可能只有 <code>RT-fifo</code> 会显示类似的结果。</p>
+<p class="note"><strong>注意</strong>:后台负荷可能会影响延迟测试中的吞吐量结果和 <code>other_ms</code> 元组。只要后台负荷的优先级低于 <code>RT-fifo</code>,就可能只有 <code>fifo_ms</code> 会显示类似的结果。</p>
 
 <h4 id="pair-values">指定对值</h4>
 <p>每个客户端进程都会与其专用的服务器进程配对,且每一对都可能会独立调度到任何 CPU。不过,只要同步标记是 <code>honor</code>,事务期间应该就不会出现 CPU 迁移的情况。</p>
@@ -301,7 +301,7 @@
 <p>经过大量用户场景测试(在合格产品上运行延迟测试),我们决定将 2.5 毫秒定为需要满足的截止时间要求。对于具有更高要求的新应用(如每秒 1000 张照片),此截止时间值将发生变化。</p>
 
 <h4 id="verbose">指定详细输出</h4>
-<p>使用 <code>-v</code> 选项显示详细输出。示例:</p>
+<p>使用 <code>-v</code> 选项显示详细输出。例如:</p>
 
 <pre class="devsite-click-to-copy">
 <code class="devsite-terminal">libhwbinder_latency -i 1 -v</code>
@@ -334,13 +334,13 @@
 
 <ul>
 <li><font style="color:orange">服务线程</font>使用 <code>SCHED_OTHER</code> 优先级创建,且与 <code>pid
-8674</code> 要一起在 <code>CPU:1</code> 中运行。</li>
-<li>随后,<font style="color:blue">第一个事务</font>由 <code>fifo-caller</code> 启动。为处理该事务,hwbinder 会将服务器 (<code>pid: 8674 tid: 8676</code>) 的优先级升级到 99,并使用瞬态调度类别(输出为 <code>???</code>)对其进行标记。接下来,调度程序会将服务器进程置于 <code>CPU:0</code> 中,以运行该进程并将它与其客户端使用的同一 CPU 进行同步。</li>
+8674</code> 一起在 <code>CPU:1</code> 中运行。</li>
+<li>随后,由 <code>fifo-caller</code> 启动<font style="color:blue">第一个事务</font>。为处理该事务,hwbinder 会将服务器 (<code>pid: 8674 tid: 8676</code>) 的优先级升级到 99,并使用瞬态调度类别(输出为 <code>???</code>)对其进行标记。接下来,调度程序会将服务器进程置于 <code>CPU:0</code> 中,以运行该进程并将它与其客户端使用的同一 CPU 进行同步。</li>
 <li><font style="color:green">第二个事务</font>调用程序的优先级为 <code>SCHED_OTHER</code>。服务器自行降级并为优先级为 <code>SCHED_OTHER</code> 的调用程序提供服务。</li>
 </ul>
 
 <h4 id="trace">使用跟踪记录进行调试</h4>
-<p>您可以指定 <code>-trace</code> 选项来调试延迟问题。使用该选项时,延迟测试会在检测到不良延迟时停止跟踪日志记录。示例:</p>
+<p>您可以指定 <code>-trace</code> 选项来调试延迟问题。使用该选项时,延迟测试会在检测到不良延迟时停止跟踪日志记录。例如:</p>
 
 <pre class="prettyprint">
 <code class="devsite-terminal">atrace --async_start -b 8000 -c sched idle workq binder_driver sync freq</code>
diff --git a/zh-cn/devices/tv/index.html b/zh-cn/devices/tv/index.html
index 57daed6..691ffd0 100644
--- a/zh-cn/devices/tv/index.html
+++ b/zh-cn/devices/tv/index.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>TV Input Framework</title>
+    <title>TV 输入框架</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
diff --git a/zh-cn/devices/tv/reference-tv-app.html b/zh-cn/devices/tv/reference-tv-app.html
index deb1325..be9b8d2 100644
--- a/zh-cn/devices/tv/reference-tv-app.html
+++ b/zh-cn/devices/tv/reference-tv-app.html
@@ -60,44 +60,46 @@
 
 <p>首选,请从 Git 中选择您想要的 Live TV 版本。以下说明面向的是最新版的 Live TV,但您也可以通过将分支从 master 更改为上表中所列的其他分支,来选择一个更早的版本。</p>
 
-<pre>
-$ mkdir live-tv &amp;&amp; cd live-tv
-$ repo init -u <a href="https://android.googlesource.com/platform/manifest">https://android.googlesource.com/platform/manifest</a> -b master
-$ repo sync -j8 -c
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">mkdir live-tv &amp;&amp; cd live-tv</code>
+<code class="devsite-terminal">repo init -u <a href="https://android.googlesource.com/platform/manifest">https://android.googlesource.com/platform/manifest</a> -b master</code>
+<code class="devsite-terminal">repo sync -j8 -c</code>
 </pre>
 
 <h2 id="build">构建</h2>
 
 <p>要构建 Live TV 代码,请运行:</p>
 
-<pre>
-$ . build/envsetup.sh
-$ tapas LiveTv x86
-$ make LiveTv
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">. build/envsetup.sh</code>
+<code class="devsite-terminal">tapas LiveTv x86</code>
+<code class="devsite-terminal">make LiveTv</code>
 </pre>
 
 <h2 id="push">推送</h2>
 
 <p>要将 Live TV 推送到测试设备,请运行:</p>
 
-<pre>
-$ adb install -r -d $OUT/system/priv-app/LiveTv/LiveTv.apk
+<pre class="devsite-terminal devsite-click-to-copy">
+adb install -r -d $OUT/system/priv-app/LiveTv/LiveTv.apk
 </pre>
 
 <p>如果开发者想让 Live TV 应用拥有系统权限,则在首次安装时,需要通过运行以下命令将该应用推送到 /system/priv-app:</p>
 
-<pre>adb push $OUT/system/priv-app/LiveTv/LiveTv.apk  /system/priv-app/LiveTv/</pre>
+<pre class="devsite-terminal devsite-click-to-copy">
+adb push $OUT/system/priv-app/LiveTv/LiveTv.apk  /system/priv-app/LiveTv/
+</pre>
 
 <h2 id="test">测试</h2>
 
-<p>在设备上安装 Live TV 后,您需要测试该应用是否已正确集成。除了对 TV 应用运行<a href="/compatibility/cts/index.html">兼容性测试套件</a>和 <a href="http://source.android.com/compatibility/cts/verifier.html">CTS 验证程序测试</a>外,还可使用以下这些测试:</p>
+<p>在设备上安装 Live TV 后,您需要测试该应用是否已正确集成。除了对 TV 应用运行<a href="/compatibility/cts/index.html">兼容性测试套件</a>和 <a href="http://source.android.com/compatibility/cts/verifier.html">CTS 验证程序测试</a>外,您还可以使用以下这些测试:</p>
 
 <h3 id="unit_tests">单元测试</h3>
 
 <p>可对 Live TV 应用运行单元测试和功能测试。您必须连接一台设备(或模拟器)才能运行这类测试。</p>
 
-<pre>
-$ adb shell logcat -c
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell logcat -c
 m LiveTv TVTestInput TVUnitTests -j20 &amp;&amp;\
 adb install -r -d $OUT/system/priv-app/LiveTv/LiveTv.apk &amp;&amp;\
 adb install -r -d $OUT/system/app/TVTestInput/TVTestInput.apk &amp;&amp; \
@@ -114,8 +116,8 @@
 
 <h3 id="functional_tests">功能测试</h3>
 
-<pre>
-$ adb shell logcat -c
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell logcat -c
 m LiveTv TVTestInput TVFuncTests -j20 &amp;&amp;\
 adb install -r -d $OUT/system/priv-app/LiveTv/LiveTv.apk &amp;&amp;\
 adb install -r -d $OUT/system/app/TVTestInput/TVTestInput.apk &amp;&amp; \
@@ -132,10 +134,10 @@
 
 <h3 id="jank_tests">Jank 测试</h3>
 
-<p>Jank 测试用于检查是否存在丢帧和渲染延迟。</p>
+<p>Jank 测试用于检查是否存在丢帧和渲染延迟的情况。</p>
 
-<pre>
-$ adb shell logcat -c
+<pre class="devsite-terminal devsite-click-to-copy">
+adb shell logcat -c
 m LiveTv TVTestInput TVJankTests -j20 &amp;&amp;\
 adb install -r -d $OUT/system/priv-app/LiveTv/LiveTv.apk &amp;&amp;\
 adb install -r -d $OUT/system/app/TVTestInput/TVTestInput.apk &amp;&amp;\
diff --git a/zh-cn/license.html b/zh-cn/license.html
index 6c24e82..ed26225 100644
--- a/zh-cn/license.html
+++ b/zh-cn/license.html
@@ -28,7 +28,7 @@
 
 <p>本网站上的文档内容作为 <a href="https://android.googlesource.com/">Android 开放源代码项目</a>的一部分向您提供。我们根据 <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 许可</a>(Android 开放源代码项目所有组成部分的首选许可)授权您使用本文档(包括其中显示的所有代码)。</p>
 
-<p>Apache 2.0 是适用于开放源代码的商业软件许可。大多数 Android 平台和文档都是根据 Apache 2.0 许可授权用户使用。尽管该项目会尽可能遵循此首选许可,但也可能存在例外情况,例如,如果文档(代码注释)的提取来源是根据 GPLv2 或其他许可授权的源代码模块。在这些情况下,源代码模块所遵循的许可将适用于从源代码模块中提取的文档。要了解用于生成文档并需要根据许可注明出处的源代码模块,请查看下文的<a href="#doclicenses">“文档许可”部分</a>。</p>
+<p>Apache 2.0 是适用于开放源代码的商业软件许可。Android 平台和文档的大部分内容都是根据 Apache 2.0 许可授权用户使用。尽管该项目会尽可能遵循此首选许可,但也可能存在例外情况,例如,如果文档(代码注释)的提取来源是根据 GPLv2 或其他许可授权的源代码模块。在这些情况下,源代码模块所遵循的许可将适用于从源代码模块中提取的文档。要了解用于生成文档并需要根据许可注明出处的源代码模块,请查看下文的<a href="#doclicenses">“文档许可”部分</a>。</p>
 
 <p>本网站的第三方组件(例如 JavaScript 库)已根据其作者指定的许可纳入 Android 开放源代码项目。要了解这些许可,请参阅 Android 开放源代码项目中的源代码文件。</p>
 
@@ -58,13 +58,13 @@
 <h2 id="attribution">注明出处</h2>
 <p>当您重复使用网页上显示的根据 Creative Commons Attribution 许可条款提供的内容或创建其修改版本时,需注明相应的出处。在该网站上,需注明出处的要求仅适用于非文档内容(如上文所述)。要了解关于注明出处的完整要求,请参阅 <a href="https://creativecommons.org/licenses/by/3.0/legalcode">Creative Commons 法律规定</a>的 4b 部分。
 </p>
-<p>在实际使用情形中,我们要求您根据创作作品所用媒介的特点,尽一切可能注明出处来自 Android 开放源代码项目。此要求可能适用于以下几种典型方式:</p>
+<p>在实际使用情形中,我们要求您根据创作作品所用媒介的特点,尽可能注明出处来自 Android 开放源代码项目。此要求可能适用于以下几种典型方式:</p>
 <h3>原样复制</h3>
 <p>
  如果您的在线作品原样复制本网站中的全部或部分文字或图片,请在网页底部附上以下这段内容:<em></em>
 </p>
 <p style="margin-left:20px;font-style:italic">
-本网页的部分内容是从 <a href="https://code.google.com/p/android/">Android 开放源代码项目</a>原创及共享作品中复制的,须遵照 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 许可</a>所述条款付诸应用。
+ 本网页的部分内容是从 <a href="https://code.google.com/p/android/">Android 开源项目</a>原创及共享作品中复制的,须遵照 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 许可</a>所述条款付诸应用。
 
 </p>
 <p>此外,请提供指向原始来源网页的链接,以便用户可以参阅相应网页,了解更多信息。
@@ -73,9 +73,9 @@
 <p>
  如果您的在线作品会显示在本网站内容的基础上<em>修改的</em>文字或图片,请在您的网页底部附上以下这段内容:</p>
 <p style="margin-left:20px;font-style:italic">
-本网页的部分内容是在 <a href="https://code.google.com/p/android/">Android 开放源代码项目</a>原创及共享作品的基础上修改而成的,须遵照 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 许可</a>所述条款付诸应用。
+ 本网页的部分内容是在 <a href="https://code.google.com/p/android/">Android 开源项目</a>原创及共享作品的基础上修改而成的,须遵照 <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 许可</a>所述条款付诸应用。
 </p>
-<p>再次提醒,请提供指向原始来源网页的链接,以便用户可以参阅相应网页,了解更多信息。在对相应内容完成修改后,尤其要谨记这一点。
+<p>再次提醒,请提供指向原始来源网页的链接,以便用户可以参阅相应网页,了解更多信息。在对相应内容做过修改后,尤其要谨记这一点。
 </p>
 <h3>其他媒体</h3>
 <p>如果您要制作非超文本作品(如图书、音频或视频),我们要求您本着上述精神尽可能提供语音或文字形式的出处说明。
diff --git a/zh-cn/security/apksigning/v2.html b/zh-cn/security/apksigning/v2.html
index bb2bb3e..b32f6ff 100644
--- a/zh-cn/security/apksigning/v2.html
+++ b/zh-cn/security/apksigning/v2.html
@@ -20,9 +20,12 @@
       limitations under the License.
   -->
 
-<p>APK 签名方案 v2 是一种全文件签名方案,该方案能够发现对 APK 的受保护部分进行的所有更改,从而有助于加快验证速度并<a href="#integrity-protected-contents">增强完整性保证</a>。</p>
+<p>
+APK 签名方案 v2 是一种全文件签名方案,该方案能够发现对 APK 的受保护部分进行的所有更改,从而有助于加快验证速度并<a href="#integrity-protected-contents">增强完整性保证</a>。
+</p>
 
-<p>使用 APK 签名方案 v2 进行签名时,会在 APK 文件中插入一个 <a href="#apk-signing-block">APK 签名分块</a>,该分块位于“ZIP 中央目录”部分之前并紧邻该部分。在“APK 签名分块”内,v2 签名和签名者身份信息会存储在 <a href="#apk-signature-scheme-v2-block">APK 签名方案 v2 分块</a>中。
+<p>
+使用 APK 签名方案 v2 进行签名时,会在 APK 文件中插入一个 <a href="#apk-signing-block">APK 签名分块</a>,该分块位于“ZIP 中央目录”部分之前并紧邻该部分。在“APK 签名分块”内,v2 签名和签名者身份信息会存储在 <a href="#apk-signature-scheme-v2-block">APK 签名方案 v2 分块</a>中。
 </p>
 
 <p>
@@ -51,7 +54,7 @@
     </ul>
   </li>
   <li><code>size of block</code>,以字节数计 - 与第一个字段相同 (uint64)</li>
-  <li><code>magic</code> APK 签名分块 42(16 个字节)</li>
+  <li><code>magic</code>“APK 签名分块 42”(16 个字节)</li>
 </ul>
 
 <p>在解析 APK 时,首先要通过以下方法找到“ZIP 中央目录”的起始位置:在文件末尾找到“ZIP 中央目录结尾”记录,然后从该记录中读取“中央目录”的起始偏移量。通过 <code>magic</code> 值,可以快速确定“中央目录”前方可能是“APK 签名分块”。然后,通过 <code>size of
@@ -74,30 +77,37 @@
 </p>
 
 <h3 id="apk-signature-scheme-v2-block-format">格式</h3>
-<p>“APK 签名方案 v2 分块”存储在“APK 签名分块”内,ID 为 <code>0x7109871a</code>。
+<p>
+“APK 签名方案 v2 分块”存储在“APK 签名分块”内,ID 为 <code>0x7109871a</code>。
 </p>
 
 <p>“APK 签名方案 v2 分块”的格式如下(所有数字值均采用小端字节序,所有带长度前缀的字段均使用 uint32 值表示长度):</p>
 <ul>
-  <li>带长度前缀的 <code>signer</code>(带长度前缀)序列:<ul>
-      <li>带长度前缀的 <code>signed data</code>:<ul>
-          <li>带长度前缀的 <code>digests</code>(带长度前缀)序列:<ul>
+  <li>带长度前缀的 <code>signer</code>(带长度前缀)序列:
+    <ul>
+      <li>带长度前缀的 <code>signed data</code>:
+        <ul>
+          <li>带长度前缀的 <code>digests</code>(带长度前缀)序列:
+            <ul>
               <li><code>signature algorithm ID</code> (uint32)</li>
               <li>(带长度前缀)<code>digest</code> - 请参阅<a href="#integrity-protected-contents">受完整性保护的内容</a></li>
             </ul>
           </li>
-          <li>带长度前缀的 X.509 <code>certificates</code> 序列:<ul>
+          <li>带长度前缀的 X.509 <code>certificates</code> 序列:
+            <ul>
               <li>带长度前缀的 X.509 <code>certificate</code>(ASN.1 DER 形式)</li>
             </ul>
           </li>
-          <li>带长度前缀的 <code>additional attributes</code>(带长度前缀)序列:<ul>
+          <li>带长度前缀的 <code>additional attributes</code>(带长度前缀)序列:
+            <ul>
               <li><code>ID</code> (uint32)</li>
               <li><code>value</code>(可变长度:附加属性的长度 - 4 个字节)</li>
             </ul>
           </li>
         </ul>
       </li>
-      <li>带长度前缀的 <code>signatures</code>(带长度前缀)序列:<ul>
+      <li>带长度前缀的 <code>signatures</code>(带长度前缀)序列:
+        <ul>
           <li><code>signature algorithm ID</code> (uint32)</li>
           <li><code>signed data</code> 上带长度前缀的 <code>signature</code></li>
         </ul>
@@ -147,13 +157,17 @@
 </p>
 <p class="img-caption"><strong>图 2.</strong> 签名后的各个 APK 部分</p>
 
-<p>APK 签名方案 v2 负责保护第 1、3、4 部分的完整性,以及第 2 部分包含的“APK 签名方案 v2 分块”中的 <code>signed data</code> 分块的完整性。
+<p>
+APK 签名方案 v2 负责保护第 1、3、4 部分的完整性,以及第 2 部分包含的“APK 签名方案 v2 分块”中的 <code>signed data</code> 分块的完整性。
 </p>
 
-<p>第 1、3 和 4 部分的完整性通过其内容的一个或多个摘要来保护,这些摘要存储在 <code>signed data</code> 分块中,而这些分块则通过一个或多个签名来保护。
+<p>
+第 1、3 和 4 部分的完整性通过其内容的一个或多个摘要来保护,这些摘要存储在 <code>signed data</code> 分块中,而这些分块则通过一个或多个签名来保护。
 </p>
 
-<p>第 1、3 和 4 部分的摘要采用以下计算方式,类似于两级 <a href="https://en.wikipedia.org/wiki/Merkle_tree">Merkle 树</a>。每个部分都会被拆分成多个大小为 1 MB(2<sup>20</sup> 个字节)的连续块。每个部分的最后一个块可能会短一些。每个块的摘要均通过字节 <code>0xa5</code> 的连接、块的长度(采用小端字节序的 uint32 值,以字节数计)和块的内容进行计算。顶级摘要通过字节 <code>0x5a</code> 的连接、块数(采用小端字节序的 uint32 值)以及块的摘要的连接(按照块在 APK 中显示的顺序)进行计算。摘要以分块方式计算,以便通过并行处理来加快计算速度。
+<p>
+第 1、3 和 4 部分的摘要采用以下计算方式,类似于两级 <a href="https://en.wikipedia.org/wiki/Merkle_tree">Merkle 树</a>。
+每个部分都会被拆分成多个大小为 1 MB(2<sup>20</sup> 个字节)的连续块。每个部分的最后一个块可能会短一些。每个块的摘要均通过字节 <code>0xa5</code> 的连接、块的长度(采用小端字节序的 uint32 值,以字节数计)和块的内容进行计算。顶级摘要通过字节 <code>0x5a</code> 的连接、块数(采用小端字节序的 uint32 值)以及块的摘要的连接(按照块在 APK 中显示的顺序)进行计算。摘要以分块方式计算,以便通过并行处理来加快计算速度。
 </p>
 
 <p>
@@ -190,7 +204,8 @@
     </ol>
   </li>
   <li>找到“APK 签名分块”中的第一个“APK 签名方案 v2 分块”。如果 v2 分块存在,则继续执行第 3 步。否则,回退至<a href="#v1-verification">使用 v1 方案</a>验证 APK。</li>
-  <li>对“APK 签名方案 v2 分块”中的每个 <code>signer</code> 执行以下操作:<ol>
+  <li>对“APK 签名方案 v2 分块”中的每个 <code>signer</code> 执行以下操作:
+    <ol>
       <li>从 <code>signatures</code> 中选择安全系数最高的受支持 <code>signature algorithm ID</code>。安全系数排序取决于各个实现/平台版本。</li>
       <li>使用 <code>public
       key</code> 并对照 <code>signed data</code> 验证 <code>signatures</code> 中对应的 <code>signature</code>。(现在可以安全地解析 <code>signed data</code> 了。)</li>
@@ -207,7 +222,8 @@
 </p>
 
 <h3 id="v1-verification">JAR 已签名的 APK 的验证(v1 方案)</h3>
-<p>JAR 已签名的 APK 是一种<a href="https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Signed_JAR_File">标准的已签名 JAR</a>,其中包含的条目必须与 META-INF/MANIFEST.MF 中列出的条目完全相同,并且所有条目都必须已由同一组签名者签名。其完整性按照以下方式进行验证:</p>
+<p>
+JAR 已签名的 APK 是一种<a href="https://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Signed_JAR_File">标准的已签名 JAR</a>,其中包含的条目必须与 META-INF/MANIFEST.MF 中列出的条目完全相同,并且所有条目都必须已由同一组签名者签名。其完整性按照以下方式进行验证:</p>
 
 <ol>
   <li>每个签名者均由一个包含 META-INF/&lt;signer&gt;.SF 和 META-INF/&lt;signer&gt;.(RSA|DSA|EC) 的 JAR 条目来表示。</li>
diff --git a/zh-cn/security/bulletin/2015-08-01.html b/zh-cn/security/bulletin/2015-08-01.html
index c3f113c..491a625 100644
--- a/zh-cn/security/bulletin/2015-08-01.html
+++ b/zh-cn/security/bulletin/2015-08-01.html
@@ -22,7 +22,7 @@
 
 <p><em>发布时间:2015 年 8 月 13 日</em></p>
 
-<p>在每月发布 Android 安全公告的过程中,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。我们还会在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布 Nexus 固件映像。LMY48I 或更高版本的系统已解决本文所列的安全问题。我们的合作伙伴在 2015 年 6 月 25 日或之前就已收到这些问题的相关通知。</p>
+<p>在每月发布 Android 安全公告的过程中,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。<a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。LMY48I 或更高版本的系统已解决本文所列的安全问题。我们的合作伙伴在 2015 年 6 月 25 日或之前就已收到这些问题的相关通知。</p>
 
 <p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
 
@@ -466,7 +466,7 @@
 
 <p>由于该漏洞可能允许本地应用访问通常由“危险”保护级别的权限保护的数据,因此我们将其严重程度评为“中”。</p>
 
-<p>我们认为,此漏洞首次在 <a href="http://stackoverflow.com/questions/24625936/getrunningtasks-doesnt-work-in-android-l">Stack Overflow</a> 上被公开讨论。</p>
+<p>我们认为,此漏洞是首次在 <a href="http://stackoverflow.com/questions/24625936/getrunningtasks-doesnt-work-in-android-l">Stack Overflow</a> 上被公开讨论。</p>
 <table>
  <tbody><tr>
     <th>CVE</th>
diff --git a/zh-cn/security/bulletin/2015-09-01.html b/zh-cn/security/bulletin/2015-09-01.html
index 9a8ba54..bf423d6 100644
--- a/zh-cn/security/bulletin/2015-09-01.html
+++ b/zh-cn/security/bulletin/2015-09-01.html
@@ -24,7 +24,7 @@
 
 <p>在本月发布 Android 安全公告的过程中,我们通过无线 (OTA) 更新的方式发布了针对 Nexus 设备的安全更新(版本号为 LMY48M)。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序。这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可用于在受影响的设备上执行远程代码。</p>
 
-<p>我们还在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布了 Nexus 固件映像。LMY48M 或更高版本的系统已解决本文所列的安全问题。我们的合作伙伴在 2015 年 8 月 13 日或之前就已收到这些问题的相关通知。</p>
+<p><a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。LMY48M 或更高版本的系统已解决本文所列的安全问题。我们的合作伙伴在 2015 年 8 月 13 日或之前就已收到这些问题的相关通知。</p>
 
 <p>我们尚未检测到用户因这些新报告的问题而遭到攻击的情况。不过,现有问题 CVE-2015-3636 属于例外情况。请参阅<a href="#mitigations">缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护</a>和服务防护功能(如 SafetyNet)。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
 
diff --git a/zh-cn/security/bulletin/2015-10-01.html b/zh-cn/security/bulletin/2015-10-01.html
index 5244883..adc3ae6 100644
--- a/zh-cn/security/bulletin/2015-10-01.html
+++ b/zh-cn/security/bulletin/2015-10-01.html
@@ -22,7 +22,8 @@
 
 <p><em>发布时间:2015 年 10 月 5 日 | 更新时间:2016 年 4 月 28 日</em></p>
 
-<p>在每月发布 Android 安全公告的同时,我们都会通过无线下载 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。我们还会在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布 Nexus 固件映像。安全补丁程序级别为 2015 年 10 月 1 日(或之后的日期)的 LMY48T 或更高版本的 Android L 系统以及所有 Android M 系统都已解决本文所列的安全问题。请参阅 <a href="https://support.google.com/nexus/answer/4457705">Nexus 文档</a>中提供的有关说明,了解如何检查安全补丁程序级别。</p>
+<p>在每月发布 Android 安全公告的同时,我们都会通过无线下载 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。
+<a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。安全补丁程序级别为 2015 年 10 月 1 日(或之后的日期)的 LMY48T 或更高版本的 Android L 系统以及所有 Android M 系统都已解决本文所列的安全问题。请参阅 <a href="https://support.google.com/nexus/answer/4457705">Nexus 文档</a>中提供的有关说明,了解如何检查安全补丁程序级别。</p>
 
 <p>我们的合作伙伴在 2015 年 9 月 10 日或之前就已收到这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序。</p>
 
@@ -67,7 +68,7 @@
 
 <h2 id="security_vulnerability_details">安全漏洞详情</h2>
 
-<p>我们在下面提供了 2015-10-01 补丁程序级别涵盖的每个安全漏洞的详细信息,其中包括问题描述、严重程度阐述以及一个包含 CVE、相关 Bug、严重程度、受影响版本及报告日期的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的 AOSP 代码更改记录。如果某个 Bug 有多条相关的代码更改记录,我们还将通过 Bug ID 后面的数字链接到更多 AOSP 参考信息。</p>
+<p>我们在下面提供了 2015-10-01 补丁程序级别涵盖的每个安全漏洞的详细信息,其中包括问题描述、严重程度阐述以及一个包含 CVE、相关 Bug、严重程度、受影响版本及报告日期的表格。在适用的情况下,我们会将 Bug ID 链接到解决问题的 AOSP 代码更改记录。如果某个 Bug 有多条相关的代码更改记录,我们还将通过 Bug ID 后面的数字链接到更多 AOSP 参考信息。</p>
 
 <h3 id="remote_code_execution_vulnerabilities_in_libstagefright">libstagefright 中的远程代码执行漏洞</h3>
 
@@ -84,13 +85,13 @@
  </tr>
  <tr>
     <td rowspan="14">CVE-2015-3873</td>
-    <td><a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/c23e3dd8af7397f023aae040c4a03dd14091cbed">ANDROID-20674086</a> [<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/9abb7401df730b5c510f6b8dac2716a0928d9623">2</a>、<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/b62a73b860757143d3b140b2985fdae71e18d675">3</a>、<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/b2ae4351539de9aa4667fcb3e02ba40d9c6bd094">4</a>]</td>
+    <td><a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/c23e3dd8af7397f023aae040c4a03dd14091cbed">ANDROID-20674086</a>  [<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/9abb7401df730b5c510f6b8dac2716a0928d9623">2</a>,<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/b62a73b860757143d3b140b2985fdae71e18d675">3</a>,<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/b2ae4351539de9aa4667fcb3e02ba40d9c6bd094">4</a>]</td>
     <td rowspan="13">严重</td>
     <td rowspan="13">5.1 及更低版本</td>
     <td rowspan="13">Google 内部</td>
  </tr>
  <tr>
-    <td><a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/3fd96683850cf27648e036180acb149fac362242">ANDROID-20674674</a> [<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/65842db06c2d77e53cc5ac61692160d844cc7d0a">2</a>、<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/38eff9af5c032bf12f89d6e94df05f65eef51afc">3</a>、<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/91860b89488b3ee4644c539e89e657fbb79fb6ad">4</a>]</td>
+    <td><a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/3fd96683850cf27648e036180acb149fac362242">ANDROID-20674674</a>  [<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/65842db06c2d77e53cc5ac61692160d844cc7d0a">2</a>,<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/38eff9af5c032bf12f89d6e94df05f65eef51afc">3</a>,<a href="https://android.googlesource.com/platform%2Fframeworks%2Fav/+/91860b89488b3ee4644c539e89e657fbb79fb6ad">4</a>]</td>
  </tr>
  <tr>
     <td><a href="https://android.googlesource.com/platform%2Fexternal%2Ftremolo/+/2e941e40ce76eb13b273479a4ee8fb6e40d33795">ANDROID-20718524</a></td>
@@ -423,7 +424,7 @@
  </tr>
 </tbody></table>
 
-<p>*AOSP 中没有针对该问题的补丁。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+<p>*AOSP 中没有针对该问题的补丁程序。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="elevation_of_privilege_vulnerability_in_secure_element_evaluation_kit">Secure Element Evaluation Kit 中的提权漏洞</h3>
@@ -494,8 +495,7 @@
 
 <p>我们在 SQLite 解析引擎中发现多个漏洞。这些漏洞可能会被本地应用利用,从而导致其他应用或服务可执行任意 SQL 查询。如果本地应用成功利用这些漏洞,则可通过目标应用执行任意代码。</p>
 
-<p>我们在 2015 年 4 月 8 日向 AOSP 主代码库上传了一个修复程序,将 SQLite
-版本升级到 3.8.9:<a href="https://android-review.googlesource.com/#/c/145961/">https://android-review.googlesource.com/#/c/145961/</a></p>
+<p>我们在 2015 年 4 月 8 日向 AOSP 主代码库上传了一个修复程序,用于将 SQLite 版本升级到 3.8.9:<a href="https://android-review.googlesource.com/#/c/145961/">https://android-review.googlesource.com/#/c/145961/</a></p>
 
 <p>此公告中包含针对 Android 4.4 (SQLite
 3.7.11) 以及 Android 5.0 和 5.1 (SQLite 3.8.6) 中的 SQLite 版本的补丁。</p>
diff --git a/zh-cn/security/bulletin/2015-11-01.html b/zh-cn/security/bulletin/2015-11-01.html
index 4ff1449..3186b71 100644
--- a/zh-cn/security/bulletin/2015-11-01.html
+++ b/zh-cn/security/bulletin/2015-11-01.html
@@ -22,7 +22,7 @@
 
 <p><em>发布时间:2015 年 11 月 2 日</em></p>
 
-<p>在每月发布 Android 安全公告的过程中,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。我们还会在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布 Nexus 固件映像。安全补丁程序级别为 2015 年 11 月 1 日(或之后的日期)的 LMY48X 或更高版本的 Android Lollipop 系统以及所有 Android Marshmallow 系统都已解决本文所列的安全问题。如需了解详情,请参阅<a href="#common_questions_and_answers">常见问题和解答</a>部分。</p>
+<p>在每月发布 Android 安全公告的过程中,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。<a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。安全补丁程序级别为 2015 年 11 月 1 日(或之后的日期)的 LMY48X 或更高版本的 Android Lollipop 系统以及所有 Android Marshmallow 系统都已解决本文所列的安全问题。如需了解详情,请参阅<a href="#common_questions_and_answers">常见问题和解答</a>部分。</p>
 
 <p>我们的合作伙伴在 2015 年 10 月 5 日或之前就已收到这些问题的相关通知。我们会在接下来的 48 小时内在 Android 开放源代码项目 (AOSP) 代码库中发布针对相关问题的源代码补丁程序。届时,我们将会修订本公告,将相关 AOSP 链接增补到本文中。</p>
 
@@ -53,7 +53,7 @@
   </li><li> 趋势科技 (Trend Micro) 的 Peter Pi:CVE-2015-6611
   </li><li> Google Project Zero 的 Natalie Silvanovich:CVE-2015-6608
   </li><li> 碁震安全研究团队(@K33nTeam,http://k33nteam.org/)的何淇丹 (@flanker_hqd) 和 Wen Xu (@antlr7):CVE-2015-6612
-  </li><li> <a href="http://www.360.cn">奇虎 360 科技有限公司的龚广(</a><a href="https://twitter.com/oldfresher">@oldfresher</a>,[email protected]):CVE-2015-6612
+  </li><li><a href="http://www.360.cn">奇虎 360 科技有限公司的龚广(</a><a href="https://twitter.com/oldfresher">@oldfresher</a>,[email protected]):CVE-2015-6612
   </li><li> 趋势科技的 Seven Shen:CVE-2015-6610
 </li></ul>
 
@@ -125,8 +125,7 @@
  </tr>
  <tr>
     <td>CVE-2015-6609</td>
-    <td><a href="https://android.googlesource.com/platform%2Fbootable%2Frecovery/+/ec63d564a86ad5b30f75aa307b4bd271f6a96a56">ANDROID-22953624</a>
-[<a href="https://android.googlesource.com/platform%2Fsystem%2Fcore/+/419e6c3c68413bd6dbb6872340b2ae0d69a0fd60">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform%2Fbootable%2Frecovery/+/ec63d564a86ad5b30f75aa307b4bd271f6a96a56">ANDROID-22953624</a> [<a href="https://android.googlesource.com/platform%2Fsystem%2Fcore/+/419e6c3c68413bd6dbb6872340b2ae0d69a0fd60">2</a>]</td>
     <td>严重</td>
     <td>6.0 及更低版本</td>
     <td>2015 年 8 月 3 日</td>
@@ -268,7 +267,7 @@
 <h3 id="elevation_of_privilege_vulnerability_in_telephony">
 Telephony 中的提权漏洞</h3>
 
-<p>本地恶意应用可利用 Telephony 组件中的漏洞将未经授权的数据传递到受限的网络接口,因而可能会产生流量费。此外,该漏洞还可用于阻碍设备接听电话,并让攻击者控制通话的静音设置。由于该漏洞可被用于以不正当的方式获取“<a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">危险</a>”权限,因此我们将其严重程度评为“中”。</p>
+<p>本地恶意应用可利用 Telephony 组件中的漏洞将未经授权的数据传递到受限的网络接口,因而可能会产生流量费。此外,该漏洞还可用于阻碍设备接听电话,并让攻击者控制通话的静音设置。由于该漏洞可被用于以不正当的方式获取“<a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">dangerous</a>”权限,因此我们将其严重程度评为“中”。</p>
 <table>
  <tbody><tr>
     <th>CVE</th>
diff --git a/zh-cn/security/bulletin/2015-12-01.html b/zh-cn/security/bulletin/2015-12-01.html
index 1d09be3..c88adb9 100644
--- a/zh-cn/security/bulletin/2015-12-01.html
+++ b/zh-cn/security/bulletin/2015-12-01.html
@@ -22,7 +22,8 @@
 
 <p><em>发布时间:2015 年 12 月 7 日 | 更新时间:2016 年 3 月 7 日</em></p>
 
-<p>在每月发布 Android 安全公告的同时,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。<a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。安全补丁程序级别为 2015 年 12 月 1 日(或之后的日期)的 LMY48Z 或更高版本的 Android L 系统以及所有 Android 6.0 系统都已解决本文所列的安全问题。如需了解详情,请参阅<a href="#common_questions_and_answers">常见问题和解答</a>部分。</p>
+<p>在每月发布 Android 安全公告的同时,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。
+<a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。安全补丁程序级别为 2015 年 12 月 1 日(或之后的日期)的 LMY48Z 或更高版本的 Android L 系统以及所有 Android 6.0 系统都已解决本文所列的安全问题。如需了解详情,请参阅<a href="#common_questions_and_answers">常见问题和解答</a>部分。</p>
 
 <p>我们的合作伙伴在 2015 年 11 月 2 日或之前就已收到这些问题的相关通知和更新。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序(如果适用)。</p>
 
@@ -32,7 +33,7 @@
 
 <h2 id="mitigations">缓解措施</h2>
 
-<p>本部分概括总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 SafetyNet)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+<p>这部分简要介绍了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 SafetyNet)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
 
 <ul>
   <li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。</li>
@@ -45,7 +46,13 @@
 <p>非常感谢以下研究人员做出的贡献:</p>
 
 <ul>
-  <li>Google Chrome 安全团队的 Abhishek Arya、Oliver Chang 和 Martin Barbella:CVE-2015-6616、CVE-2015-6617、CVE-2015-6623、CVE-2015-6626、CVE-2015-6619、CVE-2015-6633、CVE-2015-6634</li><li><a href="http://k33nteam.org/">碁震安全研究团队</a> (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的 Flanker (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>):CVE-2015-6620</li><li><a href="http://www.360.cn">奇虎 360 科技有限公司</a>的龚广(<a href="https://twitter.com/oldfresher">@oldfresher</a>、[email protected]):CVE-2015-6626</li><li>EmberMitre Ltd 的 Mark Carter (<a href="https://twitter.com/hanpingchinese">@hanpingchinese</a>):CVE-2015-6630</li><li>Michał Bednarski (<a href="https://github.com/michalbednarski">https://github.com/michalbednarski</a>):CVE-2015-6621</li><li>Google Project Zero 的 Natalie Silvanovich:CVE-2015-6616</li><li>趋势科技 (Trend Micro) 的 Peter Pi:CVE-2015-6616、CVE-2015-6628</li><li><a href="http://k33nteam.org/">碁震安全研究团队</a> (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的何淇丹 (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>) 和 Marco Grassi (<a href="https://twitter.com/marcograss">@marcograss</a>):CVE-2015-6622</li><li>Tzu-Yin (Nina) Tai:CVE-2015-6627</li><li>阿根廷布宜诺斯艾利斯 Dr. Manuel Sadosky 基金会 Programa STIC 的 Joaquín Rinaudo (<a href="https://twitter.com/xeroxnir">@xeroxnir</a>):CVE-2015-6631</li><li>百度 X-Team 的 Wangtao (neobyte):CVE-2015-6626</li></ul>
+  <li>Google Chrome 安全团队的 Abhishek Arya、Oliver Chang 和 Martin Barbella:CVE-2015-6616、CVE-2015-6617、CVE-2015-6623、CVE-2015-6626、CVE-2015-6619、CVE-2015-6633、CVE-2015-6634</li><li><a href="http://k33nteam.org/">碁震安全研究团队</a> (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的 Flanker (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>):CVE-2015-6620
+  </li><li><a href="http://www.360.cn">奇虎 360 科技有限公司</a>的龚广(<a href="https://twitter.com/oldfresher">@oldfresher</a>、[email protected]):CVE-2015-6626
+  </li><li>EmberMitre Ltd 的 Mark Carter (<a href="https://twitter.com/hanpingchinese">@hanpingchinese</a>):CVE-2015-6630
+  </li><li>Michał Bednarski (<a href="https://github.com/michalbednarski">https://github.com/michalbednarski</a>):CVE-2015-6621
+  </li><li>Google Project Zero 的 Natalie Silvanovich:CVE-2015-6616</li><li>趋势科技 (Trend Micro) 的 Peter Pi:CVE-2015-6616、CVE-2015-6628</li><li><a href="http://k33nteam.org/">碁震安全研究团队</a> (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的何淇丹 (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>) 和 Marco Grassi (<a href="https://twitter.com/marcograss">@marcograss</a>):CVE-2015-6622
+  </li><li>Tzu-Yin (Nina) Tai:CVE-2015-6627</li><li>阿根廷布宜诺斯艾利斯 Dr. Manuel Sadosky 基金会 Programa STIC 的 Joaquín Rinaudo (<a href="https://twitter.com/xeroxnir">@xeroxnir</a>):CVE-2015-6631
+  </li><li>百度 X-Team 的 Wangtao (neobyte):CVE-2015-6626</li></ul>
 
 <h2 id="security_vulnerability_details">安全漏洞详情</h2>
 
diff --git a/zh-cn/security/bulletin/2015.html b/zh-cn/security/bulletin/2015.html
index 85d6a2f..e3fda7d 100644
--- a/zh-cn/security/bulletin/2015.html
+++ b/zh-cn/security/bulletin/2015.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>本页面列出了我们已发布的所有 2015 Android 安全公告。(它们以前称为 Nexus 安全公告。)如需所有公告的列表,请参阅 <a href="index.html">Android 安全公告</a>主页。</p>
+<p>本页面列出了我们已发布的所有 2015 Android 安全公告。(它们以前称为 Nexus 安全公告。)如需所有公告的列表,请参阅 <a href="index.html">Android 安全公告</a>首页。</p>
 
 <table>
   <colgroup><col width="15%" />
diff --git a/zh-cn/security/bulletin/2016-01-01.html b/zh-cn/security/bulletin/2016-01-01.html
index f86eb0d..56ce0b4 100644
--- a/zh-cn/security/bulletin/2016-01-01.html
+++ b/zh-cn/security/bulletin/2016-01-01.html
@@ -22,7 +22,7 @@
 
 <p><em>发布时间:2016 年 1 月 4 日 | 更新时间:2016 年 4 月 28 日</em></p>
 
-<p>在每月发布 Android 安全公告的同时,我们都会通过无线下载 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。我们还会在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布 Nexus 固件映像。安全补丁程序级别为 2016 年 1 月 1 日(或之后的日期)的 LMY49F 或更高版本的 Android L 系统以及所有 Android 6.0 系统都已解决本文所列的安全问题。如需了解详情,请参阅<a href="#common_questions_and_answers">常见问题和解答</a>部分。</p>
+<p>在每月发布 Android 安全公告的同时,我们都会通过无线下载 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。<a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。安全补丁程序级别为 2016 年 1 月 1 日(或之后的日期)的 LMY49F 或更高版本的 Android L 系统以及所有 Android 6.0 系统都已解决本文所列的安全问题。如需了解详情,请参阅<a href="#common_questions_and_answers">常见问题和解答</a>部分。</p>
 
 <p>我们的合作伙伴在 2015 年 12 月 7 日或之前就已收到本公告所列问题的相关通知和更新。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序(如果适用)。</p>
 
@@ -32,7 +32,7 @@
 
 <h2 id="mitigations">缓解措施</h2>
 
-<p>本部分概括总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 SafetyNet)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+<p>这部分简要介绍了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 SafetyNet)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
 
 <ul>
   <li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。
@@ -47,7 +47,8 @@
 <ul>
   <li>Google Chrome 安全团队的 Abhishek Arya、Oliver Chang 和 Martin Barbella:CVE-2015-6636
   </li><li>腾讯科恩实验室 (<a href="https://twitter.com/k33nteam">@K33nTeam</a>) 的 Sen Nie (<a href="https://twitter.com/@nforest_">@nforest_</a>) 和 jfang:CVE-2015-6637
-  </li><li>Android Bionic 团队的 Yabin Cui:CVE-2015-6640</li><li>Google X 的 Tom Craig:CVE-2015-6641</li><li>Jann Horn (<a href="https://thejh.net">https://thejh.net</a>):CVE-2015-6642</li><li>Jouni Malinen PGP id EFC895FA:CVE-2015-5310</li><li>Google 信息安全工程师团队的 Quan Nguyen:CVE-2015-6644</li><li>Gal Beniamini (<a href="https://twitter.com/@laginimaineb">@laginimaineb</a>、<a href="http://bits-please.blogspot.com">http://bits-please.blogspot.com</a>):CVE-2015-6639
+  </li><li>Android Bionic 团队的 Yabin Cui:CVE-2015-6640</li><li>Google X 的 Tom Craig:CVE-2015-6641</li><li>Jann Horn (<a href="https://thejh.net">https://thejh.net</a>):CVE-2015-6642
+  </li><li>Jouni Malinen PGP id EFC895FA:CVE-2015-5310</li><li>Google 信息安全工程师团队的 Quan Nguyen:CVE-2015-6644</li><li>Gal Beniamini (<a href="https://twitter.com/@laginimaineb">@laginimaineb</a>、<a href="http://bits-please.blogspot.com">http://bits-please.blogspot.com</a>):CVE-2015-6639
 </li></ul>
 
 <h2 id="security_vulnerability_details">安全漏洞详情</h2>
diff --git a/zh-cn/security/bulletin/2016-02-01.html b/zh-cn/security/bulletin/2016-02-01.html
index 7bb0506..ae068c2 100644
--- a/zh-cn/security/bulletin/2016-02-01.html
+++ b/zh-cn/security/bulletin/2016-02-01.html
@@ -22,7 +22,7 @@
 
 <p><em>发布时间:2016 年 2 月 1 日 | 更新时间:2016 年 3 月 7 日</em></p>
 
-<p>在每月发布 Android 安全公告的同时,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。我们还会在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布 Nexus 固件映像。安全补丁程序级别为 2016 年 2 月 1 日(或之后的日期)的 LMY49G 或更高版本的 Android L 系统以及所有 Android M 系统都已解决本文所列的安全问题。请参阅 <a href="https://support.google.com/nexus/answer/4457705">Nexus 文档</a>中提供的相关说明,了解如何检查安全补丁程序级别。</p>
+<p>在每月发布 Android 安全公告的同时,我们都会通过无线 (OTA) 更新的方式发布针对 Nexus 设备的安全更新。<a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上也发布了 Nexus 固件映像。安全补丁程序级别为 2016 年 2 月 1 日(或之后的日期)的 LMY49G 或更高版本的 Android L 系统以及所有 Android M 系统都已解决本文所列的安全问题。请参阅 <a href="https://support.google.com/nexus/answer/4457705">Nexus 文档</a>中提供的相关说明,了解如何检查安全补丁程序级别。</p>
 
 <p>我们的合作伙伴在 2016 年 1 月 4 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序(如果适用)。</p>
 
@@ -32,7 +32,7 @@
 
 <h3 id="mitigations">缓解措施</h3>
 
-<p>本部分概括总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 SafetyNet)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+<p>这部分简要介绍了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 SafetyNet)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
 
 <ul>
   <li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。
@@ -45,7 +45,13 @@
 <p>非常感谢以下研究人员做出的贡献:</p>
 
 <ul>
-  <li>Android 和 Chrome 安全团队:CVE-2016-0809、CVE-2016-0810</li><li>Broadgate 团队:CVE-2016-0801、CVE-2015-0802</li><li><a href="http://www.360safe.com/">奇虎 360</a> 的 <a href="http://c0reteam.org">C0RE 团队</a>的 Chiachih Wu (<a href="https://twitter.com/chiachih_wu">@chiachih_wu</a>)、Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang:CVE-2016-0804</li><li>Google Pixel C 团队的 David Riley:CVE-2016-0812</li><li>奇虎 360 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/@chengjia4574">@chengjia4574</a>):CVE-2016-0805</li><li>腾讯科恩实验室 (<a href="https://twitter.com/@Flanker_hqd">@keen_lab</a>) 的何淇丹 (<a href="https://twitter.com/keen_lab">@Flanker_hqd</a>):CVE-2016-0811</li><li>趋势科技 (<a href="http://www.trendmicro.com">www.trendmicro.com</a>) 的 Seven Shen (<a href="https://twitter.com/@lingtongshen">@lingtongshen</a>):CVE-2016-0803</li><li>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>):CVE-2016-0808</li><li>Android 安全团队的 Zach Riggle (<a href="https://twitter.com/@ebeip90">@ebeip90</a>):CVE-2016-0807</li></ul>
+  <li>Android 和 Chrome 安全团队:CVE-2016-0809、CVE-2016-0810</li><li>Broadgate 团队:CVE-2016-0801、CVE-2015-0802</li><li><a href="http://www.360safe.com/">奇虎 360</a> 的 <a href="http://c0reteam.org">C0RE 团队</a>的 Chiachih Wu (<a href="https://twitter.com/chiachih_wu">@chiachih_wu</a>)、Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang:CVE-2016-0804
+  </li><li>Google Pixel C 团队的 David Riley:CVE-2016-0812</li><li>奇虎 360 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/@chengjia4574">@chengjia4574</a>):CVE-2016-0805
+  </li><li>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的何淇丹 (<a href="https://twitter.com/@Flanker_hqd">@Flanker_hqd</a>):CVE-2016-0811
+  </li><li>趋势科技 (<a href="http://www.trendmicro.com">www.trendmicro.com</a>) 的 Seven Shen (<a href="https://twitter.com/@lingtongshen">@lingtongshen</a>):CVE-2016-0803
+  </li><li>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>):CVE-2016-0808
+  </li><li>Android 安全团队的 Zach Riggle (<a href="https://twitter.com/@ebeip90">@ebeip90</a>):CVE-2016-0807
+</li></ul>
 
 <h2 id="security_vulnerability_details">安全漏洞详情</h2>
 
@@ -196,7 +202,7 @@
 
 <h3 id="elevation_of_privilege_vulnerability_in_wi-fi">WLAN 中的提权漏洞</h3>
 
-<p>WLAN 组件中的提权漏洞可让本地恶意应用通过系统执行任意代码。不过,只有本地邻近区域中的设备才会受到该漏洞的攻击。由于该漏洞可用于远程获取“<a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">normal</a>”功能,因此我们将其严重程度评为“高”。通常情况下,只有在本地安装的第三方应用才可以获取这些权限。</p>
+<p>WLAN 组件中的提权漏洞可让本地恶意应用通过系统执行任意代码。不过,只有本地邻近区域中的设备才会受到该漏洞的攻击。由于该漏洞可用于远程获取“<a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">normal</a>”权能,因此我们将其严重程度评为“高”。通常情况下,只有在本地安装的第三方应用才可以获取这些权限。</p>
 <table>
  <tbody><tr>
     <th>CVE</th>
diff --git a/zh-cn/security/bulletin/2016-04-02.html b/zh-cn/security/bulletin/2016-04-02.html
index 5f7d70e..e254252 100644
--- a/zh-cn/security/bulletin/2016-04-02.html
+++ b/zh-cn/security/bulletin/2016-04-02.html
@@ -28,7 +28,8 @@
 
 <p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
 
-<p>《<a href="/security/advisory/2016-03-18.html">Android 安全公告 - 2016 年 3 月 18 日</a>》先前讨论过 Root 应用利用 <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1805">CVE-2015-1805</a> 的问题。<a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1805">CVE-2015-1805</a> 已在本次更新中得以解决。我们尚未收到用户因其他新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅<a href="#mitigations">缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 SafetyNet);这些功能可提高 Android 平台的安全性。</p>
+<p>
+《<a href="/security/advisory/2016-03-18.html">Android 安全公告 - 2016 年 3 月 18 日</a>》先前讨论过 Root 应用利用 <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1805">CVE-2015-1805</a> 的问题。<a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1805">CVE-2015-1805</a> 已在本次更新中得以解决。我们尚未收到用户因其他新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅<a href="#mitigations">缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 SafetyNet),这些功能可提高 Android 平台的安全性。</p>
 
 <h2 id="mitigations">缓解措施</h2>
 
@@ -45,7 +46,7 @@
 <p>Android 安全团队非常感谢以下研究人员做出的贡献:</p>
 
 <ul>
-  <li>Google Chrome 安全团队的 Abhishek Arya、Oliver Chang 和 Martin Barbella:CVE-2016-0834、CVE-2016-0841、CVE-2016-0840、CVE-2016-0839、CVE-2016-0838</li><li>CENSUS S.A. 的 Anestis Bechtsoudis (<a href="https://twitter.com/anestisb">@anestisb</a>):CVE-2016-0842、CVE-2016-0836、CVE-2016-0835</li><li>Google Telecom 团队的 Brad Ebinger 和 Santos Cordon:CVE-2016-0847</li><li>布伦瑞克工业大学<a href="https://www.ibr.cs.tu-bs.de">操作系统和计算机网络学院</a>的 Dominik Schürmann:CVE-2016-2425</li><li>奇虎 360 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>)、<a href="http://weibo.com/jfpan">pjf</a> 和 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>):CVE-2016-0844</li><li> <a href="https://www.epfl.ch">École polytechnique fédérale de Lausanne</a> 的 <a href="mailto:[email protected]">George Piskas</a>:CVE-2016-2426</li><li><a href="http://www.360.com/">奇虎 360 科技有限公司</a>的龚广 (<a href="https://twitter.com/oldfresher">@oldfresher</a>):CVE-2016-2412、CVE-2016-2416</li><li>Google Project Zero 的 James Forshaw:CVE-2016-2417、CVE-2016-0846</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>)、<a href="http://weibo.com/jfpan">pjf</a> 和 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>):CVE-2016-2410、CVE-2016-2411</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-2409</li><li>Vertu Corporation LTD 的 Nancy Wang:CVE-2016-0837</li><li> <a href="mailto:[email protected]">Nasim Zamir</a>:CVE-2016-2409</li><li>Qualcomm 产品安全计划的 Nico Golde (<a href="https://twitter.com/iamnion">@iamnion</a>):CVE-2016-2420、CVE-2016-0849</li><li>趋势科技的 Peter Pi (<a href="https://twitter.com/heisecode">@heisecode</a>):CVE-2016-2418、CVE-2016-2413、CVE-2016-2419</li><li>Richard Shupak:CVE-2016-2415</li><li><a href="https://labs.mwrinfosecurity.com/">MWR 实验室</a>的 RomainTrouvé:CVE-2016-0850</li><li>Stuart Henderson:CVE-2016-2422</li><li>Android 安全团队的 Vishwath Mohan:CVE-2016-2424</li><li>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>):CVE-2016-2414</li><li>趋势科技的吴潍浠 (<a href="https://twitter.com/wish_wu">@wish_wu</a>):CVE-2016-0843</li><li> 印第安纳大学布卢明顿分校的 <a href="mailto:[email protected]">Yeonjoon Lee</a> 和 <a href="mailto:[email protected]">Xiaofeng Wang</a>;北京大学的 <a href="mailto:[email protected]">Tongxin Li</a> 和 <a href="mailto:[email protected]">Xinhui Han</a>:CVE-2016-0848</li></ul>
+  <li>Google Chrome 安全团队的 Abhishek Arya、Oliver Chang 和 Martin Barbella:CVE-2016-0834、CVE-2016-0841、CVE-2016-0840、CVE-2016-0839、CVE-2016-0838</li><li>CENSUS S.A. 的 Anestis Bechtsoudis (<a href="https://twitter.com/anestisb">@anestisb</a>):CVE-2016-0842、CVE-2016-0836、CVE-2016-0835</li><li>Google Telecom 团队的 Brad Ebinger 和 Santos Cordon:CVE-2016-0847</li><li>布伦瑞克工业大学<a href="https://www.ibr.cs.tu-bs.de">操作系统和计算机网络学院</a>的 Dominik Schürmann:CVE-2016-2425</li><li>奇虎 360 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>)、<a href="http://weibo.com/jfpan">pjf</a> 和 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>):CVE-2016-0844</li><li> <a href="https://www.epfl.ch">École polytechnique fédérale de Lausanne</a> 的 <a href="mailto:[email protected]">George Piskas</a>:CVE-2016-2426</li><li><a href="http://www.360.com/">奇虎 360 科技有限公司</a>的龚广 (<a href="https://twitter.com/oldfresher">@oldfresher</a>):CVE-2016-2412、CVE-2016-2416</li><li>Google Project Zero 的 James Forshaw:CVE-2016-2417、CVE-2016-0846</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>)、<a href="http://weibo.com/jfpan">pjf</a> 和 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>):CVE-2016-2410、CVE-2016-2411</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-2409</li><li>Vertu Corporation LTD 的 Nancy Wang:CVE-2016-0837</li><li> <a href="mailto:[email protected]">Nasim Zamir</a>:CVE-2016-2409</li><li>Qualcomm 产品安全计划的 Nico Golde (<a href="https://twitter.com/iamnion">@iamnion</a>):CVE-2016-2420、CVE-2016-0849</li><li>趋势科技的 Peter Pi (<a href="https://twitter.com/heisecode">@heisecode</a>):CVE-2016-2418、CVE-2016-2413、CVE-2016-2419</li><li>Richard Shupak:CVE-2016-2415</li><li><a href="https://labs.mwrinfosecurity.com/">MWR 实验室</a>的 Romain Trouvé:CVE-2016-0850</li><li>Stuart Henderson:CVE-2016-2422</li><li>Android 安全团队的 Vishwath Mohan:CVE-2016-2424</li><li>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>):CVE-2016-2414</li><li>趋势科技的吴潍浠 (<a href="https://twitter.com/wish_wu">@wish_wu</a>):CVE-2016-0843</li><li> 印第安纳大学布卢明顿分校的 <a href="mailto:[email protected]">Yeonjoon Lee</a> 和 <a href="mailto:[email protected]">Xiaofeng Wang</a>;北京大学的 <a href="mailto:[email protected]">Tongxin Li</a> 和 <a href="mailto:[email protected]">Xinhui Han</a>:CVE-2016-0848</li></ul>
 
 <p>此外,Android 安全团队还由衷地感谢 <a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Yuan-Tsung Lo</a>、<a href="mailto:[email protected]">Wenke Dou</a>、Chiachih Wu (<a href="https://twitter.com/chiachih_wu">@chiachih_wu</a>) 和 Xuxian Jiang 以及 <a href="https://www.zimperium.com/">Zimperium</a> 对 CVE-2015-1805 做出的贡献。</p>
 
@@ -112,7 +113,7 @@
  </tr>
 </tbody></table>
 
-<p>*针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+<p>* 针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 
 <h3 id="remote_code_execution_vulnerability_in_mediaserver">Mediaserver 中的远程代码执行漏洞</h3>
 
@@ -131,8 +132,7 @@
  </tr>
  <tr>
     <td>CVE-2016-0835</td>
-    <td><a href="https://android.googlesource.com/platform/external/libmpeg2/+/ba604d336b40fd4bde1622f64d67135bdbd61301">ANDROID-26070014</a>
-[<a href="https://android.googlesource.com/platform/external/libmpeg2/+/58a6822d7140137ce957c6d2fc20bae1374186c1">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/external/libmpeg2/+/ba604d336b40fd4bde1622f64d67135bdbd61301">ANDROID-26070014</a> [<a href="https://android.googlesource.com/platform/external/libmpeg2/+/58a6822d7140137ce957c6d2fc20bae1374186c1">2</a>]</td>
     <td>严重</td>
     <td>6.0、6.0.1</td>
     <td>2015 年 12 月 6 日</td>
@@ -153,8 +153,7 @@
  </tr>
  <tr>
     <td>CVE-2016-0838</td>
-    <td><a href="https://android.googlesource.com/platform/external/sonivox/+/3ac044334c3ff6a61cb4238ff3ddaf17c7efcf49">ANDROID-26366256</a>
-[<a href="https://android.googlesource.com/platform/external/sonivox/+/24d7c408c52143bce7b49de82f3913fd8d1219cf">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/external/sonivox/+/3ac044334c3ff6a61cb4238ff3ddaf17c7efcf49">ANDROID-26366256</a> [<a href="https://android.googlesource.com/platform/external/sonivox/+/24d7c408c52143bce7b49de82f3913fd8d1219cf">2</a>]</td>
     <td>严重</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1</td>
     <td>Google 内部</td>
@@ -227,7 +226,7 @@
     <td>2016 年 2 月 19 日</td>
  </tr>
 </tbody></table>
-<p>*AOSP 中的补丁程序适用于特定的内核版本:<a href="https://android.googlesource.com/kernel/common/+/bf010e99c9bc48002f6bfa1ad801a59bf996270f">3.14</a>、<a href="https://android.googlesource.com/kernel/common/+/4a5a45669796c5b4617109182e25b321f9f00beb">3.10</a> 和 <a href="https://android.googlesource.com/kernel/common/+/f7ebfe91b806501808413c8473a300dff58ddbb5">3.4</a>。</p>
+<p>* AOSP 中的补丁程序适用于特定的内核版本:<a href="https://android.googlesource.com/kernel/common/+/bf010e99c9bc48002f6bfa1ad801a59bf996270f">3.14</a>、<a href="https://android.googlesource.com/kernel/common/+/4a5a45669796c5b4617109182e25b321f9f00beb">3.10</a> 和 <a href="https://android.googlesource.com/kernel/common/+/f7ebfe91b806501808413c8473a300dff58ddbb5">3.4</a>。</p>
 
 <h3 id="elevation_of_privilege_vulnerability_in_qualcomm_performance_module">Qualcomm 效能模块中的提权漏洞</h3>
 
@@ -249,7 +248,7 @@
  </tr>
 </tbody></table>
 
-<p>*针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+<p>* 针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 
 <h3 id="elevation_of_privilege_in_qualcomm_rf_component">Qualcomm RF 组件中的提权漏洞</h3>
 
@@ -286,17 +285,7 @@
  </tr>
  <tr>
     <td>CVE-2014-9322</td>
-    <td><a href="https://android.googlesource.com/kernel/common/+/c22e479e335628ce8766cfbf06e2ba17e8f9a1bb">ANDROID-26927260</a>
-    [<a href="https://android.googlesource.com/kernel/common/+/1b627d4e5e61e89b840f77abb3ca6711ad6ffbeb">2</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/4c941665c7368a34b146929b31949555e680a4ee">3</a>]<br />
-    [<a href="https://android.googlesource.com/kernel/common/+/758f0dac9104b46016af98304656a0268ac3e105">4</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/44d057a37868a60bc2eb6e7d1dcea701f234d56a">5</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/b9b9f908c8ae82b73b9d75181982028b6bc06c2b">6</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/e068734f9e7344997a61022629b92d142a985ab3">7</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/fdc6c1052bc7d89a5826904fbb4318677e8442ce">8</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/211d59c0034ec9d88690c750ccd6da27f6952dc5">9</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/c9e31d5a4747e9967ace6d05896c78516c4c0850">10</a>]
-    [<a href="https://android.googlesource.com/kernel/common/+/e01834bfbafd25fd392bf10014451c4e5f34f829">11</a>]</td>
+    <td><a href="https://android.googlesource.com/kernel/common/+/c22e479e335628ce8766cfbf06e2ba17e8f9a1bb">ANDROID-26927260</a> [<a href="https://android.googlesource.com/kernel/common/+/1b627d4e5e61e89b840f77abb3ca6711ad6ffbeb">2</a>] [<a href="https://android.googlesource.com/kernel/common/+/4c941665c7368a34b146929b31949555e680a4ee">3</a>]<br />[<a href="https://android.googlesource.com/kernel/common/+/758f0dac9104b46016af98304656a0268ac3e105">4</a>] [<a href="https://android.googlesource.com/kernel/common/+/44d057a37868a60bc2eb6e7d1dcea701f234d56a">5</a>] [<a href="https://android.googlesource.com/kernel/common/+/b9b9f908c8ae82b73b9d75181982028b6bc06c2b">6</a>] [<a href="https://android.googlesource.com/kernel/common/+/e068734f9e7344997a61022629b92d142a985ab3">7</a>] [<a href="https://android.googlesource.com/kernel/common/+/fdc6c1052bc7d89a5826904fbb4318677e8442ce">8</a>] [<a href="https://android.googlesource.com/kernel/common/+/211d59c0034ec9d88690c750ccd6da27f6952dc5">9</a>] [<a href="https://android.googlesource.com/kernel/common/+/c9e31d5a4747e9967ace6d05896c78516c4c0850">10</a>] [<a href="https://android.googlesource.com/kernel/common/+/e01834bfbafd25fd392bf10014451c4e5f34f829">11</a>]</td>
     <td>严重</td>
     <td>6.0、6.0.1</td>
     <td>2015 年 12 月 25 日</td>
@@ -336,17 +325,17 @@
  </tr>
  <tr>
     <td>CVE-2016-0847</td>
-    <td><a href="https://android.googlesource.com/platform/packages/services/Telecomm/+/2750faaa1ec819eed9acffea7bd3daf867fda444">ANDROID-26864502</a>
-[<a href="https://android.googlesource.com/platform/packages/services/Telephony/+/a294ae5342410431a568126183efe86261668b5d">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/packages/services/Telecomm/+/2750faaa1ec819eed9acffea7bd3daf867fda444">ANDROID-26864502</a> [<a href="https://android.googlesource.com/platform/packages/services/Telephony/+/a294ae5342410431a568126183efe86261668b5d">2</a>]</td>
     <td>高</td>
     <td>5.0.2、5.1.1、6.0、6.0.1</td>
     <td>Google 内部</td>
  </tr>
 </tbody></table>
 
-<h3 id="elevation_of_privilege_vulnerability_in_download_manager">下载管理器中的提权漏洞</h3>
+<h3 id="elevation_of_privilege_vulnerability_in_download_manager">
+内容下载管理器中的提权漏洞</h3>
 
-<p>下载管理器中的提权漏洞可让攻击者获取对私人存储空间中未经授权文件的访问权限。由于该漏洞可用于获取第三方应用无法获取的特权(如 <a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">Signature</a> 或 <a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">SignatureOrSystem</a> 权限)的本地使用权限,因此我们将其严重程度评为“高”。</p>
+<p>内容下载管理器中的提权漏洞可让攻击者获取对私人存储空间中未经授权文件的访问权限。由于该漏洞可用于获取第三方应用无法获取的特权(如 <a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">Signature</a> 或 <a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">SignatureOrSystem</a> 权限)的本地使用权限,因此我们将其严重程度评为“高”。</p>
 
 <table>
  <tbody><tr>
@@ -424,9 +413,10 @@
     <td>2015 年 12 月 25 日</td>
  </tr>
 </tbody></table>
-<p>*针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+<p>* 针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 
-<h3 id="elevation_of_privilege_vulnerability_in_qualcomm_video_kernel_driver">Qualcomm 视频内核驱动程序中的提权漏洞</h3>
+<h3 id="elevation_of_privilege_vulnerability_in_qualcomm_video_kernel_driver">
+Qualcomm 视频内核驱动程序中的提权漏洞</h3>
 
 <p>Qualcomm 视频内核驱动程序中有一项提权漏洞,本地恶意应用可利用这项漏洞通过内核执行任意代码。通常,我们会将内核代码执行漏洞的严重程度评为“严重”,但由于该漏洞需要先破坏能够调用驱动程序的服务,因此我们将其严重程度改评为“高”。</p>
 <table>
@@ -445,9 +435,10 @@
     <td>2015 年 12 月 21 日</td>
  </tr>
 </tbody></table>
-<p>*针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+<p>* 针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 
-<h3 id="elevation_of_privilege_vulnerability_in_qualcomm_power_management_component">Qualcomm 电源管理组件中的提权漏洞</h3>
+<h3 id="elevation_of_privilege_vulnerability_in_qualcomm_power_management_component">
+Qualcomm 电源管理组件中的提权漏洞</h3>
 
 <p>Qualcomm 电源管理内核驱动程序中有一项提权漏洞,本地恶意应用可利用这项漏洞通过内核执行任意代码。通常,我们会将此类内核代码执行 Bug 的严重程度评为“严重”,但由于该漏洞需要先破坏设备并将权限提升为 root,因此我们将其严重程度改评为“高”。</p>
 <table>
@@ -466,9 +457,10 @@
     <td>2016 年 1 月 28 日</td>
  </tr>
 </tbody></table>
-<p>*针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
+<p>* 针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 
-<h3 id="elevation_of_privilege_vulnerability_in_system_server">System_server 中的提权漏洞</h3>
+<h3 id="elevation_of_privilege_vulnerability_in_system_server">
+System_server 中的提权漏洞</h3>
 
 <p>System_server 中的提权漏洞可让本地恶意应用通过提权后的系统应用执行任意代码。由于该漏洞可用于获取第三方应用无法获取的特权(如 <a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">Signature</a> 或 <a href="http://developer.android.com/guide/topics/manifest/permission-element.html#plevel">SignatureOrSystem</a> 权限),因此我们将其严重程度评为“高”。</p>
 <table>
@@ -521,15 +513,15 @@
  </tr>
  <tr>
     <td>CVE-2016-2414</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/minikin/+/ca8ac8acdad662230ae37998c6c4091bb39402b6">ANDROID-26413177</a>
-[<a href="https://android.googlesource.com/platform/frameworks/minikin/+/f4785aa1947b8d22d5b19559ef1ca526d98e0e73">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/minikin/+/ca8ac8acdad662230ae37998c6c4091bb39402b6">ANDROID-26413177</a> [<a href="https://android.googlesource.com/platform/frameworks/minikin/+/f4785aa1947b8d22d5b19559ef1ca526d98e0e73">2</a>]</td>
     <td>高</td>
     <td>5.0.2、5.1.1、6.0、6.0.1</td>
     <td>2015 年 11 月 3 日</td>
  </tr>
 </tbody></table>
 
-<h3 id="information_disclosure_vulnerability_in_exchange_activesync">Exchange ActiveSync 中的信息披露漏洞</h3>
+<h3 id="information_disclosure_vulnerability_in_exchange_activesync">
+Exchange ActiveSync 中的信息披露漏洞</h3>
 
 <p>Exchange ActiveSync 中的信息披露漏洞可让本地恶意应用获取对用户隐私信息的访问权限。由于该漏洞可用于远程访问受保护的数据,因此我们将其严重程度评为“高”。</p>
 <table>
@@ -562,8 +554,7 @@
  </tr>
  <tr>
     <td>CVE-2016-2416</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/native/+/85d253fab5e2c01bd90990667c6de25c282fc5cd">ANDROID-27046057</a>
-[<a href="https://android.googlesource.com/platform/frameworks/native/+/a40b30f5c43726120bfe69d41ff5aeb31fe1d02a">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/native/+/85d253fab5e2c01bd90990667c6de25c282fc5cd">ANDROID-27046057</a> [<a href="https://android.googlesource.com/platform/frameworks/native/+/a40b30f5c43726120bfe69d41ff5aeb31fe1d02a">2</a>]</td>
     <td>高</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1</td>
     <td>2016 年 2 月 5 日</td>
@@ -604,15 +595,15 @@
  </tr>
  <tr>
     <td>CVE-2016-2420</td>
-    <td><a href="https://android.googlesource.com/platform/system/core/+/669ecc2f5e80ff924fa20ce7445354a7c5bcfd98">ANDROID-26403620</a>
-[<a href="https://android.googlesource.com/platform/system/core/+/81df1cc77722000f8d0025c1ab00ced123aa573c">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/system/core/+/669ecc2f5e80ff924fa20ce7445354a7c5bcfd98">ANDROID-26403620</a> [<a href="https://android.googlesource.com/platform/system/core/+/81df1cc77722000f8d0025c1ab00ced123aa573c">2</a>]</td>
     <td>中</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1</td>
     <td>2016 年 1 月 5 日</td>
  </tr>
 </tbody></table>
 
-<h3 id="elevation_of_privilege_vulnerability_in_setup_wizard">设置向导中的提权漏洞</h3>
+<h3 id="elevation_of_privilege_vulnerability_in_setup_wizard">
+设置向导中的提权漏洞</h3>
 
 <p>设置向导中的漏洞可让攻击者绕过“恢复出厂设置保护”机制,并获取对设备的访问权限。由于该漏洞可让实际拿到设备的人绕过“恢复出厂设置保护”机制,从而使攻击者可以成功重置设备并清除所有数据,因此我们将其严重程度评为“中”。</p>
 <table>
@@ -721,7 +712,7 @@
  </tr>
 </tbody></table>
 
-<p>*针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制版本中包含相应更新。</p>
+<p>* 针对该问题的补丁程序未在 AOSP 中发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制版本中包含相应更新。</p>
 
 <h3 id="information_disclosure_vulnerability_in_framework">Framework 中的信息披露漏洞</h3>
 
@@ -751,19 +742,18 @@
 
 <p>2016 年 4 月 2 日(或之后)的安全补丁程序级别均已解决本文所列的这些问题(请参阅 <a href="https://support.google.com/nexus/answer/4457705">Nexus 文档</a>中提供的相关说明,了解如何检查安全补丁程序级别)。提供这些更新的设备制造商应将补丁程序字符串级别设为 [ro.build.version.security_patch]:[2016-04-02]</p>
 
-<p><strong>2. 为什么此安全补丁程序级别是 2016 年 4 月 2 日?
-</strong></p>
+<p><strong>2. 为什么此安全补丁程序级别是 2016 年 4 月 2 日?</strong></p>
 
-<p>通常情况下,每月安全更新的安全补丁程序级别会设置为当月的第一天。以 4 月为例,2016 年 4 月 1 日的安全补丁程序级别表示,本公告中所列问题均已得到解决(CVE-2015-1805 除外,如 <a href="/security/advisory/2016-03-18.html">Android 安全公告 - 2016 年 3 月 18 日</a>中所述)。2016 年 4 月 2 日的安全补丁程序级别表示,本公告中所列问题均已得到解决(包括 CVE-2015-1805,如 <a href="/security/advisory/2016-03-18.html">Android 安全公告 - 2016 年 3 月 18 日</a>中所述)。</p>
+<p>通常情况下,每月安全更新的安全补丁程序级别会设置为当月的第一天。以 4 月为例,2016 年 4 月 1 日的安全补丁程序级别表示,本公告中所列问题均已得到解决(CVE-2015-1805 除外,如 <a href="/security/advisory/2016-03-18.html">Android 安全公告 - 2016 年 3 月 18 日</a>中所述)。2016 年 4 月 2 日的安全补丁程序级别表示,本公告中所列问题均已得到解决(包括 CVE-2015-1805,如《<a href="/security/advisory/2016-03-18.html">Android 安全公告 - 2016 年 3 月 18 日</a>》中所述)。</p>
 
 <h2 id="revisions">修订版本</h2>
 
 <ul>
   <li>2016 年 4 月 4 日:发布了本公告。
-  </li><li>2016 年 4 月 6 日:修订了本公告,添加了多个 AOSP 链接。
+  </li><li>2016 年 4 月 6 日:修订了本公告,添加了 AOSP 链接。
   </li><li>2016 年 4 月 7 日:修订了本公告,添加了一个额外的 AOSP 链接。
   </li><li>2016 年 7 月 11 日:更新了 CVE-2016-2427 的说明。
-  </li><li>2016 年 8 月 1 日:更新了 CVE-2016-2427 的说明。</li><li>2016 年 12 月 19 日:更新了本公告,移除了之前恢复的 CVE-2016-2427。
+  </li><li>2016 年 8 月 1 日:更新了 CVE-2016-2427 的说明</li><li>2016 年 12 月 19 日:更新了本公告,移除了之前恢复的 CVE-2016-2427。
 </li></ul>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/security/bulletin/2016-06-01.html b/zh-cn/security/bulletin/2016-06-01.html
index 99e5f87..9c5c29a 100644
--- a/zh-cn/security/bulletin/2016-06-01.html
+++ b/zh-cn/security/bulletin/2016-06-01.html
@@ -50,7 +50,8 @@
   <li>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>):CVE-2016-2468
   </li><li> <a href="http://bits-please.blogspot.com">Gal Beniamini</a> (<a href="https://twitter.com/laginimaineb">@laginimaineb</a>):CVE-2016-2476
   </li><li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>)、pjf (<a href="http://weibo.com/jfpan">weibo.com/jfpan</a>):CVE-2016-2492
-  </li><li>奇虎 360 科技有限公司移动安全团队的 Hao Chen、Guang Gong 和 Wenlin Yang:CVE-2016-2470、CVE-2016-2471、CVE-2016-2472、CVE-2016-2473、CVE-2016-2498</li><li> <a href="http://www.iwobanas.com">Iwo Banas</a>:CVE-2016-2496</li><li>奇虎 360 科技有限公司 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 pjf (<a href="http://weibo.com/jfpan">weibo.com/jfpan</a>):CVE-2016-2490、CVE-2016-2491
+  </li><li>奇虎 360 科技有限公司移动安全团队的 Hao Chen、Guang Gong 和 Wenlin Yang:CVE-2016-2470、CVE-2016-2471、CVE-2016-2472、CVE-2016-2473、CVE-2016-2498</li><li> <a href="http://www.iwobanas.com">Iwo Banas</a>:CVE-2016-2496
+  </li><li>奇虎 360 科技有限公司 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 pjf (<a href="http://weibo.com/jfpan">weibo.com/jfpan</a>):CVE-2016-2490、CVE-2016-2491
   </li><li>Google 的 Lee Campbell:CVE-2016-2500</li><li>Google 安全团队的 Maciej Szawłowski:CVE-2016-2474</li><li>Google 的 Marco Nelissen 和 Max Spector:CVE-2016-2487</li><li>Google Project Zero 的 Mark Brand:CVE-2016-2494</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)、Chiachih Wu (<a href="https://twitter.com/chiachih_wu">@chiachih_wu</a>) 和 Xuxian Jiang:CVE-2016-2477、CVE-2016-2478、CVE-2016-2479、CVE-2016-2480、CVE-2016-2481、CVE-2016-2482、CVE-2016-2483、CVE-2016-2484、CVE-2016-2485、CVE-2016-2486
   </li><li> <a href="mailto:[email protected]">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2016-2066、CVE-2016-2061、CVE-2016-2465、CVE-2016-2469、CVE-2016-2489
   </li><li>Vasily Vasilev:CVE-2016-2463</li><li>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>):CVE-2016-2495</li><li>腾讯安全平台部门的 Xiling Gong:CVE-2016-2499</li><li>Android 安全团队的 Zach Riggle (<a href="https://twitter.com/ebeip90">@ebeip90</a>):CVE-2016-2493</li></ul>
@@ -113,7 +114,9 @@
  </tr>
  <tr>
     <td>CVE-2016-2464</td>
-    <td><a href="https://android.googlesource.com/platform/external/libvpx/+/cc274e2abe8b2a6698a5c47d8aa4bb45f1f9538d">23167726</a> [<a href="https://android.googlesource.com/platform/external/libvpx/+/65c49d5b382de4085ee5668732bcb0f6ecaf7148">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/external/libvpx/+/cc274e2abe8b2a6698a5c47d8aa4bb45f1f9538d">23167726</a>
+       [<a href="https://android.googlesource.com/platform/external/libvpx/+/65c49d5b382de4085ee5668732bcb0f6ecaf7148">2</a>]
+    </td>
     <td>严重</td>
     <td><a href="#nexus_devices">所有 Nexus 设备</a></td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1</td>
@@ -341,7 +344,11 @@
  </tr>
  <tr>
     <td>CVE-2016-2476</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/295c883fe3105b19bcd0f9e07d54c6b589fc5bff">27207275</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/94d9e646454f6246bf823b6897bd6aea5f08eda3">2</a>] [<a href="https://android.googlesource.com/platform/frameworks/av/+/0bb5ced60304da7f61478ffd359e7ba65d72f181">3</a>] [<a href="https://android.googlesource.com/platform/frameworks/av/+/db829699d3293f254a7387894303451a91278986">4</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/295c883fe3105b19bcd0f9e07d54c6b589fc5bff">27207275</a>
+       [<a href="https://android.googlesource.com/platform/frameworks/av/+/94d9e646454f6246bf823b6897bd6aea5f08eda3">2</a>]
+       [<a href="https://android.googlesource.com/platform/frameworks/av/+/0bb5ced60304da7f61478ffd359e7ba65d72f181">3</a>]
+       [<a href="https://android.googlesource.com/platform/frameworks/av/+/db829699d3293f254a7387894303451a91278986">4</a>]
+    </td>
     <td>高</td>
     <td><a href="#nexus_devices">所有 Nexus 设备</a></td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1</td>
@@ -439,7 +446,10 @@
  </tr>
  <tr>
     <td>CVE-2016-2487</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/918eeaa29d99d257282fafec931b4bda0e3bae12">27833616</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/d2f47191538837e796e2b10c1ff7e1ee35f6e0ab">2</a>] [<a href="https://android.googlesource.com/platform/frameworks/av/+/4e32001e4196f39ddd0b86686ae0231c8f5ed944">3</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/918eeaa29d99d257282fafec931b4bda0e3bae12">27833616</a>
+       [<a href="https://android.googlesource.com/platform/frameworks/av/+/d2f47191538837e796e2b10c1ff7e1ee35f6e0ab">2</a>]
+       [<a href="https://android.googlesource.com/platform/frameworks/av/+/4e32001e4196f39ddd0b86686ae0231c8f5ed944">3</a>]
+    </td>
     <td>高</td>
     <td><a href="#nexus_devices">所有 Nexus 设备</a></td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1</td>
@@ -710,7 +720,9 @@
  </tr>
  <tr>
     <td>CVE-2016-2495</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/45737cb776625f17384540523674761e6313e6d4">28076789</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/b57b3967b1a42dd505dbe4fcf1e1d810e3ae3777">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/45737cb776625f17384540523674761e6313e6d4">28076789</a>
+       [<a href="https://android.googlesource.com/platform/frameworks/av/+/b57b3967b1a42dd505dbe4fcf1e1d810e3ae3777">2</a>]
+    </td>
     <td>高</td>
     <td><a href="#nexus_devices">所有 Nexus 设备</a></td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1</td>
@@ -739,7 +751,10 @@
  </tr>
  <tr>
     <td>CVE-2016-2496</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/native/+/03a53d1c7765eeb3af0bc34c3dff02ada1953fbf">26677796</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/613f63b938145bb86cd64fe0752eaf5e99b5f628">2</a>] [<a href="https://android.googlesource.com/platform/packages/apps/PackageInstaller/+/2068c7997265011ddc5e4dfa3418407881f7f81e">3</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/native/+/03a53d1c7765eeb3af0bc34c3dff02ada1953fbf">26677796</a>
+       [<a href="https://android.googlesource.com/platform/frameworks/base/+/613f63b938145bb86cd64fe0752eaf5e99b5f628">2</a>]
+       [<a href="https://android.googlesource.com/platform/packages/apps/PackageInstaller/+/2068c7997265011ddc5e4dfa3418407881f7f81e">3</a>]
+    </td>
     <td>中</td>
     <td><a href="#nexus_devices">所有 Nexus 设备</a></td>
     <td>6.0、6.1</td>
diff --git a/zh-cn/security/bulletin/2016-09-01.html b/zh-cn/security/bulletin/2016-09-01.html
index 61223f1..3993278 100644
--- a/zh-cn/security/bulletin/2016-09-01.html
+++ b/zh-cn/security/bulletin/2016-09-01.html
@@ -31,7 +31,8 @@
 我们的合作伙伴在 2016 年 8 月 5 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序(如果适用)。本公告还提供了 AOSP 之外的补丁程序的链接。
 </p>
 
-<p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。
+<p>
+这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。
 </p>
 
 <p>
@@ -126,8 +127,7 @@
   </tr>
   <tr>
    <td>CVE-2016-3861</td>
-   <td><a href="https://android.googlesource.com/platform/system/core/+/ecf5fd58a8f50362ce9e8d4245a33d56f29f142b">
-       A-29250543</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/3944c65637dfed14a5a895685edfa4bacaf9f76e">2</a>] [<a href="https://android.googlesource.com/platform/frameworks/base/+/866dc26ad4a98cc835d075b627326e7d7e52ffa1">3</a>] [<a href="https://android.googlesource.com/platform/frameworks/native/+/1f4b49e64adf4623eefda503bca61e253597b9bf">4</a>]
+   <td><a href="https://android.googlesource.com/platform/system/core/+/ecf5fd58a8f50362ce9e8d4245a33d56f29f142b">A-29250543</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/3944c65637dfed14a5a895685edfa4bacaf9f76e">2</a>] [<a href="https://android.googlesource.com/platform/frameworks/base/+/866dc26ad4a98cc835d075b627326e7d7e52ffa1">3</a>] [<a href="https://android.googlesource.com/platform/frameworks/native/+/1f4b49e64adf4623eefda503bca61e253597b9bf">4</a>]
    </td>
    <td>严重</td>
    <td>所有 Nexus 设备</td>
diff --git a/zh-cn/security/bulletin/2016.html b/zh-cn/security/bulletin/2016.html
index ea927cb..f480b35 100644
--- a/zh-cn/security/bulletin/2016.html
+++ b/zh-cn/security/bulletin/2016.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>本页面列出了我们已发布的所有 2016 Android 安全公告。如需所有公告的列表,请参阅 <a href="index.html">Android 安全公告</a>主页。</p>
+<p>本页面列出了我们已发布的所有 2016 Android 安全公告。如需所有公告的列表,请参阅 <a href="index.html">Android 安全公告</a>首页。</p>
 
 <table>
   <colgroup><col width="15%" />
@@ -36,7 +36,7 @@
  <tr>
     <td><a href="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>
@@ -44,7 +44,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>
@@ -52,7 +52,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>
@@ -60,7 +60,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>
@@ -68,7 +68,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>
@@ -76,7 +76,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>
@@ -84,7 +84,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>
@@ -92,7 +92,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>
@@ -100,7 +100,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-01.html?hl=ja">日本語</a>/<a href="/security/bulletin/2016-04-01.html?hl=ko">한국어</a>/<a href="/security/bulletin/2016-04-01.html?hl=ru">ру́сский</a>/<a href="/security/bulletin/2016-04-01.html?hl=zh-cn">中文(中国)</a>/<a href="/security/bulletin/2016-04-01.html?hl=zh-tw">中文 (台灣)</a>
+      <a href="/security/bulletin/2016-04-02.html">English</a>/<a href="/security/bulletin/2016-04-01.html?hl=ja">日本語</a>/<a href="/security/bulletin/2016-04-01.html?hl=ko">한국어</a>/<a href="/security/bulletin/2016-04-01.html?hl=ru">ру́сский</a>/<a href="/security/bulletin/2016-04-01.html?hl=zh-cn">中文(中国)</a>/<a href="/security/bulletin/2016-04-01.html?hl=zh-tw">中文(台灣)</a>
     </td>
     <td>2016 年 4 月 4 日</td>
     <td>2016-04-02</td>
@@ -108,7 +108,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>
@@ -116,7 +116,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>
@@ -124,7 +124,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>
diff --git a/zh-cn/security/bulletin/2017-03-01.html b/zh-cn/security/bulletin/2017-03-01.html
index 4c5f271..898d74e 100644
--- a/zh-cn/security/bulletin/2017-03-01.html
+++ b/zh-cn/security/bulletin/2017-03-01.html
@@ -22,9 +22,9 @@
 
 <p><em>发布时间:2017 年 3 月 6 日 | 更新时间:2017 年 3 月 7 日</em></p>
 <p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。除了公告之外,我们还通过无线下载 (OTA) 更新的方式发布了针对 Google 设备的安全更新。我们还在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布了 Google 设备固件映像。2017 年 3 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。请参阅 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>,了解如何检查设备的安全补丁程序级别。</p>
-<p>我们的合作伙伴在 2017 年 2 月 6 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
+<p>我们的合作伙伴在 2017 年 2 月 6 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开源项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
 <p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
-<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google 服务缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 <a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a>);这些功能可提高 Android 平台的安全性。</p>
+<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google 服务缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 <a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a>),这些功能可提高 Android 平台的安全性。</p>
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 <h2 id="announcements">公告</h2>
 <ul>
@@ -138,30 +138,27 @@
   <tr>
    <td>CVE-2017-0466</td>
    <td><a href="https://android.googlesource.com/platform/external/libavc/+/c4f152575bd6d8cc6db1f89806e2ba1fd1bb314f">A-33139050</a>
-[<a href="https://android.googlesource.com/platform/external/libavc/+/ec9ab83ac437d31f484a86643e2cc66db8efae4c">2</a>]
-   </td>
+[<a href="https://android.googlesource.com/platform/external/libavc/+/ec9ab83ac437d31f484a86643e2cc66db8efae4c">2</a>]</td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 11 月 25 日</td>
   </tr>
   <tr>
    <td>CVE-2017-0467</td>
    <td><a href="https://android.googlesource.com/platform/external/libavc/+/c4f152575bd6d8cc6db1f89806e2ba1fd1bb314f">A-33250932</a>
-[<a href="https://android.googlesource.com/platform/external/libavc/+/fd9a12f9fdd9dd3e66c59dd7037e864b948085f7">2</a>]
-   </td>
+[<a href="https://android.googlesource.com/platform/external/libavc/+/fd9a12f9fdd9dd3e66c59dd7037e864b948085f7">2</a>]</td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 11 月 30 日</td>
   </tr>
   <tr>
    <td>CVE-2017-0468</td>
    <td><a href="https://android.googlesource.com/platform/external/libavc/+/0e8b1dff88e08b9d738d2360f05b96108e190995">A-33351708</a>
-   [<a href="https://android.googlesource.com/platform/external/libavc/+/fd9a12f9fdd9dd3e66c59dd7037e864b948085f7">2</a>]
-   </td>
+[<a href="https://android.googlesource.com/platform/external/libavc/+/fd9a12f9fdd9dd3e66c59dd7037e864b948085f7">2</a>]</td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 12 月 5 日</td>
   </tr>
@@ -169,7 +166,7 @@
    <td>CVE-2017-0469</td>
    <td><a href="https://android.googlesource.com/platform/external/libavc/+/21851eaecc814be709cb0c20f732cb858cfe1440">A-33450635</a></td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 12 月 8 日</td>
   </tr>
@@ -177,7 +174,7 @@
    <td>CVE-2017-0470</td>
    <td><a href="https://android.googlesource.com/platform/external/libavc/+/6aac82003d665708b4e21e9b91693b642e2fa64f">A-33818500</a></td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 12 月 21 日</td>
   </tr>
@@ -185,7 +182,7 @@
    <td>CVE-2017-0471</td>
    <td><a href="https://android.googlesource.com/platform/external/libavc/+/4a61d15e7b0ab979ba7e80db8ddbde025c1ce6cc">A-33816782</a></td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 12 月 21 日</td>
   </tr>
@@ -193,7 +190,7 @@
    <td>CVE-2017-0472</td>
    <td><a href="https://android.googlesource.com/platform/external/libhevc/+/dfa7251ff270ae7e12a019e6735542e36b2a47e0">A-33862021</a></td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 12 月 23 日</td>
   </tr>
@@ -201,7 +198,7 @@
    <td>CVE-2017-0473</td>
    <td><a href="https://android.googlesource.com/platform/external/libavc/+/0a4463e2beddb8290e05ad552e48b17686f854ce">A-33982658</a></td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>6.0、6.0.1、7.0、7.1.1</td>
    <td>2016 年 12 月 30 日</td>
   </tr>
@@ -209,7 +206,7 @@
    <td>CVE-2017-0474</td>
    <td><a href="https://android.googlesource.com/platform/external/libvpx/+/6f5927de29337fa532c64d0ef8c7cb68f7c89889">A-32589224</a></td>
    <td>严重</td>
-   <td>全部</td>
+   <td>所有</td>
    <td>7.0、7.1.1</td>
    <td>Google 内部</td>
   </tr>
@@ -265,7 +262,7 @@
     <td>CVE-2017-0476</td>
     <td><a href="https://android.googlesource.com/platform/packages/apps/Messaging/+/8ba22b48ebff50311d7eaa8d512f9d507f0bdd0d">A-33388925</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 12 月 6 日</td>
   </tr>
@@ -293,7 +290,7 @@
     <td>CVE-2017-0477</td>
    <td><a href="https://android.googlesource.com/platform/external/libgdx/+/fba04a52f43315cdb7dd38766822af0324eab7c5">A-33621647</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>7.1.1</td>
     <td>2016 年 12 月 14 日</td>
   </tr>
@@ -321,7 +318,7 @@
     <td>CVE-2017-0478</td>
     <td><a href="https://android.googlesource.com/platform/frameworks/ex/+/7c824f17b3eea976ca58be7ea097cb807126f73b">A-33718716</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 12 月 16 日</td>
   </tr>
@@ -349,7 +346,7 @@
     <td>CVE-2017-0481</td>
     <td><a href="https://android.googlesource.com/platform/external/libnfc-nci/+/c67cc6ad2addddcb7185a33b08d27290ce54e350">A-33434992</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 6 日</td>
   </tr>
@@ -375,23 +372,19 @@
   </tr>
   <tr>
     <td>CVE-2017-0479</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/22e26d8ee73488c58ba3e7928e5da155151abfd0">
-       A-32707507</a>
-[<a href="https://android.googlesource.com/platform/frameworks/av/+/8415635765380be496da9b4578d8f134a527d86b">2</a>]
-   </td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/22e26d8ee73488c58ba3e7928e5da155151abfd0">A-32707507</a>
+[<a href="https://android.googlesource.com/platform/frameworks/av/+/8415635765380be496da9b4578d8f134a527d86b">2</a>]</td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 7 日</td>
   </tr>
   <tr>
     <td>CVE-2017-0480</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/22e26d8ee73488c58ba3e7928e5da155151abfd0">
-       A-32705429</a>
-[<a href="https://android.googlesource.com/platform/frameworks/av/+/8415635765380be496da9b4578d8f134a527d86b">2</a>]
-   </td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/22e26d8ee73488c58ba3e7928e5da155151abfd0">A-32705429</a>
+[<a href="https://android.googlesource.com/platform/frameworks/av/+/8415635765380be496da9b4578d8f134a527d86b">2</a>]</td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 7 日</td>
   </tr>
@@ -417,35 +410,32 @@
   </tr>
   <tr>
     <td>CVE-2017-0482</td>
-    <td><a href="https://android.googlesource.com/platform/external/libavc/+/ec9ab83ac437d31f484a86643e2cc66db8efae4c">
-        A-33090864</a>
+    <td><a href="https://android.googlesource.com/platform/external/libavc/+/ec9ab83ac437d31f484a86643e2cc66db8efae4c">A-33090864</a>
 [<a href="https://android.googlesource.com/platform/external/libavc/+/0e8b1dff88e08b9d738d2360f05b96108e190995">2</a>]
 [<a href="https://android.googlesource.com/platform/external/libavc/+/a467b1fb2956fdcee5636ab63573a4bca8150dbe">3</a>]
 [<a href="https://android.googlesource.com/platform/external/libavc/+/3695b6bdaa183bb2852da06b63ebd5b9c2cace36">4</a>]
 [<a href="https://android.googlesource.com/platform/external/libavc/+/c4f152575bd6d8cc6db1f89806e2ba1fd1bb314f">5</a>]
 [<a href="https://android.googlesource.com/platform/external/libavc/+/fd9a12f9fdd9dd3e66c59dd7037e864b948085f7">6</a>]</td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 22 日</td>
   </tr>
   <tr>
     <td>CVE-2017-0483</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/bc62c086e9ba7530723dc8874b83159f4d77d976">
-        A-33137046</a>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/bc62c086e9ba7530723dc8874b83159f4d77d976">A-33137046</a>
 [<a href="https://android.googlesource.com/platform/frameworks/av/+/5cabe32a59f9be1e913b6a07a23d4cfa55e3fb2f">2</a>]</td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 24 日</td>
   </tr>
   <tr>
     <td>CVE-2017-0484</td>
-    <td><a href="https://android.googlesource.com/platform/external/libavc/+/fd9a12f9fdd9dd3e66c59dd7037e864b948085f7">
-        A-33298089</a>
+    <td><a href="https://android.googlesource.com/platform/external/libavc/+/fd9a12f9fdd9dd3e66c59dd7037e864b948085f7">A-33298089</a>
 [<a href="https://android.googlesource.com/platform/external/libavc/+/a467b1fb2956fdcee5636ab63573a4bca8150dbe">2</a>]</td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 12 月 1 日</td>
   </tr>
@@ -453,7 +443,7 @@
     <td>CVE-2017-0485</td>
     <td><a href="https://android.googlesource.com/platform/external/libavc/+/3695b6bdaa183bb2852da06b63ebd5b9c2cace36">A-33387820</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 12 月 6 日</td>
   </tr>
@@ -461,7 +451,7 @@
     <td>CVE-2017-0486</td>
     <td><a href="https://android.googlesource.com/platform/external/libavc/+/19814b7ad4ea6f0cc4cab34e50ebab2e180fc269">A-33621215</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 12 月 14 日</td>
   </tr>
@@ -469,7 +459,7 @@
     <td>CVE-2017-0487</td>
     <td><a href="https://android.googlesource.com/platform/external/libavc/+/aa78b96e842fc1fb70a18acff22be35c7a715b23">A-33751193</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 12 月 19 日</td>
   </tr>
@@ -477,7 +467,7 @@
     <td>CVE-2017-0488</td>
     <td><a href="https://android.googlesource.com/platform/external/libavc/+/0340381cd8c220311fd4fe2e8b23e1534657e399">A-34097213</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>Google 内部</td>
   </tr>
@@ -505,7 +495,7 @@
     <td>CVE-2017-0489</td>
     <td><a href="https://android.googlesource.com/platform/frameworks/base/+/d22261fef84481651e12995062105239d551cbc6">A-33091107</a></td>
     <td>中</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 20 日</td>
   </tr>
@@ -531,13 +521,11 @@
   </tr>
   <tr>
     <td>CVE-2017-0490</td>
-   <td><a href="https://android.googlesource.com/platform/packages/apps/CertInstaller/+/1166ca8adba9b49c9185dad11b28b02e72124d95">
-       A-33178389</a>
+   <td><a href="https://android.googlesource.com/platform/packages/apps/CertInstaller/+/1166ca8adba9b49c9185dad11b28b02e72124d95">A-33178389</a>
 [<a href="https://android.googlesource.com/platform/packages/apps/CertInstaller/+/1ad3b1e3256a226be362de1a4959f2a642d349b7">2</a>]
-[<a href="https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/41c42f5bb544acf8bede2d05c6325657d92bd83c">3</a>]
-   </td>
+[<a href="https://android.googlesource.com/platform/frameworks/opt/net/wifi/+/41c42f5bb544acf8bede2d05c6325657d92bd83c">3</a>]</td>
     <td>中</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 25 日</td>
   </tr>
@@ -566,7 +554,7 @@
     <td><a href="https://android.googlesource.com/platform/packages/apps/PackageInstaller/+/5c49b6bf732c88481466dea341917b8604ce53fa">A-32553261</a>
    </td>
     <td>中</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>Google 内部</td>
   </tr>
@@ -623,7 +611,7 @@
     <td>CVE-2017-0494</td>
     <td><a href="https://android.googlesource.com/platform/packages/apps/Messaging/+/3f9821128abd66c4cd2f040d8243efb334bfad2d">A-32764144</a></td>
     <td>中</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 11 月 9 日</td>
   </tr>
@@ -651,7 +639,7 @@
     <td>CVE-2017-0495</td>
     <td><a href="https://android.googlesource.com/platform/external/libavc/+/85c0ec4106659a11c220cd1210f8d76c33d9e2ae">A-33552073</a></td>
     <td>中</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
     <td>2016 年 12 月 11 日</td>
   </tr>
@@ -684,7 +672,7 @@
     <td>2016 年 9 月 14 日</td>
   </tr>
 </tbody></table>
-<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Google 设备的最新二进制驱动程序中包含相应更新。</p>
+<p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 <p>** 搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
 
 <h3 id="dos-in-mediaserver-2">Mediaserver 中的拒绝服务漏洞</h3>
@@ -709,7 +697,7 @@
     <td>CVE-2017-0497</td>
     <td><a href="https://android.googlesource.com/platform/external/skia/+/8888cbf8e74671d44e9ff92ec3847cd647b8cdfb">A-33300701</a></td>
     <td>中</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>7.0、7.1.1</td>
     <td>2016 年 12 月 2 日</td>
   </tr>
@@ -735,10 +723,8 @@
   </tr>
   <tr>
     <td>CVE-2017-0498</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/base/+/1c4d535d0806dbeb6d2fa5cea0373cbd9ab6d33b">
-        A-30352311</a>
-[<a href="https://android.googlesource.com/platform/frameworks/base/+/5f621b5b1549e8379aee05807652d5111382ccc6">2</a>]
-   </td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/base/+/1c4d535d0806dbeb6d2fa5cea0373cbd9ab6d33b">A-30352311</a>
+[<a href="https://android.googlesource.com/platform/frameworks/base/+/5f621b5b1549e8379aee05807652d5111382ccc6">2</a>]</td>
     <td>中</td>
     <td>所有</td>
     <td>5.1.1、6.0、6.0.1、7.0、7.1.1</td>
@@ -778,7 +764,7 @@
 <p>我们在下面提供了 2017-03-05 补丁程序级别涵盖的每个安全漏洞的详细信息,其中包括问题描述、严重程度阐述以及一个包含 CVE、相关参考信息、严重程度、已更新的 Google 设备、已更新的 AOSP 版本(如果适用)及报告日期的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个 Bug 有多条相关的更改记录,我们还通过 Bug ID 后面的数字链接到了更多参考信息。</p>
 
 <h3 id="eop-in-mediatek-components">MediaTek 组件中的提权漏洞</h3>
-<p>MediaTek 组件(包括 M4U 驱动程序、声音驱动程序、触摸屏驱动程序、GPU 驱动程序和命名队列驱动程序)中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
+<p>MediaTek 组件(包括 M4U 驱动程序、声音驱动程序、触摸屏驱动程序、GPU 驱动程序和命令队列驱动程序)中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。</p>
 
 <table>
   <colgroup><col width="19%" />
@@ -1731,7 +1717,7 @@
 <p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 
 <h3 id="dos-in-kernel-cryptographic-subsystem">内核加密子系统中的拒绝服务漏洞</h3>
-<p>内核加密子系统中的拒绝服务漏洞可让远程攻击者使用特制网络数据包起或重启设备。由于该漏洞可用于远程发起拒绝服务攻击,因此我们将其严重程度评为“高”。</p>
+<p>内核加密子系统中的拒绝服务漏洞可让远程攻击者使用特制网络数据包挂起或重启设备。由于该漏洞可用于远程发起拒绝服务攻击,因此我们将其严重程度评为“高”。</p>
 
 <table>
   <colgroup><col width="19%" />
@@ -1928,8 +1914,7 @@
   <tr>
     <td>CVE-2016-8477</td>
     <td>A-32720522<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=33c9042e38506b04461fa99e304482bc20923508">
-QC-CR#1090007</a>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=33c9042e38506b04461fa99e304482bc20923508">QC-CR#1090007</a>
 [<a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=96145eb5f0631f0e105d47abebc8f940f7621eeb">2</a>]</td>
     <td>中</td>
     <td>Nexus 5X、Nexus 6、Nexus 6P、Android One、Pixel、Pixel XL</td>
diff --git a/zh-cn/security/bulletin/2017-04-01.html b/zh-cn/security/bulletin/2017-04-01.html
index 8565deb..e325371 100644
--- a/zh-cn/security/bulletin/2017-04-01.html
+++ b/zh-cn/security/bulletin/2017-04-01.html
@@ -21,9 +21,9 @@
   -->
 <p><em>发布时间:2017 年 4 月 3 日 | 更新时间:2017 年 8 月 17 日</em></p>
 <p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。除了公告之外,我们还通过无线下载 (OTA) 更新的方式发布了针对 Nexus 设备的安全更新。我们还在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布了 Google 设备固件映像。2017 年 4 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。请参阅 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>,了解如何检查设备的安全补丁程序级别。</p>
-<p>我们的合作伙伴在 2017 年 3 月 6 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
+<p>我们的合作伙伴在 2017 年 3 月 6 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开源项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
 <p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
-<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google 服务缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 <a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a>;这些功能可提高 Android 平台的安全性。</p>
+<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google 服务缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 <a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a>),这些功能可提高 Android 平台的安全性。</p>
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 
 <h2 id="announcements">公告</h2>
@@ -57,9 +57,9 @@
   <li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen 和龚广:CVE-2017-6424、CVE-2017-0584、CVE-2017-0454、CVE-2017-0574、CVE-2017-0575、CVE-2017-0567</li>
   <li>Ian Foster (<a href="https://twitter.com/lanrat">@lanrat</a>):CVE-2017-0554</li>
   <li>趋势科技的 Jack Tang:CVE-2017-0579</li>
-  <li><a href="https://twitter.com/Jioun_dai">奇虎 360 天眼实验室</a>的 Jianjun Dai (<a href="https://skyeye.360safe.com">@Jioun_dai</a>):CVE-2017-0559、CVE-2017-0541</li>
+  <li><a href="https://skyeye.360safe.com">奇虎 360 天眼实验室</a>的 Jianjun Dai (<a href="https://twitter.com/Jioun_dai">@Jioun_dai</a>):CVE-2017-0559、CVE-2017-0541</li>
   <li>奇虎 360 冰刃实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2017-6425、CVE-2016-5346</li>
-  <li>奇虎 360 科技有限公司 <a href="mailto:[email protected]">C0RE 团队</a>的 Lubo Zhang (<a href="http://c0reteam.org">[email protected]</a>) 和冰刃实验室的 Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>):CVE-2017-0564</li>
+  <li>奇虎 360 科技有限公司 <a href="http://c0reteam.org">C0RE 团队</a>的 Lubo Zhang (<a href="mailto:[email protected]">[email protected]</a>) 和冰刃实验室的 Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>):CVE-2017-0564</li>
   <li>Google 的 <a href="mailto:[email protected]">Mark Salyzyn</a>:CVE-2017-0558</li>
   <li>特斯拉产品安全团队的 Mike Andereson (<a href="https://twitter.com/manderbot">@manderbot</a>) 和 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0327、CVE-2017-0328</li>
   <li>阿里巴巴移动安全团队的 Peng Xiao、Chengming Yang、Ning You、Chao Yang、和 Yang song:CVE-2017-0565</li>
@@ -70,7 +70,7 @@
   <li>趋势科技移动威胁研究团队的 Seven Shen (<a href="https://twitter.com/lingtongshen">@lingtongshen</a>):CVE-2016-10231、CVE-2017-0578、CVE-2017-0586</li>
   <li>Tim Becker:CVE-2017-0546</li>
   <li>Uma Sankar Pradhan (<a href="https://twitter.com/umasankar_iitd">@umasankar_iitd</a>):CVE-2017-0560</li>
-  <li><a href="https://twitter.com/vysea">趋势科技</a><a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="http://www.trendmicro.com">@VYSEa</a>):CVE-2017-0555、CVE-2017-0538、CVE-2017-0539、CVE-2017-0557、CVE-2017-0556</li>
+  <li><a href="http://www.trendmicro.com">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>):CVE-2017-0555、CVE-2017-0538、CVE-2017-0539、CVE-2017-0557、CVE-2017-0556</li>
   <li>阿里巴巴的 Weichao Sun (<a href="https://twitter.com/sunblate">@sunblate</a>):CVE-2017-0549</li>
   <li>奇虎 360 科技有限公司 Alpha 团队的 Wenlin Yang (<a href="https://twitter.com/wenlin_yang">@wenlin_yang</a>)、龚广 (<a href="https://twitter.com/oldfresher">@oldfresher</a>) 和 Hao Chen:CVE-2017-0580、CVE-2017-0577</li>
   <li>奇虎 360 科技有限公司成都安全响应中心的 <a href="http://weibo.com/ele7enxxh">Zinuo Han</a>:CVE-2017-0548</li>
@@ -979,8 +979,7 @@
   </tr>
   <tr>
     <td>CVE-2017-0575</td>
-    <td>A-32658595*<br />
-        QC-CR#1103099</td>
+    <td>A-32658595*<br />QC-CR#1103099</td>
     <td>高</td>
     <td>Nexus 5X、Pixel、Pixel XL</td>
     <td>2016 年 11 月 3 日</td>
@@ -1174,8 +1173,7 @@
   <tr>
     <td>CVE-2016-10232</td>
     <td>A-34386696<br />
-        <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.10/commit/?id=21e0ead58e47798567d846b84f16f89cf69a57ae">
-QC-CR#1024872</a> <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=27f7b3b3059f6181e2786f886f4cd92f413bc30c">
+        <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.10/commit/?id=21e0ead58e47798567d846b84f16f89cf69a57ae">QC-CR#1024872</a> <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=27f7b3b3059f6181e2786f886f4cd92f413bc30c">
 [2]</a></td>
     <td>高</td>
     <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL、Android One</td>
@@ -1380,8 +1378,7 @@
   <tr>
     <td>CVE-2014-3145</td>
     <td>A-34469585<br />
-        <a href="https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=314760e66c35c8ffa51b4c4ca6948d207e783079">
-上游内核</a> <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=05ab8f2647e4221cbdb3856dd7d32bd5407316b3">
+        <a href="https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/commit/?id=314760e66c35c8ffa51b4c4ca6948d207e783079">上游内核</a> <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=05ab8f2647e4221cbdb3856dd7d32bd5407316b3">
 [2]</a></td>
     <td>高</td>
     <td>Nexus 6、Nexus Player</td>
@@ -1408,8 +1405,7 @@
   <tr>
     <td>CVE-2016-5349</td>
     <td>A-29083830<br />
-        <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=7c3bf6557c62d904b15507eb451fda8fd7ef750c">
-QC-CR#1021945</a> <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=03853a58952834ac3e1e3007c9c680dd4c001a2f">
+        <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=7c3bf6557c62d904b15507eb451fda8fd7ef750c">QC-CR#1021945</a> <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=03853a58952834ac3e1e3007c9c680dd4c001a2f">
 [2]</a> <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=e3d969000fb60ecb9bc01667fa89957f67763514">
 [3]</a> <a href="https://source.codeaurora.org/quic/la//kernel/msm-3.18/commit/?id=9bd398661cae758ffc557adc7de74ba32654e1f9">
 [4]</a></td>
@@ -1438,8 +1434,7 @@
   <tr>
     <td>CVE-2016-10234</td>
     <td>A-34390017<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=c7d7492c1e329fdeb28a7901c4cd634d41a996b1">
-QC-CR#1069060</a> <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=d12370c7f3ecded1867fbd6b70ded35db55cab1d">
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=c7d7492c1e329fdeb28a7901c4cd634d41a996b1">QC-CR#1069060</a> <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=d12370c7f3ecded1867fbd6b70ded35db55cab1d">
 [2]</a></td>
     <td>高</td>
     <td>Nexus 5X、Nexus 6P、Pixel、Pixel XL</td>
@@ -2039,8 +2034,8 @@
 <p><strong>3. 如何确定各个问题都会影响哪些 Google 设备?</strong></p>
 <p>在 <a href="#2017-04-01-details">2017-04-01</a> 和 <a href="#2017-04-05-details">2017-04-05</a> 安全漏洞详情部分,每个表均包含“已更新的 Google 设备”列,其中列出了已针对每个问题进行了更新的受影响 Google 设备系列。<em></em>此列有以下几种情形:</p>
 <ul>
-  <li><strong>所有 Google 设备</strong>:如果某个问题会影响所有 Nexus 和 Pixel 设备,则相应表的“已更新的 Google 设备”列中会显示“所有”<em></em>。“所有”包含下列<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">受支持的设备</a>:Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Android One、Nexus Player、Pixel C、Pixel 和 Pixel XL。</li>
-  <li><strong>部分 Google 设备</strong>:如果某个问题仅会影响部分 Google 设备,则“已更新的 Google 设备”列中会列出受影响的 Google 设备。<em></em> </li>
+  <li><strong>所有 Google 设备</strong>:如果某个问题会影响所有 Nexus 和 Pixel 设备,则相应表的“已更新的 Google 设备”列中会显示“所有”。<em></em>“所有”包含下列<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">受支持的设备</a>:Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Android One、Nexus Player、Pixel C、Pixel 和 Pixel XL。</li>
+  <li><strong>部分 Google 设备</strong>:如果某个问题仅会影响部分 Google 设备,则“已更新的 Google 设备”列中会列出受影响的 Google 设备。<em></em></li>
   <li><strong>无 Google 设备</strong>:如果某个问题不会影响任何运行 Android 7.0 的 Google 设备,则相应表的“已更新的 Google 设备”列中会显示“无”。<em></em></li>
 </ul>
 <p><strong>4.“参考信息”列中的条目对应的是什么内容?</strong></p>
diff --git a/zh-cn/security/bulletin/2017-05-01.html b/zh-cn/security/bulletin/2017-05-01.html
index 0c662e7..4b03d4d 100644
--- a/zh-cn/security/bulletin/2017-05-01.html
+++ b/zh-cn/security/bulletin/2017-05-01.html
@@ -24,11 +24,11 @@
 
 <p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。除了公告之外,我们还通过无线下载 (OTA) 更新的方式发布了针对 Nexus 设备的安全更新。我们还在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布了 Google 设备固件映像。2017 年 5 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。请参阅 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>,了解如何检查设备的安全补丁程序级别。</p>
 
-<p>我们的合作伙伴在 2017 年 4 月 3 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
+<p>我们的合作伙伴在 2017 年 4 月 3 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开源项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
 
 <p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
 
-<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google 服务缓解措施 </a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 <a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a>)。这些功能可提高 Android 平台的安全性。</p>
+<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google 服务缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和服务防护功能(如 <a href="https://developer.android.com/training/safetynet/index.html">SafetyNet</a>),这些功能可提高 Android 平台的安全性。</p>
 
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 <h2 id="announcements">公告</h2>
@@ -57,24 +57,24 @@
 <p>非常感谢以下研究人员做出的贡献:</p>
 <ul>
 <li>Venustech 的 ADlab:CVE-2017-0630</li>
-<li>腾讯科恩实验室 (<a href="https://twitter.com/returnsme">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/keen_lab">@returnsme</a>):CVE-2016-10287</li>
+<li>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>):CVE-2016-10287</li>
 <li>趋势科技的徐健:CVE-2017-0599、CVE-2017-0635</li>
-<li><a href="https://twitter.com/heeeeen4x">MS509Team</a> 的 En He (<a href="http://www.ms509.com">@heeeeen4x</a>) 和 Bo Liu:CVE-2017-0601</li>
+<li><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>) 和 Bo Liu:CVE-2017-0601</li>
 <li><a href="https://twrp.me/">Team Win Recovery Project</a> 的 Ethan Yonker:CVE-2017-0493</li>
 <li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-10285、CVE-2016-10288、CVE-2016-10290、CVE-2017-0624、CVE-2017-0616、CVE-2017-0617、CVE-2016-10294、CVE-2016-10295、CVE-2016-10296</li>
 <li>腾讯电脑管家的郑文选 (<a href="https://twitter.com/virtualseekers">@VirtualSeekers</a>):CVE-2017-0602</li>
-<li><a href="https://www.linkedin.com/in/g%C3%BCliz-seray-tuncay-952a1b9/">伊利诺伊大学厄巴纳-尚佩恩分校</a>的 <a href="http://tuncay2.web.engr.illinois.edu">Güliz Seray Tuncay</a>:CVE-2017-0593</li>
+<li><a href="http://tuncay2.web.engr.illinois.edu">伊利诺伊大学厄巴纳-尚佩恩分校</a>的 <a href="https://www.linkedin.com/in/g%C3%BCliz-seray-tuncay-952a1b9/">Güliz Seray Tuncay</a>:CVE-2017-0593</li>
 <li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen 和 Guang Gong:CVE-2016-10283</li>
 <li>小米公司的 Juhu Nie、Yang Cheng、Nan Li 和 Qiwu Huang:CVE-2016-10276</li>
 <li><a href="https://github.com/michalbednarski">Michał Bednarski</a>:CVE-2017-0598</li>
 <li>特斯拉产品安全团队的 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0331、CVE-2017-0606</li>
 <li><a href="mailto:[email protected]">Niky1235</a> (<a href="https://twitter.com/jiych_guru">@jiych_guru</a>):CVE-2017-0603</li>
 <li>阿里巴巴移动安全团队的 Peng Xiao、Chengming Yang、Ning You、Chao Yang 和 Yang Song:CVE-2016-10281、CVE-2016-10280</li>
-<li><a href="https://twitter.com/roeehay">Aleph 研究团队</a>的 Roee Hay (<a href="https://alephsecurity.com/">@roeehay</a>):CVE-2016-10277</li>
+<li><a href="https://alephsecurity.com/">Aleph 研究团队</a>的 Roee Hay (<a href="https://twitter.com/roeehay">@roeehay</a>):CVE-2016-10277</li>
 <li><a href="mailto:[email protected]">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2016-10274</li>
-<li><a href="mailto:[email protected]">C0RE 团队</a>的 <a href="mailto:[email protected]">Tong Lin</a>、<a href="http://c0reteam.org">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2016-10291</li>
+<li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Tong Lin</a>、<a href="mailto:[email protected]">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2016-10291</li>
 <li>Vasily Vasiliev:CVE-2017-0589</li>
-<li><a href="https://twitter.com/vysea">趋势科技</a><a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="http://www.trendmicro.com">@VYSEa</a>):CVE-2017-0590、CVE-2017-0587、CVE-2017-0600</li>
+<li><a href="http://www.trendmicro.com">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>):CVE-2017-0590、CVE-2017-0587、CVE-2017-0600</li>
 <li>腾讯安全平台部门的 Xiling Gong:CVE-2017-0597</li>
 <li>360 Marvel 团队的 Xingyuan Lin:CVE-2017-0627</li>
 <li>阿里巴巴的王勇 (<a href="https://twitter.com/ThomasKing2014">@ThomasKing2014</a>):CVE-2017-0588</li>
@@ -216,7 +216,7 @@
     <td>CVE-2017-0595</td>
     <td><a href="https://android.googlesource.com/platform/frameworks/av/+/5443b57cc54f2e46b35246637be26a69e9f493e1">A-34705519</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2017 年 1 月 24 日</td>
   </tr>
@@ -224,7 +224,7 @@
     <td>CVE-2017-0596</td>
     <td><a href="https://android.googlesource.com/platform/frameworks/av/+/5443b57cc54f2e46b35246637be26a69e9f493e1">A-34749392</a></td>
     <td>高</td>
-    <td>全部</td>
+    <td>所有</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1</td>
     <td>2017 年 1 月 24 日</td>
   </tr>
diff --git a/zh-cn/security/bulletin/2017-06-01.html b/zh-cn/security/bulletin/2017-06-01.html
index e19861a..f47e9be 100644
--- a/zh-cn/security/bulletin/2017-06-01.html
+++ b/zh-cn/security/bulletin/2017-06-01.html
@@ -23,11 +23,11 @@
 
 <p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。2017 年 6 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。请参阅 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>,了解如何检查设备的安全补丁程序级别。</p>
 
-<p>我们的合作伙伴在至少一个月前就已收到本公告中说明的这些问题的相关通知。我们将在 Android 开放源代码项目 (AOSP) 代码库中发布针对相关问题的源代码补丁程序,并在本公告中提供相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
+<p>我们的合作伙伴在至少一个月前就已收到本公告中说明的这些问题的相关通知。我们将在 Android 开源项目 (AOSP) 代码库中发布针对相关问题的源代码补丁程序,并在本公告中提供相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
 
-<p>这些问题中危险性最高的是媒体框架中的一个严重程度为“严重”的安全漏洞,在系统处理文件和数据时,该漏洞可让远程攻击者使用特制文件破坏内存。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
+<p>这些问题中危险性最高的是媒体框架中的一个严重程度为“严重”的安全漏洞,在系统处理媒体文件和数据时,该漏洞可让远程攻击者使用特制文件破坏内存。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
 
-<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google Play 保护机制缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>;这些功能可提高 Android 平台的安全性。</p>
+<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google Play 保护机制缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>,这些功能可提高 Android 平台的安全性。</p>
 
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 
@@ -155,7 +155,7 @@
    <td><a href="https://android.googlesource.com/platform/external/libxml2/+/308396a55280f69ad4112d4f9892f4cbeff042aa">A-36556310</a></td>
    <td>RCE</td>
    <td>中</td>
-   <td>4.4.4、5.0.2, 5.1.1, 6.0, 6.0.1, 7.0, 7.1.1, 7.1.2</td>
+   <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
   </tr>
   <tr>
    <td>CVE-2017-0647</td>
@@ -338,16 +338,14 @@
   </tr>
   <tr>
    <td>CVE-2017-0636</td>
-   <td>A-35310230<a href="#asterisk">*</a><br />
-       M-ALPS03162263</td>
+   <td>A-35310230<a href="#asterisk">*</a><br />M-ALPS03162263</td>
    <td>EoP</td>
    <td>高</td>
    <td>命令队列驱动程序</td>
   </tr>
   <tr>
    <td>CVE-2017-0649</td>
-   <td>A-34468195<a href="#asterisk">*</a><br />
-       M-ALPS03162283</td>
+   <td>A-34468195<a href="#asterisk">*</a><br />M-ALPS03162283</td>
    <td>EoP</td>
    <td>中</td>
    <td>声音驱动程序</td>
@@ -371,24 +369,21 @@
   </tr>
   <tr>
    <td>CVE-2017-6247</td>
-   <td>A-34386301<a href="#asterisk">*</a><br />
-       N-CVE-2017-6247</td>
+   <td>A-34386301<a href="#asterisk">*</a><br />N-CVE-2017-6247</td>
    <td>EoP</td>
    <td>高</td>
    <td>声音驱动程序</td>
   </tr>
   <tr>
    <td>CVE-2017-6248</td>
-   <td>A-34372667<a href="#asterisk">*</a><br />
-       N-CVE-2017-6248</td>
+   <td>A-34372667<a href="#asterisk">*</a><br />N-CVE-2017-6248</td>
    <td>EoP</td>
    <td>中</td>
    <td>声音驱动程序</td>
   </tr>
   <tr>
    <td>CVE-2017-6249</td>
-   <td>A-34373711<a href="#asterisk">*</a><br />
-       N-CVE-2017-6249</td>
+   <td>A-34373711<a href="#asterisk">*</a><br />N-CVE-2017-6249</td>
    <td>EoP</td>
    <td>中</td>
    <td>声音驱动程序</td>
@@ -632,350 +627,350 @@
   <tr>
    <td>CVE-2014-9960</td>
    <td>A-37280308<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9961</td>
    <td>A-37279724<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9953</td>
    <td>A-36714770<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9967</td>
    <td>A-37281466<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9026</td>
    <td>A-37277231<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9027</td>
    <td>A-37279124<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9008</td>
    <td>A-36384689<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9009</td>
    <td>A-36393600<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9010</td>
    <td>A-36393101<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9011</td>
    <td>A-36714882<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9024</td>
    <td>A-37265657<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9012</td>
    <td>A-36384691<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9013</td>
    <td>A-36393251<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9014</td>
    <td>A-36393750<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9015</td>
    <td>A-36714120<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9029</td>
    <td>A-37276981<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10338</td>
    <td>A-37277738<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10336</td>
    <td>A-37278436<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10333</td>
    <td>A-37280574<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10341</td>
    <td>A-37281667<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10335</td>
    <td>A-37282802<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10340</td>
    <td>A-37280614<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10334</td>
    <td>A-37280664<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10339</td>
    <td>A-37280575<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10298</td>
    <td>A-36393252<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10299</td>
    <td>A-32577244<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>严重</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9954</td>
    <td>A-36388559<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9955</td>
    <td>A-36384686<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9956</td>
    <td>A-36389611<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9957</td>
    <td>A-36387564<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9958</td>
    <td>A-36384774<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9962</td>
    <td>A-37275888<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9963</td>
    <td>A-37276741<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9959</td>
    <td>A-36383694<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9964</td>
    <td>A-37280321<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9965</td>
    <td>A-37278233<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2014-9966</td>
    <td>A-37282854<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9023</td>
    <td>A-37276138<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9020</td>
    <td>A-37276742<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9021</td>
    <td>A-37276743<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9025</td>
    <td>A-37276744<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9022</td>
    <td>A-37280226<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9028</td>
    <td>A-37277982<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9031</td>
    <td>A-37275889<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9032</td>
    <td>A-37279125<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9033</td>
    <td>A-37276139<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2015-9030</td>
    <td>A-37282907<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10332</td>
    <td>A-37282801<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10337</td>
    <td>A-37280665<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
   <tr>
    <td>CVE-2016-10342</td>
    <td>A-37281763<a href="#asterisk">*</a></td>
-   <td>无</td>
+   <td>N/A</td>
    <td>高</td>
    <td>闭源组件</td>
   </tr>
@@ -1181,7 +1176,7 @@
    <td>没有分类</td>
   </tr>
 </tbody></table>
-<p><strong>4.<em></em>“参考信息”列中的条目表示什么意思?</strong></p>
+<p><strong>4. “参考信息”列中的条目表示什么意思?<em></em></strong></p>
 
 <p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em></p>
 
diff --git a/zh-cn/security/bulletin/2017-07-01.html b/zh-cn/security/bulletin/2017-07-01.html
index 0fba66d..7ee09a8 100644
--- a/zh-cn/security/bulletin/2017-07-01.html
+++ b/zh-cn/security/bulletin/2017-07-01.html
@@ -31,7 +31,7 @@
 
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 
-<p class="note"><strong>注意</strong>:如需了解与最新的无线下载更新 (OTA) 和适用于 Google 设备的固件映像有关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
+<p class="note"><strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
 
 <h2 id="announcements">公告</h2>
 <ul>
@@ -44,10 +44,10 @@
 </ul>
 
 <h2 id="mitigations">Android 和 Google Play 保护机制缓解措施</h2>
-<p>本部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="//www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+<p>这部分简要介绍了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="//www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
 <ul>
   <li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。</li>
-  <li>Android 安全团队会积极利用 <a href="//www.android.com/play-protect">Google Play 保护机制</a>来监控滥用行为,并在发现<a href="/security/reports/Google_Android_Security_PHA_classifications.pdf">可能有害的应用</a>时向用户发出警告。在预装有 <a href="//www.android.com/gms">Google 移动服务</a>的设备上,Google Play 保护机制在默认情况下处于启用状态。对于安装来自 Google Play 以外的应用的用户来说,这项功能尤为重要。
+  <li>Android 安全团队会积极利用 <a href="//www.android.com/play-protect">Google Play 保护机制</a>来监控滥用行为,并会在发现<a href="/security/reports/Google_Android_Security_PHA_classifications.pdf">可能有害的应用</a>时向用户发出警告。在预装有 <a href="//www.android.com/gms">Google 移动服务</a>的设备上,Google Play 保护机制在默认情况下处于启用状态。对于安装来自 Google Play 以外的应用的用户来说,这项功能尤为重要。
   </li>
 </ul>
 
@@ -413,7 +413,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0701</td>
-   <td><a href="https://android.googlesource.com/platform/external/libgdx/+/85e94f5b67c1beb9402c4de82bd481a5202470de"> A-36385715</a> [<a href="https://android.googlesource.com/platform/external/libgdx/+/bd4c825d8fc5dd48f5c602e673ae210909b31fd0">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/external/libgdx/+/85e94f5b67c1beb9402c4de82bd481a5202470de">A-36385715</a> [<a href="https://android.googlesource.com/platform/external/libgdx/+/bd4c825d8fc5dd48f5c602e673ae210909b31fd0">2</a>]</td>
    <td>RCE</td>
    <td>高</td>
    <td>7.1.1、7.1.2</td>
@@ -561,13 +561,6 @@
    <td>SCSI 驱动程序</td>
   </tr>
   <tr>
-   <td>CVE-2017-0710</td>
-   <td>A-34951864<a href="#asterisk">*</a></td>
-   <td>EoP</td>
-   <td>中</td>
-   <td>TCB</td>
-  </tr>
-  <tr>
    <td>CVE-2017-7308</td>
    <td>A-36725304<br />
 <a href="//git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2b6867c2ce76c596676bec7d2d525af525fdc6e2">上游内核</a> [<a href="//git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8f8d28e4d6d815a391285e121c3a53a0b6cb9e7b">2</a>] [<a href="//git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=bcc5364bdcfe131e6379363f089e7b4108d35b70">3</a>]</td>
@@ -1249,7 +1242,7 @@
   </tr>
 </tbody></table>
 <h2 id="google-device-updates">Google 设备更新</h2>
-<p>以下表格包含最新的无线更新 (OTA) 中的安全补丁程序级别和适用于 Google 设备的固件映像。Google 设备固件映像可在 <a href="//developers.google.com/android/nexus/images">Google 开发者网站</a>上获取。</p>
+<p>以下表格包含适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像中的安全补丁程序级别。Google 设备固件映像可在 <a href="//developers.google.com/android/nexus/images">Google Developers 网站</a>上找到。</p>
 
 <table>
   <colgroup><col width="25%" />
@@ -1287,6 +1280,31 @@
    <td>2017 年 7 月 5 日</td>
   </tr>
 </tbody></table>
+
+<p>Google 设备更新还包含针对以下安全漏洞的补丁程序(如果适用):</p>
+
+<table>
+  <colgroup><col width="17%" />
+  <col width="19%" />
+  <col width="9%" />
+  <col width="14%" />
+  <col width="39%" />
+  </colgroup><tbody><tr>
+   <th>CVE</th>
+   <th>参考信息</th>
+   <th>类型</th>
+   <th>严重程度</th>
+   <th>组件</th>
+  </tr>
+  <tr>
+   <td>CVE-2017-0710</td>
+   <td>A-34951864<a href="#asterisk">*</a></td>
+   <td>EoP</td>
+   <td>中</td>
+   <td>TCB</td>
+  </tr>
+</tbody></table>
+
 <h2 id="acknowledgements">致谢</h2>
 <p>非常感谢以下研究人员做出的贡献:</p>
 
@@ -1335,7 +1353,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0665</td>
-   <td><a href="mailto:[email protected]">C0RE 团队</a>的 <a href="//twitter.com/Mingjian_Zhou">Hanxiang Wen</a>、Mingjian Zhou (<a href="//c0reteam.org">@Mingjian_Zhou</a>) 和 Xuxian Jiang</td>
+   <td><a href="//c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Chi Zhang</a>、<a href="mailto:[email protected]">Hanxiang Wen</a>、Mingjian Zhou (<a href="//twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang</td>
   </tr>
   <tr>
    <td>CVE-2017-8268、CVE-2017-8261</td>
@@ -1371,7 +1389,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0695、CVE-2017-0689、CVE-2017-0540、CVE-2017-0680、CVE-2017-0679、CVE-2017-0685、CVE-2017-0686、CVE-2017-0693、CVE-2017-0674、CVE-2017-0677</td>
-   <td><a href="//www.trendmicro.com">趋势科技</a><a href="//blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的 V.E.O (<a href="//twitter.com/vysea">@VYSEa</a>)</td>
+   <td><a href="//www.trendmicro.com">趋势科技</a>的<a href="//blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的 V.E.O (<a href="//twitter.com/vysea">@VYSEa</a>)</td>
   </tr>
   <tr>
    <td>CVE-2017-0708</td>
@@ -1422,7 +1440,7 @@
   <li>[ro.build.version.security_patch]:[2017-07-01]</li>
   <li>[ro.build.version.security_patch]:[2017-07-05]</li>
 </ul>
-<p><strong>2. 为何此公告有 2 个安全补丁程序级别?</strong></p>
+<p><strong>2. 为何本公告会有 2 个安全补丁程序级别?</strong></p>
 
 <p>本公告有 2 个安全补丁程序级别,目的是让 Android 合作伙伴能够灵活地、更快速地修复所有 Android 设备上类似的一系列漏洞。我们建议 Android 合作伙伴修复本公告中的所有问题并使用最新的安全补丁程序级别。</p>
 <ul>
@@ -1431,9 +1449,9 @@
 </ul>
 <p>我们建议合作伙伴在一次更新中汇总要解决的所有问题的修复方案。</p>
 
-<p><strong>3.<em></em>“类型”列中的条目表示什么意思?</strong></p>
+<p><strong>3. “类型”列中的条目表示什么意思?<em></em></strong></p>
 
-<p><em></em>漏洞详情表的“类型”列中的条目是安全漏洞的分类。</p>
+<p>漏洞详情表的“类型”列中的条目是安全漏洞的分类。<em></em></p>
 
 <table>
   <colgroup><col width="25%" />
@@ -1464,7 +1482,7 @@
   </tr>
 </tbody></table>
 
-<p><strong>4.<em></em>“参考信息”列中的条目表示什么意思?</strong></p>
+<p><strong>4.“参考信息”列中的条目表示什么意思?<em></em></strong></p>
 
 <p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em></p>
 
@@ -1536,7 +1554,7 @@
    <td>2017 年 9 月 19 日</td>
    <td>更新了 CVE-2017-0710 的致谢。</td>
   </tr>
-    <tr>
+  <tr>
    <td>1.5</td>
    <td>2017 年 9 月 26 日</td>
    <td>更新了 CVE-2017-0681 的致谢。</td>
diff --git a/zh-cn/security/bulletin/2017-08-01.html b/zh-cn/security/bulletin/2017-08-01.html
index 469ad44..57adbed 100644
--- a/zh-cn/security/bulletin/2017-08-01.html
+++ b/zh-cn/security/bulletin/2017-08-01.html
@@ -27,11 +27,11 @@
 
 <p>这些问题中危险性最高的是媒体框架中的一个严重程度为“严重”的安全漏洞,该漏洞可让远程攻击者使用特制文件通过特许进程执行任意代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被关闭)。</p>
 
-<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google Play 保护机制缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和 Google Play 保护机制;这些功能可提高 Android 平台的安全性。</p>
+<p>我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google Play 保护机制缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和 Google Play 保护机制。这些功能可提高 Android 平台的安全性。</p>
 
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 
-<p class="note"><strong>注意</strong>:如需了解与最新的无线下载更新 (OTA) 和适用于 Google 设备的固件映像有关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
+<p class="note"><strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
 
 <h2 id="announcements">公告</h2>
 <ul>
@@ -45,7 +45,7 @@
 
 <h2 id="mitigations">Android 和 Google Play 保护机制缓解措施</h2>
 
-<p>本部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+<p>这部分简要介绍了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
 <ul>
   <li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。</li>
   <li>Android 安全团队会积极利用 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>来监控滥用行为,并在发现<a href="/security/reports/Google_Android_Security_PHA_classifications.pdf">可能有害的应用</a>时向用户发出警告。在预装有 <a href="http://www.android.com/gms">Google 移动服务</a>的设备上,Google Play 保护机制在默认情况下处于启用状态。对于安装来自 Google Play 以外的应用的用户来说,这项功能尤为重要。</li>
@@ -491,7 +491,7 @@
 </tbody></table>
 
 <h2 id="google-device-updates">Google 设备更新</h2>
-<p>以下表格包含最新的无线更新 (OTA) 中的安全补丁程序级别和适用于 Google 设备的固件映像。Google 设备固件映像可在 <a href="https://developers.google.com/android/nexus/images">Google 开发者网站</a>上获取。</p>
+<p>以下表格包含适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像中的安全补丁程序级别。Google 设备固件映像可在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上找到。</p>
 
 <table>
   <tbody><tr>
@@ -638,7 +638,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0737</td>
-   <td><a href="mailto:[email protected]">C0RE 团队</a>的 <a href="https://twitter.com/Mingjian_Zhou">Hanxiang Wen</a>、Mingjian Zhou (<a href="http://c0reteam.org">@Mingjian_Zhou</a>) 和 Xuxian Jiang</td>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Hanxiang Wen</a>、Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang</td>
   </tr>
   <tr>
    <td>CVE-2017-0748</td>
@@ -675,8 +675,7 @@
   </tr>
   <tr>
    <td>CVE-2017-10661</td>
-   <td><a href="http://c0reteam.org">C0RE 团队</a> 的 Tong Lin (<a href="mailto:[email protected]">[email protected]</a>)、Yuan-Tsung Lo
-(<a href="mailto:[email protected]">[email protected]</a>) 和 Xuxian Jiang</td>
+   <td><a href="http://c0reteam.org">C0RE 团队</a> 的 Tong Lin (<a href="mailto:[email protected]">[email protected]</a>)、Yuan-Tsung Lo (<a href="mailto:[email protected]">[email protected]</a>) 和 Xuxian Jiang</td>
   </tr>
   <tr>
    <td>CVE-2017-0712</td>
@@ -725,7 +724,7 @@
   <li>[ro.build.version.security_patch]:[2017-08-01]</li>
   <li>[ro.build.version.security_patch]:[2017-08-05]</li>
 </ul>
-<p><strong>2. 为何此公告有 2 个安全补丁程序级别?</strong></p>
+<p><strong>2. 为何本公告会有 2 个安全补丁程序级别?</strong></p>
 
 <p>本公告有 2 个安全补丁程序级别,目的是让 Android 合作伙伴能够灵活地、更快速地修复所有 Android 设备上类似的一系列漏洞。我们建议 Android 合作伙伴修复本公告中的所有问题并使用最新的安全补丁程序级别。</p>
 <ul>
@@ -734,9 +733,9 @@
 </ul>
 <p>我们建议合作伙伴在一次更新中汇总要解决的所有问题的修复方案。</p>
 
-<p id="type"><strong>3.<em></em>“类型”列中的条目表示什么意思?</strong></p>
+<p id="type"><strong>3. “类型”列中的条目表示什么意思?<em></em></strong></p>
 
-<p><em></em>漏洞详情表的“类型”列中的条目是安全漏洞的分类。</p>
+<p>漏洞详情表的“类型”列中的条目表示安全漏洞的分类。<em></em></p>
 
 <table>
   <colgroup><col width="25%" />
@@ -766,7 +765,7 @@
    <td>没有分类</td>
   </tr>
 </tbody></table>
-<p><strong>4.<em></em>“参考信息”列中的条目表示什么意思?</strong></p>
+<p><strong>4.“参考信息”列中的条目表示什么意思?<em></em></strong></p>
 
 <p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em></p>
 
diff --git a/zh-cn/security/bulletin/2017-09-01.html b/zh-cn/security/bulletin/2017-09-01.html
index c390a5c..9017b37 100644
--- a/zh-cn/security/bulletin/2017-09-01.html
+++ b/zh-cn/security/bulletin/2017-09-01.html
@@ -19,7 +19,7 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-  <p><em>发布时间:2017 年 9 月 5 日 | 更新时间:2017 年 9 月 28 日</em></p>
+  <p><em>发布时间:2017 年 9 月 5 日 | 更新时间:2017 年 10 月 5 日</em></p>
 
 <p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。2017 年 9 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。请参阅 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>,了解如何检查设备的安全补丁程序级别。</p>
 
@@ -31,7 +31,7 @@
 
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 
-<p class="note"><strong>注意</strong>:如需了解与最新的无线下载更新 (OTA) 和适用于 Google 设备的固件映像有关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
+<p class="note"><strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 <a href="#google-device-updates">Google 设备更新</a>部分。</p>
 
 <h2 id="announcements">公告</h2>
 <ul>
@@ -44,7 +44,7 @@
 </ul>
 
 <h2 id="mitigations">Android 和 Google 服务缓解措施</h2>
-<p>本部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
+<p>这一部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。</p>
 <ul>
   <li>新版 Android 平台中的增强功能让攻击者更加难以利用 Android 上存在的许多问题。我们建议所有用户都尽可能更新到最新版 Android。</li>
   <li>Android 安全团队会积极利用 <a href="https://www.android.com/play-protect">Google Play 保护机制</a>来监控滥用行为,并在发现<a href="/security/reports/Google_Android_Security_PHA_classifications.pdf">可能有害的应用</a>时向用户发出警告。在预装有 <a href="http://www.android.com/gms">Google 移动服务</a>的设备上,Google Play 保护机制在默认情况下处于启用状态。对于安装来自 Google Play 以外的应用的用户来说,这项功能尤为重要。</li>
@@ -958,12 +958,16 @@
    <td><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:[email protected]">Dacheng Shao</a>、Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang</td>
   </tr>
   <tr>
+  <td>CVE-2017-0755</td>
+  <td>阿里巴巴移动安全团队的 Dawei Peng(<a href="http://weibo.com/u/5622360291">微博:Vinc3nt4H</a>)</td>
+  </tr>
+  <tr>
    <td>CVE-2017-0775、CVE-2017-0774、CVE-2017-0771</td>
    <td>奇虎 360 科技有限公司 Alpha 团队的 Elphet 和龚广</td>
   </tr>
   <tr>
    <td>CVE-2017-0784</td>
-   <td><a href="https://twitter.com/heeeeen4x">MS509Team</a> 的 En He (<a href="http://www.ms509.com">@heeeeen4x</a>) 和 Bo Liu</td>
+   <td><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>) 和 Bo Liu</td>
   </tr>
   <tr>
    <td>CVE-2017-10997</td>
@@ -975,7 +979,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0802</td>
-   <td>Shellphish Grill 团队的 Jake Corina 和 Nick Stephens</td>
+   <td>Shellphish Grill 团队的 Jake Corina (<a href="https://twitter.com/JakeCorina">@JakeCorina</a>)</td>
   </tr>
   <tr>
    <td>CVE-2017-0780</td>
@@ -1093,7 +1097,7 @@
    <td>没有分类</td>
   </tr>
 </tbody></table>
-<p><strong>4.<em></em>“参考信息”列中的条目表示什么意思?</strong></p>
+<p><strong>4.“参考信息”列中的条目表示什么意思?<em></em></strong></p>
 
 <p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em></p>
 
diff --git a/zh-cn/security/bulletin/2017-10-01.html b/zh-cn/security/bulletin/2017-10-01.html
index cf35730..101f13e 100644
--- a/zh-cn/security/bulletin/2017-10-01.html
+++ b/zh-cn/security/bulletin/2017-10-01.html
@@ -19,11 +19,11 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-  <p><em>发布时间:2017 年 10 月 2 日</em></p>
+<p><em>发布时间:2017 年 10 月 2 日 | 更新时间:2017 年 10 月 3 日</em></p>
 
 <p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。2017 年 10 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。要了解如何检查设备的安全补丁程序级别,请参阅<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">检查并更新您的 Android 版本</a>。</p>
 
-<p>Android 合作伙伴在本公告发布前至少一个月就已收到所有问题的相关通知。我们会在接下来的 48 小时内在 Android 开放源代码项目 (AOSP) 代码库中发布针对相关问题的源代码补丁程序。届时,我们将会修订本公告,将相关 AOSP 链接增补到本文中。</p>
+<p>Android 合作伙伴在本公告发布前至少一个月就已收到所有问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
 
 <p>这些问题中危险性最高的是媒体框架中的一个严重程度为“严重”的安全漏洞,该漏洞可让远程攻击者使用特制文件通过特许进程执行任意代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被关闭)。</p>
 
@@ -31,7 +31,7 @@
 
 <p>我们建议所有用户都在自己的设备上接受这些更新。</p>
 
-<p class="note"><strong>注意</strong>:如需了解与最新的无线下载更新 (OTA) 和适用于 Google 设备的固件映像有关的信息,请参阅 <a href="/security/bulletin/pixel/2017-10-01">2017 年 10 月 Pixel / Nexus 安全公告</a>。</p>
+<p class="note"><strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 <a href="/security/bulletin/pixel/2017-10-01">2017 年 10 月 Pixel / Nexus 安全公告</a>。</p>
 
 <h2 id="announcements">公告</h2>
 <ul>
@@ -66,7 +66,7 @@
   </tr>
   <tr>
     <td>CVE-2017-0806</td>
-    <td>A-62998805</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/base/+/b87c968e5a41a1a09166199bf54eee12608f3900">A-62998805</a></td>
     <td>EoP</td>
     <td>高</td>
     <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
@@ -91,42 +91,42 @@
   </tr>
   <tr>
     <td>CVE-2017-0809</td>
-    <td>A-62673128</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/552a3b5df2a6876d10da20f72e4cc0d44ac2c790">A-62673128</a></td>
     <td>RCE</td>
     <td>严重</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
     <td>CVE-2017-0810</td>
-    <td>A-38207066</td>
+    <td><a href="https://android.googlesource.com/platform/external/libmpeg2/+/7737780815fe523ad7b0e49456eb75d27a30818a">A-38207066</a></td>
     <td>RCE</td>
     <td>严重</td>
     <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
     <td>CVE-2017-0811</td>
-    <td>A-37930177</td>
+    <td><a href="https://android.googlesource.com/platform/external/libhevc/+/25c0ffbe6a181b4a373c3c9b421ea449d457e6ed">A-37930177</a></td>
     <td>RCE</td>
     <td>严重</td>
     <td>5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
     <td>CVE-2017-0812</td>
-    <td>A-62873231</td>
+    <td><a href="https://android.googlesource.com/device/google/dragon/+/7df7ec13b1d222ac3a66797fbe432605ea8f973f">A-62873231</a></td>
     <td>EoP</td>
     <td>高</td>
     <td>7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
     <td>CVE-2017-0815</td>
-    <td>A-63526567</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/f490fc335772a9b14e78997486f4a572b0594c04">A-63526567</a></td>
     <td>ID</td>
     <td>中</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
     <td>CVE-2017-0816</td>
-    <td>A-63662938</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/f490fc335772a9b14e78997486f4a572b0594c04">A-63662938</a></td>
     <td>ID</td>
     <td>中</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
@@ -151,7 +151,7 @@
   </tr>
   <tr>
     <td>CVE-2017-14496</td>
-    <td>A-64575136</td>
+    <td><a href="https://android.googlesource.com/platform/external/dnsmasq/+/ff755ca73c98a1f2706fe86996e4bf6215054834">A-64575136</a> [<a href="https://android.googlesource.com/platform/external/dnsmasq/+/68a974de72b5091ce608815a349daaeb05cdeab5">2</a>]</td>
     <td>RCE</td>
     <td>高</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
@@ -269,8 +269,8 @@
 
 <p>要了解如何检查设备的安全补丁程序级别,请参阅<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">检查并更新您的 Android 版本</a>。</p>
 <ul>
-  <li>2017-10-01(或之后)的安全补丁程序级别解决了与 2017-09-01 安全补丁程序级别相关的所有问题。</li>
-  <li>2017-10-05(或之后)的安全补丁程序级别解决了与 2017-09-05 安全补丁程序级别以及之前的所有补丁程序级别相关的所有问题。
+  <li>2017-10-01(或之后)的安全补丁程序级别解决了与 2017-10-01 安全补丁程序级别相关的所有问题。</li>
+  <li>2017-10-05(或之后)的安全补丁程序级别解决了与 2017-10-05 安全补丁程序级别以及之前的所有补丁程序级别相关的所有问题。
   </li>
 </ul>
 <p>提供这些更新的设备制造商应将补丁程序字符串级别设为:</p>
@@ -278,7 +278,7 @@
   <li>[ro.build.version.security_patch]:[2017-10-01]</li>
   <li>[ro.build.version.security_patch]:[2017-10-05]</li>
 </ul>
-<p><strong>2.为何此公告有 2 个安全补丁程序级别?</strong></p>
+<p><strong>2.为何本公告会有 2 个安全补丁程序级别?</strong></p>
 
 <p>本公告有 2 个安全补丁程序级别,目的是让 Android 合作伙伴能够灵活地、更快速地修复所有 Android 设备上类似的一系列漏洞。我们建议 Android 合作伙伴修复本公告中的所有问题并使用最新的安全补丁程序级别。</p>
 <ul>
@@ -288,9 +288,9 @@
 <p>我们建议合作伙伴在一次更新中汇总要解决的所有问题的修复方案。</p>
 
 <p id="type">
-<strong>3.<em></em>“类型”列中的条目表示什么意思?</strong></p>
+<strong>3. “类型”列中的条目表示什么意思?<em></em></strong></p>
 
-<p><em></em>漏洞详情表的“类型”列中的条目是安全漏洞的分类。</p>
+<p>漏洞详情表的“类型”列中的条目是安全漏洞的分类。<em></em></p>
 
 <table>
   <colgroup><col width="25%" />
@@ -320,7 +320,7 @@
    <td>没有分类</td>
   </tr>
 </tbody></table>
-<p><strong>4.<em></em>“参考信息”列中的条目表示什么意思?</strong></p>
+<p><strong>4.“参考信息”列中的条目表示什么意思?<em></em></strong></p>
 
 <p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em></p>
 
@@ -381,6 +381,11 @@
    <td>2017 年 10 月 2 日</td>
    <td>发布了本公告。</td>
   </tr>
+  <tr>
+   <td>1.1</td>
+   <td>2017 年 10 月 3 日</td>
+   <td>修订了本公告,添加了 AOSP 链接。</td>
+  </tr>
 </tbody></table>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/security/bulletin/2017-11-01.html b/zh-cn/security/bulletin/2017-11-01.html
index 9ad57c7..fb1a514 100644
--- a/zh-cn/security/bulletin/2017-11-01.html
+++ b/zh-cn/security/bulletin/2017-11-01.html
@@ -25,7 +25,7 @@
 Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。2017-11-06(或之后)的安全补丁程序级别均已解决所有这些问题。要了解如何检查设备的安全补丁程序级别,请参阅<a href="//support.google.com/pixelphone/answer/4457705">查看并更新 Android 版本</a>。
 </p>
 <p>
-Android 合作伙伴在本公告发布前至少一个月就已收到 2017-11-01 和 2017-11-05 补丁程序级别中的所有问题的相关通知。Android 合作伙伴在上个月就已收到 2017-11-06 补丁程序级别中的所有问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。
+Android 合作伙伴在本公告发布前至少一个月就已收到 2017-11-01 和 2017-11-05 补丁程序级别中的所有问题的相关通知。Android 合作伙伴在上个月就已收到 2017-11-06 补丁程序级别中的所有问题的相关通知。我们已在 Android 开源项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。
 </p>
 <p>
 这些问题中危险性最高的是媒体框架中的一个严重程度为“严重”的安全漏洞,该漏洞可让远程攻击者使用特制文件通过特许进程执行任意代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被关闭)。
@@ -34,7 +34,7 @@
 我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google Play 保护机制缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和 Google Play 保护机制。这些功能可提高 Android 平台的安全性。
 </p>
 <p class="note">
-<strong>注意</strong>:如需了解与最新的无线下载更新 (OTA) 和适用于 Google 设备的固件映像有关的信息,请参阅 <a href="/security/bulletin/pixel/2017-11-01">2017 年 11 月 Pixel/Nexus 安全公告</a>。
+<strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 <a href="/security/bulletin/pixel/2017-11-01">2017 年 11 月 Pixel/Nexus 安全公告</a>。
 </p>
 <h2 id="announcements">公告</h2>
 <ul>
@@ -293,8 +293,7 @@
   <tr>
     <td>CVE-2017-11013</td>
     <td>A-64453535<br />
-        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/prima/commit/?id=64297e4caffdf6b1a90807bbdb65a66b43582228">
-QC-CR#2058261</a>
+        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/prima/commit/?id=64297e4caffdf6b1a90807bbdb65a66b43582228">QC-CR#2058261</a>
  [<a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=c9f8654b11a1e693022ad7f163b3bc477fea8ce8">2</a>]</td>
     <td>RCE</td>
     <td>严重</td>
@@ -312,8 +311,7 @@
   <tr>
     <td>CVE-2017-11014</td>
     <td>A-64438727<br />
-        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=ec58bc99e29d89f8e164954999ef8a45cec21754">
-QC-CR#2060959</a></td>
+        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=ec58bc99e29d89f8e164954999ef8a45cec21754">QC-CR#2060959</a></td>
     <td>RCE</td>
     <td>严重</td>
     <td>WLAN</td>
@@ -344,8 +342,7 @@
   <tr>
     <td>CVE-2017-11028</td>
     <td>A-64453533<br />
-        <a href="//source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=fd70b655d901e626403f132b65fc03d993f0a09b">
-QC-CR#2008683</a>
+        <a href="//source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=fd70b655d901e626403f132b65fc03d993f0a09b">QC-CR#2008683</a>
 [<a href="//source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=6724296d3f3b2821b83219768c1b9e971e380a9f">2</a>]</td>
     <td>ID</td>
     <td>高</td>
@@ -480,7 +477,7 @@
 我们建议合作伙伴在一次更新中汇总要解决的所有问题的修复方案。
 </p>
 <p id="type">
-<strong>3. “类型”列中的条目表示什么意思?<em></em></strong>
+<strong>3.“类型”列中的条目表示什么意思?<em></em></strong>
 </p>
 <p>
 漏洞详情表的“类型”列中的条目是安全漏洞的分类。<em></em>
@@ -514,7 +511,7 @@
   </tr>
 </tbody></table>
 <p>
-<strong>4. <em></em>“参考信息”列中的条目表示什么意思?</strong>
+<strong>4.<em></em>“参考信息”列中的条目表示什么意思?</strong>
 </p>
 <p>
 漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em>
@@ -557,7 +554,8 @@
 <strong>6. 为什么将安全漏洞分开公布在本公告和设备 / 合作伙伴安全公告(如 Pixel/Nexus 公告)中?</strong>
 </p>
 <p>
-本安全公告中记录的安全漏洞是在 Android 设备上采用最新安全补丁程序级别所必不可少的。设备/合作伙伴安全公告中记录的其他安全漏洞不是采用安全补丁程序级别所必需的。我们建议 Android 设备和芯片组制造商通过自己的安全网站(例如 <a href="//security.samsungmobile.com/securityUpdate.smsb">Samsung</a>、<a href="//lgsecurity.lge.com/security_updates.html">LGE</a> 或 <a href="/security/bulletin/pixel/">Pixel/Nexus</a> 安全公告)记录其设备上存在的其他修复程序。
+本安全公告中记录的安全漏洞是在 Android 设备上采用最新安全补丁程序级别所必不可少的。设备/合作伙伴安全公告中记录的其他安全漏洞不是采用安全补丁程序级别所必需的。
+我们建议 Android 设备和芯片组制造商通过自己的安全网站(例如 <a href="//security.samsungmobile.com/securityUpdate.smsb">Samsung</a>、<a href="//lgsecurity.lge.com/security_updates.html">LGE</a> 或 <a href="/security/bulletin/pixel/">Pixel/Nexus</a> 安全公告)记录其设备上存在的其他修复程序。
 </p>
 <h2 id="versions">版本</h2>
 <table>
diff --git a/zh-cn/security/bulletin/2017.html b/zh-cn/security/bulletin/2017.html
index ce88351..9a1a386 100644
--- a/zh-cn/security/bulletin/2017.html
+++ b/zh-cn/security/bulletin/2017.html
@@ -64,7 +64,7 @@
  <tr>
     <td><a href="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>
@@ -72,7 +72,7 @@
  <tr>
     <td><a href="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>
@@ -80,7 +80,7 @@
  <tr>
     <td><a href="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>
@@ -88,7 +88,7 @@
  <tr>
     <td><a href="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>
+      <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>
@@ -96,7 +96,7 @@
  <tr>
     <td><a href="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>
+      <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>
@@ -104,7 +104,7 @@
 <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>
+      <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>
@@ -112,7 +112,7 @@
  <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>
+      <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>
diff --git a/zh-cn/security/bulletin/index.html b/zh-cn/security/bulletin/index.html
index ea6f5be..c79f8ad 100644
--- a/zh-cn/security/bulletin/index.html
+++ b/zh-cn/security/bulletin/index.html
@@ -29,7 +29,7 @@
 </ul>
 
 <h3 id="notification">通知</h3>
-<p>要在新的 Android 公告发布时收到通知,请加入 <a href="https://groups.google.com/forum/#!forum/android-security-updates">Android 安全更新网上论坛</a>,并调整您的电子邮件设置以接收所有更新。
+<p>要在新的 Android 公告发布时收到通知,请加入 <a href="https://groups.google.com/forum/#!forum/android-security-updates">Android 安全更新网上论坛</a>,并调整您的电子邮件递送偏好设置以接收所有更新。
 </p>
 
 <h3 id="sources">来源</h3>
@@ -54,46 +54,41 @@
     <th>安全补丁程序级别</th>
  </tr>
  <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>&nbsp;/
-     <a href="/security/bulletin/2017-10-01.html?hl=ja">日本語</a>&nbsp;/
-     <a href="/security/bulletin/2017-10-01.html?hl=ko">한국어</a>&nbsp;/
-     <a href="/security/bulletin/2017-10-01.html?hl=ru">ру́сский</a>&nbsp;/
-     <a href="/security/bulletin/2017-10-01.html?hl=zh-cn">中文&nbsp;(中国)</a>&nbsp;/
-     <a href="/security/bulletin/2017-10-01.html?hl=zh-tw">中文&nbsp;(台灣)</a>
+    <td><a href="/security/bulletin/2017-11-01.html">2017 年 11 月</a></td>
+    <td>即将发布 <!--
+     <a href="/security/bulletin/2017-11-01.html">English</a>&nbsp;/
+     <a href="/security/bulletin/2017-11-01.html?hl=ja">日本語</a>&nbsp;/
+     <a href="/security/bulletin/2017-11-01.html?hl=ko">한국어</a>&nbsp;/
+     <a href="/security/bulletin/2017-11-01.html?hl=ru">ру́сский</a>&nbsp;/
+     <a href="/security/bulletin/2017-11-01.html?hl=zh-cn">中文&nbsp;(中国)</a>&nbsp;/
+     <a href="/security/bulletin/2017-11-01.html?hl=zh-tw">中文&nbsp;(台灣)</a>
      -->
     </td>
+    <td>2017 年 11 月 6 日</td>
+    <td>2017-11-01<br />
+        2017-11-05<br />
+        2017-11-06</td>
+ </tr>
+ <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>
+    </td>
     <td>2017 年 10 月 2 日</td>
     <td>2017-10-01<br />2017-10-05</td>
  </tr>
  <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>&nbsp;/
-     <a href="/security/bulletin/2017-09-01.html?hl=ja">日本語</a>&nbsp;/
-     <a href="/security/bulletin/2017-09-01.html?hl=ko">한국어</a>&nbsp;/
-     <a href="/security/bulletin/2017-09-01.html?hl=ru">ру́сский</a>&nbsp;/
-     <a href="/security/bulletin/2017-09-01.html?hl=zh-cn">中文&nbsp;(中国)</a>&nbsp;/
-     <a href="/security/bulletin/2017-09-01.html?hl=zh-tw">中文&nbsp;(台灣)</a>
-     -->
+    <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>
     </td>
     <td>2017 年 9 月 5 日</td>
     <td>2017-09-01<br />2017-09-05</td>
  </tr>
  <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>&nbsp;/
-     <a href="/security/bulletin/2017-08-01.html?hl=ja">日本語</a>&nbsp;/
-     <a href="/security/bulletin/2017-08-01.html?hl=ko">한국어</a>&nbsp;/
-     <a href="/security/bulletin/2017-08-01.html?hl=ru">ру́сский</a>&nbsp;/
-     <a href="/security/bulletin/2017-08-01.html?hl=zh-cn">中文&nbsp;(中国)</a>&nbsp;/
-     <a href="/security/bulletin/2017-08-01.html?hl=zh-tw">中文&nbsp;(台灣)</a>
-     -->
+    <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>
     </td>
     <td>2017 年 8 月 7 日</td>
     <td>2017-08-01<br />2017-08-05</td>
@@ -101,7 +96,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>
@@ -109,7 +104,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>
@@ -117,35 +112,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>
@@ -153,7 +148,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>
@@ -161,7 +156,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>
@@ -169,7 +164,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>
@@ -177,7 +172,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>
@@ -185,7 +180,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>
@@ -193,7 +188,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>
@@ -201,7 +196,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>
@@ -209,7 +204,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>
@@ -217,7 +212,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>
@@ -225,7 +220,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>
@@ -233,7 +228,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>
@@ -241,7 +236,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>
@@ -249,7 +244,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>
@@ -257,7 +252,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>
@@ -265,7 +260,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>
@@ -273,7 +268,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>
@@ -281,7 +276,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/2017-10-01.html b/zh-cn/security/bulletin/pixel/2017-10-01.html
index 22c6c10..223d520 100644
--- a/zh-cn/security/bulletin/pixel/2017-10-01.html
+++ b/zh-cn/security/bulletin/pixel/2017-10-01.html
@@ -19,9 +19,9 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-  <p><em>发布时间:2017 年 10 月 2 日</em></p>
+<p><em>发布时间:2017 年 10 月 2 日 | 更新时间:2017 年 10 月 3 日</em></p>
 
-<p>Pixel/Nexus 安全公告详细介绍了会影响<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">受支持的 Google Pixel 和 Nexus 设备</a>(Google 设备)的安全漏洞和功能改进。对于 Google 设备,2017 年 10 月 5 日或之后的安全补丁程序级别解决了本公告中提及的所有问题以及 <a href="/security/bulletin/2017-10-01">2017 年 10 月 Android 安全公告</a>中提及的所有问题。要了解如何检查设备的安全补丁程序级别,请参阅<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">检查并更新您的 Android 版本</a>。</p>
+<p>Pixel/Nexus 安全公告详细介绍了会影响<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">受支持的 Google Pixel 和 Nexus 设备</a>(Google 设备)的安全漏洞和功能改进。对于 Google 设备,2017 年 10 月 5 日或之后发布的安全补丁程序级别解决了本公告中提及的所有问题以及 <a href="/security/bulletin/2017-10-01">2017 年 10 月 Android 安全公告</a>中提及的所有问题。要了解如何检查设备的安全补丁程序级别,请参阅<a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">检查并更新您的 Android 版本</a>。</p>
 
 <p>所有受支持的 Google 设备都将收到 2017-10-05 补丁程序级别的更新。我们建议所有用户都在自己的设备上接受这些更新。</p>
 
@@ -35,7 +35,8 @@
 </ul>
 
 <h2 id="patches">安全补丁程序</h2>
-漏洞列在受其影响的组件下,其中包括问题描述,以及一个包含 CVE、相关参考信息、<a href="#type">漏洞类型</a>、<a href="/security/overview/updates-resources.html#severity">严重程度</a>和已更新的 Android 开放源代码项目 (AOSP) 版本(如果适用)的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个错误有多条相关的更改记录,我们还将通过 Bug ID 后面的数字链接到更多参考信息。<p></p>
+漏洞列在受其影响的组件下,其中包括问题描述,以及一个包含 CVE、相关参考信息、<a href="#type">漏洞类型</a>、<a href="/security/overview/updates-resources.html#severity">严重程度</a>和已更新的 Android 开放源代码项目 (AOSP) 版本(如果适用)的表格。
+在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个 Bug 有多条相关的更改记录,我们还将通过 Bug ID 后面的数字链接到更多参考信息。<p></p>
 
 <h3 id="framework">框架</h3>
 
@@ -54,14 +55,14 @@
   </tr>
   <tr>
     <td>CVE-2017-0807</td>
-    <td>A-35056974</td>
+    <td>A-35056974<a href="#asterisk">*</a></td>
     <td>EoP</td>
     <td>高</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
   </tr>
   <tr>
     <td>CVE-2017-0808</td>
-    <td>A-62301183</td>
+    <td><a href="https://android.googlesource.com/platform/libcore/+/809681f310663288e83587089abb7715c68f6924">A-62301183</a> [<a href="https://android.googlesource.com/platform/libcore/+/100a8006a7baab1bb62820eb62577c0b0849fbc3">2</a>]</td>
     <td>ID</td>
     <td>中</td>
     <td>7.0、7.1.1、7.1.2、8.0</td>
@@ -85,14 +86,14 @@
   </tr>
   <tr>
     <td>CVE-2017-0813</td>
-    <td>A-36531046</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/7fa3f552a6f34ed05c15e64ea30b8eed53f77a41">A-36531046</a></td>
     <td>DoS</td>
     <td>中</td>
     <td>7.0、7.1.1、7.1.2</td>
   </tr>
   <tr>
     <td rowspan="2">CVE-2017-0814</td>
-    <td rowspan="2">A-62800140</td>
+    <td rowspan="2"><a href="https://android.googlesource.com/platform/external/tremolo/+/eeb4e45d5683f88488c083ecf142dc89bc3f0b47">A-62800140</a></td>
     <td>ID</td>
     <td>中</td>
     <td>7.0、7.1.1、7.1.2、8.0</td>
@@ -104,14 +105,14 @@
   </tr>
   <tr>
     <td>CVE-2017-0817</td>
-    <td>A-63522430</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/av/+/d834160d9759f1098df692b34e6eeb548f9e317b">A-63522430</a></td>
     <td>ID</td>
     <td>中</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
     <td rowspan="2">CVE-2017-0818</td>
-    <td rowspan="2">A-63581671</td>
+    <td rowspan="2"><a href="https://android.googlesource.com/platform/frameworks/av/+/d07f5c14e811951ff9b411ceb84e7288e0d04aaf">A-63581671</a></td>
     <td>NSI</td>
     <td>NSI</td>
     <td>7.0、7.1.1、7.1.2、8.0</td>
@@ -123,7 +124,7 @@
   </tr>
   <tr>
     <td rowspan="2">CVE-2017-0819</td>
-    <td rowspan="2">A-63045918</td>
+    <td rowspan="2"><a href="https://android.googlesource.com/platform/external/libhevc/+/87fb7909c49e6a4510ba86ace1ffc83459c7e1b9">A-63045918</a></td>
     <td>NSI</td>
     <td>NSI</td>
     <td>7.0、7.1.1、7.1.2、8.0</td>
@@ -135,7 +136,7 @@
   </tr>
   <tr>
     <td rowspan="2">CVE-2017-0820</td>
-    <td rowspan="2">A-62187433</td>
+    <td rowspan="2"><a href="https://android.googlesource.com/platform/frameworks/av/+/8a3a2f6ea7defe1a81bb32b3c9f3537f84749b9d">A-62187433</a></td>
     <td>NSI</td>
     <td>NSI</td>
     <td>7.0、7.1.1、7.1.2、8.0</td>
@@ -164,14 +165,14 @@
   </tr>
   <tr>
     <td>CVE-2017-0822</td>
-    <td>A-63787722</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/base/+/c574568aaede7f652432deb7707f20ae54bbdf9a">A-63787722</a></td>
     <td>EoP</td>
     <td>中</td>
     <td>6.0.1、7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
     <td>CVE-2017-0823</td>
-    <td>A-37896655</td>
+    <td><a href="https://android.googlesource.com/platform/hardware/ril/+/cd5f15f588a5d27e99ba12f057245bfe507f8c42">A-37896655</a></td>
     <td>ID</td>
     <td>中</td>
     <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2</td>
@@ -495,9 +496,9 @@
 <p>2017-10-05(或之后)的安全补丁程序级别解决了与 2017-10-05 安全补丁程序级别以及之前的所有补丁程序级别相关的所有问题。要了解如何检查设备的安全补丁程序级别,请阅读 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>中的说明。</p>
 
 <p id="type">
-<strong>2.<em></em>“类型”列中的条目表示什么意思?</strong></p>
+<strong>2.“类型”列中的条目表示什么意思?<em></em></strong></p>
 
-<p><em></em>漏洞详情表的“类型”列中的条目是安全漏洞的分类。</p>
+<p>漏洞详情表的“类型”列中的条目表示安全漏洞的分类。<em></em></p>
 
 <table>
   <colgroup><col width="25%" />
@@ -527,7 +528,7 @@
    <td>没有分类</td>
   </tr>
 </tbody></table>
-<p><strong>3.<em></em>“参考信息”列中的条目表示什么意思?</strong></p>
+<p><strong>3.“参考信息”列中的条目表示什么意思?<em></em></strong></p>
 
 <p>漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em></p>
 
@@ -586,6 +587,11 @@
    <td>2017 年 10 月 2 日</td>
    <td>发布了本公告。</td>
   </tr>
+  <tr>
+   <td>1.1</td>
+   <td>2017 年 10 月 3 日</td>
+   <td>修订了本公告,添加了 AOSP 链接。</td>
+  </tr>
 </tbody></table>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/security/bulletin/pixel/2017-11-01.html b/zh-cn/security/bulletin/pixel/2017-11-01.html
index ac718b7..47d4fa4 100644
--- a/zh-cn/security/bulletin/pixel/2017-11-01.html
+++ b/zh-cn/security/bulletin/pixel/2017-11-01.html
@@ -28,7 +28,7 @@
 所有受支持的 Google 设备都会收到 2017-11-05 补丁程序级别的更新。我们建议所有用户都在自己的设备上接受这些更新。
 </p>
 <p class="note">
-<strong>注意:</strong>Google 设备固件映像可在 <a href="//developers.google.com/android/nexus/images">Google Developers 网站</a>上获取。
+<strong>注意</strong>:Google 设备固件映像可在 <a href="//developers.google.com/android/nexus/images">Google Developers 网站</a>上找到。
 </p>
 <h2 id="announcements">公告</h2>
 <p>
@@ -36,7 +36,7 @@
 </p>
 <h2 id="security-patches">安全补丁程序</h2>
 <p>
-漏洞列在受其影响的组件下,其中包括问题描述,以及一个包含 CVE、相关参考信息、<a href="#type">漏洞类型</a>、<a href="/security/overview/updates-resources.html#severity">严重程度</a>和已更新的 Android 开放源代码项目 (AOSP) 版本(如果适用)的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个 Bug 有多条相关的更改记录,我们还将通过 Bug ID 后面的数字链接到更多参考信息。
+漏洞列在受其影响的组件下,其中包括问题描述,以及一个包含 CVE、相关参考信息、<a href="#type">漏洞类型</a>、<a href="/security/overview/updates-resources.html#severity">严重程度</a>和已更新的 Android 开源项目 (AOSP) 版本(如果适用)的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个 Bug 有多条相关的更改记录,我们还将通过 Bug ID 后面的数字链接到更多参考信息。
 </p>
 
 <h3 id="framework">框架</h3>
@@ -399,8 +399,7 @@
   <tr>
     <td>CVE-2017-11035</td>
     <td>A-64431968<br />
-        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=c5060da3e741577578d66dfadb7922d853da6156">
-QC-CR#2055659</a>
+        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=c5060da3e741577578d66dfadb7922d853da6156">QC-CR#2055659</a>
        [<a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=cc1896424ae7a346090f601bc69c6ca51d9c3e04">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
@@ -454,8 +453,7 @@
   <tr>
     <td>CVE-2017-9719</td>
     <td>A-64438726<br />
-        <a href="//source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a491499c3490999555b7ccf8ad1a7d6455625807">
-QC-CR#2042697</a>
+        <a href="//source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=a491499c3490999555b7ccf8ad1a7d6455625807">QC-CR#2042697</a>
        [<a href="//source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=d815f54f15d765b5e0035a9d208d71567bcaace0">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
@@ -488,8 +486,7 @@
   <tr>
     <td>CVE-2017-11029</td>
     <td>A-64433362<br />
-        <a href="//source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=86f0d207d478e1681f6711b46766cfb3c6a30fb5">
-QC-CR#2025367</a>
+        <a href="//source.codeaurora.org/quic/la/kernel/msm-4.4/commit/?id=86f0d207d478e1681f6711b46766cfb3c6a30fb5">QC-CR#2025367</a>
        [<a href="//source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=74ab23917b82769644a3299da47b58e080aa63f2">2</a>]</td>
     <td>EoP</td>
     <td>中</td>
@@ -712,7 +709,7 @@
   <colgroup><col width="25%" />
   <col width="75%" />
   </colgroup><tbody><tr>
-   <th>缩写</th>
+   <th>缩写词</th>
    <th>定义</th>
   </tr>
   <tr>
diff --git a/zh-cn/security/bulletin/pixel/index.html b/zh-cn/security/bulletin/pixel/index.html
index 452df29..3176ef3 100644
--- a/zh-cn/security/bulletin/pixel/index.html
+++ b/zh-cn/security/bulletin/pixel/index.html
@@ -43,16 +43,24 @@
     <th>安全补丁程序级别</th>
  </tr>
  <tr>
-    <td><a href="/security/bulletin/pixel/2017-10-01.html">2017 年 10 月</a></td>
+    <td><a href="/security/bulletin/pixel/2017-11-01.html">2017 年 11 月</a></td>
     <td>即将发布 <!--
-     <a href="/security/bulletin/pixel/2017-10-01.html">English</a>&nbsp;/
-     <a href="/security/bulletin/pixel/2017-10-01.html?hl=ja">日本語</a>&nbsp;/
-     <a href="/security/bulletin/pixel/2017-10-01.html?hl=ko">한국어</a>&nbsp;/
-     <a href="/security/bulletin/pixel/2017-10-01.html?hl=ru">ру́сский</a>&nbsp;/
-     <a href="/security/bulletin/pixel/2017-10-01.html?hl=zh-cn">中文&nbsp;(中国)</a>&nbsp;/
-     <a href="/security/bulletin/pixel/2017-10-01.html?hl=zh-tw">中文&nbsp;(台灣)</a>
+     <a href="/security/bulletin/pixel/2017-11-01.html">English</a>&nbsp;/
+     <a href="/security/bulletin/pixel/2017-11-01.html?hl=ja">日本語</a>&nbsp;/
+     <a href="/security/bulletin/pixel/2017-11-01.html?hl=ko">한국어</a>&nbsp;/
+     <a href="/security/bulletin/pixel/2017-11-01.html?hl=ru">ру́сский</a>&nbsp;/
+     <a href="/security/bulletin/pixel/2017-11-01.html?hl=zh-cn">中文&nbsp;(中国)</a>&nbsp;/
+     <a href="/security/bulletin/pixel/2017-11-01.html?hl=zh-tw">中文&nbsp;(台灣)</a>
      -->
     </td>
+    <td>2017 年 11 月 6 日</td>
+    <td>2017-11-05</td>
+ </tr>
+ <tr>
+    <td><a href="/security/bulletin/pixel/2017-10-01.html">2017 年 10 月</a></td>
+    <td>
+     <a href="/security/bulletin/pixel/2017-10-01.html">English</a>/<a href="/security/bulletin/pixel/2017-10-01.html?hl=ja">日本語</a>/<a href="/security/bulletin/pixel/2017-10-01.html?hl=ko">한국어</a>/<a href="/security/bulletin/pixel/2017-10-01.html?hl=ru">ру́сский</a>/<a href="/security/bulletin/pixel/2017-10-01.html?hl=zh-cn">中文(中国)</a>/<a href="/security/bulletin/pixel/2017-10-01.html?hl=zh-tw">中文(台灣)</a>
+    </td>
     <td>2017 年 10 月 2 日</td>
     <td>2017-10-05</td>
  </tr>
diff --git a/zh-cn/security/index.html b/zh-cn/security/index.html
index 57bef77..b0103c9 100644
--- a/zh-cn/security/index.html
+++ b/zh-cn/security/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>
@@ -32,7 +32,8 @@
 </p>
 <p>除了提供一个稳定的平台来供开发者开发应用之外,Android 还以多种方式为开发者提供其他支持。Android 安全团队会检查应用中是否存在潜在漏洞,并会提出关于如何解决这些问题的建议。对于带有 Google Play 的设备,Play 服务会为关键软件库(例如,用于保障应用通信安全的 OpenSSL)提供安全更新。Android 安全团队发布了一款用于测试 SSL 的工具 (<a href="https://github.com/google/nogotofail">Nogotofail</a>),该工具可以协助开发者发现潜在的安全问题,无论他们是在使用什么平台进行开发。
 </p>
-<p>如需面向 Android 应用开发者的更多信息,请访问 <a href="https://developer.android.com/training/best-security.html">developer.android.com</a>。
+<p>
+如需面向 Android 应用开发者的更多信息,请访问 <a href="https://developer.android.com/training/best-security.html">developer.android.com</a>。
 </p>
 <p>
 <strong>Android 适合用户使用</strong>。用户可以查看每个应用请求的权限,并可以对这些权限加以控制。这种设计考虑到了攻击者可能会尝试进行一些常见的攻击,例如,诱使设备用户安装恶意软件的社会工程攻击,以及对 Android 上的第三方应用的攻击。Android 能够降低受到这些攻击的可能性,并能够大大限制攻击成功时造成的影响。在设备到达用户手中后,Android 的安全性将会不断提升:Android 会与<a href="/security/overview/acknowledgements.html">合作伙伴和公众</a>密切合作,为还在继续接收安全更新的所有 Android 设备提供补丁程序。
@@ -66,9 +67,12 @@
 </ul>
 
 <h2 id="google-security-services">Google 安全服务</h2>
-<p>Google 提供了一套基于云的服务,用户可通过 <a href="https://www.android.com/gms/">Google 移动服务</a>将这些服务安装到兼容的 Android 设备上。虽然这些服务不是 Android 开放源代码项目的一部分,但它们包含在许多 Android 设备中。如需关于其中部分服务的更多信息,请参阅 Android 安全团队发布的 <a href="/security/reports/Google_Android_Security_2015_Report_Final.pdf">2015 年年度回顾报告</a>。
+<p>
+Google 提供了一套基于云的服务,用户可通过 <a href="https://www.android.com/gms/">Google 移动服务</a>将这些服务安装到兼容的 Android 设备上。虽然这些服务不是 Android 开放源代码项目的一部分,但它们包含在许多 Android 设备中。如需关于其中部分服务的更多信息,请参阅 Android 安全团队发布的 <a href="/security/reports/Google_Android_Security_2016_Report_Final.pdf">2016 年年度回顾报告</a>。
 </p>
-<p>Google 的主要安全服务包括:</p>
+<p>
+Google 的主要安全服务包括:
+</p>
 <ul>
   <li><strong>Google Play</strong>:Google Play 是一系列服务的总称。借助这些服务,用户可以通过自己的 Android 设备或网络发现、安装和购买应用。Google Play 可让开发者轻松覆盖 Android 用户和潜在客户。此外,Google Play 还提供社区审核、应用<a href="https://developer.android.com/guide/publishing/licensing.html">许可验证</a>、应用安全扫描以及其他安全服务。</li>
   <li><strong>Android 更新</strong>:Android 更新服务可为某些 Android 设备提供新功能和安全更新,其中包括通过网络或无线下载 (OTA) 方式提供的更新。</li>
diff --git a/zh-cn/security/keystore/tags.html b/zh-cn/security/keystore/tags.html
index 89d1156..c6e5807 100644
--- a/zh-cn/security/keystore/tags.html
+++ b/zh-cn/security/keystore/tags.html
@@ -27,7 +27,7 @@
 
 <p>要了解具体函数,请参阅 <a href="/security/keystore/implementer-ref">Keymaster 函数</a>页面。</p>
 
-<p class="note">为了支持 Keymaster 3 从旧式 C 结构 HAL 转换到从新的硬件接口定义语言 (HIDL) 中的定义生成的 C++ HAL 接口,Android 8.0 中的标记名称已更改。如同所有其他 keymaster 枚举一样,标记现在被定义为范围限定为 C++ 的枚举。例如,之前标记带有 <code>KM_TAG_</code> 前缀,而现在带有 <code>Tag::</code> 前缀。</p>
+<p class="note">为了支持 Keymaster 3 从旧式 C 结构 HAL 转换到根据新的硬件接口定义语言 (HIDL) 定义生成的 C++ HAL 接口,Android 8.0 中的标记名称已更改。如同所有其他 keymaster 枚举一样,标记现在被定义为范围限定为 C++ 的枚举。例如,标记的前缀从之前的 <code>KM_TAG_</code> 改为现在的 <code>Tag::</code>。</p>
 
 <h2 id="active_datetime">Tag::ACTIVE_DATETIME</h2>
 
@@ -79,7 +79,7 @@
 <p><strong>版本</strong>:2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>此标记仅适用于配备贴身传感器的 Android Wear 设备。目前,并非所有 TEE 都能提供对贴身传感器的安全访问权限,或贴身传感器非常安全,因此这应该是一项完全由软件强制执行的功能。</p>
+<p>此标记仅适用于配备贴身传感器的 Android Wear 设备。目前,TEE 并不能提供对贴身传感器的安全访问,贴身传感器也不是非常安全,因此这应该是一项完全由软件强制执行的功能。</p>
 
 <h2 id="all_users">Tag::ALL_USERS</h2>
 
@@ -106,7 +106,7 @@
 
 <p>当提供给 <a href="/security/keystore/implementer-ref#generate_key">generateKey</a> 或 <a href="/security/keystore/implementer-ref#import_key">importKey</a> 时,此标记用于指定使用相应密钥时必需的数据。具体来说就是,调用 <a href="/security/keystore/implementer-ref#export_key">exportKey</a> 和 <a href="/security/keystore/implementer-ref#get_key_characteristics">getKeyCharacteristics</a> 时需要在 <code>clientId</code> 参数中提供相同的值,而调用 <a href="/security/keystore/implementer-ref#begin">begin</a> 时则需要提供此标记以及相同的相关数据(作为 <code>inParams</code> 集的一部分)。如果未收到正确的数据,则该函数会返回 <code>ErrorCode::INVALID_KEY_BLOB</code>。</p>
 
-<p>此标记的内容以加密形式绑定到相应密钥,这意味着,如果有不轨人士有权访问安全域的所有机密内容,但无权访问此标记的内容,必须要确保他们无法解密相应密钥(在不对此标记的内容进行暴力破解攻击的情况下)。<em></em></p>
+<p>此标记的内容以加密形式绑定到相应密钥,这意味着,即使有不轨人士有权访问安全域的所有机密内容,也应无权访问此标记的内容,必须要确保他们无法解密相应密钥(在不对此标记的内容进行暴力破解攻击的情况下)。<em></em></p>
 
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
 
@@ -138,7 +138,7 @@
 <p><strong>版本</strong>:3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>提供设备的品牌名称,由 Android 中的 <code>Build.BRAND</code> 返回。仅在请求认证该设备的标识符时才会设置此字段。</p>
+<p>提供设备的品牌名称,与 Android 中的 <code>Build.BRAND</code> 返回的值相同。仅在请求认证该设备的标识符时才会设置此字段。</p>
 <p>如果该设备不支持 ID 认证(或者之前已调用 <code>destroyAttestationIds()</code> 且该设备无法再证明其 ID),则任何包含该标记的密钥认证请求都会失败并显示 <code>ErrorCode::CANNOT_ATTEST_IDS</code>。</p>
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
 
@@ -146,7 +146,7 @@
 <p><strong>版本</strong>:3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>提供设备的设备名称,由 Android 中的 <code>Build.DEVICE</code> 返回。仅在请求认证该设备的标识符时才会设置此字段。</p>
+<p>提供设备的设备名称,与 Android 中的 <code>Build.DEVICE</code> 返回的值相同。仅在请求认证该设备的标识符时才会设置此字段。</p>
 <p>如果该设备不支持 ID 认证(或者之前已调用 <code>destroyAttestationIds()</code> 且该设备无法再证明其 ID),则任何包含该标记的密钥认证请求都会失败并显示 <code>ErrorCode::CANNOT_ATTEST_IDS</code>。</p>
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
 
@@ -162,7 +162,7 @@
 <p><strong>版本</strong>:3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>提供设备的制造商名称,由 Android 中的 <code>Build.MANUFACTURER</code> 返回。仅在请求认证该设备的标识符时才会设置此字段。</p>
+<p>提供设备的制造商名称,与 Android 中的 <code>Build.MANUFACTURER</code> 返回的值相同。仅在请求认证该设备的标识符时才会设置此字段。</p>
 <p>如果该设备不支持 ID 认证(或者之前已调用 <code>destroyAttestationIds()</code> 且该设备无法再证明其 ID),则任何包含该标记的密钥认证请求都会失败并显示 <code>ErrorCode::CANNOT_ATTEST_IDS</code>。</p>
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
 
@@ -178,7 +178,7 @@
 <p><strong>版本</strong>:3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>提供设备的型号名称,由 Android 中的 <code>Build.MODEL</code> 返回。仅在请求认证该设备的标识符时才会设置此字段。</p>
+<p>提供设备的型号名称,与 Android 中的 <code>Build.MODEL</code> 返回的值相同。仅在请求认证该设备的标识符时才会设置此字段。</p>
 <p>如果该设备不支持 ID 认证(或者之前已调用 <code>destroyAttestationIds()</code> 且该设备无法再证明其 ID),则任何包含该标记的密钥认证请求都会失败并显示 <code>ErrorCode::CANNOT_ATTEST_IDS</code>。</p>
 
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
@@ -187,7 +187,7 @@
 <p><strong>版本</strong>:3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>提供设备的产品名称,由 Android 中的 <code>Build.PRODUCT</code> 返回。仅在请求认证该设备的标识符时才会设置此字段。</p>
+<p>提供设备的产品名称,与 Android 中的 <code>Build.PRODUCT</code> 返回的值相同。仅在请求认证该设备的标识符时才会设置此字段。</p>
 <p>如果该设备不支持 ID 认证(或者之前已调用 <code>destroyAttestationIds()</code> 且该设备无法再证明其 ID),则任何包含该标记的密钥认证请求都会失败并显示 <code>ErrorCode::CANNOT_ATTEST_IDS</code>。</p>
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。</p>
 
@@ -351,7 +351,7 @@
 <p><strong>版本</strong>:2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>在 Keymaster 1 中,用于 EC 密钥的曲线从指定密钥的大小推测而来。为了在今后提高灵活性,Keymaster 2 引入了一种明确的方法来指定曲线。EC 密钥生成请求可能包含 <code>Tag::EC_CURVE</code> 和/或 <code>Tag::KEY_SIZE</code>。</p>
+<p>在 Keymaster 1 中,用于 EC 密钥的曲线从指定密钥的大小推测而来。为了在今后提高灵活性,Keymaster 2 引入了一种明确的方法来指定曲线。EC 密钥生成请求可包含 <code>Tag::EC_CURVE</code> 和/或 <code>Tag::KEY_SIZE</code>。</p>
 
 <p>可能的值是通过以下枚举定义的:</p>
 
@@ -386,7 +386,7 @@
 <p><strong>版本</strong>:2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>在密钥生成期间指定此标记,以指示生成密钥的认证证书应包含一个范围限定于应用且受时间限制的设备唯一 ID(由 <a href="#unique_id">Tag::UNIQUE_ID</a> 指定)。</p>
+<p>在密钥生成期间指定此标记,以指示所生成密钥的认证证书应包含一个范围限定于应用且受时间限制的设备唯一 ID(由 <a href="#unique_id">Tag::UNIQUE_ID</a> 指定)。</p>
 
 <p>此标记为布尔值,因此可能的值为 true(如果此标记存在)和 false(如果此标记不存在)。</p>
 
@@ -438,9 +438,8 @@
 
 <p>此标记的值是一个 32 位的整数,表示允许的操作之间间隔的秒数。</p>
 
-<p>当有操作使用带有此标记的某个密钥时,计时器会在 <a href="/security/keystore/implementer-ref#finish">finish</a> 或 <a href="/security/keystore/implementer-ref#abort">abort</a> 调用期间启动。在计时器表明通过 <code>Tag::MIN_SECONDS_BETWEEN_OPS</code> 指定的间隔时间已过去之前收到的所有 <a href="/security/keystore/implementer-ref#begin">begin</a> 调用都会失败并显示 <code>ErrorCode::KEY_RATE_LIMIT_EXCEEDED</code>。这意味着 Trustlet 会为带有此标记的密钥维护一份使用次数计数器表格。
-由于 Keymaster 内存的大小通常有限制,因此该表格可以具有固定的最大大小,并且当该表格被占满时,如果有操作尝试使用带有此标记的密钥,Keymaster 可以使这些操作失败。该表格需要容纳至少 32 个使用中的密钥,而且当密钥最小使用间隔到期时,需要主动重复使用该表格中的位置。
-如果某项操作因该表格已被占满而失败,则 Keymaster 会返回 <code>ErrorCode::TOO_MANY_OPERATIONS</code>。</p>
+<p>当有操作使用带有此标记的某个密钥时,计时器会在 <a href="/security/keystore/implementer-ref#finish">finish</a> 或 <a href="/security/keystore/implementer-ref#abort">abort</a> 调用期间启动。在计时器表明通过 <code>Tag::MIN_SECONDS_BETWEEN_OPS</code> 指定的间隔时间已过去之前,收到的所有 <a href="/security/keystore/implementer-ref#begin">begin</a> 调用都会失败并显示 <code>ErrorCode::KEY_RATE_LIMIT_EXCEEDED</code>。这意味着 Trustlet 会为带有此标记的密钥维护一份使用次数计数器表格。
+由于 Keymaster 内存的大小通常有限制,因此该表格可以具有固定的最大大小,并且当该表格被占满时,如果有操作尝试使用带有此标记的密钥,Keymaster 可以使这些操作失败。该表格需要容纳至少 32 个使用中的密钥,而且当密钥最小使用间隔到期时,需要主动重复使用该表格中的位置。如果某项操作因该表格已被占满而失败,则 Keymaster 会返回 <code>ErrorCode::TOO_MANY_OPERATIONS</code>。</p>
 
 <h2 id="no_auth_required">Tag::NO_AUTH_REQUIRED</h2>
 
@@ -456,7 +455,7 @@
 <p><strong>版本</strong>:1、2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>用于提供或返回进行 AES GCM、CBC 或 CTR 加密/解密时使用的随机数或初始化矢量 (IV)。在加密和解密操作期间,可以将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a>。仅当相应密钥带有 <a href="#caller_nonce">Tag::CALLER_NONCE</a> 时,才将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a>。如果调用程序未提供此标记,Keymaster 将随机生成适当的随机数或 IV 并通过 begin 将其返回。</p>
+<p>用于提供或返回进行 AES GCM、CBC 或 CTR 加密/解密时使用的随机数或初始化矢量 (IV)。在加密和解密操作期间,可以将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a>。仅当相应密钥带有 <a href="#caller_nonce">Tag::CALLER_NONCE</a> 时,才将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a> 。如果调用程序未提供此标记,Keymaster 将随机生成适当的随机数或 IV 并通过 begin 将其返回。</p>
 
 <p>此标记的值是一个 Blob(任意长度的字节数数组)。所允许的长度取决于模式:GCM 随机数的长度为 12 个字节;CBC IV 和 CTR IV 的长度为 16 个字节。</p>
 
@@ -639,8 +638,7 @@
 
 <p>用于为 RSA 密钥对指定公开指数的值。此标记仅与 RSA 密钥有关,而且是所有 RSA 密钥都必需的标记。</p>
 
-<p>此标记的值是一个 64 位的未签名整数,并且符合 RSA 公开指数方面的要求。该值必须是质数。Trustlet 支持 2^16+1 这个值,并且可以支持其他合理的值,尤其是 3。
-如果未指定指数或指定的指数不受支持,密钥生成操作会失败并显示 <code>ErrorCode::INVALID_ARGUMENT</code>。</p>
+<p>此标记的值是一个 64 位的未签名整数,并且符合 RSA 公开指数方面的要求。该值必须是质数。Trustlet 支持 2^16+1 这个值,并且可以支持其他合理的值,尤其是 3。如果未指定指数或指定的指数不受支持,密钥生成操作会失败并显示 <code>ErrorCode::INVALID_ARGUMENT</code>。</p>
 
 <h2 id="unique_id">Tag::UNIQUE_ID</h2>
 
diff --git a/zh-cn/security/overview/acknowledgements.html b/zh-cn/security/overview/acknowledgements.html
index 81b9b10..bac45db 100644
--- a/zh-cn/security/overview/acknowledgements.html
+++ b/zh-cn/security/overview/acknowledgements.html
@@ -52,12 +52,16 @@
    <td>CVE-2017-0691、CVE-2017-0700</td>
   </tr>
   <tr>
+   <td>加州大学圣巴巴拉分校 Shellphish Grill 团队的 Aravind Machiry</td>
+   <td>CVE-2017-0865</td>
+  </tr>
+  <tr>
    <td>本·古里安大学网络实验室的 Asaf Shabtai 博士</td>
    <td>CVE-2017-0650</td>
   </tr>
   <tr>
    <td>阿里巴巴移动安全团队的 Baozeng Ding (<a href="https://twitter.com/sploving">@sploving</a>)</td>
-   <td>CVE-2017-0463、CVE-2017-0506、CVE-2017-0711、CVE-2017-0741、CVE-2017-0742、CVE-2017-0751、CVE-2017-0796、CVE-2017-0798、CVE-2017-0800、CVE-2017-0827、CVE-2017-11000、CVE-2017-11059</td>
+   <td>CVE-2017-0463、CVE-2017-0506、CVE-2017-0711、CVE-2017-0741、CVE-2017-0742、CVE-2017-0751、CVE-2017-0796、CVE-2017-0798、CVE-2017-0800、CVE-2017-0827、CVE-2017-0843、CVE-2017-0864、CVE-2017-11000、CVE-2017-11059</td>
   </tr>
   <tr>
    <td>Ben Actis (<a href="https://twitter.com/ben_ra">@Ben_RA</a>)</td>
@@ -85,14 +89,18 @@
   </tr>
   <tr>
    <td>阿里巴巴移动安全团队的 Chengming Yang</td>
-   <td>CVE-2016-10280、CVE-2016-10281、CVE-2017-0463、CVE-2017-0506、CVE-2017-0565、CVE-2017-0711、CVE-2017-0741、CVE-2017-0742、CVE-2017-0751、CVE-2017-0796、CVE-2017-0798、CVE-2017-0800、CVE-2017-0827、CVE-2017-11000、CVE-2017-11059</td>
+   <td>CVE-2016-10280、CVE-2016-10281、CVE-2017-0463、CVE-2017-0506、CVE-2017-0565、CVE-2017-0711、CVE-2017-0741、CVE-2017-0742、CVE-2017-0751、CVE-2017-0796、CVE-2017-0798、CVE-2017-0800、CVE-2017-0827、CVE-2017-0843、CVE-2017-0864、CVE-2017-9696、CVE-2017-9702、CVE-2017-11000、CVE-2017-11059、CVE-2017-11089、CVE-2017-11090</td>
+  </tr>
+  <tr>
+   <td>佐治亚理工学院的 Chenxiong Qian</td>
+   <td>CVE-2017-0860</td>
   </tr>
   <tr>
    <td><a href="https://c0reteam.org/">C0RE 团队</a>的 <a href="mailto:[email protected]">Chi Zhang</a></td>
-   <td>CVE-2017-0666、CVE-2017-0681、CVE-2017-0684、CVE-2017-0765</td>
+   <td>CVE-2017-0666、CVE-2017-0681、CVE-2017-0684、CVE-2017-0765、CVE-2017-0836、CVE-2017-0857</td>
   </tr>
   <tr>
-   <td><a href="https://twitter.com/chiachih_wu">C0RE 团队</a>的 Chiachih Wu (<a href="http://c0reteam.org/">@chiachih_wu</a>)</td>
+   <td><a href="http://c0reteam.org/">C0RE 团队</a>的 Chiachih Wu (<a href="https://twitter.com/chiachih_wu">@chiachih_wu</a>)</td>
    <td>CVE-2016-8425、CVE-2016-8426、CVE-2016-8430、CVE-2016-8431、CVE-2016-8432、CVE-2016-8449、CVE-2016-8435、CVE-2016-8480、CVE-2016-8481、CVE-2016-8482、CVE-2017-0383、CVE-2017-0384、CVE-2017-0385、CVE-2017-0398、CVE-2017-0400、CVE-2017-0401、CVE-2017-0402、CVE-2017-0428、CVE-2017-0429、CVE-2017-0435、CVE-2017-0436、CVE-2017-0444、CVE-2017-0448</td>
   </tr>
   <tr>
@@ -141,7 +149,7 @@
   </tr>
   <tr>
    <td>趋势科技的徐健</td>
-   <td>CVE-2017-0599、CVE-2017-0635、CVE-2017-0641、CVE-2017-0643</td>
+   <td>CVE-2017-0599、CVE-2017-0635、CVE-2017-0641、CVE-2017-0643、CVE-2017-0859</td>
   </tr>
   <tr>
    <td>比雷埃夫斯大学的 Efthimios Alepis</td>
@@ -253,7 +261,7 @@
   </tr>
   <tr>
    <td>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>)</td>
-   <td>CVE-2016-5346、CVE-2016-8416、CVE-2016-8475、CVE-2016-8478、CVE-2017-0445、CVE-2017-0458、CVE-2017-0459、CVE-2017-0518、CVE-2017-0519、CVE-2017-0533、CVE-2017-0534、CVE-2017-6425、CVE-2017-8233、CVE-2017-8261、CVE-2017-8268</td>
+   <td>CVE-2016-5346、CVE-2016-8416、CVE-2016-8475、CVE-2016-8478、CVE-2017-0445、CVE-2017-0458、CVE-2017-0459、CVE-2017-0518、CVE-2017-0519、CVE-2017-0533、CVE-2017-0534、CVE-2017-0862、CVE-2017-6425、CVE-2017-8233、CVE-2017-8261、CVE-2017-8268</td>
   </tr>
   <tr>
    <td>Census Consulting Inc. 的 Joey Brand</td>
@@ -264,6 +272,10 @@
    <td>CVE-2016-8461、CVE-2016-8462</td>
   </tr>
   <tr>
+   <td><a href="https://www.linkedin.com/in/jose-maria-ariel-martinez-juarez-7910a189/">Jose Martinez</a></td>
+   <td>CVE-2017-0841</td>
+  </tr>
+  <tr>
    <td>小米公司的 Juhu Nie</td>
    <td>CVE-2016-10276</td>
   </tr>
@@ -272,12 +284,16 @@
    <td>CVE-2017-0404</td>
   </tr>
   <tr>
+   <td>Google 的 Justin Paupore</td>
+   <td>CVE-2017-0831</td>
+  </tr>
+  <tr>
    <td>Google 的 Kevin Deus</td>
    <td>CVE-2017-11052、CVE-2017-11054、CVE-2017-11055、CVE-2017-11062</td>
   </tr>
   <tr>
    <td>百度安全实验室的韦韬</td>
-   <td>CVE-2016-8417、CVE-2016-10236、CVE-2017-0728、CVE-2017-0738、CVE-2017-0766、CVE-2017-0794、CVE-2017-9681、CVE-2017-9684、CVE-2017-9693、CVE-2017-9694、CVE-2017-9720、CVE-2017-10999、CVE-2017-11001、CVE-2017-11057、CVE-2017-11060、CVE-2017-11061、CVE-2017-11064</td>
+   <td>CVE-2016-8417、CVE-2016-10236、CVE-2017-0728、CVE-2017-0738、CVE-2017-0766、CVE-2017-0794 CVE-2017-9681、CVE-2017-9684、CVE-2017-9693、CVE-2017-9694、CVE-2017-9696、CVE-2017-9702、CVE-2017-9720、CVE-2017-10999、CVE-2017-11001、CVE-2017-11057、CVE-2017-11060、CVE-2017-11061、CVE-2017-11064、CVE-2017-11089、CVE-2017-11090</td>
   </tr>
   <tr>
    <td>奇虎 360 Qex 团队的 Liyadong</td>
@@ -321,7 +337,7 @@
   </tr>
   <tr>
    <td><a href="http://c0reteam.org/">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
-   <td>CVE-2017-0383、CVE-2017-0417、CVE-2017-0418、CVE-2017-0425、CVE-2017-0450、CVE-2017-0479、CVE-2017-0480、CVE-2017-0483、CVE-2017-0665、CVE-2017-0666、CVE-2017-0681、CVE-2017-0684、CVE-2017-0731、CVE-2017-0737、CVE-2017-0739、CVE-2017-0765、CVE-2017-0768、CVE-2017-0769、CVE-2017-0779、CVE-2017-0801、CVE-2017-0812、CVE-2017-0815、CVE-2017-0816</td>
+   <td>CVE-2017-0383、CVE-2017-0417、CVE-2017-0418、CVE-2017-0425、CVE-2017-0450、CVE-2017-0479、CVE-2017-0480、CVE-2017-0483、CVE-2017-0665、CVE-2017-0666、CVE-2017-0681、CVE-2017-0684、CVE-2017-0731、CVE-2017-0737、CVE-2017-0739、CVE-2017-0765、CVE-2017-0768、CVE-2017-0769、CVE-2017-0779、CVE-2017-0801、CVE-2017-0812、CVE-2017-0815、CVE-2017-0816、CVE-2017-0836、CVE-2017-0840、CVE-2017-0857</td>
   </tr>
   <tr>
    <td>Monk Avel</td>
@@ -369,15 +385,15 @@
   </tr>
   <tr>
    <td>阿里巴巴移动安全团队的 Peng Xiao</td>
-   <td>CVE-2016-10280、CVE-2016-10281、CVE-2017-0463、CVE-2017-0506、CVE-2017-0565</td>
+   <td>CVE-2016-10280、CVE-2016-10281、CVE-2017-0463、CVE-2017-0506、CVE-2017-0565、CVE-2017-0842</td>
   </tr>
   <tr>
    <td>百度安全实验室的丁鹏飞</td>
-   <td>CVE-2016-8417、CVE-2016-10236、CVE-2017-0728、CVE-2017-0738、CVE-2017-0766、CVE-2017-0794、CVE-2017-9681、CVE-2017-9684、CVE-2017-9693、CVE-2017-9694、CVE-2017-9715、CVE-2017-9717、CVE-2017-9720、CVE-2017-11001、CVE-2017-10999、CVE-2017-11057、CVE-2017-11060、CVE-2017-11061、CVE-2017-11064</td>
+   <td>CVE-2016-8417、CVE-2016-10236、CVE-2017-0728、CVE-2017-0738、CVE-2017-0766、CVE-2017-0794、CVE-2017-9681、CVE-2017-9684、CVE-2017-9693、CVE-2017-9694、CVE-2017-9696、CVE-2017-9702、CVE-2017-9715、CVE-2017-9717、CVE-2017-9720、CVE-2017-11001、CVE-2017-10999、CVE-2017-11057、CVE-2017-11060、CVE-2017-11061、CVE-2017-11064、CVE-2017-11089、CVE-2017-11090</td>
   </tr>
   <tr>
    <td>腾讯安全平台部门的 Peter Pi</td>
-   <td>CVE-2017-11046</td>
+   <td>CVE-2017-11046、CVE-2017-11091</td>
   </tr>
   <tr>
    <td>趋势科技的 Peter Pi (<a href="https://twitter.com/heisecode">@heisecode</a>)</td>
@@ -385,11 +401,11 @@
   </tr>
   <tr>
    <td>奇虎 360 科技有限公司 IceSword 实验室的 <a href="http://weibo.com/jfpan">pjf</a></td>
-   <td>CVE-2016-5346、CVE-2016-8416、CVE-2016-8464、CVE-2016-8475、CVE-2016-8478、CVE-2016-10285、CVE-2016-10288、CVE-2016-10290、CVE-2016-10294、CVE-2016-10295、CVE-2016-10296、CVE-2017-0329、CVE-2017-0332、CVE-2017-0432、CVE-2017-0434、CVE-2017-0445、CVE-2017-0446、CVE-2017-0447、CVE-2017-0458、CVE-2017-0459、CVE-2017-0500、CVE-2017-0501、CVE-2017-0502、CVE-2017-0503、CVE-2017-0509、CVE-2017-0518、CVE-2017-0519、CVE-2017-0524、CVE-2017-0529、CVE-2017-0533、CVE-2017-0534、CVE-2017-0536、CVE-2017-0566、CVE-2017-0573、CVE-2017-0581、CVE-2017-0616、CVE-2017-0617、CVE-2017-0624、CVE-2017-0649、CVE-2017-0744、CVE-2017-6425、CVE-2017-6426、CVE-2017-8233、CVE-2017-8243、CVE-2017-8261、CVE-2017-8266、CVE-2017-8268、CVE-2017-8270、CVE-2017-9691、CVE-2017-10997</td>
+   <td>CVE-2016-5346、CVE-2016-8416、CVE-2016-8464、CVE-2016-8475、CVE-2016-8478、CVE-2016-10285、CVE-2016-10288、CVE-2016-10290、CVE-2016-10294、CVE-2016-10295、CVE-2016-10296、CVE-2017-0329、CVE-2017-0332、CVE-2017-0432、CVE-2017-0434、CVE-2017-0445、CVE-2017-0446、CVE-2017-0447、CVE-2017-0458、CVE-2017-0459、CVE-2017-0500、CVE-2017-0501、CVE-2017-0502、CVE-2017-0503、CVE-2017-0509、CVE-2017-0518、CVE-2017-0519、CVE-2017-0524、CVE-2017-0529、CVE-2017-0533、CVE-2017-0534、CVE-2017-0536、CVE-2017-0566、CVE-2017-0573、CVE-2017-0581、CVE-2017-0616、CVE-2017-0617、CVE-2017-0624、CVE-2017-0649、CVE-2017-0744、CVE-2017-0862、CVE-2017-6425、CVE-2017-6426、CVE-2017-8233、CVE-2017-8243、CVE-2017-8261、CVE-2017-8266、CVE-2017-8268、CVE-2017-8270、CVE-2017-9691、CVE-2017-10997</td>
   </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</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</td>
   </tr>
   <tr>
    <td>奇虎 360 的 Qing Zhang</td>
@@ -404,8 +420,8 @@
    <td>CVE-2017-0522</td>
   </tr>
   <tr>
-   <td>HCL 科技公司 Aleph 研究团队的 Roee Hay (<a href="https://twitter.com/roeehay">@rooehay</a>)</td>
-   <td>CVE-2016-10277、CVE-2017-0563、CVE-2017-0582、CVE-2017-0648</td>
+   <td>HCL 科技公司 Aleph 研究团队的 Roee Hay (<a href="https://twitter.com/roeehay">@roeehay</a>)</td>
+   <td>CVE-2016-10277、CVE-2017-0563、CVE-2017-0582、CVE-2017-0648、CVE-2017-0829</td>
   </tr>
   <tr>
    <td>IBM X-Force 安全研究团队的 Roee Hay</td>
@@ -440,6 +456,10 @@
    <td>CVE-2017-0498</td>
   </tr>
   <tr>
+   <td>佐治亚理工学院的 Simon Chung</td>
+   <td>CVE-2017-0860</td>
+  </tr>
+  <tr>
    <td><a href="http://www.byterev.com/">ByteRev</a> 的 <a href="mailto:[email protected]">Stéphane Marques</a></td>
    <td>CVE-2017-0489</td>
   </tr>
@@ -492,6 +512,10 @@
    <td>CVE-2017-0752</td>
   </tr>
   <tr>
+   <td>佐治亚理工学院的 Wenke Lee</td>
+   <td>CVE-2017-0860</td>
+  </tr>
+  <tr>
    <td><a href="http://c0reteam.org/">C0RE 团队</a>的 <a href="mailto:[email protected]">Wenke Dou</a></td>
    <td>CVE-2017-0384、CVE-2017-0385、CVE-2017-0398、CVE-2017-0400、CVE-2017-0401、CVE-2017-0402、CVE-2017-0417、CVE-2017-0418、CVE-2017-0450、CVE-2017-0483、CVE-2017-0768、CVE-2017-0779、CVE-2017-0812、CVE-2017-0815、CVE-2017-0816</td>
   </tr>
@@ -501,11 +525,11 @@
   </tr>
   <tr>
    <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</td>
+   <td>CVE-2017-0408、CVE-2017-0477、CVE-2017-11063、CVE-2017-11092</td>
   </tr>
   <tr>
    <td>腾讯安全平台部门的付敬贵</td>
-   <td>CVE-2017-11050、CVE-2017-11051、CVE-2017-11067</td>
+   <td>CVE-2017-0863、CVE-2017-11050、CVE-2017-11051、CVE-2017-11067、CVE-2017-11073、CVE-2017-11093</td>
   </tr>
   <tr>
    <td>阿里巴巴移动安全团队的 Xiangqian Zhang</td>
@@ -521,7 +545,7 @@
   </tr>
   <tr>
    <td>腾讯安全平台部门的 Xiling Gong</td>
-   <td>CVE-2017-0597、CVE-2017-0708、CVE-2017-8236</td>
+   <td>CVE-2017-0597、CVE-2017-0708、CVE-2017-8236、CVE-2017-9690</td>
   </tr>
   <tr>
    <td>360 Marvel 团队的 Xingyuan Lin</td>
@@ -549,7 +573,11 @@
   </tr>
   <tr>
    <td>阿里巴巴移动安全团队的 Yang Song</td>
-   <td>CVE-2016-10280、CVE-2016-10281、CVE-2017-0463、CVE-2017-0506、CVE-2017-0565、CVE-2017-0711、CVE-2017-0741、CVE-2017-0742、CVE-2017-0751、CVE-2017-0796、CVE-2017-0798、CVE-2017-0800、CVE-2017-0827、CVE-2017-11000、CVE-2017-11059</td>
+   <td>CVE-2016-10280、CVE-2016-10281、CVE-2017-0463、CVE-2017-0506、CVE-2017-0565、CVE-2017-0711、CVE-2017-0741、CVE-2017-0742、CVE-2017-0751、CVE-2017-0796、CVE-2017-0798、CVE-2017-0800、CVE-2017-0827、CVE-2017-0842、CVE-2017-0843、CVE-2017-0864、CVE-2017-11000、CVE-2017-11059</td>
+  </tr>
+  <tr>
+   <td>EURECOM 加州大学圣巴巴拉分校 Shellphish Grill 团队的 Yanick Fratantonio</td>
+   <td>CVE-2017-0860</td>
   </tr>
   <tr>
    <td>奇虎 360 Qex 团队的 Yangkang (<a href="https://twitter.com/dnpushme">@dnpushme</a>)</td>
@@ -561,7 +589,7 @@
   </tr>
   <tr>
    <td>阿里巴巴的王勇 (<a href="https://twitter.com/ThomasKing2014">@ThomasKing2014</a>)</td>
-   <td>CVE-2017-0404、CVE-2017-0588</td>
+   <td>CVE-2017-0404、CVE-2017-0588、CVE-2017-0842</td>
   </tr>
   <tr>
    <td>奇虎 360 科技有限公司 IceSword 实验室的 Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>)</td>
@@ -569,7 +597,7 @@
   </tr>
   <tr>
    <td><a href="http://xlab.tencent.com/">腾讯玄武实验室</a>的 Yongke Wang</td>
-   <td>CVE-2017-0729、CVE-2017-0767</td>
+   <td>CVE-2017-0729、CVE-2017-0767、CVE-2017-0839、CVE-2017-0848</td>
   </tr>
   <tr>
    <td>本·古里安大学网络实验室的 Yossi Oren 博士</td>
@@ -581,11 +609,11 @@
   </tr>
   <tr>
    <td><a href="http://c0reteam.org/">C0RE 团队</a>的 <a href="mailto:[email protected]">Yuan-Tsung Lo</a></td>
-   <td>CVE-2016-8425、CVE-2016-8426、CVE-2016-8430、CVE-2016-8431、CVE-2016-8432、CVE-2016-8435、CVE-2016-8449、CVE-2016-8479、CVE-2016-8480、CVE-2016-8481、CVE-2016-8482、CVE-2016-10291、CVE-2017-0326、CVE-2017-0333、CVE-2017-0428、CVE-2017-0429、CVE-2017-0435、CVE-2017-0436、CVE-2017-0444、CVE-2017-0448、CVE-2017-0526、CVE-2017-0527、CVE-2017-0651、CVE-2017-0709、CVE-2017-0824、CVE-2017-7368、CVE-2017-8264、CVE-2017-10661</td>
+   <td>CVE-2016-8425、CVE-2016-8426、CVE-2016-8430、CVE-2016-8431、CVE-2016-8432、CVE-2016-8435、CVE-2016-8449、CVE-2016-8479、CVE-2016-8480、CVE-2016-8481、CVE-2016-8482、CVE-2016-10291、CVE-2017-0326、CVE-2017-0333、CVE-2017-0428、CVE-2017-0429、CVE-2017-0435、CVE-2017-0436、CVE-2017-0444、CVE-2017-0448、CVE-2017-0526、CVE-2017-0527、CVE-2017-6264、CVE-2017-6274、CVE-2017-6275、CVE-2017-0651、CVE-2017-0709、CVE-2017-0824、CVE-2017-7368、CVE-2017-8264、CVE-2017-10661</td>
   </tr>
   <tr>
    <td><a href="http://xlab.tencent.com/">腾讯玄武实验室</a>的 Yuebin Sun</td>
-   <td>CVE-2017-0767</td>
+   <td>CVE-2017-0767、CVE-2017-0839、CVE-2017-0848</td>
   </tr>
   <tr>
    <td><a href="http://c0reteam.org/">C0RE 团队</a>的 Yuqi Lu (<a href="https://twitter.com/nikos233__">@nikos233</a>)</td>
@@ -621,13 +649,14 @@
   </tr>
   <tr>
    <td>奇虎 360 科技有限公司成都安全响应中心的 <a href="https://weibo.com/ele7enxxh">Zinuo Han</a></td>
-   <td>CVE-2017-0475、CVE-2017-0497、CVE-2017-0548、CVE-2017-0678、CVE-2017-0691、CVE-2017-0700、CVE-2017-0714、CVE-2017-0718、CVE-2017-0719、CVE-2017-0720、CVE-2017-0722、CVE-2017-0725、CVE-2017-0745、CVE-2017-0760、CVE-2017-0761、CVE-2017-0764、CVE-2017-0776、CVE-2017-0777、CVE-2017-0778、CVE-2017-0813、CVE-2017-0814、CVE-2017-0820、CVE-2017-0823</td>
+   <td>CVE-2017-0475、CVE-2017-0497、CVE-2017-0548、CVE-2017-0678、CVE-2017-0691、CVE-2017-0700、CVE-2017-0714、CVE-2017-0718、CVE-2017-0719、CVE-2017-0720、CVE-2017-0722、CVE-2017-0725、CVE-2017-0745、CVE-2017-0760、CVE-2017-0761、CVE-2017-0764、CVE-2017-0776、CVE-2017-0777、CVE-2017-0778、CVE-2017-0813、CVE-2017-0814、CVE-2017-0820、CVE-2017-0823、CVE-2017-0850、CVE-2017-0858</td>
   </tr>
   <tr>
    <td>Google 的 Zubin Mithra</td>
    <td>CVE-2017-0462、CVE-2017-8241</td>
   </tr>
 </tbody></table>
+
 <h2 id="2016">2016 年</h2>
 
 <div style="LINE-HEIGHT:25px;">
@@ -719,7 +748,7 @@
 
 <p>比雷埃夫斯大学的 <a href="mailto:[email protected]">Efthimios Alepis</a></p>
 
-<p><a href="https://twitter.com/heeeeen4x">MS509Team</a> 的 En He (<a href="http://www.ms509.com">@heeeeen4x</a>)</p>
+<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>
 
@@ -1026,7 +1055,7 @@
 
 <p>趋势科技的 Jack Tang (@jacktang310)</p>
 
-<p><a href="http://security.utexas.edu/">德克萨斯州大学奥斯汀分校</a>的 jgor (<a href="https://twitter.com/indiecom">@indiecom</a>)</p>
+<p><a href="https://twitter.com/indiecom">德克萨斯州大学奥斯汀分校</a>的 jgor (<a href="http://security.utexas.edu/">@indiecom</a>)</p>
 
 <p>阿根廷布宜诺斯艾利斯 Dr. Manuel Sadosky 基金会 Programa STIC 的 Joaquín Rinaudo (@xeroxnir)</p>
 
@@ -1109,7 +1138,9 @@
 
 <p><a href="http://www.search-lab.hu/">Search-Lab Ltd.</a> 的 Imre Rad</p>
 
-<p><a href="http://thejh.net/">Jann Horn</a><a href="https://android-review.googlesource.com/#/c/98197/"><img style="vertical-align:middle;" src="../images/tiny-robot.png" alt="绿色机器人补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://thejh.net/">Jann Horn</a><a href="https://android-review.googlesource.com/#/c/98197/">
+<img style="vertical-align:middle;" src="../images/tiny-robot.png" alt="绿色机器人补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/>
+</a></p>
 
 <p><a href="http://www.bluebox.com/">Bluebox Security</a> 的 Jeff Forristal</p>
 
@@ -1129,7 +1160,9 @@
 
 <p>犹他大学的 <a href="http://www.cs.utah.edu/~rsas/">Raimondas Sasnauskas</a></p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p><a href="http://www.samsung.com">三星移动</a></p>
 
@@ -1141,9 +1174,12 @@
 
 <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"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>EC SPRIDE 达姆施塔特工业大学<a href="http://sseblog.ec-spride.de/">安全软件工程团队</a>的 Steven Arzt (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
@@ -1163,7 +1199,10 @@
 
 <p><a href="https://www.facebook.com">Facebook</a> 的 <a href="http://www.shackleton.io/">Will Shackleton</a></p>
 
-<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://www.linkedin.com/in/billcroberts">
+William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>印第安纳大学布卢明顿分校的 <a href="http://www.informatics.indiana.edu/xw7/">Xiaofeng Wang</a> (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
@@ -1173,7 +1212,7 @@
 
 <p>印第安纳大学布卢明顿分校的 Yeonjoon Lee (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
-<p><a href="http://www.androbugs.com">林禹成</a> (<a href="https://twitter.com/AndroBugs">@AndroBugs</a>)</p>
+<p><a href="http://www.androbugs.com">林禹成</a> (<a href="https://twitter.com/AndroBugs">@AndroBugs)</a></p>
 
 <p><a href="http://xteam.baidu.com">百度 X-Team</a> 的 Zhang Dong Hui (<a href="http://weibo.com/shineastdh">shineastdh</a>)</p>
 
@@ -1187,11 +1226,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>)<a href="https://android-review.googlesource.com/#/q/change:72228+OR+change:72229"><img style="vertical-align:middle" src="../images/patchreward.png" alt="补丁程序奖励符号" title="此人符合参加补丁程序奖励计划的条件!"/></a></p>
+<p><a href="http://www.accuvant.com/">Accuvant LABS</a> 的 Joshua J. Drake (<a href="https://twitter.com/jduck">@jduck</a>)
+<a href="https://android-review.googlesource.com/#/q/change:72228+OR+change:72229">
+<img style="vertical-align:middle" src="../images/patchreward.png" alt="补丁程序奖励符号" title="此人符合参加补丁程序奖励计划的条件!"/></a></p>
 
 <p>Kan Yuan</p>
 
-<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>
 
@@ -1205,13 +1246,20 @@
 
 <p><a href="https://securityresear.ch/">Roee Hay</a>(<a href="https://twitter.com/roeehay">@roeehay</a>、<a href="mailto:[email protected]">[email protected]</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>IOActive 的 Ruben Santamarta (<a href="https://twitter.com/reversemode">@reversemode</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
-<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://www.linkedin.com/in/billcroberts">
+William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p>印第安纳大学布卢明顿分校的 Xiaorui Pan (<a href="mailto:[email protected]">[email protected]</a>)</p>
 
@@ -1229,13 +1277,20 @@
 
 <p>柏林工业大学的 Ravishankar Borgaonkari (<a href="https://twitter.com/raviborgaonkar">@raviborgaonkar</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Robert Craig
+<a href="https://android-review.googlesource.com/#/q/owner:%22Robert+Craig+%253Crpcraig%2540tycho.ncsc.mil%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 <p><a href="https://securityresear.ch/">Roee Hay</a>(<a href="https://twitter.com/roeehay">@roeehay</a>、<a href="mailto:[email protected]">[email protected]</a>)</p>
 
-<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p>美国国家安全局<a href="https://www.nsa.gov/research/ia_research/">可信系统研究团队</a>的 Stephen Smalley
+<a href="https://android-review.googlesource.com/#/q/owner:%22Stephen+Smalley+%253Csds%2540tycho.nsa.gov%253E%22+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
-<p><a href="http://www.linkedin.com/in/billcroberts">William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged"><img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
+<p><a href="http://www.linkedin.com/in/billcroberts">
+William Roberts</a> (<a href="mailto:[email protected]">[email protected]</a>)
+<a href="https://android-review.googlesource.com/#/q/owner:bill.c.roberts%2540gmail.com+status:merged">
+<img style="vertical-align:middle" src="../images/tiny-robot.png" alt="补丁程序符号" title="此人贡献了有助于提高 Android 安全性的代码"/></a></p>
 
 </div>