Docs: Changes to source.android.com

  - 186386294 Document sparse build IDs. by Android Partner Docs <noreply@android.com>
  - 186311197 Devsite localized content from translation request 703a84... by Android Partner Docs <noreply@android.com>
  - 186311182 Devsite localized content from translation request 52fd59... by Android Partner Docs <noreply@android.com>
  - 186311170 Devsite localized content from translation request 5ce91a... by Android Partner Docs <noreply@android.com>
  - 186311073 Devsite localized content from translation request 1eb5e4... by Android Partner Docs <noreply@android.com>
  - 186311067 Devsite localized content from translation request a350f8... by Android Partner Docs <noreply@android.com>
  - 186311040 Devsite localized content from translation request 311c15... by Android Partner Docs <noreply@android.com>
  - 186083666 Devsite localized content from translation request c04a20... by Android Partner Docs <noreply@android.com>
  - 186083661 Devsite localized content from translation request 9ed102... by Android Partner Docs <noreply@android.com>
  - 185957552 Devsite localized content from translation request 2e9841... by Android Partner Docs <noreply@android.com>
  - 185846824 Devsite localized content from translation request 1e4314... by Android Partner Docs <noreply@android.com>
  - 185767602 Update CTS/CTS-Verifier downloads for CTS-Feb-2018 Releases by Android Partner Docs <noreply@android.com>
  - 185753300 Update incorrect CVE assignments in February public bulle... by Android Partner Docs <noreply@android.com>
  - 185722157 Devsite localized content from translation request 5f11d4... by Android Partner Docs <noreply@android.com>
  - 185722126 Devsite localized content from translation request cb9a85... by Android Partner Docs <noreply@android.com>
  - 185721715 Devsite localized content from translation request 643c25... by Android Partner Docs <noreply@android.com>
  - 185710613 CDD: Clarify that /sdcard can share storage with /data by Android Partner Docs <noreply@android.com>

PiperOrigin-RevId: 186386294
Change-Id: I0ba14b2f9dfc653c05455516185a9fae43a2f53b
diff --git a/en/compatibility/5.1/android-5.1-cdd.html b/en/compatibility/5.1/android-5.1-cdd.html
index 3d0fe89..c292781 100644
--- a/en/compatibility/5.1/android-5.1-cdd.html
+++ b/en/compatibility/5.1/android-5.1-cdd.html
@@ -3814,8 +3814,9 @@
 storage as shared storage for apps as included in the upstream Android Open
 Source Project; device implementations SHOULD use this configuration and
 software implementation. If a device implementation uses internal
-(non-removable) storage to satisfy the shared storage requirement, that storage
-MUST be 1GB in size or larger and mounted on /sdcard (or /sdcard MUST be a
+(non-removable) storage to satisfy the shared storage requirement, while that
+storage MAY share space with the application private data, it MUST be at least
+1GB in size and mounted on /sdcard (or /sdcard MUST be a
 symbolic link to the physical location if it is mounted elsewhere).</p>
 
 <p>Device implementations MUST enforce as documented the
diff --git a/en/compatibility/cts/downloads.html b/en/compatibility/cts/downloads.html
index ab07ebd..32413c3 100644
--- a/en/compatibility/cts/downloads.html
+++ b/en/compatibility/cts/downloads.html
@@ -31,115 +31,115 @@
 <h2 id="android-81">Android 8.1</h2>
 <p>Android 8.1 is the release of the development milestone code-named Oreo-MR1.
 The source code for the following tests can be synced with the
-'android-cts-8.1_r1' tag in the open-source tree.</p>
+'android-cts-8.1_r2' tag in the open-source tree.</p>
 <ul>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-8.1_r1-linux_x86-arm.zip">Android
-8.1 R1 Compatibility Test Suite (CTS) - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-8.1_r2-linux_x86-arm.zip">Android
+8.1 R2 Compatibility Test Suite (CTS) - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-8.1_r1-linux_x86-x86.zip">Android
-8.1 R1 Compatibility Test Suite (CTS) - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-8.1_r2-linux_x86-x86.zip">Android
+8.1 R2 Compatibility Test Suite (CTS) - x86</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r1-linux_x86-arm.zip">Android
-8.1 R1 CTS Verifier - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r2-linux_x86-arm.zip">Android
+8.1 R2 CTS Verifier - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r1-linux_x86-x86.zip">Android
-8.1 R1 CTS Verifier - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r2-linux_x86-x86.zip">Android
+8.1 R2 CTS Verifier - x86</a></li>
 </ul>
 
 <h2 id="android-80">Android 8.0</h2>
 <p>Android 8.0 is the release of the development milestone code-named Oreo.
 The source code for the following tests can be synced with the
-'android-cts-8.0_r5' tag in the open-source tree.</p>
+'android-cts-8.0_r6' tag in the open-source tree.</p>
 <ul>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-8.0_r5-linux_x86-arm.zip">Android
-8.0 R5 Compatibility Test Suite (CTS) - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-8.0_r6-linux_x86-arm.zip">Android
+8.0 R6 Compatibility Test Suite (CTS) - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-8.0_r5-linux_x86-x86.zip">Android
-8.0 R5 Compatibility Test Suite (CTS) - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-8.0_r6-linux_x86-x86.zip">Android
+8.0 R6 Compatibility Test Suite (CTS) - x86</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r5-linux_x86-arm.zip">Android
-8.0 R5 CTS Verifier - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r6-linux_x86-arm.zip">Android
+8.0 R6 CTS Verifier - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r5-linux_x86-x86.zip">Android
-8.0 R5 CTS Verifier - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r6-linux_x86-x86.zip">Android
+8.0 R6 CTS Verifier - x86</a></li>
 </ul>
 
 <h2 id="android-71">Android 7.1</h2>
 <p>Android 7.1 is the release of the development milestone code-named Nougat-MR1.
 The source code for the following tests can be synced with the
-'android-cts-7.1_r13' tag in the open-source tree.</p>
+'android-cts-7.1_r14' tag in the open-source tree.</p>
 <ul>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-7.1_r13-linux_x86-arm.zip">Android
-7.1 R13 Compatibility Test Suite (CTS) - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-7.1_r14-linux_x86-arm.zip">Android
+7.1 R14 Compatibility Test Suite (CTS) - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-7.1_r13-linux_x86-x86.zip">Android
-7.1 R13 Compatibility Test Suite (CTS) - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-7.1_r14-linux_x86-x86.zip">Android
+7.1 R14 Compatibility Test Suite (CTS) - x86</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r13-linux_x86-arm.zip">Android
-7.1 R13 CTS Verifier - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r14-linux_x86-arm.zip">Android
+7.1 R14 CTS Verifier - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r13-linux_x86-x86.zip">Android
-7.1 R13 CTS Verifier - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r14-linux_x86-x86.zip">Android
+7.1 R14 CTS Verifier - x86</a></li>
 </ul>
 
 <h2 id="android-70">Android 7.0</h2>
 <p>Android 7.0 is the release of the development milestone code-named Nougat.
 The source code for the following tests can be synced with the
-'android-cts-7.0_r17' tag in the open-source tree.</p>
+'android-cts-7.0_r18' tag in the open-source tree.</p>
 <ul>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-7.0_r17-linux_x86-arm.zip">Android
-7.0 R17 Compatibility Test Suite (CTS) - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-7.0_r18-linux_x86-arm.zip">Android
+7.0 R18 Compatibility Test Suite (CTS) - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-7.0_r17-linux_x86-x86.zip">Android
-7.0 R17 Compatibility Test Suite (CTS) - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-7.0_r18-linux_x86-x86.zip">Android
+7.0 R18 Compatibility Test Suite (CTS) - x86</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r17-linux_x86-arm.zip">Android
-7.0 R17 CTS Verifier - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r18-linux_x86-arm.zip">Android
+7.0 R18 CTS Verifier - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r17-linux_x86-x86.zip">Android
-7.0 R17 CTS Verifier - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r18-linux_x86-x86.zip">Android
+7.0 R18 CTS Verifier - x86</a></li>
 </ul>
 
 <h2 id="android-60">Android 6.0</h2>
 <p>Android 6.0 is the release of the development milestone code-named Marshmallow.
 The source code for the following tests can be synced with the
-'android-cts-6.0_r25' tag in the open-source tree.</p>
+'android-cts-6.0_r26' tag in the open-source tree.</p>
 <ul>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-6.0_r25-linux_x86-arm.zip">Android
-6.0 R25 Compatibility Test Suite (CTS) - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-6.0_r26-linux_x86-arm.zip">Android
+6.0 R26 Compatibility Test Suite (CTS) - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-6.0_r25-linux_x86-x86.zip">Android
-6.0 R25 Compatibility Test Suite (CTS) - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-6.0_r26-linux_x86-x86.zip">Android
+6.0 R26 Compatibility Test Suite (CTS) - x86</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r25-linux_x86-arm.zip">Android
-6.0 R25 CTS Verifier - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r26-linux_x86-arm.zip">Android
+6.0 R26 CTS Verifier - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r25-linux_x86-x86.zip">Android
-6.0 R25 CTS Verifier - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r26-linux_x86-x86.zip">Android
+6.0 R26 CTS Verifier - x86</a></li>
 </ul>
 
 <h2 id="android-51">Android 5.1</h2>
 <p>Android 5.1 is the release of the development milestone code-named Lollipop-MR1.
 The source code for the following tests can be synced with the
-'android-cts-5.1_r26' tag in the open source tree.</p>
+'android-cts-5.1_r27' tag in the open source tree.</p>
 <ul>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-5.1_r26-linux_x86-arm.zip">Android
-5.1 R26 Compatibility Test Suite (CTS) - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-5.1_r27-linux_x86-arm.zip">Android
+5.1 R27 Compatibility Test Suite (CTS) - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-5.1_r26-linux_x86-x86.zip">Android
-5.1 R26 Compatibility Test Suite (CTS) - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-5.1_r27-linux_x86-x86.zip">Android
+5.1 R27 Compatibility Test Suite (CTS) - x86</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r26-linux_x86-arm.zip">Android
-5.1 R26 CTS Verifier - ARM</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r27-linux_x86-arm.zip">Android
+5.1 R27 CTS Verifier - ARM</a></li>
 <li><a
-href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r26-linux_x86-x86.zip">Android
-5.1 R26 CTS Verifier - x86</a></li>
+href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r27-linux_x86-x86.zip">Android
+5.1 R27 CTS Verifier - x86</a></li>
 </ul>
 
 <h2 id="android-50">Android 5.0</h2>
diff --git a/en/security/bulletin/2018-02-01.html b/en/security/bulletin/2018-02-01.html
index 67509df..878f2be 100644
--- a/en/security/bulletin/2018-02-01.html
+++ b/en/security/bulletin/2018-02-01.html
@@ -20,7 +20,7 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-  <p><em>Published February 5, 2018 | February 7, 2018</em></p>
+  <p><em>Published February 5, 2018 | February 14, 2018</em></p>
 
 
 <p>
@@ -287,7 +287,7 @@
     <td>Multi-queue block IO</td>
   </tr>
   <tr>
-    <td>CVE-2017-17770</td>
+    <td>CVE-2017-13273</td>
     <td>A-65853158<a href="#asterisk">*</a></td>
     <td>EoP</td>
     <td>High</td>
@@ -362,7 +362,7 @@
     <td>WLan</td>
   </tr>
   <tr>
-    <td>CVE-2017-17760</td>
+    <td>CVE-2017-15860</td>
     <td>A-68992416<br />
         <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=71331327ac389bff7d5af2707c4325e5b7949013">
 QC-CR#2082544</a>
@@ -397,7 +397,7 @@
     <td>WLan</td>
   </tr>
   <tr>
-    <td>CVE-2017-17762</td>
+    <td>CVE-2017-15862</td>
     <td>A-68992439<br />
         <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=41ee23cd0972ef2ed47dd76eb7cd44a0268e4f9f">
 QC-CR#2114426</a></td>
@@ -442,7 +442,7 @@
     <td>WLan</td>
   </tr>
   <tr>
-    <td>CVE-2017-17761</td>
+    <td>CVE-2017-15861</td>
     <td>A-68992434<br />
         <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=13e3a516935a0dd90a7bc39e51c30c1592c548b7">
 QC-CR#2114187</a></td>
@@ -644,5 +644,11 @@
    <td>February 7, 2018</td>
    <td>Bulletin revise to include AOSP links.</td>
   </tr>
+  <tr>
+   <td>1.2</td>
+   <td>February 14, 2018</td>
+   <td>Corrected CVE numbers for CVE-2017-13273, CVE-2017-15860, CVE-2017-15861 and
+     CVE-2017-15862.</td>
+  </tr>
 </table>
 	</body></html>
diff --git a/en/security/overview/acknowledgements.html b/en/security/overview/acknowledgements.html
index 0f5f91d..f9f73b0 100644
--- a/en/security/overview/acknowledgements.html
+++ b/en/security/overview/acknowledgements.html
@@ -149,7 +149,7 @@
    <td>Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>) of
 IceSword Lab, Qihoo 360 Technology Co. Ltd.
    </td>
-   <td>CVE-2017-17770
+   <td>CVE-2017-13273
    </td>
   </tr>
   <tr>
diff --git a/en/setup/build-numbers.html b/en/setup/build-numbers.html
index f0ba4a2..10f50cd 100644
--- a/en/setup/build-numbers.html
+++ b/en/setup/build-numbers.html
@@ -171,12 +171,13 @@
 </tr>
 </tbody>
 </table>
-<p>Starting with Oreo, individual builds are identified with a new build ID format, in the form of PVBB.YYMMDD.bbb.</p>
+<p>Starting with Oreo, individual builds are identified with a new build ID format, in the form of PVBB.YYMMDD.bbb[.Cn].</p>
 <p>The P part represents the first letter of the code name of the platform release, e.g. O is Oreo.</p>
 <p>The V part represents a supported vertical. By convention, 'P' represents the primary platform branch.</p>
 <p>The BB part represents a alpha numeric code which allows Google to identify the exact code branch that the build was made from.</p>
 <p>The YYMMDD part identifies the date when the release is branched from or synced with the development branch.  It is not guaranteed to be  the exact date at which a build was made, and it is common that minor variations added to an existing build re-use the same date code as that existing build.</p>
 <p>The bbb part identifies individual versions related to the same date code, sequentially starting with 001.</p>
+<p>An optional, alphanumeric Cn part identifies a hotfix on top of an existing PVBB.YYMMDD.bbb build, starting from A1.</p>
 <p>Older Android releases from Cupcake to Nougat uses a different build ID scheme.  These Android builds are identified with a short build code, e.g. FRF85B.
 </p>
 <p>The first letter is the code name of the release family, e.g. F is
diff --git a/ja/security/bulletin/pixel/2017-11-01.html b/ja/security/bulletin/pixel/2017-11-01.html
index 9ddda8f..bf98c64 100644
--- a/ja/security/bulletin/pixel/2017-11-01.html
+++ b/ja/security/bulletin/pixel/2017-11-01.html
@@ -29,7 +29,7 @@
 パッチレベル 2017-11-05 へのアップデートは、サポート対象のすべての Google 端末に送信されます。ご利用の端末にこのアップデートを適用することをすべてのユーザーにおすすめします。
 </p>
 <p class="note">
-<strong>注:</strong> Google 端末のファームウェア イメージは、<a href="//developers.google.com/android/nexus/images">Google デベロッパー サイト</a>で入手できます。
+<strong>注:</strong> Google 端末のファームウェア イメージは、<a href="//developers.google.com/android/nexus/images">Google Developers サイト</a>で入手できます。
 </p>
 <h2 id="announcements">お知らせ</h2>
 <p>
@@ -731,10 +731,10 @@
 セキュリティ パッチレベル 2017-11-05 以降では、セキュリティ パッチレベル 2017-11-05、およびそれ以前のすべてのパッチレベルに関連するすべての問題に対処しています。端末のセキュリティ パッチレベルを確認する方法については、<a href="//support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel および Nexus のアップデート スケジュール</a>に記載されている手順をご覧ください。
 </p>
 <p id="type">
-<strong>2. 「タイプ」列の項目はどういう意味ですか?<em></em></strong>
+<strong>2. 「タイプ」<em></em>列の項目はどういう意味ですか?</strong>
 </p>
 <p>
-脆弱性の詳細の表で「タイプ」列に記載した項目は、セキュリティの脆弱性の分類を示しています。<em></em>
+脆弱性の詳細の表で「タイプ」<em></em>列に記載した項目は、セキュリティの脆弱性の分類を示しています。
 </p>
 <table>
   <colgroup><col width="25%" />
@@ -765,10 +765,10 @@
   </tr>
 </tbody></table>
 <p>
-<strong>3. 「参照」列の項目はどういう意味ですか?<em></em></strong>
+<strong>3. 「参照」<em></em>列の項目はどういう意味ですか?</strong>
 </p>
 <p>
-脆弱性の詳細の表で「参照」列に記載した項目には、その参照番号が属す組織を示す接頭辞を含めている場合があります。<em></em>
+脆弱性の詳細の表で「参照」<em></em>列に記載した項目には、その参照番号が属す組織を示す接頭辞を含めている場合があります。
 </p>
 <table>
   <colgroup><col width="25%" />
@@ -802,7 +802,7 @@
 <strong>4. 「参照」<em></em>列の Android バグ ID の横にある「*」はどういう意味ですか?</strong>
 </p>
 <p>
-公開されていない問題には、「参照」<em></em>列の Android バグ ID の横に「*」を付けています。この問題のアップデートは、通常、<a href="//developers.google.com/android/nexus/drivers">Google デベロッパー サイト</a>から入手できる Nexus 端末用最新バイナリ ドライバに含まれています。
+公開されていない問題には、「参照」<em></em>列の Android バグ ID の横に「*」を付けています。この問題のアップ���ートは、通常、<a href="//developers.google.com/android/nexus/drivers">Google Developers サイト</a>から入手できる Nexus 端末用最新バイナリ ドライバに含まれています。
 </p>
 <p>
 <strong>5. セキュリティの脆弱性が、この公開情報と Android のセキュリティに関する公開情報に分けられているのはなぜですか?</strong>
diff --git a/ja/security/bulletin/pixel/2017-12-01.html b/ja/security/bulletin/pixel/2017-12-01.html
index 96af723..4bf14ad 100644
--- a/ja/security/bulletin/pixel/2017-12-01.html
+++ b/ja/security/bulletin/pixel/2017-12-01.html
@@ -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>、更新対象の AOSP(Android オープンソース プロジェクト)バージョン(該当する場合)を表にまとめています。該当する場合は、バグ ID の欄に、その問題に対処した一般公開されている変更(AOSP の変更の一覧など)へのリンクがあります。複数の変更が同じバグに関係する場合は、バグ ID の後に続く番号で、追加の参照先へのリンクを示します。</p>
+脆弱性は、影響を受けるコンポーネントごとに分類しています。問題の内容について説明し、CVE、関連する参照先、<a href="#type">脆弱性の種類</a>、<a href="/security/overview/updates-resources.html#severity">重大度</a>、更新対象の AOSP(Android オープンソース プロジェクト)バージョン(該当する場合)を表にまとめていま���。該当する場合は、バグ ID の欄に、その問題に対処した一般公開されている変更(AOSP の変更の一覧など)へのリンクがあります。複数の変更が同じバグに関係する場合は、バグ ID の後に続く番号で、追加の参照先へのリンクを示します。</p>
 
 <h3 id="media-framework">メディア フレームワーク</h3>
 
diff --git a/ko/security/bulletin/2017-12-01.html b/ko/security/bulletin/2017-12-01.html
index 52dc683..b0fa908 100644
--- a/ko/security/bulletin/2017-12-01.html
+++ b/ko/security/bulletin/2017-12-01.html
@@ -45,11 +45,11 @@
 </p>
 <p>
 실제 고객이 새로 보고된 이러한 문제로 인해 악용당했다는 신고는
-접수되지 않았습니다. Android 플랫폼의 보안을 개선하는
-<a href="#mitigations">Android 보안 플랫폼 보호</a> 및 Google Play 프로텍트에 관해
-자세히 알아보려면 <a href="/security/enhancements/index.html">Android
-및 Google Play 프로텍트 완화</a> 섹션을
-참조하세요.
+접수되지 않았습니다. Android 플랫폼의 보안을 개선하는 <a href="/security/enhancements/index.html">Android
+보안 플랫폼 보호</a> 및 Google Play 프로텍트에 관해
+자세히 알아보려면<a href="#mitigations">
+Android 및 Google Play 프로텍트 완화
+</a> 섹션을 참조하세요.
 </p>
 <p class="note">
 <strong>참고:</strong> Google 기기의 최신 무선 업데이트(OTA) 및
@@ -70,7 +70,7 @@
   악용하기 더욱 어려워졌습니다. 가능하다면 모든 사용자는 최신 버전의 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 href="/security/reports/Google_Android_Security_PHA_classifications.pdf">유해할 수 있는
   애플리케이션</a>에 관해 사용자에게 경고를 보냅니다. Google Play 프로텍트는 <a href="http://www.android.com/gms">Google 모바일 서비스</a>가 적용된
   기기에 기본적으로 사용 설정되어 있으며
   Google Play 외부의 앱을 설치하는 사용자에게 특히
diff --git a/ko/security/bulletin/pixel/2017-11-01.html b/ko/security/bulletin/pixel/2017-11-01.html
index ed5ed82..37cea08 100644
--- a/ko/security/bulletin/pixel/2017-11-01.html
+++ b/ko/security/bulletin/pixel/2017-11-01.html
@@ -828,10 +828,10 @@
 무엇을 의미하나요?</strong>
 </p>
 <p>
-공개되지 않은 문제에는 <em>참조</em> 열의 Android 버그 ID 옆에 * 표시가
+공개되지 않은 문제는 <em>참조</em> 열의 Android 버그 ID 옆에 * 표시가
 있습니다. 일반적으로 이러한 문제에 관한 업데이트는 <a href="//developers.google.com/android/nexus/drivers">Google 개발자 사이트</a>에서
-제공하는 Nexus 기기용 최신 바이너리 드라이버에
-포함되어 있습니다.
+���공되는 Nexus 기기용 최신 바이너리 드라이버에 포함되어
+있습니다.
 </p>
 <p>
 <strong>5. 보안 취약성이 이 게시판과 Android 보안 게시판에 나뉘어져 있는 이유가
diff --git a/ru/security/bulletin/2017-12-01.html b/ru/security/bulletin/2017-12-01.html
index 98bbd1a..2c6d68f 100644
--- a/ru/security/bulletin/2017-12-01.html
+++ b/ru/security/bulletin/2017-12-01.html
@@ -48,7 +48,7 @@
 </ul>
 <h2 id="2017-12-01-details">Описание уязвимостей (обновление системы безопасности 2017-12-01)</h2>
 <p>
-В этом разделе вы найдете подробную информацию обо всех уязвимостях, устраненных в обновлении системы безопасности 2017-12-01. Проблемы сгруппированы по компонентам, которые они затрагивают. Для каждого приведено описание и таблица с CVE, ссылками, <a href="#type">типом</a>, <a href="/security/overview/updates-resources.html#severity">уровнем серьезности</a>, а также версиями AOSP (при наличии). Где возможно, мы приводим основную ссылку на опубликованное изменение, связанное с идентификатором ошибки (например, список AOSP), и дополнительные ссылки в квадратных скобках.
+В этом разделе вы найдете подробную информацию обо всех уязвимостях, устраненных в обновлении системы безопасности 2017-12-01. Проблемы сгруппированы по компонентам, которые они затрагивают. Для каждого приведен�� описание и таблица с CVE, ссылками, <a href="#type">типом</a>, <a href="/security/overview/updates-resources.html#severity">уровнем серьезности</a>, а также версиями AOSP (при наличии). Где возможно, мы приводим основную ссылку на опубликованное изменение, связанное с идентификатором ошибки (например, список AOSP), и дополнительные ссылки в квадратных скобках.
 </p>
 <h3 id="framework">Framework</h3>
 <p>Самая серьезная уязвимость позволяет локальному вредоносному ПО обойти требования к взаимодействию с пользователем и получить доступ к дополнительным разрешениям.</p>
@@ -590,7 +590,7 @@
 <strong>3. Что означают сокращения в столбце <em>Тип</em>?</strong>
 </p>
 <p>
-В этом столбце указан <em>тип уязвимости</em> по следующей классификации:
+В этом столбце указан<em></em> тип уязвимости по следующей классификации:
 </p>
 <table>
   <colgroup><col width="25%" />
diff --git a/ru/security/bulletin/pixel/2017-12-01.html b/ru/security/bulletin/pixel/2017-12-01.html
index edbb810..a83b42a 100644
--- a/ru/security/bulletin/pixel/2017-12-01.html
+++ b/ru/security/bulletin/pixel/2017-12-01.html
@@ -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>, а также версиями AOSP (при наличии). Где возможно, мы приводим основную ссылку на опубликованное изменение, связанное с идентификатором ошибки (например, список AOSP), и дополнительные ссылки в квадратных скобках.
+Уязвимости сгруппированы по компонентам, которые они затрагивают. Для каждого приведены описание и таблица с CVE, ссылками, <a href="#type">типом</a>, <a href="/security/overview/updates-resources.html#severity">уровнем серьезности</a>, а так��е версиями AOSP (при наличии). Где возможно, мы приводим основную ссылку на опубликованное изменение, связанное с идентификатором ошибки (например, список AOSP), и дополнительные ссылки в квадратных скобках.
 </p>
 
 <h3 id="media-framework">Media Framework</h3>
@@ -462,8 +462,7 @@
   <tr>
     <td>CVE-2017-11033</td>
     <td>A-64453422<br />
-        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=b54141365805ae1a5254bff5442e1a103d3701d0">QC-CR#2031930</a>
- [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=fd98387b3d30da51773ad7597bb9febb87c70394">2</a>]</td>
+        <a href="https://source.codeaurora.org/quic/la/kernel/msm-3.18/commit/?id=b54141365805ae1a5254bff5442e1a103d3701d0">QC-CR#2031930</a> [<a href="https://source.codeaurora.org/quic/la/kernel/msm-3.10/commit/?id=fd98387b3d30da51773ad7597bb9febb87c70394">2</a>]</td>
     <td>ПП</td>
     <td>Средний</td>
     <td>Ядро</td>
diff --git a/zh-cn/_book.yaml b/zh-cn/_book.yaml
index 1a8dabb..12a8c0d 100644
--- a/zh-cn/_book.yaml
+++ b/zh-cn/_book.yaml
@@ -118,6 +118,8 @@
           title: 公告
         - section:
           - section:
+            - path: /security/bulletin/2018-02-01
+              title: 2 月
             - path: /security/bulletin/2018-01-01
               title: 1 月
             - path: /security/bulletin/2018
@@ -198,6 +200,8 @@
           - path: /security/bulletin/pixel/index
             title: 概览
           - section:
+            - path: /security/bulletin/pixel/2018-02-01
+              title: 2 月
             - path: /security/bulletin/pixel/2018-01-01
               title: 1 月
             - path: /security/bulletin/pixel/2018
@@ -243,7 +247,7 @@
         - path: /security/keystore/tags
           title: 授权标记
         - path: /security/keystore/implementer-ref
-          title: 功能
+          title: 函数
         title: 密钥存储区
       - section:
         - path: /security/trusty/
@@ -978,8 +982,8 @@
         - path: /devices/tech/vts/performance
           title: 性能测试
         title: 供应商测试套件 (VTS)
-      name: 微调
-  name: 微调
+      name: 调整
+  name: 调整
 - lower_tabs:
     other:
     - contents:
diff --git a/zh-cn/_index.yaml b/zh-cn/_index.yaml
index d33ce9f..5ba3e46 100644
--- a/zh-cn/_index.yaml
+++ b/zh-cn/_index.yaml
@@ -54,6 +54,12 @@
       image_path: /images/android_stack.png
   - heading: 新闻
     items:
+    - heading: 2 月安全公告
+      description: >
+        2018 年 2 月的 Android 和 Pixel/Nexus 安全公告已经发布,其中提供了与 2 月安全更新补丁相关的信息。
+      buttons:
+      - label: 2018 年 2 月 7 日
+        path: /security/bulletin/2018-02-01
     - heading: ART DEX 字节码方面的改进
       description: >
         Android 运行时 (ART) 现在包含 <code>const-method-handle</code> 和 <code>const-method-type</code>
@@ -61,12 +67,6 @@
       buttons:
       - label: 2018 年 1 月 19 日
         path: /devices/tech/dalvik/dalvik-bytecode
-    - heading: 1 月安全公告
-      description: >
-        2018 年 1 月的 Android 和 Pixel/Nexus 安全公告已经发布,其中提供了与 1 月安全更新补丁相关的信息。
-      buttons:
-      - label: 2018 年 1 月 2 日
-        path: /security/bulletin/2018-01-01
     - heading: Android 8.1 版说明
       description: >
         Android 8.1 版现已推出,其中提供了许多面向设备制造商以及个人用户的新功能。
diff --git a/zh-cn/compatibility/cts/downloads.html b/zh-cn/compatibility/cts/downloads.html
index 7b7cfb8..4eedff4 100644
--- a/zh-cn/compatibility/cts/downloads.html
+++ b/zh-cn/compatibility/cts/downloads.html
@@ -23,63 +23,59 @@
 <p>感谢您对 Android 兼容性计划的关注!您可以通过以下链接访问关于该计划的重要文档和信息。随着 CTS 的更新,此网页上会陆续添加新的版本。CTS 版本在链接名称中由 R&lt;数字&gt; 表示。</p>
 
 <h2 id="android-81">Android 8.1</h2>
-<p>Android 8.1 是代号为 Oreo-MR1 的开发里程碑版本。
-以下测试的源代码可以与开放源代码树中的“android-cts-8.1_r1”标记同步。</p>
+<p>Android 8.1 是代号为 Oreo-MR1 的开发里程碑版本。以下测试的源代码可以与开放源代码树中的“android-cts-8.1_r2”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r1-linux_x86-arm.zip">Android 8.1 R1 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r1-linux_x86-x86.zip">Android 8.1 R1 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r1-linux_x86-arm.zip">Android 8.1 R1 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r1-linux_x86-x86.zip">Android 8.1 R1 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r2-linux_x86-arm.zip">Android 8.1 R2 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.1_r2-linux_x86-x86.zip">Android 8.1 R2 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r2-linux_x86-arm.zip">Android 8.1 R2 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.1_r2-linux_x86-x86.zip">Android 8.1 R2 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-80">Android 8.0</h2>
 <p>Android 8.0 是代号为 Oreo 的开发里程碑版本。
-以下测试的源代码可以与开放源代码树中的“android-cts-8.0_r5”标记同步。</p>
+以下测试的源代码可以与开放源代码树中的“android-cts-8.0_r6”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r5-linux_x86-arm.zip">Android 8.0 R5 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r5-linux_x86-x86.zip">Android 8.0 R5 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r5-linux_x86-arm.zip">Android 8.0 R5 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r5-linux_x86-x86.zip">Android 8.0 R5 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r6-linux_x86-arm.zip">Android 8.0 R6 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-8.0_r6-linux_x86-x86.zip">Android 8.0 R6 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r6-linux_x86-arm.zip">Android 8.0 R6 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-8.0_r6-linux_x86-x86.zip">Android 8.0 R6 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-71">Android 7.1</h2>
-<p>Android 7.1 是代号为 Nougat-MR1 的开发里程碑版本。
-以下测试的源代码可以与开放源代码树中的“android-cts-7.1_r13”标记同步。</p>
+<p>Android 7.1 是代号为 Nougat-MR1 的开发里程碑版本。以下测试的源代码可以与开放源代码树中的“android-cts-7.1_r14”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r13-linux_x86-arm.zip">Android 7.1 R13 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r13-linux_x86-x86.zip">Android 7.1 R13 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r13-linux_x86-arm.zip">Android 7.1 R13 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r13-linux_x86-x86.zip">Android 7.1 R13 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r14-linux_x86-arm.zip">Android 7.1 R14 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.1_r14-linux_x86-x86.zip">Android 7.1 R14 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r14-linux_x86-arm.zip">Android 7.1 R14 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.1_r14-linux_x86-x86.zip">Android 7.1 R14 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-70">Android 7.0</h2>
 <p>Android 7.0 是代号为 Nougat 的开发里程碑版本。
-以下测试的源代码可以与开放源代码树中的“android-cts-7.0_r17”标记同步。</p>
+以下测试的源代码可以与开放源代码树中的“android-cts-7.0_r18”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r17-linux_x86-arm.zip">Android 7.0 R17 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r17-linux_x86-x86.zip">Android 7.0 R17 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r17-linux_x86-arm.zip">Android 7.0 R17 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r17-linux_x86-x86.zip">Android 7.0 R17 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r18-linux_x86-arm.zip">Android 7.0 R18 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-7.0_r18-linux_x86-x86.zip">Android 7.0 R18 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r18-linux_x86-arm.zip">Android 7.0 R18 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-7.0_r18-linux_x86-x86.zip">Android 7.0 R18 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-60">Android 6.0</h2>
-<p>Android 6.0 是代号为 Marshmallow 的开发里程碑版本。
-以下测试的源代码可以与开放源代码树中的“android-cts-6.0_r25”标记同步。</p>
+<p>Android 6.0 是代号为 Marshmallow 的开发里程碑版本。以下测试的源代码可以与开放源代码树中的“android-cts-6.0_r26”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r25-linux_x86-arm.zip">Android 6.0 R25 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r25-linux_x86-x86.zip">Android 6.0 R25 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r25-linux_x86-arm.zip">Android 6.0 R25 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r25-linux_x86-x86.zip">Android 6.0 R25 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r26-linux_x86-arm.zip">Android 6.0 R26 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-6.0_r26-linux_x86-x86.zip">Android 6.0 R26 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r26-linux_x86-arm.zip">Android 6.0 R26 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-6.0_r26-linux_x86-x86.zip">Android 6.0 R26 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-51">Android 5.1</h2>
-<p>Android 5.1 是代号为 Lollipop-MR1 的开发里程碑版本。
-以下测试的源代码可以与开放源代码树中的“android-cts-5.1_r26”标记��步。</p>
+<p>Android 5.1 是代号为 Lollipop-MR1 的开发里程碑版本。以下测试的源代码可以与开放源代码树中的“android-cts-5.1_r27”标记同步。</p>
 <ul>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-5.1_r26-linux_x86-arm.zip">Android 5.1 R26 兼容性测试套件 (CTS) - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-5.1_r26-linux_x86-x86.zip">Android 5.1 R26 兼容性测试套件 (CTS) - x86</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r26-linux_x86-arm.zip">Android 5.1 R26 CTS 验证程序 - ARM</a></li>
-<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r26-linux_x86-x86.zip">Android 5.1 R26 CTS 验证程序 - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-5.1_r27-linux_x86-arm.zip">Android 5.1 R27 兼容性测试套件 (CTS) - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-5.1_r27-linux_x86-x86.zip">Android 5.1 R27 兼容性测试套件 (CTS) - x86</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r27-linux_x86-arm.zip">Android 5.1 R27 CTS 验证程序 - ARM</a></li>
+<li><a href="https://dl.google.com/dl/android/cts/android-cts-verifier-5.1_r27-linux_x86-x86.zip">Android 5.1 R27 CTS 验证程序 - x86</a></li>
 </ul>
 
 <h2 id="android-50">Android 5.0</h2>
diff --git a/zh-cn/compatibility/cts/interpret.html b/zh-cn/compatibility/cts/interpret.html
index 9d6539b..1141056 100644
--- a/zh-cn/compatibility/cts/interpret.html
+++ b/zh-cn/compatibility/cts/interpret.html
@@ -25,7 +25,7 @@
 $CTS_ROOT/android-cts/repository/results/&lt;start_time&gt;.zip
 </pre>
 
-<p>如果您自行编译了 CTS,则 $CTS_ROOT 将类似于路径 out/host/linux-x86/cts(但会因平台而异)。<em></em><em></em>该路径即是您解压缩从此网站<a href="downloads.html">下载</a>的预编译官方 CTS 文件时所在的路径。</p>
+<p>如果您自行编译了 CTS,则 $CTS_ROOT 将类似于路径 out/host/linux-x86/cts(但会因平台而异)。<em></em><em></em>该路径取决于您解压缩从此网站<a href="downloads.html">下载</a>的预编译官方 CTS 文件时所在的路径。</p>
 
 <p>在 zip 压缩包中,testResult.xml 文件会包含实际的结果。在任何网络浏览器(推荐使用与 HTML 5 技术兼容的浏览器)中打开此文件,即可查看测试结果。</p>
 
@@ -38,7 +38,7 @@
 <ul>
   <li>CTS v1 适用于 Android 6.0 及更早版本</li><li>CTS v2 适用于 Android 7.0 及更高版本</li></ul>
 
-<p class="note"><strong>注意</strong>:所提供的结果旨在帮助您确保软件在整个开发过程中一直是兼容的,并且可作为通用格式来说明您的设备与其他方的兼容性状态。</p>
+<p class="note"><strong>注意</strong>:所提供的结果旨在帮助您确保软件在整个开发过程中始终兼容,并且可作为通用格式来说明您的设备与其他方的兼容性状态。</p>
 
 <h4 id="device-information">设备信息</h4>
 
@@ -63,9 +63,9 @@
 <p> </p>
 
 <h4 id="test-report">测试报告</h4>
-<p>下一部分为 CTS 测试报告,它会以文件包的形式提供已通过的测���的摘要。</p>
+<p>下一部分为 CTS 测试报告,它会按文件包显示已通过的测试的摘要。</p>
 
-<p>接下来是所执行的实际测试的详细信息。该报告会列出测试包、测试套件、测试用例和执行的测试。它会显示以下测试执行结果:通过、失败、超时或未执行。如果测试失败,则该报告会提供详细信息以供诊断原因。</p>
+<p>接下来是所执行的实际测试的详细信息。该报告会列出测试包、测试套件、测试用例和执行的测试。它会显示测试执行结果:通过、失败、超时或未执行。如果测试失败,则该报告会提供详细信息以供诊断原因。</p>
 
 <p>此外,为了确保简洁性,故障的堆栈跟踪信息会包含在 XML 文件中,但不会包含在报告中;使用文本编辑器查看 XML 文件可了解有关测试失败的详细信息(搜索与失败的测试对应的 &lt;Test&gt; 标记,并在其中查找 &lt;StackTrace&gt; 标记)。<em></em><em></em></p>
 
diff --git a/zh-cn/compatibility/cts/run.html b/zh-cn/compatibility/cts/run.html
index 3d80c31..5d4cb6e 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><em></em>通过运行解压缩 CTS 包所得的文件夹中的 cts-tradefed 脚本(例如 <code>$ ./android-cts/tools/cts-tradefed</code>)来启动 CTS 控制台。
+  </li><li>通过运行解压缩 CTS 包所得的文件夹中的 cts-tradefed 脚本(例如 <code>$ ./android-cts/tools/cts-tradefed</code>)来启动 CTS 控制台。<em></em>
   </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 b1f16d4..3e07046 100644
--- a/zh-cn/compatibility/cts/setup.html
+++ b/zh-cn/compatibility/cts/setup.html
@@ -22,17 +22,17 @@
 
 <h2 id="physical_environment">物理环境</h2>
 <h3 id="ble_beacons">蓝牙 LE 信标</h3>
-<p>如果 DUT 支持蓝牙 LE 功能,则至少应在距离 DUT 五米的范围内放置三个蓝牙 LE 信标,以进行蓝牙 LE 扫描测试。这些信标可以为任何类型,不需要进行配置或发射任何特定信号,并且可以包括 iBeacon、Eddystone 甚至模拟 BLE 信标的设备。</p>
+<p>如果 DUT 支持蓝牙 LE 功能,则应在与 DUT 的距离不超过五米的范围内放置至少三个蓝牙 LE 信标,以进行蓝牙 LE 扫描测试。这些信标可以为任何类型,不需要进行配置或发射任何特定信号,并且可以包括 iBeacon、Eddystone,甚至模拟 BLE 信标的设备。</p>
 
 <h3 id="gnss">GPS/GNSS</h3>
 <p>如果 DUT 支持全球定位系统 (GPS)/全球导航卫星系统 (GNSS) 功能,则应该以合适的信号电平向 DUT 提供 GPS/GNSS 信号(GPS 部分符合 ICD-GPS-200C 标准),以便其接收到相应信号并计算 GPS 位置。GPS/GNSS 信��源的种类不限(可以是卫星模拟器,也可以是室外 GPS/GNSS 信号中继器),只需将 DUT 放在距离窗口足够近的位置以使其可以直接接收到足够强的 GPS/GNSS 信号即可。</p>
 
 <aside class="caution">
-  <strong>请注意</strong>:在测试 GPS 时,请确保互联网连接设置未屏蔽 supl.google.com 的 7276 端口的连接。该端口将用于下载 GPS 辅助数据,以便在本地设备上测试位置计算。
+  <strong>请注意</strong>:在进行 GPS 测试时,请确保互联网连接设置未屏蔽 supl.google.com 的 7276 端口的连接。该端口将用于下载 GPS 辅助数据,以便在本地设备上测试位置计算。
 </aside>
 
 <h3 id="wifi">WLAN 和 IPv6</h3>
-<p>CTS 测试需要满足以下要求的 WLAN 网络:支持 IPv6,可以将被测设备 (DUT) 视为隔离客户端,并可以连接到互联网。隔离客户端是一种配置,可将 DUT 配置为无法接收子网络上的广播/多网消息;这种配置可通过 WLAN AP ���置或通过在未连接其他设备的隔离子网络上运行 DUT 来实现。</p>
+<p>CTS 测试需要满足以下要求的 WLAN 网络:支持 IPv6,可以将被测设备 (DUT) 视为隔离客户端,并可以连接到互联网。隔离客户端是一种配置,可使 DUT 无法接收子网络上的广播/多网消息;这种配置可通过 WLAN AP 配置或通过在未连接其他设备的隔离子网络上运行 DUT 来实现。</p>
 
 <p>如果您无法访问原生 IPv6 网络、IPv6 运营商网络或 IPv6 VPN,以致无法通过基于 IPv6 的一些测试,则可以改为使用 WLAN 接入点和 IPv6 隧道。请参阅维基百科 <a href="http://en.wikipedia.org/wiki/List_of_IPv6_tunnel_brokers">IPv6 隧道代理列表</a>。</p>
 
@@ -53,7 +53,7 @@
 <p class="note"><strong>注意:</strong>请确保起始路径和目录名称均准确无误。</p>
 
 <h3 id="JDK">Java 开���套件 (JDK)</h3>
-<p>安装适当版本的 Java 开发套件 (JDK)。对于 Android 7.0 -
+<p>安装正确版本的 Java 开发套件 (JDK)。对于 Android 7.0 -
 </p>
 <ul>
   <li>在 Ubuntu 上,使用 <a href="http://openjdk.java.net/install/">OpenJDK 8</a>。
@@ -82,9 +82,9 @@
 
 <h3 id="first-api-level">初始 API 级别版本属性</h3>
 
-<p>某些 CTS 要求取决于设备最初搭载的版本。例如,如果设备最初搭载的是较低的版本,则不必遵循适用于搭载较高版本的设备的系统要求。</p>
+<p>某些 CTS 要求取决于设备最初搭载的版本。例如,如果设备最初搭载的是较低的版本,则不一定需要遵循适用于搭载较高版本的设备的系统要求。</p>
 
-<p>为了保证在 CTS 中可读取到这些信息,设备制造商可以定义编译时属性:<code>ro.product.first_api_level</code>。该属性的值是以商业化形式发布该设备时所采用的初始 API 级别。</p>
+<p>为了保证 CTS 可读取到这些信息,设备制造商可以定义编译时属性:<code>ro.product.first_api_level</code>。该属性的值是对该设备进行商业化发布时所采用的初始 API 级别。</p>
 
 <p>OEM 可以将 <code>PRODUCT_PROPERTY_OVERRIDES</code> 添加到其 device.mk 文件以设置这项属性,具体如以下示例所示:</p>
 
@@ -95,7 +95,7 @@
 </pre>
 
 <aside class="note">
-<b>注意:</b>对于产品的第一个版本,ro.product.first_api_level 属性应取消设置 (0);而对于所有后续版本,该属性应设置为正确的 API 级别值。通过这种方式,该属性可以正确标识新产品,而且我们不会丢失任何关于产品初始 API 级别的信息(值为 0 意味着 ro.product.first_api_level = Build.VERSION.SDK_INT)。
+<b>注意:</b>对于产品的第一个版本,ro.product.first_api_level 属性应未设置 (0);而对于所有后续版本,该属性应设置为正确的 API 级别值。通过这种方式,该属性可以正确标识新产品,而且我们不会丢失任何关于产品初始 API 级别的信息(值为 0 意味着 ro.product.first_api_level = Build.VERSION.SDK_INT)。
 </aside>
 
 <h3 id="cts-shim-apps">CTS Shim 应用</h3>
@@ -111,11 +111,11 @@
   该 apk 文件将复制到系统映像上的 <code>/system/priv-app/CtsShimPrivPrebuilt.apk</code>。</li>
 </ul>
 
-<p>CTS 会使用这些应用来测试特权和权限。要通过测试,您必须将应用预加载到系统映像上的相应目录下,而无需对它们重新签名。</p>
+<p>CTS 会使用这些应用来测试特权和权限。要通过测试,您必须将应用预加载到系统映像上的相应目录下,但不能对它们重新签名。</p>
 
 <h3 id="storage_requirements">存储空间要求</h3>
 <p>CTS 媒体压力测试要求将视频剪辑存放在外部存储设备 (<code>/sdcard</code>) 上。大部分剪辑来自 <a href="https://peach.blender.org/">Big Buck Bunny</a>,其版权归 Blender Foundation 所有并采用 <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 许可</a>。</p>
-<p>所需空间取决于设备支持的最高视频播放分辨率(要查看所需分辨率支持的平台版本,请参阅兼容性定义文档中的第 5 部分)。请注意,被测设备的视频播放功能将通过 <code>android.media.CamcorderProfile</code> API(针对早期 Android 版本)和 <code>android.media.MediaCodecInfo.CodecCapabilities</code> API(针对 Android 5.0)进行检测。</p>
+<p>所需空间取决于设备支持的最高视频播放分辨率(要查看所需分辨率的平台版本,请参阅兼容性定义文档中的第 5 部分)。请注意,被测设备的视频播放功能将通过 <code>android.media.CamcorderProfile</code> API(针对早期 Android 版本)和 <code>android.media.MediaCodecInfo.CodecCapabilities</code> API(针对 Android 5.0 及更高版本)进行检测。</p>
 <p>以下是按最大视频播放分辨率列出的存储空间要求:</p>
 <ul>
   <li>480x360:98 MB</li><li>720x480:193 MB</li><li>1280x720:606 MB</li><li>1920x1080:1863 MB</li></ul>
@@ -139,7 +139,7 @@
   <li>将设备恢复出厂设置:<strong>设置 &gt; 备份和重置 &gt; 恢复出厂设置</strong>
     <p class="warning"><strong>警告:</strong>这将清空设备中的所有用户数据。</p>
   </li><li>将设备的语言设置为英语(<strong>美国</strong>):<strong>设置 &gt; 语言和输入法 &gt; 语言</strong>
-  </li><li>如果设备上具有 GPS 或 WLAN/移动网络功能,则打开位置信息设置:<strong>设置 &gt; 位置信息 &gt; 开启</strong>
+  </li><li>如果设备具有 GPS 或 WLAN/移动网络功能,则打开位置信息设置:<strong>设置 &gt; 位置信息 &gt; 开启</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>。
@@ -149,17 +149,17 @@
   </li><li>依次选择:<strong>设置 &gt; 开发者选项 &gt; 允许模拟位置 &gt; 开启</strong>
     <p class="note"><strong>注意:</strong>此模拟位置设置仅适用于 Android 5.x 和 4.4.x。</p>
   </li><li>依次选择:<strong>设置 &gt; 开发者选项 &gt; 通过 USB 验证应用 &gt; 关闭</strong>
-    <p class="note"><strong>注意:</strong>此验证应用步骤在 Android 4.2 中为必要步骤。</p>
+    <p class="note"><strong>注意:</strong>此验证应用步骤在 Android 4.2 中为必需步骤。</p>
   </li><li>启动浏览器并关闭任何启动/设置屏幕。
   </li><li>使用 USB 数据线连接用于测试设备的台式机<p class="note"><strong>注意:</strong>将运行 Android 4.2.2 或更高版本的设备连接到计算机时,系统会显示一个对话框,询问您是否接受允许通过此计算机进行调试的 RSA 密钥。选择“允许 USB 调试”。<em></em></p>
   </li><li>在设备上安装和配置帮助程序应用。
-<p class="note"><strong>注意:</strong>对于 CTS 版本 2.1 R2 至 4.2 R4,请将您的设备(或模拟器)设置为通过以下��令执行无障碍测试:<br />
+<p class="note"><strong>注意:</strong>对于 CTS 版本 2.1 R2 至 4.2 R4,请通过以下命令设置您的设备(或模拟器),以便执行无障碍测试:<br />
 <code>adb install -r android-cts/repository/testcases/CtsDelegatingAccessibilityService.apk</code><br />
 在设备上,依次启用:<strong>设置 &gt; 无障碍 &gt; 无障碍 &gt; Delegating Accessibility Service</strong></p>
-<p class="note"><strong>注意</strong>:对于 7.0 之前的 CTS 版本,请在声明 <code>android.software.device_admin</code> 的设备上,将您的设备设置为使用以下命令执行设备管理测试:<br />
+<p class="note"><strong>注意</strong>:对于 7.0 之前的 CTS 版本,请在声明 <code>android.software.device_admin</code> 的设备上,使用以下命令设置您的设备,以便执行设备管理测试:<br />
 <code>adb install -r android-cts/repository/testcases/CtsDeviceAdmin.apk</code><br />
 </p><p>
-依次选择“设置”&gt;“安全”&gt;“设备管理器”,然后启用两个 <code>android.deviceadmin.cts.CtsDeviceAdminReceiver*</code> 设备管理器。确保 <code>android.deviceadmin.cts.CtsDeviceAdminDeactivatedReceiver</code> 和任何其他预加载的设备管理器均将保持停用状态。
+依次选择“设置”&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>
@@ -167,10 +167,9 @@
   </li><li>更改文件权限:<code>chmod u+x copy_media.sh</code>
   </li><li>运行 <code>copy_media.sh</code>:
     <ul>
-      <li>要复制分辨率高达 720x480 的剪辑,请运行:<code>./copy_media.sh 720x480</code>
+      <li>要复制分辨率不超过 720x480 的剪辑,请运行:<code>./copy_media.sh 720x480</code>
       </li><li>如果您不确定最大分辨率,请尝试运行 <code>./copy_media.sh all</code>,以便复制所有文件。
-      </li><li>如果 adb 下有多个设备,请将 -s(序列号)选项添加到末尾。
-        例如,要将分辨率高达 720x480 的文件复制到序列号为 1234567 的设备,请运行:<code>./copy_media.sh 720x480 -s 1234567</code>
+      </li><li>如果 adb 下有多个设备,请将 -s(序列号)选项添加到末尾。例如,要将分辨率不超过 720x480 的文件复制到序列号为 1234567 的设备,请运行:<code>./copy_media.sh 720x480 -s 1234567</code>
     </li></ul>
 </li></ul>
 </li></ol>
diff --git a/zh-cn/compatibility/index.html b/zh-cn/compatibility/index.html
index 235d7a5..9b240b3 100644
--- a/zh-cn/compatibility/index.html
+++ b/zh-cn/compatibility/index.html
@@ -55,6 +55,6 @@
 <p>在符合 CDD 要求且通过 CTS 测试后,您的设备即是与 Android 兼容的设备,这意味着生态系统中的 Android 应用在您的设备上运行时可提供一致的体验。有关 Android 兼容性计划的详细信息,请参阅<a href="overview.html">计划概述</a>。</p>
 
 <h2 id="licensing-gms">申请 Google 移动服务 (GMS) 许可</h2>
-<p>打造 Android 兼容��备后,请考虑申请 Android 上的 Google 移动服务(简称 GMS,由 Google Play、YouTube、Google 地图、Gmail 等 Google 拥有的一系列应用组成)许可。GMS 不是 Android 开放源代码项目的一部分,仅通过 Google 授予许可的方式提供。有关如何申请 GMS 许可的信息,请查看<a href="contact-us.html">与我们联系</a>一文。</p>
+<p>打造 Android 兼容设备后,请考虑申请 Android 上的 Google 移动服务(简称 GMS,由 Google Play、YouTube、Google 地图、Gmail 等 Google 拥有的一系列应用组成)许可。GMS 不是 Android 开放源代码项目的一部分,仅通过 Google 授予许可的方式提供。有关如何申请 GMS 许可的信息,请参阅<a href="contact-us.html">与我们联系</a>。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/accessories/headset/usb-adapter.html b/zh-cn/devices/accessories/headset/usb-adapter.html
new file mode 100644
index 0000000..e022134
--- /dev/null
+++ b/zh-cn/devices/accessories/headset/usb-adapter.html
@@ -0,0 +1,84 @@
+<html devsite><head>
+    <title>USB-C 型转模拟音频适配器</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2018 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>
+尽管一些新的 Android 手机在出厂时并未配备 3.5 毫米耳机插孔,但如果用户需要的话,他们仍然可以针对这类设备使用 3.5 毫米耳机。为此,本文详细介绍了 USB-C 型转模拟音频适配器规范,以协助您将 <a href="plug-headset-spec.html">/devices/accessories/headset/3.5 毫米耳机</a>插入只提供 <a href="/devices/accessories/headset/usb-device">USB-C 型端口</a>的设备。</p>
+<p>
+本文档给出的是最低要求,我们鼓励配件制造商在满足这些要求��基础上添加新的功能。
+</p>
+
+<h2 id="adapter-type">适配器类型</h2>
+<p>
+只允许使用数字转模拟适配器。不支持遵循 <a href="http://www.usb.org/">USB.org</a> 的“USB C 型数据线和连接器规范 - 修订版 1.2,附录 A”相关规定的“仅模拟”适配器。
+</p>
+<h2 id="functional-overview">功能概览</h2>
+<p>
+该适配器可让用户将其现有的 3.5 毫米配件插入带 USB-C 型端口的设备。为此,该适配器支持:</p>
+<ul>
+ <li>立体声模拟设备(无论是否带麦克风)</li>
+ <li>从数字到模拟的转换(2 个输出通道)</li>
+ <li>从模拟到数字的转换(1 个输入通道)</li>
+ <li>检测模拟设备插入</li>
+ <li>检测耳机麦克风</li>
+ <li>检测输出阻抗</li>
+ <li>从耳机按钮事件转换为 HID 事件</li>
+</ul>
+
+<h2 id="analog-interface">模拟接口</h2>
+<p>
+在插入和正确识别设备之前,适配器不得向 USB 主机展示任何 UAC 接口、播放或捕获端点。根据检测到的设备类型,必须报告以下 UAC 终端类型:</p>
+
+<ul>
+ <li><strong>头戴式耳机</strong>。低阻抗换能器,&lt; 1 千欧,无麦克风:0x0302</li>
+ <li><strong>耳机</strong>。带麦克风的低阻抗换能器:0x0402</li>
+ <li><strong>线路输入</strong>。高阻抗输入:0x603</li>
+ <li><strong>线路输出</strong>。高阻抗输出:0x604</li>
+ <li><strong>线路输入和线路输出</strong>或<strong>线路输入和麦克风</strong>:0x400</li>
+</ul>
+
+<h2 id="button-functions">按钮功能</h2>
+<p>
+适配器应将从模拟接口接收的按钮事件转换为以下 HID 事件(在遵循 Android <a href="/devices/accessories/headset/plug-headset-spec">模拟耳机规范</a>的前提下):</p>
+<table>
+  <tbody><tr>
+   <th>函数</th>
+   <th>映射</th>
+  </tr>
+  <tr>
+   <td>A</td>
+   <td>HID 用途页:0x0C<br />HID 用途:0x0CD</td>
+  </tr>
+  <tr>
+   <td>B</td>
+   <td>HID 用途页:0x0C<br />HID ���途:0x0E9</td>
+  </tr>
+  <tr>
+   <td>C</td>
+   <td>HID 用途页:0x0C<br />HID 用途:0x0EA</td>
+  </tr>
+  <tr>
+   <td>D</td>
+   <td>HID 用途页:0x0C<br />HID 用途:0x0CF</td>
+  </tr>
+</tbody></table>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/accessories/headset/usb-device.html b/zh-cn/devices/accessories/headset/usb-device.html
new file mode 100644
index 0000000..b3cc73f
--- /dev/null
+++ b/zh-cn/devices/accessories/headset/usb-device.html
@@ -0,0 +1,107 @@
+<html devsite><head>
+    <title>USB 耳机:设备规范</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>为了让 USB 耳机能够在 Android 生态系统中无缝工作,Android 设备必须为其提供一致的支持。本文档详细说明了在整个 Android 生态系统中支持 USB 耳机和适配器的 USB 行为。
+</p>
+
+<h2 id="software-mapping">软件映射</h2>
+<p>
+兼容的 USB 耳机需要支持兼容的 HID 映射。以下键码映射需要设备支持。
+</p>
+
+<table>
+  <tbody><tr>
+   <th>函数</th>
+   <th>映射</th>
+   <th>环境</th>
+   <th>行为</th>
+  </tr>
+  <tr>
+   <td rowspan="6">A</td>
+   <td rowspan="6"><strong>HID 用途页</strong>:0x0C<br />
+       <strong>HID 用途</strong>:0x0CD<br />
+       <strong>内核按键</strong>:<code>KEY_PLAYPAUSE</code><br />
+       <strong>Android 按键</strong>:<code>KEYCODE_MEDIA_PLAY_PAUSE</code></td>
+   <td rowspan="2">媒体播放</td>
+   <td><strong>输入</strong>:短按<br />
+       <strong>输出</strong>:播放或暂停</td>
+  </tr>
+  <tr>
+   <td><strong>输入</strong>:长按<br />
+       <strong>输出</strong>:启动语音指令<br />
+       <strong>发送</strong>:<code>android.speech.action.VOICE_SEARCH_HANDS_FREE</code>(如果设备被锁定或其屏幕已关闭)。否则发送 <code>android.speech.RecognizerIntent.ACTION_WEB_SEARCH</code></td>
+  </tr>
+  <tr>
+   <td rowspan="2">来电</td>
+   <td><strong>输入</strong>:短按<br />
+       <strong>输出</strong>:接听来电</td>
+  </tr>
+  <tr>
+   <td><strong>输入</strong>:长按<br />
+       <strong>输出</strong>:拒绝来电</td>
+  </tr>
+  <tr>
+   <td rowspan="2">当前通话</td>
+   <td><strong>输入</strong>:短按<br />
+       <strong>输出</strong>:结束通话</td>
+  </tr>
+  <tr>
+   <td><strong>输入</strong>:长按<br />
+       <strong>输出</strong>:将麦克风设为静音或取消静音</td>
+  </tr>
+  <tr>
+   <td>B</td>
+   <td><strong>HID 用途页</strong>:0x0C<br />
+       <strong>HID 用途</strong>:0x0E9<br />
+       <strong>内核按键</strong>:<code>KEY_VOLUMEUP</code><br />
+       <strong>Android 按键</strong>:<code>VOLUME_UP</code></td>
+   <td>媒体播放、当前通话</td>
+   <td><strong>输入</strong>:短按或长按<br />
+       <strong>输出</strong>:调高系统或耳机的音量</td>
+  </tr>
+  <tr>
+   <td>C</td>
+   <td><strong>HID 用途页</strong>:0x0C<br />
+       <strong>HID 用途</strong>:0x0EA<br />
+       <strong>内核按键</strong>:<code>KEY_VOLUMEDOWN</code><br />
+       <strong>Android 按键</strong>:<code>VOLUME_DOWN</code></td>
+   <td>媒体播放、当前通话</td>
+   <td><strong>输入</strong>:短按或长按<br />
+       <strong>输出</strong>:调低系统或耳机的音量</td>
+  </tr>
+  <tr>
+   <td>D</td>
+   <td><strong>HID 用途页</strong>:0x0C<br />
+       <strong>HID 用途</strong>:0x0CF<br />
+       <strong>内核按键</strong>:<code>KEY_VOICECOMMAND</code><br />
+       <strong>Android 按键</strong>:<code>KEYCODE_VOICE_ASSIST</code></td>
+   <td>所有。可在任何情况下触发。</td>
+   <td><strong>输入</strong>:短按或长按<br />
+       <strong>输出</strong>:启动语音指令</td>
+  </tr>
+</tbody></table>
+
+<h2 id="mechanical">机械工程</h2>
+<p>
+设备制造商还应参考 <a href="/devices/audio/usb.html">USB 数字音频</a>页面,以了解有关在 Android 设备上实现 USB 的更多信息。设备制造商还必须遵循 Android CDD 的 <a href="/compatibility/android-cdd.html#7_7_usb">USB 部分</a>中的要求。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/accessories/headset/usb-headset-spec.html b/zh-cn/devices/accessories/headset/usb-headset-spec.html
index 3fee17e..00c6183 100644
--- a/zh-cn/devices/accessories/headset/usb-headset-spec.html
+++ b/zh-cn/devices/accessories/headset/usb-headset-spec.html
@@ -21,7 +21,7 @@
   -->
 
 <p>
-本文档详细说明了 USB 耳机上各个按钮的行为,以使其在整个 Android 生态系统中保持一致。设备制造商还应参考 <a href="/devices/audio/usb.html">USB 数字音频</a>页面,以了解有关在 Android 设备上实现 USB 的更多信息;以及参考 <a href="http://source.android.com/compatibility/android-cdd.html">Android 兼容性定义文档 (CDD)</a>,以了解与 Android 设备相关的要求。
+本文档详细说明了 USB 耳机上各个按钮的行为,以使其在���个 Android 生态系统中保持一致。设备制造商还应参考 <a href="/devices/audio/usb.html">USB 数字音频</a>页面,以了解有关在 Android 设备上实现 USB 的更多信息;以及参考 <a href="/compatibility/android-cdd.html">Android 兼容性定义文档 (CDD)</a>,以了解与 Android 设备相关的要求。
 </p>
 <p>此外,本文档还介绍了 <a href="plug-headset-spec.html">3.5 毫米耳机</a>规范(适用于配件制造商)和 <a href="jack-headset-spec.html">3.5 毫米耳机插孔</a>规范(适用于设备制造商)。
 </p>
@@ -97,7 +97,7 @@
   <tr>
    <td><strong>输入</strong>:长按<br />
        <strong>输出</strong>:启动语音命令<br />
-       <strong>发送</strong>:<code>android.speech.action.VOICE_SEARCH_HANDS_FREE</code>(如果设备被锁定或其屏幕已关闭)。否则发送 <code>android.speech.RecognizerIntent.ACTION_WEB_SEARCH</code></td>
+       <strong>发送</strong>:如果设备已被锁定或其屏幕已关闭,则发送 <code>android.speech.action.VOICE_SEARCH_HANDS_FREE</code>,否则发送 <code>android.speech.RecognizerIntent.ACTION_WEB_SEARCH</code></td>
   </tr>
   <tr>
    <td rowspan="2">来电</td>
@@ -106,7 +106,7 @@
   </tr>
   <tr>
    <td><strong>输入</strong>:长按<br />
-       <strong>输出</strong>:拒绝来电</td>
+       <strong>输出</strong>:拒接来电</td>
   </tr>
   <tr>
    <td rowspan="2">当前通话</td>
@@ -153,7 +153,7 @@
 
 <h2 id="mechanical">机械</h2>
 <p>
-配件制造商必须遵循 <a href="http://www.usb.org/">USB.org</a> 规定的对 USB 连接器的要求。
+配件制造商必须遵循 <a href="http://www.usb.org/">USB.org</a> 的规定中对 USB 连接器的要求。
 </p>
 <p>
 设备制造商必须遵循 Android CDD 的 <a href="/compatibility/android-cdd.html#7_7_usb">USB 部分</a>中的要求。
diff --git a/zh-cn/devices/architecture/dto/optimize.html b/zh-cn/devices/architecture/dto/optimize.html
index 1b0e861..9db8cb5 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<em></em>),从而改善两个 <code>.dtb</code> 文件(从 O(N2) 到 O(N),其中 N 是树中的节点数)的合并效果。</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-java/interfaces.html b/zh-cn/devices/architecture/hidl-java/interfaces.html
index 0f31f80..0293fff 100644
--- a/zh-cn/devices/architecture/hidl-java/interfaces.html
+++ b/zh-cn/devices/architecture/hidl-java/interfaces.html
@@ -108,7 +108,7 @@
 foo.linkToDeath(recipient, 1481 /* cookie */);
 </pre>
 
-<p><code>recipient</code> 参数必须是由 HIDL 提供的 <code>HwBinder.DeathRecipient</code> 接口的实现。该接口包含在托管接口的进程终止时调用的单个方法 <code>serviceDied()</code>。</p>
+<p><code>recipient</code> 参数必须是由 HIDL 提供的 <code>HwBinder.DeathRecipient</code> 接口的实现。该接口包含单个方法 <code>serviceDied()</code>,该方法在托管该接口的进程终止时调用。</p>
 
 <pre class="prettyprint">
 final class DeathRecipient implements HwBinder.DeathRecipient {
diff --git a/zh-cn/devices/architecture/index.html b/zh-cn/devices/architecture/index.html
index fe8f943..e4cddec 100644
--- a/zh-cn/devices/architecture/index.html
+++ b/zh-cn/devices/architecture/index.html
@@ -45,6 +45,6 @@
 <h2 id="Linux-kernel">Linux 内核</h2>
 <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="/setup/building-kernels.html">编译内核</a>一文。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/architecture/vintf/match-rules.html b/zh-cn/devices/architecture/vintf/match-rules.html
index 90fe713..4ffc2f6 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 版本,用于升级设备和启动设备。在这种情况下,可以共享同一个未签名的系统映像,但最终签名的系统映像是不同的(具有不同的 <code>avb.vbmeta-version</code>):<em></em><em></em></p>
+<p>引导加载程序或 Android 操作系统可能包含 <code>libavb</code> 库的两个副本,每个副本具有不同的 MAJOR 版本,用于升级设备和启动设备。<em></em><em></em>在这种情况下,可以共享同一个未签名的系统映像,但最终签名的系统映像是不同的(具有不同的 <code>avb.vbmeta-version</code>):</p>
 
 <img src="../images/treble_vintf_avb_o_p.png"/>
 <figcaption><strong>图 1. </strong>AVB 版本匹配(<code>/system</code> 为 P,其他所有分区均为 O)。</figcaption>
diff --git a/zh-cn/devices/architecture/vndk/enabling.html b/zh-cn/devices/architecture/vndk/enabling.html
index ecca086..fa774a7 100644
--- a/zh-cn/devices/architecture/vndk/enabling.html
+++ b/zh-cn/devices/architecture/vndk/enabling.html
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>为了将供应商模块与系统模块分开考虑,VNDK 需要对代码库进行一些更改。请按照以下指南在供应商/OEM 代码库中启用 VNDK。</p>
+<p>为了区隔供应商模块与系统模块,您在启用 VNDK 前需要对代码库进行一些更改。请按照以下指南在供应商/OEM 代码库中启用 VNDK。</p>
 
 <h2 id="build-system-libraries">编译系统库</h2>
 <p>编译系统包含多种类型的对象,其中包括库(共享、静态或标头)和二进制文件:</p>
@@ -29,7 +29,7 @@
 <figcaption><strong>图 1.</strong> 编译系统库。</figcaption>
 
 <ul>
-<li><strong>核心</strong>:由系统映像在系统映像上使用。<code>vendor</code>、<code>vendor_available</code>、<code>vndk</code> 或 <code>vndk-sp</code> 库不能使用此类库。
+<li><strong>core</strong>:位于系统映像中,由系统映像使用。<code>vendor</code>、<code>vendor_available</code>、<code>vndk</code> 或 <code>vndk-sp</code> 库不能使用此��库。
 <pre class="prettyprint">
 cc_library {
     name: "libThatIsCore",
@@ -38,7 +38,7 @@
 </pre>
 </li>
 
-<li><strong>仅限供应商</strong>(或 <code>proprietary</code>):由供应商映像在供应商映像上使用。
+<li><strong>vendor-only</strong>(或 <code>proprietary</code>):位于供应商映像中,由供应商映像使用。
 <pre class="prettyprint">
 cc_library {
     name: "libThatIsVendorOnly",
@@ -49,7 +49,7 @@
 
 </pre></li>
 
-<li><strong>vendor_available</strong>:由供应商映像在供应商映像上使用(可能包含 <code>core</code> 的重复项)。
+<li><strong>vendor_available</strong>:位于供应商映像中,由供应商映像使用(可能包含 <code>core</code> 的重复项)。
 <pre class="prettyprint">
 cc_library {
     name: "libThatIsVendorAvailable",
@@ -59,7 +59,7 @@
 </pre>
 </li>
 
-<li><strong>vndk</strong>:由供应商映像在系统映像上使用(<code>vendor_available</code> 的子集)。
+<li><strong>vndk</strong>:位于系统映像中,由供应商映像使用(<code>vendor_available</code> 的子集)。
 <pre class="prettyprint">
 cc_library {
     name: "libThatIsVndk",
@@ -72,7 +72,7 @@
 </pre>
 </li>
 
-<li><strong>vndk-sp</strong>:由系统映像在系统映像上间接使用(<code>core</code> 的子集)。
+<li><strong>vndk-sp</strong>:位于系统映像中,由系统映像间接使用(<code>core</code> 的子集)。
 <pre class="prettyprint">
 cc_library {
     name: "libThatIsVndkSp",
@@ -95,34 +95,34 @@
 </li>
 </ul>
 
-<p>当 lib 被标记为 <code>vendor_available:true</code> 时,它将编译两次:</p>
+<p>当一个库被标记为 <code>vendor_available:true</code> 时,它将编译两次:</p>
 <ul>
 <li>一次是为平台编译(因此被安装到 <code>/system/lib</code> 中)。</li>
 <li>一次是为供应商编译(因此被安装到 <code>/vendor/lib</code>、<code>/system/lib/vndk</code> 或 <code>/system/lib/vndk-sp</code> 中)。</li>
 </ul>
 
-<p>libs 的供应商版本是使用 <code>-D__ANDROID_VNDK__</code> 编译的。您可以使用此标记停用在 Android 未来版本中可能会发生显著变化的专用系统组件。此外,不同的库会导出一组不同的标头(例如 <code>liblog</code>)。可以在 <code>Android.bp</code> 文件中指定相应目标的供应商变体特有的选项:</p>
+<p>库的供应商版本使用 <code>-D__ANDROID_VNDK__</code> 标记编译。您可以使用此标记停用在 Android 未来版本中可能会发生显著变化的专用系统组件。此外,不同的库会导出一组不同的标头(例如 <code>liblog</code>)。可以在 <code>Android.bp</code> 文件中指定相应目标的供应商变体特有的选项:</p>
 <pre class="prettyprint">target: { vendor: { … } }</pre>
 
 <h2 id="enabling">为代码库启用 VNDK</h2>
 <p>要为代码库启用 VNDK,请执行��下操作:</p>
 <ol>
-<li>通过计算 <code>vendor.img</code> 和 <code>system.img</code> 分区的所需大小来确定是否符合资格。</li>
-<li>启用 <code>BOARD_VNDK_VERSION=current</code>。您可以添加到 <code>BoardConfig.mk</code>,也可以直接通过它编译组件(即 <code>m -j BOARD_VNDK_VERSION=current <var>MY-LIB</var></code>)。</li>
+<li>通过计算 <code>vendor.img</code> 和 <code>system.img</code> 分区的所需大小来确定是否符合条件。</li>
+<li>启用 <code>BOARD_VNDK_VERSION=current</code>。您可以将其添加到 <code>BoardConfig.mk</code>,也可以直接使用此选项来编译组件(即 <code>m -j BOARD_VNDK_VERSION=current <var>MY-LIB</var></code>)。</li>
 </ol>
 <p>在启用 <code>BOARD_VNDK_VERSION=current</code> 后,编译系统会强制执行以下依赖项和标头要求。</p>
 
 <h3 id="managing-dependencies">管理依赖项</h3>
-<p>如果 <code>vendor</code> 对象依赖的 <code>core</code> 组件在 <code>vndk</code> 中不存在或未以 <code>vendor</code> 对象的形式出现,则必须使用下列选项之一解析该对象:</p>
+<p>如果 <code>vendor</code> 对象依赖的 <code>core</code> 组件在 <code>vndk</code> 中不存在或未以 <code>vendor</code> 对象的形式存在,则必须通过以下某种方式解决该问题:</p>
 <ul>
-<li>可以移除依赖项。</li>
-<li>如果 <code>core</code> 组件归 <code>vendor</code> 所有,则可以将其标记为 <code>vendor_available</code> 或 <code>vendor</code>。</li>
-<li>构成 <code>vndk</code> 核心对象部分的更改可以在上游提交给 Google。</li>
+<li>可以移除该依赖项。</li>
+<li>如果该 <code>core</code> 组件归 <code>vendor</code> 所有,则可将其标记为 <code>vendor_available</code> 或 <code>vendor</code>。</li>
+<li>可以在上游向 Google 提交更改请求,以便将此核心对象列入 <code>vndk</code>。</li>
 </ul>
-<p>此外,如果 <code>core</code> 组件依赖于 <code>vendor</code> 组件,则必须使 <code>vendor</code> 组件成为 <code>core</code> 组件,<strong>或者</strong>必须以其他方式移除依赖项(例如,通过移除依赖项或将其移到 <code>vendor</code> 组件中)。</p>
+<p>此外,如果有 <code>core</code> 组件依赖于 <code>vendor</code> 组件,则必须使此 <code>vendor</code> 组件成为 <code>core</code> 组件,<strong>或者</strong>以其他方式移除此依赖项(例如,通过移除依赖项或将其移到 <code>vendor</code> 组件中)。</p>
 
 <h3 id="managing-headers">管理标头</h3>
-<p>必须移除全局标头依赖项,编译系统才能知道在编译标头时是否带 <code>-D__ANDROID_VNDK__</code>。例如,诸如 <code>utils/StrongPointer.h</code> 之类的 libutils 标头仍可以使用标头库 <a href="https://android.googlesource.com/platform/system/core/+/master/libutils/include/utils" class="external"><code>libutils_headers</code></a> 来访问。
+<p>必须移除全局标头依赖项,编译系统才能知道在编译标头时是否带 <code>-D__ANDROID_VNDK__</code>。例如,<code>utils/StrongPointer.h</code> 之类的 libutils 标头仍可使用标头库 <a href="https://android.googlesource.com/platform/system/core/+/master/libutils/include/utils" class="external"><code>libutils_headers</code></a> 来访问。
 </p>
 
 <p>某些标头(例如 <code>unistd.h</code>)无法再以传递方式包含在内,但可以包含在本地。</p>
@@ -130,7 +130,7 @@
 <p>最后,<code>private/android_filesystem_config.h</code> 的公共部分已移至 <code>cutils/android_filesystem_config.h</code>。要管理这些标头,请执行下列操作之一:</p>
 
 <ul>
-<li>通过将所有 <code>AID_*</code> 宏替换为 <code><a href="http://man7.org/linux/man-pages/man3/getgrnam.3.html" class="external">getgrnam</a></code>/<code><a href="http://man7.org/linux/man-pages/man3/getpwnam.3.html" class="external">getpwnam</a></code> 调用(如果可能),移除 <code>private/android_filesystem_config.h</code> 的依赖项。例如:
+<li>通过将所有 <code>AID_*</code> 宏替换为 <code><a href="http://man7.org/linux/man-pages/man3/getgrnam.3.html" class="external">getgrnam</a></code>/<code><a href="http://man7.org/linux/man-pages/man3/getpwnam.3.html" class="external">getpwnam</a></code> 调用(如果可能),去除对 <code>private/android_filesystem_config.h</code> 的依赖。例如:
 
 <ul>
 <li><code>(uid_t)AID_WIFI</code> 会变为 <code>getpwnam("wifi")-&gt;pw_uid</code>。</li>
@@ -138,7 +138,7 @@
 </ul>
 如需了解详情,请参阅 <code><a href="https://android.googlesource.com/platform/system/core/+/master/libcutils/include/private/android_filesystem_config.h" class="external">private/android_filesystem_config.h</a></code>。
 </li>
-<li>对于硬编码的 AIS,请添加 <code>cutils/android_filesystem_config.h</code>。</li>
+<li>对于硬编码的 AIS,请包含 <code>cutils/android_filesystem_config.h</code>。</li>
 </ul>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/audio/latency.html b/zh-cn/devices/audio/latency.html
index cc370b0..75fcb45 100644
--- a/zh-cn/devices/audio/latency.html
+++ b/zh-cn/devices/audio/latency.html
@@ -32,7 +32,8 @@
 </tr>
 <tr>
   <td>为确保 Android 兼容性的音频延迟说明</td>
-  <td><a href="/compatibility/android-cdd#5_6_audio_latency">Android CDD</a><br /><em>第 5.6 节:音频延迟</em></td>
+  <td><a href="/compatibility/android-cdd#5_6_audio_latency">Android 兼容性定义文档 (CDD)</a><br />
+    <em>第 5.6 节:音频延迟</em></td>
 </tr>
 <tr>
   <td>音频延迟的常见原因</td>
@@ -58,6 +59,9 @@
   <td>应用</td>
   <td><a href="latency_app.html">音频延迟(适用于应用开发者)</a></td>
 </tr>
-</tbody></table>
+<tr>
+  <td>AAudio 和 MMAP</td>
+  <td><a href="aaudio.html">AAudio(适用于 OEM 和 SoC 供应商)</a></td>
+</tr></tbody></table>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/automotive/camera-hal.html b/zh-cn/devices/automotive/camera-hal.html
index 8b3470b..5680192 100644
--- a/zh-cn/devices/automotive/camera-hal.html
+++ b/zh-cn/devices/automotive/camera-hal.html
@@ -63,7 +63,7 @@
 getCameraList() generates (vec&lt;CameraDesc&gt; cameras);
 </pre>
 
-<p>返回包含系统中所有相机的说明的矢量。假设相机组是固定的且在启动时是可知的。有关相机说明的详细信息,请参阅 <code><a href="#cameradesc">CameraDesc</a></code>。</p>
+<p>返回包含系统中所有相机的说明的矢量。假设相机组是固定的且在启动时是可知的。要了解相机说明详细信息,请参阅 <code><a href="#cameradesc">CameraDesc</a></code>。</p>
 
 <pre class="prettyprint">
 openCamera(string camera_id) generates (IEvsCamera camera);
@@ -94,7 +94,7 @@
 getDisplayState() generates (DisplayState state);
 </pre>
 
-<p>获取当前的显示状态。HAL 实现应报告实际的当��状态,该状态可能与最近请求的状态不同。负责更改显示状态的逻辑应存在于设备层之上,从而使 HAL 实现无需自发更改显示状态。如果该显示目前未被任何客户端持有(通过调用 openDisplay),则此函数会返回 <code>NOT_OPEN</code>。否则,它会报告 EVS 显示的当前状态(请参阅 <a href="#ievsdisplay">IEvsDisplay API</a>)。</p>
+<p>获取当前的显示状态。HAL 实现应报告实际的当前状态,该状态可能与最近请求的状态不同。负责更改显示状态的逻辑应存在于设备层之上,从而使 HAL 实现无需自发更改显示状态。如果显示目前未被任何客户端持有(通过调用 openDisplay),则此函数会返回 <code>NOT_OPEN</code>。否则,它会报告 EVS 显示的当前状态(请参阅 <a href="#ievsdisplay">IEvsDisplay API</a>)。</p>
 
 <a name="cameradesc"></a>
 <pre class="prettyprint">
@@ -200,7 +200,7 @@
 
 <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>
+<p>应用<strong>不</strong>得依赖 <code>bufferId</code> 字段与 <code>BufferDesc</code> 结构中的 <code>memHandle</code> 之间的对应关系。一般来说,<code>bufferId</code> 值对于 HAL 驱动程序实现是私有的,该实现可以在适当的情况下使用(和重新使用)这些值。</p>
 
 <h3 id="ievsdisplay">IEvsDisplay</h3>
 
@@ -340,7 +340,7 @@
 <img src="/devices/automotive/images/vhal_evs_receive_frame.png"/>
 <figcaption><strong>图 4.</strong> EVS 应用逻辑样本,接收帧回调。</figcaption>
 
-<p>由于图像数据通过标准图形缓冲区呈现给应用,因此应用负责将图像从源缓冲区移动到输出缓冲区。尽管这会产生复制数据的成本,但也为应用以任何所需的方式将图像呈现到显示缓冲区提供了机会。</p>
+<p>由于图像数据通过标准图形缓冲区呈现给应用,因此应用负责将图像从源缓冲区移动到输出缓冲区。尽管这会产生复制数据的成本,但也为应用提供了机会以任何所需的方式将图像呈现到显示缓冲区。</p>
 
 <p>例如,应用可以选择移动像素数据本身,从而可以进行内嵌缩放或旋转操作。应用还可以选择使用源图像作为 OpenGL 纹理,并将复杂场景呈现给输出缓冲区,包括虚拟元素(如图标、准则和动画)。更复杂的应用还可以选择多个并发输入���机并将它们合并到单个输出帧中(例如用于从上到下地显示车辆周围环境的虚拟视图)。</p>
 
diff --git a/zh-cn/devices/bluetooth/hci_requirements.html b/zh-cn/devices/bluetooth/hci_requirements.html
index 5d31b24..ac245ea 100644
--- a/zh-cn/devices/bluetooth/hci_requirements.html
+++ b/zh-cn/devices/bluetooth/hci_requirements.html
@@ -1572,7 +1572,7 @@
                   注意:<br />
                   <ul>
                     <li>目前本地名称字符串中的字符数上限为 29</li>
-                    <li>执行“清除”操作时不适用 (0x2)</li>
+                    <li>执行“清除”操作 (0x2) 时不适用</li>
                   </ul>
                 </td>
               </tr>
@@ -1637,7 +1637,7 @@
                   注意:<br />
                   <ul>
                     <li>目前本地名称字符串中的字符数上限为 29</li>
-                    <li>执行“清除”操作时不适用 (0x2)</li>
+                    <li>执行“清除”操作 (0x2) 时不适用</li>
                   </ul>
                 </td>
               </tr>
@@ -1708,7 +1708,7 @@
                   注意:<br />
                   <ul>
                     <li>目前本地名称字符串中的字符数上限为 29</li>
-                    <li>执行“清除”操作时不适用 (0x2)</li>
+                    <li>执行“清除”操作 (0x2) 时不适用</li>
                   </ul>
                 </td>
               </tr>
diff --git a/zh-cn/devices/bluetooth/verifying_debugging.html b/zh-cn/devices/bluetooth/verifying_debugging.html
index cbdda3a..bb845fd 100644
--- a/zh-cn/devices/bluetooth/verifying_debugging.html
+++ b/zh-cn/devices/bluetooth/verifying_debugging.html
@@ -42,10 +42,10 @@
         system/bt/test/run_unit_tests.sh</a></code>。</p>
 
       <h3 id="android-comms-test-suite">Android 通讯测试套件</h3>
-        <p>Android 通讯测试套件 (ACTS) 用于执行对连接堆栈(例如 WLAN、蓝牙和移动网络服务)的自动测试。该测试工具需要 adb 和 python,您可以在以下文件中找到它:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts">
+        <p>Android 通讯测试套件 (ACTS) 用于执行对连接堆栈(例如 WLAN、蓝牙和移动网络服务)的自动测试。该测试工具需要 adb 和 python,您可以在以下位置找到它:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts">
           tools/test/connectivity/acts</a></code>。</p>
 
-        <p>针对蓝牙和蓝牙低功耗的 ACTS 测试分别位于以下文件中:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/bt/">
+        <p>针对蓝牙和蓝牙低功耗的 ACTS 测试分别位于以下位置:<code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/bt/">
           tools/test/connectivity/acts/tests/google/bt</a></code> 和 <code><a href="https://android.googlesource.com/platform/tools/test/connectivity/+/master/acts/tests/google/ble">
           tools/test/connectivity/acts/tests/google/ble</a></code>。</p>
 
@@ -56,8 +56,10 @@
           tools/test/connectivity/acts/tests/google/bt/pts</a></code>。</p>
 
       <h3 id="cts-tests">CTS 测试</h3>
-        <p><a href="https://source.android.com/compatibility/cts/">兼容性测试套件</a> (CTS) 包括针对蓝牙堆栈的测试。这些测试位于以下位置:<code><a href="https://android.googlesource.com/platform/cts/+/master/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/">
-            cts/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth</a></code>。</p>
+      <p>
+        <a href="/compatibility/cts/">兼容性测��套件</a> (CTS) 包括针对蓝牙堆栈的测试。这些测试位于以下位置:<code><a href="https://android.googlesource.com/platform/cts/+/master/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth/">
+        cts/apps/CtsVerifier/src/com/android/cts/verifier/bluetooth</a></code>。
+      </p>
 
     <h2 id="debugging-options">调试选项</h2>
       <p>AOSP 提供了多种调试设备蓝牙堆栈的方法,其中包括日志和错误报告。这些方法可能不适用于无法再现的问题或可能受平台和设备的多个部分影响的音频问题。
diff --git a/zh-cn/devices/graphics/arch-gameloops.html b/zh-cn/devices/graphics/arch-gameloops.html
index 8e9e3ad..04134b5 100644
--- a/zh-cn/devices/graphics/arch-gameloops.html
+++ b/zh-cn/devices/graphics/arch-gameloops.html
@@ -77,6 +77,6 @@
 
 <p>当绘图代码唤醒时,它就会抓住锁,获取块的当前位置,释放锁,然后进行绘制。您无需基于帧间增量时间进行分数移动,只需要有一个移动对象的线程,以及另一个在绘制开始时随地绘制对象的线程。</p>
 
-<p>对于任何复杂的场景,都请创建一个即将发生的事件的列表(按唤醒时间排序),并使绘图代码保持睡眠状态,直到该发生下一个事件为止。</p>
+<p>对于任何复杂的场景,都请创建一个即将发生的事件的列表(按唤醒时间排序),并使绘图代码保持休眠状态,直到该发生下一个事件为止。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/graphics/build-tests.html b/zh-cn/devices/graphics/build-tests.html
index 0ec7880..b74be4c 100644
--- a/zh-cn/devices/graphics/build-tests.html
+++ b/zh-cn/devices/graphics/build-tests.html
@@ -30,7 +30,7 @@
 
 <p>CMake 支持且建议在源代码树之外进行编译,也就是说,您应该始终在源代码树之外的独立编译目录中创建 Makefile 或项目文件。CMake 没有任何类型的“distclean”目标,因此,您必须手动移除 CMake 生成的任何文件。</p>
 
-<p>配置选项通过 <code>-D<var>OPTION_NAME</var>=<var>VALUE</var></code> 语法提供给 CMake。deqp 的一些常用选项如下所示。</p>
+<p>配置选项使用 <code>-D<var>OPTION_NAME</var>=<var>VALUE</var></code> 语法提供给 CMake。deqp 的一些常用选项如下所示。</p>
 
 <table>
  <tbody><tr>
@@ -60,7 +60,7 @@
 
 <p>针对新目标的 deqp 编译系统使用目标编译文件进行配置。目标编译文件可定义该平台支持哪些功能以及需要哪些库或其他包含路径。目标文件名遵循 <code>targets/<var>NAME</var>/<var>NAME</var>.cmake</code> 格式,且目标的选择会用到 <code>DEQP_TARGET</code> 编译参数。</p>
 
-<p>目标文件中的文件路径与基本的 <code>deqp</code> 目录(而非 <code>targets/<var>NAME</var></code> 目录)相关。目标编译文件可以设置以下标准变量。</p>
+<p>目标文件中的文件路径是相对于基本的 <code>deqp</code> 目录(而非 <code>targets/<var>NAME</var></code> 目录)。目标编译文件可以设置以下标准变量。</p>
 
 <table>
  <tbody><tr>
diff --git a/zh-cn/devices/graphics/index.html b/zh-cn/devices/graphics/index.html
index ac7f0c3..b61b571 100644
--- a/zh-cn/devices/graphics/index.html
+++ b/zh-cn/devices/graphics/index.html
@@ -30,7 +30,7 @@
 
 <p>从 Android 4.0 开始,硬件加速的 Canvas 默认情况下处于启用状态。因此,支持 OpenGL ES 2.0 的硬件 GPU 对于 Android 4.0 及更高版本的设备来说是强制要求。有关硬件加速绘制路径的工作原理及其行为与软件绘制路径行为之间的差异的说明,请参阅<a href="https://developer.android.com/guide/topics/graphics/hardware-accel.html">硬件加速指南</a>。</p>
 
-<p>除了 Canvas,开发者渲染图形的另一个主要方式是使用 OpenGL ES 直接渲���到 Surface。Android 在 <a href="http://developer.android.com/reference/android/opengl/package-summary.html">Android.opengl</a> 包中提供了 OpenGL ES 接口,开发者可以使用这些接口通过 SDK 或 <a href="https://developer.android.com/tools/sdk/ndk/index.html">Android NDK</a> 中提供的原生 API 调用其 GL 实现。</p>
+<p>除了 Canvas,开发者渲染图形的另一个主要方式是使用 OpenGL ES 直接渲染到 Surface。Android 在 <a href="http://developer.android.com/reference/android/opengl/package-summary.html">Android.opengl</a> 软件包中提供了 OpenGL ES 接口,开发者可以使用这些接口通过 SDK 或 <a href="https://developer.android.com/tools/sdk/ndk/index.html">Android NDK</a> 中提供的原生 API 调用其 GL 实现。</p>
 
 <p>Android 实现人员可以使用 <a href="testing.html">drawElements 质量计划</a>(也称为 deqp)来测试 OpenGL ES 功能。</p>
 
diff --git a/zh-cn/devices/sensors/power-use.html b/zh-cn/devices/sensors/power-use.html
index 1c8a264..8c21b9a 100644
--- a/zh-cn/devices/sensors/power-use.html
+++ b/zh-cn/devices/sensors/power-use.html
@@ -30,13 +30,13 @@
   <li>倾斜检测器</li>
 </ul>
 <p>在<a href="sensor-types.html#composite_sensor_type_summary">复合传感器类型汇总</a>表中,这些传感器都带有低功率 (<img src="images/battery_icon.png" width="20" height="20" alt="低功率传感器"/>) 图标。</p>
-<p>这些传感器类型不能实现为高功率传感器,因为它们的主要优势就是耗电量低。这些传感器预期会长期处于启用状态,并且很可能是全天候启用。宁愿不实现低功率传感器,也不要将其实现为高功率传感器,否则会导致大量耗电。</p>
-<p>对于低功率复合传感器类型(如步测器),必须在硬件中对其进行处理。</p>
-<p>有关具体的功率要求,请参阅 CDD。建议在 CTS 中进行测试,来验证这些功率要求。</p>
+<p>这些传感器类型不能实现为高功率传感器,因为它们的主要优势就是耗电量低。这些传感器预计会长期处于启用状态,并且很可能是全天候启用。宁愿不实现低功率传感器,也不要将其实现为高功率传感器,否则会导致过度耗电。</p>
+<p>对于低功率复合传感器类型(如步测器),必须使其在硬件中执行处理流程。</p>
+<p>有关具体的功率要求,请参阅 CDD。建议进行 CTS 测试,以便验证这些功率要求。</p>
 <h2 id="power_measurement_process">功率测量过程</h2>
-<p>功率是在电池处测量。对于以毫瓦为单位的值,我们使用电池的额定电压,这意味着电压为 4 伏且电流为 1 毫安时必须计为 4 毫瓦。</p>
+<p>功率的测量对象是电池。对于以毫瓦计的值,我们使用电池的额定电压,这意味着电压为 4 伏且电流为 1 毫安时必须计为 4 毫瓦。</p>
 <p>在 SoC 处于休眠状态时测量功率,并且计算 SoC 处于休眠状态时几秒钟内的平均值,以便将来自传感器芯片的周期性功率峰值考虑在内。</p>
-<p>对于单次唤醒传感器,则在传感器未触发时测量功率(因此不会唤醒 SoC)。同样,对于其他传感器,则在传感器数据存储在硬件 FIFO 中时测量功率,因此 SoC 不会被唤醒。</p>
-<p>当没有传感器处于启用状态时,通常以增量形式测量功率。当有多个传感器处于启用状态时,功率增量不得大于各个已启用传感器的功率之和。比如,如果加速度计的电流为 0.5 毫安,步测器的电流也为 0.5 毫安,则同时启用这两者所产生的电流必须小于 0.5 + 0.5 = 1 毫安。</p>
+<p>对于单次唤醒传感器,在传感器未触发时测量功率(因此不会唤醒 SoC)。同样,对于其他传感器,在传感器数据存储在硬件 FIFO 中时测量功率,因此 SoC 不会被唤醒。</p>
+<p>当没有传感器处于启用状��时,通常以增量形式测量功率。当有多个传感器处于启用状态时,功率增量不得大于各个已启用传感器的功率之和。比如,如果加速度计的电流为 0.5 毫安,步测器的电流也为 0.5 毫安,则同时启用这两者所消耗的电流必须小于 0.5 + 0.5 = 1 毫安。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/sensors/sensor-stack.html b/zh-cn/devices/sensors/sensor-stack.html
index d203eda..d98e89b 100644
--- a/zh-cn/devices/sensors/sensor-stack.html
+++ b/zh-cn/devices/sensors/sensor-stack.html
@@ -57,13 +57,13 @@
   <li>没有将数据从应用向下发送至传感器或其驱动程序的机制。这样可以确保某个应用无法修改传感器的行为,从而不会对其他应用造成破坏。</li>
 </ul>
 <h3 id="sensor_fusion">传感器融合</h3>
-<p>Android 框架为部分复合传感器提供默认实现。如果设备上有<a href="sensor-types.html#gyroscope">陀螺仪</a>、<a href="sensor-types.html#accelerometer">加速度计</a>和<a href="sensor-types.html#magnetic_field_sensor">磁力计</a>,但没有<a href="sensor-types.html#rotation_vector">旋转矢量</a>、<a href="sensor-types.html#gravity">重力</a>和<a href="sensor-types.html#linear_acceleration">线性加速度</a>传感器,则该框架会实现这些传感器,以便应用仍可以使用它们。</p>
+<p>Android 框架为部分复合传感器提供默认实现。如果设备上有<a href="sensor-types.html#gyroscope">陀螺仪</a>、<a href="sensor-types.html#accelerometer">加速度计</a>和<a href="sensor-types.html#magnetic_field_sensor">磁力计</a>,但没有<a href="sensor-types.html#rotation_vector">旋转矢量</a>、<a href="sensor-types.html#gravity">重力</a>和<a href="sensor-types.html#linear_acceleration">线性加速度</a>传感器,则框架会实现这些传感器,以便应用仍可以使用它们。</p>
 <p>默认实现无法访问其他实现可以访问的所有数据,并且必须在 SoC 上运行,因此它不像其他实现那样精准和省电。设备制造商应尽可能定义自己的融合传感器(旋转矢量传感器、重力传感器和线性加速度传感器,以及<a href="sensor-types.html#game_rotation_vector">游戏旋转矢量</a>传感器等较新的复合传感器),而非依赖该默认实现。此外,设备制造商也可以要求传感器芯片供应商为其提供实现。</p>
 <p>默认的传感器融合实现没有相关的维护,且可能导致依赖它的设备无法通过 CTS 验证。</p>
 <h3 id="under_the_hood">深入了解</h3>
 <p>本部分作为背景信息提供,适用于 Android 开放源代码项目 (AOSP) 框架代码的维护人员,与硬件制造商无关。</p>
 <h4 id="jni">JNI</h4>
-<p>该框架使用与 <a href="http://developer.android.com/reference/android/hardware/package-summary.html">android.hardware</a> 相关联且位于 <code>frameworks/base/core/jni/</code> 目录中的 Java 本机接口 (JNI)。该代码会调用较低级别的原生代码,以获取对相应传感器硬件的访问权限。</p>
+<p>框架使用与 <a href="http://developer.android.com/reference/android/hardware/package-summary.html">android.hardware</a> 相关联且位于 <code>frameworks/base/core/jni/</code> 目录中的 Java 本机接口 (JNI)。该代码会调用较低级别的原生代码,以获取对相应传感器硬件的访问权限。</p>
 <h4 id="native_framework">原生框架</h4>
 <p>原生框架在 <code>frameworks/native/</code> 中定义,并提供相当于 <a href="http://developer.android.com/reference/android/hardware/package-summary.html">android.hardware</a> 软件包的原生内容。原生框架会调用 Binder IPC 代理,以获取对传感器专属服务的访问权限。</p>
 <h4 id="binder_ipc">Binder IPC</h4>
@@ -81,7 +81,7 @@
 <h2 id="sensor_hub">传感器中枢</h2>
 <p>设备的传感器堆栈可视需要添加传感器中枢。在 SoC 可以处于暂停模式时,传感器中枢对执行一些低功耗的低级计算任务非常有用。例如,计步功能或传感器融合功能可以在这些芯片上执行。此外,它也是实施传感器批处理以及为传感器事件添加硬件 FIFO 的理想位置。如需更多信息,请参阅<a href="batching.html">批处理</a>。</p>
 
-<p class="note"><strong>注意</strong>:要开发采用新传感器或 LED 的新 ContextHub 功能,您还可以使用连接到 HiKey 或 HiKey960 开发板的 <a href="/source/devices.html#neonkey">Neonkey SensorHub</a>。</p>
+<p class="note"><strong>注意</strong>:要开发采用新传感器或 LED 的新 ContextHub 功能,您还可以使用连接到 HiKey 或 HiKey960 开发板的 <a href="/setup/devices.html#neonkey">Neonkey SensorHub</a>。</p>
 
 <p>传感器中枢的具体化方式取决于架构。它有时是一个单独的芯片,有时包含在与 SoC 相同的芯片上。传感器中枢的重要特征是,应该包含足够的内存来进行批处理,并消耗极少的电量以便能实现低功耗 Android 传感器。部分传感器中枢包含一个微控制器(用于通用计算)和硬件加速器(用于针对低电耗传感器实现极低功耗计算)。</p>
 <p>传感器中枢的架构方式以及与传感器和 SoC(I2C 总线、SPI 总线等)的通信方式并非由 Android 指定,但应该以最大程度减少整体功耗为目标。</p>
diff --git a/zh-cn/devices/storage/index.html b/zh-cn/devices/storage/index.html
index af0d1ec..c6f954c 100644
--- a/zh-cn/devices/storage/index.html
+++ b/zh-cn/devices/storage/index.html
@@ -23,7 +23,7 @@
 <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">适配<em></em>的存储设备</a>,这类存储是指物理介质(如 SD 卡或 USB 设备),已进行加密和格式化,能像内部存储一样运行。适配的存储设备可存储各类应用数据。</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>
diff --git a/zh-cn/devices/tech/admin/provision.html b/zh-cn/devices/tech/admin/provision.html
index 8d1680d..f7c0e41 100644
--- a/zh-cn/devices/tech/admin/provision.html
+++ b/zh-cn/devices/tech/admin/provision.html
@@ -53,7 +53,7 @@
 
 <h2 id="profile_owner_provisioning">资料所有者配置</h2>
 
-<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>资料所有者配置假定设备的用户(而不是公司 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>
 
diff --git a/zh-cn/devices/tech/admin/testing-setup.html b/zh-cn/devices/tech/admin/testing-setup.html
index 150b0a9..f2fd258 100644
--- a/zh-cn/devices/tech/admin/testing-setup.html
+++ b/zh-cn/devices/tech/admin/testing-setup.html
@@ -35,7 +35,8 @@
 <ol>
 <li>将目标设备恢复出厂设置。</li>
 <li>确保设备不含任何用户帐号(例如,用于登录在线服务的用户帐号)。要进行验证,请依次选择“设置”&gt;“帐号”<em></em>。</li>
-<li>使用以下某种方法设置测试应用:<ul>
+<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>
@@ -50,7 +51,7 @@
 </ol>
 
 <h2 id="verify_the_device_owner_was_correctly_setup">验证设备所有者设置</h2>
-<p>要验证设备所有者是否已正确设置,请依次转到“设置”&gt;“安全”&gt;“设备管理器”,并确认 TestDPC 是否已在列表中。<em></em>验证它无法被停用(这表明它就是设备所有者)。</p>
+<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>
@@ -58,7 +59,7 @@
 <h2 id="troubleshooting">错误报告和日志</h2>
 <p>自 Android 7.0 起,设备所有者 Device Policy Client (DPC) 可以获取受管理设备上企业进程的错误报告并查看日志。</p>
 
-<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>要触发错误报告(即由 <code>adb bugreport</code> 收集的包含 <code>dumpsys</code>、dumpstate 和 logcat 数据的对应数据),请使用 <code>DevicePolicyController.requestBugReport</code>。收集错误报告后,系统会提示用户同意发送错误报告数据。结果将由 <code>DeviceAdminReceiver.onBugreport[Failed|Shared|SharingDeclined]</code> 接收。要详细了解错误报告内容,请参阅<a href="/setup/read-bug-reports.html">读取错误报告</a>。</p>
 
 <p>此外,设备所有者 DPC 还可以收集与用户在受管理设备上执行的操作相关的日志。所有报告 device_admin 的设备均必须进行企业进程日志记录,且通过新的日志安全缓冲区(仅供系统服务器读取)进行启用(也就是说,<code>$ adb logcat -b security</code> 无法读取该缓冲区)。ActivityManager 服务和 Keyguard 组件会将以下事件记录到安全缓冲区:</p>
 
diff --git a/zh-cn/devices/tech/config/perms-whitelist.html b/zh-cn/devices/tech/config/perms-whitelist.html
index 19bda94..cb23e5a 100644
--- a/zh-cn/devices/tech/config/perms-whitelist.html
+++ b/zh-cn/devices/tech/config/perms-whitelist.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>特许权限白名单要求</title>
+    <title>特许权限白名单</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
@@ -19,132 +19,108 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-    <p>
-过去,设备实现人员几乎无法控制可以向特权应用授予哪些签名|特许权限。
-特权应用是位于系统映像上 <code>/system/priv-app</code> 目录下的系统应用。
-    </p>
+<p>
+  特权应用是位于系统映像 <code>/system/priv-app</code> 目录下的系统应用。过去,设备实现人员几乎无法控制可以向特权应用授予哪些签名|特许权限。从 Android 8.0 开始,实现人员可以将特权应用显式加入到 <code>/etc/permissions</code> 目录下的系统配置 XML 文件的白名单中。未在这些 XML 文件中明确列出的应用不会被授予特许权限。
+</p>
 
-    <p>
-从 Android 8.0 开始,所有特权应用均必须显式加入到 <code>/etc/permissions</code> 目录下的系统配置 XML 文件的白名单中。
-如果不这样做,则设备可以启动,但设备实现将无法通过 CTS。</p>
+<h2 id="adding-whitelists">添加白名单</h2>
+<p>
+  应用的权限白名单可列在位于 <code>frameworks/base/etc/permissions</code> 目录下的单个或多个 XML 文件中,如下所示:
+</p>
 
-    <h2 id="adding-the-whitelists">添加白名单</h2>
+<ul>
+  <li><code>/etc/permissions/privapp-permissions-<var>OEM_NAME</var>.xml</code>
+  </li><li><code>/etc/permissions/privapp-permissions-<var>DEVICE_NAME</var>.xml</code>
+</li></ul>
 
-    <p>
+<p>对于如何组织内容,没有严格的规则。设备实现人员可以决定内容结构,只要将 <code>/system/priv-app</code> 下的所有应用均列入白名单即可。例如,Google 针对由 Google 开发的所有特权应用提供了一个白名单。我们建议使用以下组织方式:
+</p>
 
-应用的权限白名单可列在位于 <code>frameworks/base/etc/permissions</code> 目录下的单个或多个 XML 文件中,如下所示:
-    </p>
+<ul>
+  <li>对于已包含在 Android 开源项目 (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-<var>DEVICE_NAME</var>.xml</code>。
+  </li>
+</ul>
 
-    <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>
+<h3 id="generating-whitelists">生成白名单</h3>
 
-    <p>
-对于如何组织内容,没有任何严格的规则,只要将 <code>/system/priv-app</code> 下的所有应用均列入白名单,设备实现人员就可以自行决定如何组织内容。例如,Google 会针对由 Google 开发的所有特权应用提供一个白名单。
-    </p>
+<p>
+  要针对系统映像上提供的所有应用自动生成白名单,请使用位于以下位置的 AOSP 命令行工具:<code>development/tools/privapp_permissions/privapp_permissions.py</code>。要生成特定于设备的 <code>privapp-permissions.xml</code> 的初始版本,请执行以下操作:
+</p>
 
-    <p>
-建议使用以下组织方式:
-    </p>
+<ol>
+  <li>编译系统映像:
+  <pre class="devsite-click-to-copy">
+    <code class="devsite-terminal">. build/envsetup.sh</code>
+    <code class="devsite-terminal">lunch <var>PRODUCT_NAME</var></code>
+    <code class="devsite-terminal">make -j</code></pre>
+    </li>
+  <li>运行 <code>privapp_permissions.py</code> 脚本以生成一个 <code>privapp-permissions.xml</code> 文件,该文件会列出需要列入白名单的所有签名|特许权限:
+      <pre class="devsite-terminal devsite-click-to-copy">development/tools/privapp_permissions/privapp_permissions.py</pre>
+    此工具会打印可在 <code>/etc/permissions</code> 下作为单个文件或拆分为多个文件的 XML 内容。
+    如果设备已在 <code>/etc/permissions</code> 目录下包含白名单,则该工具将仅打印出差异内容(也就是说,只打印缺少的将列入白名单的签名|特许权限)。这对审核也很有用,当添加新版本的应用时,该工具会检测所需的其他权限。
+  </li>
+  <li>将生成的文件复制到 <code>/etc/permissions</code> 目录下,系统在启动过程中将从这里读取这些文件。</li>
+</ol>
 
-    <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="customizing-whitelists">自定义白名单</h3>
 
-    <h3 id="whitelist-generation-tool">白名单生成工具</h3>
+<p>
+  AOSP ���含可视需要自定义的白名单实现。
+  对于包含在 AOSP 中的应用,其权限已在 <code>/etc/permissions/privapp-permissions-platform.xml</code> 中列入白名单。
+</p>
 
-    <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>
+<p>
+  默认情况下,<code>privapp_permissions.py</code> 脚本生成的输出会自动授予特权应用所请求的任何权限。如果有应被拒绝的权限,请修改 XML 以使用“拒绝权限”标记而非“权限”标记。例如:
+</p>
 
     <pre class="prettyprint">&lt;!--
-    This XML file declares which signature|privileged permissions should be granted to privileged
-    applications that come with the platform
+    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;
+&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;!-- don't allow application to interact across users --&gt;
+    &lt;deny-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>
+<h3 id="finding-missing-permissions">查找缺少的权限</h3>
 
-    </p><p>
-违规行为将在日志文件中予以报告,但所授予的权限仍将有效。这样可使设备处于工作状态,同时又能提供违规行为列表。
-    </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>
+<pre class="devsite-click-to-copy">ro.control_privapp_permission=log</pre>
+
+<p>
+  违规行为会在日志文件中予以报告,但仍然会授予权限。
+  这样可在提供违规行为列表的同时,使设备仍然处于工作状态。错误消息格式如下:
+</p>
+
+<pre class="devsite-click-to-copy">
+PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions whitelist
+</pre>
+
+<p>
+  所有违规行为均必须通过将应用加入白名单来予以解决。如果未加入,这些应用将不会被授予缺少的权限,即使它们位于 priv-app 路径中也是如此。
+</p>
+
+<h2 id="enforcing-whitelists">强制执行白名单</h2>
+
+<p>
+  白名单列好后,可通过设置版本属性 <code>ro.control_privapp_permission=enforce</code> 来启用运行时强制执行。
+</p>
+
+<aside class="note"><strong>注意</strong>:<code>ro.control_privapp_permission</code> 属性状态必须符合 <a href="/compatibility/android-cdd#9_1_permissions">CDD 部分 9.1 的要求</a>。</aside>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/config/uicc.html b/zh-cn/devices/tech/config/uicc.html
index 2bbc3cf..e8df1a5 100644
--- a/zh-cn/devices/tech/config/uicc.html
+++ b/zh-cn/devices/tech/config/uicc.html
@@ -80,7 +80,7 @@
 <h3 id="telephonymanager">TelephonyManager</h3>
 
 <ul>
-<li>用于允许运营商应用向 UICC 请求质询/响应的 API:<a href="https://developer.android.com/reference/android/telephony/TelephonyManager.html#getIccAuthentication(int,%20int,%20java.lang.String)"><code>getIccAuthentication</code></a>。
+<li>用于允许运营商应用向 UICC 请求挑战/响应的 API:<a href="https://developer.android.com/reference/android/telephony/TelephonyManager.html#getIccAuthentication(int,%20int,%20java.lang.String)"><code>getIccAuthentication</code></a>。
 </li>
 
 <li>用于检查发起呼叫的应用是否已获得运营商权限的 API:<a href="http://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()"><code>hasCarrierPrivileges</code></a>。
@@ -127,7 +127,7 @@
 
 <h3 id="telephonyprovider">TelephonyProvider</h3>
 
-<p>允许对电话数据库进行修改(插入、删除、更新和查询)的内容提供程序 API。值字段在 <a href="https://developer.android.com/reference/android/provider/Telephony.Carriers.html"><code>Telephony.Carriers</code></a> 中定义;如需更多详细信息,请参阅 developer.android.com 上的<a href="https://developer.android.com/reference/android/provider/Telephony.html">电话</a> API 参考。</p>
+<p>允许对电话数据库进行修改(插入、删除、更新和查询)的内容提供程序 API。值字段在 <a href="https://developer.android.com/reference/android/provider/Telephony.Carriers.html"><code>Telephony.Carriers</code></a> 中定义;有关详情,请参阅 developer.android.com 上的 <a href="https://developer.android.com/reference/android/provider/Telephony.html">Telephony</a> API 参考。</p>
 
 <h2 id="android_platform">Android 平台 </h2>
 
diff --git a/zh-cn/devices/tech/connect/block-numbers.html b/zh-cn/devices/tech/connect/block-numbers.html
index 1fea01c..30752e9 100644
--- a/zh-cn/devices/tech/connect/block-numbers.html
+++ b/zh-cn/devices/tech/connect/block-numbers.html
@@ -112,7 +112,7 @@
 </p>
 
 <p>
-如果设备之前配备了呼叫/短信限制功能,请调整该功能,以便所有严格匹配的屏蔽电话号码都存储在 <code>BlockedNumberProvider,</code> 中,并且围绕该提供程序的行为满足 Android 兼容性定义文档 (CDD) 中针对此功能的要求。<em></em>
+如果设备之前配备了呼叫/短信限制功能,请调整该功能,以便所有严格匹配的被屏蔽电话号码都存储在 <code>BlockedNumberProvider,</code> 中,并且围绕该提供程序的行为满足 Android 兼容性定义文档 (CDD) 中针对此功能的要求。<em></em>
 </p>
 
 <p>
diff --git a/zh-cn/devices/tech/connect/connect_tests.html b/zh-cn/devices/tech/connect/connect_tests.html
index d6c89fb..e57e05a 100644
--- a/zh-cn/devices/tech/connect/connect_tests.html
+++ b/zh-cn/devices/tech/connect/connect_tests.html
@@ -38,7 +38,7 @@
 
 <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>
+<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>
 
diff --git a/zh-cn/devices/tech/connect/data-saver.html b/zh-cn/devices/tech/connect/data-saver.html
index eb46d9e..73c828e 100644
--- a/zh-cn/devices/tech/connect/data-saver.html
+++ b/zh-cn/devices/tech/connect/data-saver.html
@@ -20,15 +20,15 @@
       limitations under the License.
   -->
 
-<p>移动数据流量的使用费用非常高,在大众普遍无法承担数据服务费用的地方更是如此。因此,Android 用户迫切希望能够降低应用的数据使用量,或完全阻止应用使用数据流量。Android 7.0 版本中的流量节省程序为用户提供了这项功能。
+<p>移动数据流量费用高昂,在大众普遍无法承担数据服务费用的地方更是如此。因此,Android 用户迫切希望能够降低应用的数据使用量,或完全阻止应用使用数据流量。Android 7.0 版本中的流量节省程序为用户提供了这项功能。
 </p>
 
 <p>
-<a href="https://developer.android.com/preview/features/data-saver.html">流量节省程序</a>功能可由用户开启或关闭。应用开发者应使用新的 API 来检查流量节省程序模式是否已开启。如果已开启,则应用开发者可以微调其应用以实现低数据或无数据访问,从而妥善应对这种情况。
+<a href="https://developer.android.com/preview/features/data-saver.html">流量节省程序</a>功能可由用户开启或关闭。应用开发者应使用新的 API 来检查流量节省程序模式是否已开启。如果已开启,则应用开发者可以调整其应用以降低或杜绝流量消耗,从而妥善应对这种情况。
 </p>
 
 <p>
-这项功能为最终用户带来极大的好处,因为他们将能够决定哪些应用可以在后台访问数据���而哪些应用只能在前台访问数据。这样就可以确保在流量节省程序处于开启状态时(根据用户设置),实现所需的后台数据交换。
+这项功能为最终用户带来极大的好处,因为他们将能够决定哪些应用可以在后台使用流量,而哪些应用只能在前台使用流量。这样就可以确保在流量节省程序处于开启状态时(根据用户设置),实现所需的后台数据流量限制。
 </p>
 
 <h2 id="implementation">实现</h2>
@@ -39,7 +39,7 @@
 
 <h3 id="settings-interface">设置界面</h3>
 
-<p>Android 开放源代码项目 (AOSP) 中提供了默认的“流量节省程序设置”用户界面。有关示例,请查看以下屏幕截图。
+<p>Android 开源项目 (AOSP) 中提供了默认的“流量节省程序设置”用户界面。有关示例,请查看以下屏幕截图。
 </p>
 
 <p>这些屏幕截图显示了使用中的流量节省程序模式。
@@ -65,28 +65,28 @@
 
 <p class="caution"><strong>重要提示</strong>:设备实现人员不得将应用列入白名单。即使他们这样做,用户也可以移除这类应用。如果在设备中加入了其他应用,则可能会迫使用户决定针对这些应用使用流量节省程序。</p>
 
-<p>所有应用开发者(包括使用预加载应用的原始设备制造商 (OEM) 和运营商)都必须采取相应措施来实现流量节省程序。请参阅 <a href="https://developer.android.com/preview/features/data-saver.html">developer.android.com 上的流量节省程序</a>,了解有关检测和监控流量节省程序状态的应用开发者说明。合作伙伴可参阅下文以获得更多实用信息。</p>
+<p>所有应用开发者(包括在设备上预装应用的 OEM 和运营商)都必须采取相应措施来实现流量节省程序。请参阅 <a href="https://developer.android.com/preview/features/data-saver.html">developer.android.com 上���流量节省程序</a>,了解有关检测和监控流量节省程序状态的应用开发者说明。合作伙伴可参阅下文以获得更多实用信息。</p>
 
 <p>
-要优化流量节省程序模式,应用需要满足以下几点:
+要针对流量节省程序模式进行优化,应用需要满足以下几点:
 </p>
 
 <ul>
   <li>移除不必要的图片
-  </li><li>针对剩余图片使用低分辨率
+  </li><li>为剩余图片使用低分辨率
   </li><li>使用低比特率视频
   </li><li>触发现有的“精简”体验
   </li><li>压缩数据
   </li><li>留意按流量计费/不按流量计费网络的状态(即使流量节省程序已关闭)。</li></ul>
 
-<p>另外,要实现与流量节省程序之间的完美协作,应用不得:</p>
+<p>另外,要良好地配合流量节省程序,应用不得:</p>
 
 <ul>
   <li>自动播放视频
   </li><li>预提取内容/附件
   </li><li>下载更新/代码
-  </li><li>要求列入白名单(除非实现核心功能需要使用后台数据)
-  </li><li>将列入白名单作为使用更多带宽的许可条件</li></ul>
+  </li><li>要求列入白名单(除非实现核心功能需要在后台使用流量)
+  </li><li>将列入白名单视为使用更多流量的许可</li></ul>
 
 <h2 id="validation">验证</h2>
 
@@ -101,7 +101,8 @@
 adb shell cmd netpolicy
 </pre>
 
-<p>例如,执行此命令可返回白名单应用的 UID:</p>
+<p>
+例如,执行此命令可返回白名单应用的 UID:</p>
 <pre class="devsite-terminal devsite-click-to-copy">
 adb shell cmd netpolicy list restrict-background-whitelist
 </pre>
diff --git a/zh-cn/devices/tech/dalvik/configure.html b/zh-cn/devices/tech/dalvik/configure.html
index 52ceca4..befd7a6 100644
--- a/zh-cn/devices/tech/dalvik/configure.html
+++ b/zh-cn/devices/tech/dalvik/configure.html
@@ -20,23 +20,23 @@
       limitations under the License.
   -->
 
-<p>本页中介绍了如何配置 ART 及其编译选项。讨论的主题包括:系统映像预编译配置、dex2oat 编译选项,以及如何在系统分区空间、数据分区空间和性能这三者之间取得平衡。</p>
+<p>本页面介绍了如何配置 ART 及其编译选项。讨论的主题包括:系统映像预编译配置、dex2oat 编译选项,以及如何在系统分区空间、数据分区空间和性能这三者之间取得平衡。</p>
 
-<p>请参阅 <a href="http://source.android.com/devices/tech/dalvik/index.html">ART 和 Dalvik</a>、<a href="http://source.android.com/devices/tech/dalvik/dex-format.html">Dalvik 可执行文件格式</a>,以及 source.android.com 上的其他页面,了解如何使用 ART。请参阅<a href="http://developer.android.com/guide/practices/verifying-apps-art.html">在 Android Runtime (ART) 上验证应用行为</a>,了解如何确保您的应用能够正常运行。</p>
+<p>请参阅 <a href="/devices/tech/dalvik/index.html">ART 和 Dalvik</a>、<a href="/devices/tech/dalvik/dex-format.html">Dalvik 可执行文件格式</a>,以及 source.android.com 上的其他页面,了解如何使用 ART。请参阅<a href="http://developer.android.com/guide/practices/verifying-apps-art.html">在 Android Runtime (ART) 上验证应用行为</a>,了解如何确保您的应用能够正常运行。</p>
 
 <h2 id="how_art_works">ART 的运作方式</h2>
 
-<p>ART 使用预先 (AOT) 编译,并且从 Android 7.0(Nougat 或 N)开始使用 AOT、即时 (JIT) 编译和配置文件引导型编译的混合组合。所有这些编译模式的组合均可配置,我们将在本部分中对此进行介绍。例如,Pixel 设备配置了以下编译流程:</p>
+<p>ART 使用预先 (AOT) 编译,并且从 Android 7.0(代号 Nougat,简称 N)开始结合使用 AOT、即时 (JIT) 编译和配置文件引导型编译。所有这些编译模式的组合均可配置,我们将在本部分中对此进行介绍。例如,Pixel 设备配置了以下编译流程:</p>
 <ol>
-<li>最初安装应用时不进行任何 AOT 编译。应用在前几次运行时,系统会对其进行解译,并且会对经常执行的方法进行 JIT 编译。</li>
+<li>最初安装应用时不进行任何 AOT 编译。应用前几次运行时,系统会对其进行解译,并对经常执行的方法进行 JIT 编译。</li>
 <li>当设备闲置和充电时,编译守护进程会运行,以便根据在应用前几次运行期间生成的配置文件对常用代码进行 AOT 编译。</li>
-<li>下一次重新启动应用时将会使用配置文件引导型代码,并避免在运行时对已经过编译的方法进行 JIT 编译。在应用后续运行期间被 JIT 编译的方法将会被添加到配置文件中,然后编译守护进程将会收集这些方法。</li>
+<li>下一次重新启动应用时将会使用配置文件引导型代码,并避免在运行时对已经过编译的方法进行 JIT 编译。在应用后续运行期间进行了 JIT 编译的方法将会被添加到配置文件中,然后编译守护进程将会对这些方法进行 AOT 编译。</li>
 </ol>
 
-<p>ART 包括一个编译器(<code>dex2oat</code> 工具)和一个为启动 Zygote 而加载的运行时 (<code>libart.so</code>)。<code>dex2oat</code> 工具将会收到一个 APK 文件,并生成一个或多个编译软件工件文件,然后运行时将会加载这些文件。文件的个数、扩展名和名称会因版本而异,但从 Android O 版本开始,将会生成以下文件:</p>
+<p>ART 包括一个编译器(<code>dex2oat</code> 工具)和一个为启动 Zygote 而加载的运行时 (<code>libart.so</code>)。<code>dex2oat</code> 工具接受一个 APK 文件,并生成一个或多个编译工件文件,然后运行时将会加载这些文件。文件的个数、扩展名和名称会因版本而异,但在 Android O 版本中,将会生成以下文件:</p>
 <ul>
 <li><code>.vdex</code>:其中包含 APK 的未压缩 DEX 代码,另外还有一些旨在加快验证速度的元数据。</li>
-<li><code>.odex</code>:其中包含 APK 中的方法的代码(已经过 AOT 编译)。</li>
+<li><code>.odex</code>:其中包含 APK 中已经过 AOT 编译的方法代码。</li>
 <li><code>.art (optional)</code>:其中包含 APK 中列出的某些字符串和类的 ART 内部表示,用于加快应用启动速度。</li>
 </ul>
 
@@ -49,7 +49,7 @@
 </ol>
 <p></p>
 
-<p>用于配置这两个类别的一个核心 ART 选项是编译过滤器。<em></em>编译过滤器可控制 ART 如何编译 DEX 代码,是一个传递给 <code>dex2oat</code> 工具的选项。从 Android O 开始,有四个官方支持的过滤器:</p>
+<p>用于配置这两个类别的一个核心 ART 选项是“编译过滤器”。<em></em>编译过滤器可控制 ART 如何编译 DEX 代码,是一个传递给 <code>dex2oat</code> 工具的选项。从 Android O 开始,有四个官方支持的过滤器:</p>
 <ul>
 <li>verify:只运行 DEX 代码验证。<em></em></li>
 <li>quicken:运行 DEX 代码验证,并优化一些 DEX 指令,以获得更好的解译器性能。<em></em></li>
@@ -59,9 +59,9 @@
 
 <h3 id="system_rom">系统 ROM 配置</h3>
 
-<p>有一些 ART 编译选项可用于配置系统 ROM。如何配置这些选项取决于 <code>/system</code> 的可用存储空间以及预先安装的应用数量。编译到系统 ROM 的 JAR/APK 可以分为以下四个类别:</p>
+<p>有一些 ART 编译选项可用于配置系统 ROM。如何配置这些选项取决于 <code>/system</code> 的可用存储空间以及预先安装的应用数量。编译到系统 ROM 中的 JAR/APK 可以分为以下四个类别:</p>
 <ul>
-<li>启动相关的类路径代码:默认使用 speed 编译过滤器进行编译。<em></em></li>
+<li>启动类路径代码:默认使用 speed 编译过滤器进行编译。<em></em></li>
 <li>系统服务器代码:默认使用 speed 编译过滤器进行编译。<em></em></li>
 <li>产品专属的核心应用:默认使用 speed 编译过滤器进行编译。<em></em></li>
 <li>所有其他应用:默认使用 quicken 编译过滤器进行编译。<em></em></li>
@@ -72,23 +72,23 @@
 
 <li><code>WITH_DEXPREOPT</code></li>
 <p>
-是否针对在系统映像上安装的 DEX 代码调用 <code>dex2oat</code>。默认处于启用状态。
+是否对系统映像上安装的 DEX 代码调用 <code>dex2oat</code>。默认处于启用状态。
 </p>
 
 <li><code>DONT_DEXPREOPT_PREBUILTS</code>(从 Android 5.0 开始)</li>
 <p>
-启用 <code>DONT_DEXPREOPT_PREBUILTS</code> 可防止对经过预编译的应用进行预先优化。这些都是在 <code>Android.mk</code> 中指定了 <code>include $(BUILD_PREBUILT)</code> 的应用,例如 Gmail。不对可能通过 Google Play 进行更新且经过预编译的应用进行预先优化可以节省 <code>/system</code> 空间,但是会增加首次启动时间。
+启用 <code>DONT_DEXPREOPT_PREBUILTS</code> 可防止对预编译的应用进行预先优化。这些都是在 <code>Android.mk</code> 中指定了 <code>include $(BUILD_PREBUILT)</code> 的应用,例如 Gmail。不对这些很可能要通过 Google Play 进行更新的预编译应用进行预先优化可以节省 <code>/system</code> 的空间,但是会增加首次启动时间。
 </p>
 
-<li><code>WITH_DEXPREOPT_BOOT_IMG_ONLY</code></li>
+<li><code>WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY</code>(Android O MR1 中的新增选项)</li>
 
-<p>如果启用 <code>WITH_DEXPREOPT_BOOT_IMG_ONLY</code>,将只会预先��化启动相关的类路径。
+<p>如果启用 <code>WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY</code>,将只会对启动类路径和系统服务器 JAR 进行预先优化。</p>
 
-</p><li><code>LOCAL_DEX_PREOPT</code></li>
+<li><code>LOCAL_DEX_PREOPT</code></li>
 
-<p>通过在模块定义中指定 <code>LOCAL_DEX_PREOPT</code> 选项,还可以针对个别应用启用或停用预先优化功能。这有助于停用对于可能会立即收到 Google Play 更新的应用的预先优化,因为更新会在已过时的系统映像中执行预先优化的代码。此外,这还有助于在进行主要版本升级 OTA 时节省空间,因为用户的数据分区中可能已经有了较新版本的应用。</p>
+<p>通过在模块定义中指定 <code>LOCAL_DEX_PREOPT</code> 选项,还可以针对个别应用启用或停用预先优化功能。这有助于避免对那些可能会立即收到 Google Play 更新的应用进行预先优化,因为更新之后,对系统映像中的代码所做的预先���化都成了无用功。此外,这还有助于在进行重大版本 OTA 升级时节省空间,因为用户的数据分区中可能已经有了更高版本的应用。</p>
 
-<p><code>LOCAL_DEX_PREOPT</code> 支持分别通过值“true”和“false”来启用和停用预先优化功能。此外,如果预先优化不应将 <code>classes.dex</code> 文件从 APK 或 JAR 文件中剥离出来,则可以指定“nostripping”。通常情况下,该文件会被剥离出来,因为预先优化之后将不再需要该文件;但若要使第三方 APK 签名仍保持有效,最后的这个选项则是必需的。</p>
+<p><code>LOCAL_DEX_PREOPT</code> 支持分别使用值“true”和“false”来启用和停用预先优化功能。此外,如果在预先优化过程中不应将 <code>classes.dex</code> 文件从 APK 或 JAR 文件中剥离出来,则可以指定“nostripping”。通常情况下,该文件会被剥离出来,因为在进行预先优化之后将不再需要该文件;但若要使第三方 APK 签名仍��持有效,则必须使用最后这个选项。</p>
 
 <li><code>PRODUCT_DEX_PREOPT_BOOT_FLAGS</code></li>
 <p>
@@ -102,12 +102,12 @@
 
 <li><code>PRODUCT_DEX_PREOPT_MODULE_CONFIGS</code></li>
 <p>
-用于为特定模块和产品配置传递 <code>dex2oat</code> 选项。可以通过 <code>$(call add-product-dex-preopt-module-config,&lt;modules&gt;,&lt;option&gt;)</code> 在产品的 <code>device.mk</code> 文件中设置该选项,其中 <code>&lt;modules&gt;</code> 是一个列表,用于列出 JAR 和 APK 文件各自的 LOCAL_MODULE 和 LOCAL_PACKAGE 名称。
+用于为特定模块和产品配置传递 <code>dex2oat</code> 选项。可以在产品的 <code>device.mk</code> 文件中通过 <code>$(call add-product-dex-preopt-module-config,&lt;modules&gt;,&lt;option&gt;)</code> 设置该选项,其中 <code>&lt;modules&gt;</code> 是一个列表��用于列出 JAR 和 APK 文件各自的 LOCAL_MODULE 和 LOCAL_PACKAGE 名称。
 </p>
 
 <li><code>PRODUCT_DEXPREOPT_SPEED_APPS (New in Android O)</code></li>
 <p>
-应用列表,用于列出哪些应用已被确定为产品的核心应用并且最好是使用 speed 编译过滤器进行编译。<em></em>例如,常驻应用(如 SystemUI)只有在下次系统重新启动时才有机会使用配置文件引导型编译,因此对于产品来说,让这些应用始终采用 AOT 编译可能会更好。
+一个应用列表,用于列出哪些应用已被确定为产品的核心应用并且应使用 speed 编译过滤器对其进行编译。<em></em>例如,常驻应用(如 SystemUI)只有在下次系统重新启动时才有机会使用配置文件引导型编译,因此对于产品来说,让这些应用始终采用 AOT 编译可能会更好。
 </p>
 
 <li><code>PRODUCT_SYSTEM_SERVER_APPS (New in Android O)</code></li>
@@ -120,23 +120,28 @@
 是否在设备上包含 ART 的调试版本。默认情况下,系统会针对 userdebug 和 eng 细分版本启用该选项。可以通过将该选项明确设为“true”或“false”来覆盖此行为。<em></em><em></em>
 </p>
 <p>
-默认情况下,设备将使用非调试版本 (<em>libart.so</em>)。要进行切换,请将系统属性 <code>persist.sys.dalvik.vm.lib.2</code> 设为 <em>libartd.so</em>。
+默认情况下,设备将使用非调试版本 (<em>libart.so</em>)。要进行切换,请将系统属性 <code>persist.sys.dalvik.vm.lib.2</code> 设为 libartd.so。<em></em>
 </p>
 
 <li><code>WITH_DEXPREOPT_PIC (Removed in Android O)</code></li>
 
-<p>在 Android 5.1.0 到 Android 6.0.1 的所有版本中,都可以指定 <code>WITH_DEXPREOPT_PIC</code> 来启用位置无关代码 (PIC)。这样一来,就不必将来自映像的编译代码从 /system 迁移到 /data/dalvik-cache,因此可以节省数据分区中的空间。不过,因为该选项会停用利用位置相关代码进行的优化,所以会对运行时产生轻微的影响。通常情况下,需要节省 /data 空间的设备应启用 PIC 编译。</p>
+<p>从 Android 5.1.0 到 Android 6.0.1 的所有版本中,都可以指定 <code>WITH_DEXPREOPT_PIC</code> 来启用位置无关代码 (PIC)。这样一来,就不必将来自映像的编译代码从 /system 迁移到 /data/dalvik-cache,因此可以节省数据分区中的空间。不过,因为该选项会停用根据位置相关代码进行的优化,所以会对运行时产生轻微的影响。通常情况下,需要节省 /data 空间的设备应启用 PIC 编译。</p>
 
 <p>在 Android 7.0 中,PIC 编译默认处于启用状态。</p>
 
+<li><code>WITH_DEXPREOPT_BOOT_IMG_ONLY</code>(已在 Android O MR1 中移除)</li>
+<p>
+此选项已被 WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY 取代,后者还��预先优化系统服务器 JAR。
+</p>
+
 </ul>
 
-<h4 id="boot_classpath">启动相关的类路径配置</h4>
+<h4 id="boot_classpath">启动类路径配置</h4>
 
 <ul>
 <li>预加载类列表</li>
 
-<p>预加载类列表是 zygote 将在启动时初始化的一个类列表。通过该列表,每个应用无需单独运行这些类初始化程序,从而可以更快地启动并共享内存中的页面。预加载类列表文件默认位于 frameworks/base/preloaded-classes 中,其中包含一个针对典型的手机用途微调的列表。这可能不适用于其他设备(如穿戴式设备),而应进行相应的微调。做微调时应格外小心,因为添加太多的类会造成加载不使用的类而浪费内存;而添加的类太少又会导致每个应用都必须拥有自己的副本,同样会造成内存浪费。</p>
+<p>预加载类列表列出�� zygote 将在启动时初始化的类。利用该列表,每个应用无需单独运行这些类初始化程序,从而可以更快地启动并共享内存中的页面。预加载类列表文件默认位于 frameworks/base/preloaded-classes 中,其中包含一个针对典型手机使用场景优化的列表。其他设备(如穿戴式设备)可能不适合使用此列表,而应进行相应调整。做调整时应格外小心,因为添加太多的类会造成加载未用到的类而浪费内存;而添加的类太少又会导致每个应用都各有一份副本,同样会造成内存浪费。</p>
 
 <p>使用示例(在产品的 device.mk 中):</p>
 
@@ -144,11 +149,11 @@
 PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/preloaded-classes
 </pre>
 
-<p class="note"><strong>注意</strong>:必须将此行放在沿用任何从 <code>build/target/product/base.mk</code> 获得默认值的产品配置 Makefile 之前</p>
+<p class="note"><strong>注��</strong>:如果有任何从 <code>build/target/product/base.mk</code> 提取默认值的产品配置 Makefile,此行必须放在沿用此类 Makefile 的行之前。</p>
 
 <li>映像类列表</li>
 
-<p>映像类列表是 dex2oat 预先初始化并存储在 boot.art 文件中的类列表。通过该列表,zygote 可以在启动时从 boot.art 文件中加载这些结果,而无需在预加载期间自行运行这些类的初始化程序。其中一个重要特点是,从映像加载并在进程之间共享的页面是干净的,因此可在内存不足的情况下轻松将它们交换出去。在 L 版本中,默认情况下,映像类列表和预加载类列表使用同一个列表。从 L 之后的 AOSP 版本开始,可以使用以下命令指定自定义映像类列表:</p>
+<p>映像类列表列出了 dex2oat 预先初始化并存储在 boot.art 文件中的类。利用该列表,zygote 可以在启动时从 boot.art 文件中加载这些结果,而无需在预加载期间自行运行这些类的初始化程序。这种做法的一个重要特点是,从映像加载并在进程之间共享的页面是干净的,因���可在内存不足的情况下轻松将它们交换出去。在 L 版本中,默认情况下,映像类列表和预加载类列表是同一个列表。从 L 之后的 AOSP 版本开始,可使用以下选项指定自定义映像类列表:</p>
 
 <pre class="devsite-click-to-copy">
 PRODUCT_DEX_PREOPT_BOOT_FLAGS
@@ -162,7 +167,7 @@
 
 <li>已编译类列表</li>
 
-<p>在 L 之后的 AOSP 版本中,可以指定使用已编译类的列表,在预先优化期间编译来自启动的类路径的类子集。对于空间非常紧张且无法满足整个预先优化启动映像需求的设备来说,此选项很有帮助。不过,请注意,此列表未指定的类将不会被编译(即使在设备上也不会被编译),且必须对其进行解释,这可能会影响运行时性能。默认情况下,dex2oat 会在 $OUT/system/etc/compiled-classes 中查找已编译类列表,因此,可以通过 device.mk 将自定义类列表复制到该位置。也可以使用以下命令指定特定文件位置:
+<p>在 L 之后的 AOSP 版本中,可使用此列表来指定一个启动类路径的类子集,以便在预先优化期间编译这些类。如果设备存储空间非常紧张,无法完整容纳经过预先优化的启动映像,此选项就很有帮助。不过请注意,此列表未指定的类将不会被编译(即使在设备上也不会被编译),而必须对其进行解译,这可能会影响运行时性能。默认情况下,dex2oat 会在 $OUT/system/etc/compiled-classes 中查找已编译类列表,因此,可以通过 device.mk 将自定义类列表复制到该位置。也可使用以下选项指定文件位置:
 
 </p><pre class="devsite-click-to-copy">
 PRODUCT_DEX_PREOPT_BOOT_FLAGS
@@ -174,7 +179,7 @@
 PRODUCT_COPY_FILES += &lt;filename&gt;:system/etc/compiled-classes
 </pre>
 
-<p class="note"><strong>注意</strong>:必须将此行放在沿用任何从 <code>build/target/product/base.mk</code> 获得默认值的产品配置 Makefile 之前</p>
+<p class="note"><strong>注意</strong>:如果有任何从 <code>build/target/product/base.mk</code> 提取默认值的产品配置 Makefile,此行必须放在沿用此类 Makefile 的行之前。</p>
 </ul>
 
 <h3 id="runtime_configuration">运行时配置</h3>
@@ -185,10 +190,10 @@
 
 <ul>
 <li>dalvik.vm.usejit:是否启用 JIT。</li>
-<li>dalvik.vm.jitinitialsize(默认为 64K):代码缓存初始容量。代码缓存将定期进行垃圾回收 (GC),并将视需要增加。
+<li>dalvik.vm.jitinitialsize(默认为 64K):代码缓存初始容量。代码缓存将定期进行垃圾回收 (GC),并将视需要增加容量。
 </li><li>dalvik.vm.jitmaxsize(默认为 64M):代码缓存最大容量。
-</li><li>dalvik.vm.jitthreshold(默认为 10000):方法的“热度”计数器必须超过该阈值,系统才会对方法进行 JIT 编译。“热度”计数器是运行时的内部指标。它包括调用次数、后向分支及其他因素。
-</li><li>dalvik.vm.usejitprofiles:是否启用 JIT 配置文件;即使 dalvik.vm.usejit 为 false,也可以使用该选项。请注意,如果该选项为 false,编译过滤器 speed-profile 将不会对任何方法进行 AOT 编译,并且相当于 quicken。<em></em><em></em>
+</li><li>dalvik.vm.jitthreshold(默认为 10000):方法的“热度”计数器必须超过该阈值,系统才会对方法进行 JIT 编译。“热度”计数器是运行时的内部指标。它的影响因素包括调用次数、后向分支及其他因素。
+</li><li>dalvik.vm.usejitprofiles:是否启用 JIT 配置文件;即使 dalvik.vm.usejit 为 false,也可以使用该选项。请注意,如果该选项为 false,编译过滤器 speed-profile 将不会对任何方法进行 AOT 编译,效果与 quicken 相同。<em></em><em></em>
 </li><li>dalvik.vm.jitprithreadweight(默认为 dalvik.vm.jitthreshold/20):应用界面线程的 JIT“样本”(请参阅 jitthreshold)的权重。用���加快以下方法的编译速度:当用户与应用交互时,会直接影响用户体验的方法。
 </li><li>dalvik.vm.jittransitionweight(默认为 dalvik.vm.jitthreshold/10):调用时需要在编译代码和解译器之间进行转换的方法的权重。这有助于确保对所涉及的方法进行编译以尽可能减少转换(转换需要很大开销)。
 </li>
@@ -197,7 +202,7 @@
 <h4 id="pkg_mgr_options">软件包管理器选项</h4>
 
 <p>
-从 Android 7.0 开始,提供了一种用于指定在各个阶段发生的编译/验证级别的通用方式。可以通过系统属性配置编译级别,默认级别为:
+从 Android 7.0 开始,系统提供了一种通用方式来指定各个阶段的编译/验证级别。编译级别通过系统属性来配置,默认值如下:
 </p>
 
 <ul>
@@ -210,11 +215,11 @@
 </p>
 <li>pm.dexopt.boot=verify</li>
 <p>
-无线下载更新后使用的编译过滤器。对于该选项,我们<strong>强烈</strong>建议使用 <em>verify</em> 编译过滤器,以免启动时间过长。
+OTA 更新后使用的编译过滤器。对于该选项,我们<strong>强烈</strong>建议使用 verify 编译过滤器,以免启动时间过长。<em></em>
 </p>
 <li>pm.dexopt.first-boot=quicken</li><li>
 <p>
-在设备初次启动时使用的编译过滤器。此时使用的过滤器只会影响出厂后的启动时间。对于这种情况,我们建议使用 quicken 过滤器,以免用户在首次使用手机时需要很长时间等待手机启动。<em></em>请注意,如果 <code>/system</code> 中的所有应用都已使用 quicken 编译过滤器进行编译,或者已使用 speed 或 speed-profile 编译过滤器进行编译,<code>pm.dexopt.first-boot</code> 将不会产生任何影响。<em></em><em></em><em></em>
+在设备初次启动时使用的编译过滤器。此过滤器只会影响出厂后第一次启动的时间。我们建议使用 quicken 过滤器,以免用户在首次使用手机时需要花很长时间等待手机启动。<em></em>请注意,如果 <code>/system</code> 中的所有应用都已使用 quicken 编译过滤器进行编译,或者已使用 speed 或 speed-profile 编译过滤器进行编译,<code>pm.dexopt.first-boot</code> 将不会产生任何影响。<em></em><em></em><em></em>
 </p>
 
 </li></ul>
@@ -243,15 +248,15 @@
 
 <p>Android 7.1 及之后的版本提供了两个选项来控制编译除启动映像之外的所有内容时的内存使用方式:</p>
 <ul>
-  <li>dalvik.vm.dex2oat-very-large:停用 AOT 编译的最小总 dex 文件大小(以字节为单位)</li><li>dalvik.vm.dex2oat-swap:使用 dex2oat 交换文件(用于内存较低的设备)</li></ul>
+  <li>dalvik.vm.dex2oat-very-large:停用 AOT 编译的最小总 dex 文件大小(以字节为单位)</li><li>dalvik.vm.dex2oat-swap:使用 dex2oat 交换文件(用于内存较小的设备)</li></ul>
 
-<p>不应减少用于控制 <code>dex2oat</code> 初始堆大小和最大堆大小的选项,因为它们可以限制可对哪些应用进行编译。</p>
+<p>不应减小用于控制 <code>dex2oat</code> 初始堆大小和最大堆大小的选项数值,因为它们可能会限制可对哪些应用进行编译。</p>
 
-<h2 id="other_odex">A/B 具体配置</h2>
+<h2 id="other_odex">A/B 专有配置</h2>
 
 <h3 id="rom_config">ROM 配置</h3>
 
-<p>从 Android 7.0 开始,设备可以使用两个系统分区来实现 <a href="/devices/tech/ota/ab_updates.html">A/B 系统更新</a>。为了节省系统分区大小,可以将经过预先优化的文件安装在未使用的第二个系统分区中。在系统首次启动时,这些文件会被复制到数据分区。</p>
+<p>从 Android 7.0 开始,设备可以使用两个系统分区来实现 <a href="/devices/tech/ota/ab_updates.html">A/B 系统更新</a>。为了减小系统分区大小,可以将经过预先优化的文件安装在未使用的第二个系统分区中。在系统首次启动时,这些文件会被复制到数据分区。</p>
 
 <p>使用示例(在 <code>device-common.mk</code> 中):</p>
 
@@ -268,7 +273,7 @@
 BOARD_USES_SYSTEM_OTHER_ODEX := true
 </pre>
 
-<p>请注意,启动相关的类路径代码、系统服务器代码以及产品专属的核心应用始终会被编译到系统分区。默认情况下,所有其他应用都会被编译到未使用的第二个系统分区。可以使用 <code>SYSTEM_OTHER_ODEX_FILTER</code> 控制此行为,其值默认为:</p>
+<p>请注意,启动类路径代码、系统服务器代码以及产品专属的核心应用始终会被编译到系统分区中。默认情况下,所有其他应用都会被编译到未使用的第二个系统分区中。可以使用 <code>SYSTEM_OTHER_ODEX_FILTER</code> 控制此行为,其值默认为:</p>
 
 <pre class="devsite-click-to-copy">
 SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
@@ -276,7 +281,7 @@
 
 <h3 id="background_ota">后台 dexopt OTA</h3>
 
-<p>在启用了 A/B 的设备上,可以在后台对应用进行编译,以更新到新的系统映像。如需在系统映像中选择性地包含编译脚本和二进制文件,请参阅<a href="/devices/tech/ota/ab_updates.html#compilation">后台中的应用编译</a>。可以通过以下命令控制用于此编译的编译过滤器:</p>
+<p>在启用了 A/B 的设备上,可以在后台对应用进行��译,以更新到新的系统映像。如需在系统映像中选择性地加入编译脚本和二进制文件,请参阅<a href="/devices/tech/ota/ab_updates.html#compilation">在后台编译应用</a>。可通过以下选项控制用于此类编译的编译过滤器:</p>
 <pre class="devsite-click-to-copy">
 pm.dexopt.ab-ota=speed-profile
 </pre>
diff --git a/zh-cn/devices/tech/dalvik/gc-debug.html b/zh-cn/devices/tech/dalvik/gc-debug.html
index 674c6d0..8d65e6a 100644
--- a/zh-cn/devices/tech/dalvik/gc-debug.html
+++ b/zh-cn/devices/tech/dalvik/gc-debug.html
@@ -36,9 +36,8 @@
 
 <ul>
   <li>与 Dalvik 相比,暂停次数从 2 次减少到 1 次。Dalvik 的第一次暂停��要是为了进行根标记,即在 ART 中进行并发标记,让线程标记自己的根,然后马上恢复运行。
-  </li><li>与 Dalvik 类似,ART GC 在清除过程开始之前也会暂停 1 次。
-两者在这方面的主要差异在于:在此暂停期间,某些 Dalvik 阶段在 ART 中并发进行。这些阶段包括 <code>java.lang.ref.Reference</code> 处理、系统弱清除(例如,jni 弱全局等)、重新标记非线程根和卡片预清理。在 ART 暂停期间仍进行的阶段包括扫描脏卡片以及重新标记线程根,这些操作有助于缩短暂停时间。
-  </li><li>相对于 Dalvik,ART GC 改进的最后一个方面是粘性 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>
@@ -71,7 +70,8 @@
 <p>堆验证可能是调试 GC 相关错误或堆损坏的最有用的 GC 选项。启用堆验证会使 GC 在垃圾回收过程中在几个点检查堆的正确性。堆验证与更改 GC 类型的选项相同。启用堆验证后,堆验证会验证根,并确保可访问对象仅引用其他可访问对象。通过传入以下 -<code>Xgc</code> 值可以启用 GC 验证:</p>
 
 <ul>
-  <li>如果启用 GC 验证,<code>[no]preverify</code> 将在 GC 启动之前执行堆验证。</li><li>如果启用 GC 验证,<code>[no]presweepingverify</code> 将在启动垃圾回收器清除过程之前执行堆验证。
+  <li>如果启用 GC 验证,<code>[no]preverify</code> 将在 GC 启动之前执行堆验证。
+  </li><li>如果启用 GC 验证,<code>[no]presweepingverify</code> 将在启动垃圾回收器清除过程之前执行堆验证。
   </li><li>如果启用 GC 验证,<code>[no]postverify</code> 将在 GC 完成清除后执行堆验证。
   </li><li><code>[no]preverify_rosalloc</code>、<code>[no]postsweepingverify_rosalloc</code> 和 <code>[no]postverify_rosalloc</code> 也是附加 GC 选项,仅验证 RosAlloc 内部计算的状态。验证的主要内容是,魔数值是否与预期常量匹配,以及可用内存块是否已在 <code>free_page_runs_</code> 映射中注册。
 </li></ul>
@@ -208,7 +208,7 @@
 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 <ptr>not contained by any spaces</ptr>”的错误消息。<em></em></p>
+<p>CheckJNI 应捕获错误的一个示例是超出从 <code>GetPrimitiveArrayCritical</code> 获取的数组末端的写入。该操作很可能会破坏 Java 堆。如果写入位于 CheckJNI 红色区域内,则在调用相应 <code>ReleasePrimitiveArrayCritical</code> 时,CheckJNI 将会捕获该问题。否则,写入将最终损坏 Java 堆中的一些随机对象,并可能会导致之后出现 GC 崩溃。<em></em>如果崩溃的内存是引用字段,则 GC 可能会捕获错误并输出“Tried to mark <ptr>not contained by any spaces</ptr>”这一错误消息。</p>
 
 <p>当 GC 尝试标记无法找到空间的对象时,就会发生此错误。在此检查失败后,GC 会遍历根,并尝试查看无效对象是否为根。结果共有两个选项:对象为根或非根。</p>
 
@@ -253,7 +253,7 @@
 
 <h3 id="corrupted_object_example">损坏的对象示例</h3>
 
-<p>如果对象不是根,则会输出类似于以下打印内容的消息:</p>
+<p>如果对象不是根,则会输出类似于以下输出内容的消息:</p>
 
 <pre class="devsite-click-to-copy">
 01-15 12:38:00.196  1217  1238 E art     : Attempting see if it's a bad root
diff --git a/zh-cn/devices/tech/debug/asan.html b/zh-cn/devices/tech/debug/asan.html
index c8fbb8e..666a6ae 100644
--- a/zh-cn/devices/tech/debug/asan.html
+++ b/zh-cn/devices/tech/debug/asan.html
@@ -23,9 +23,13 @@
 <p>AddressSanitizer (ASan) 是一种基于编译器的快速检测工具,用于检测原生代码中的内存错误。它与 Valgrind(Memcheck 工具)相差不大,但 ASan 具备以下独有特性:</p>
 
 <ul>
-  <li>+ 会检测堆栈和全局对象是否有溢出</li><li>- 不检测未初始化的读取和内存泄露</li><li>+ 速度更快(Valgrind 的 20-100x 与其相比,慢 2-3 倍)</li><li>+ 内存占用空间较少</li></ul>
+  <li>+ 会检测堆栈和全局对象是否有溢出
+  </li><li>- 不检测未初始化的读取和内存泄露
+  </li><li>+ 速度更快(与 Valgrind 的 20-100x 倍速设置相差 2-3 倍)
+  </li><li>+ 内存占用空间较少
+</li></ul>
 
-<p>本文档介绍了如何使用 AddressSanitizer 来编译和运行 Android 平台的各组成部分。如果您希望利用 AddressSanitizer 编译独立的(即 SDK/NDK)应用,请改为参阅 <a href="https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid">AddressSanitizerOnAndroid</a> 公共项目网站。</p>
+<p>本文档介绍了如何使用 AddressSanitizer 来编译和运行 Android 平台的各个组成部分。如果您希望利用 AddressSanitizer 编译独立的(即 SDK/NDK)应用,请改为参阅 <a href="https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid">AddressSanitizerOnAndroid</a> 公共项目网站。</p>
 
 <p>AddressSanitizer 包括一个编译器 (<code>external/clang</code>) 和一个运行时库 (<code>external/compiler-rt/lib/asan</code>)。</p>
 
@@ -33,7 +37,7 @@
 
 <h2 id="building_with_clang">使用 Clang 编译</h2>
 
-<p>要编译使用 ASan 进行测试的二进制文件,第一步是要确保您的代码是使用 Clang 进行编译的。默认情况下,系统会在 master 分支上完成这一步骤,因此您无需执行任何操作。如果您认为自己要测试的模块是使用 GCC 编译的,则可以向编译规则中添加 <code>LOCAL_CLANG:=true</code>,从而切换至 Clang。Clang 可以发现 GCC 遗漏的代码错误。</p>
+<p>要编译可通过 ASan 进行测试的二进制文件,第一步是要确保您的代码是使用 Clang 编译的。ASan 的 master 分支会默认执行这一步骤,因此您无需执行任何操作。如果您认为自己要测试的模块是使用 GCC 编译的,则可以向编译规则中添加 <code>LOCAL_CLANG:=true</code>,从而切换至 Clang。Clang 也许可以发现 GCC 遗漏的代码错误。</p>
 
 <h2 id="building_executables_with_addresssanitizer">使用 AddressSanitizer 编译可执行文件</h2>
 
@@ -43,15 +47,15 @@
 LOCAL_SANITIZE:=address
 </pre>
 
-<p>检测到错误时,ASan 会向标准输出文件和 <code>logcat</code> 发送一份详细报告,然后让相应进程崩溃。</p>
+<p>检测到错误时,ASan 会向标准输出和 <code>logcat</code> 发送一份详细报告,然后让相应进程崩溃。</p>
 
 <h2 id="building_shared_libraries_with_addresssanitizer">使用 AddressSanitizer 编译共享库</h2>
 
-<p>根据 ASan 的工作原理,未采用 ASan 编译的可执行文件将无法使用采用 ASan 编译的库。</p>
+<p>根据 ASan 的工作原理,不是通过 ASan 编译的可执行文件将无法使用通过 ASan 编译的库。</p>
 
-<p class="note"><strong>注意</strong>:在运行时,如果 ASan 库加载到错误的进程中,系统将会显示以 <code>_asan</code> 或 <code>_sanitizer</code> 开头的消息,以提示您有无法解决的符号。</p>
+<p class="note"><strong>注意</strong>:在运行时,如果将 ASan 库加载到错误的进程中,系统将会显示以 <code>_asan</code> 或 <code>_sanitizer</code> 开头的消息,���提示您有无法解析的符号。</p>
 
-<p>要清理多个可执行文件(并非所有这些可执行文件都是使用 ASan 编译的)使用的共享库,您需要该库的 2 个副本。为此,建议您针对相应的模块向 <code>Android.mk</code> 中添加以下内容:</p>
+<p>要对多个可执行文件(并非所有这些可执行文件都是使用 ASan 编译的)使用的共享库进行测试,您需要该库的 2 个副本。为此,建议您针对相应的模块向 <code>Android.mk</code> 中添加以下内容:</p>
 
 <pre class="devsite-click-to-copy">
 LOCAL_SANITIZE:=address
@@ -69,7 +73,7 @@
 <p class="warning"><strong>警告</strong>:<code>LOCAL_MODULE_RELATIVE_PATH</code> 设置会将您的库<strong>移至</strong> <code>/system/lib/asan</code>,这意味着,如果从头开始重写并重新编译,将会导致 <code>/system/lib</code> 中缺少该库,并且生成的映像可能会无法启动。这是当前���译系统存在的一个令人遗憾的限制。请不要重写;而是执行 <code>make -j $N</code> 和 <code>adb
 sync</code>。</p>
 
-<p>通过读取 <code>/proc/$PID/maps</code>,验证相应进程使用的是否为来自 <code>/system/lib/asan</code> 的库(如果此库存在)。如果不是,您可能需要停用 SELinux,如下所示:</p>
+<p>通过读取 <code>/proc/$PID/maps</code>,验证相应进程使用的库是否来自 <code>/system/lib/asan</code>(如果此库存在)。如果不是,您可能需要停用 SELinux,如下所示:</p>
 
 <pre class="devsite-click-to-copy">
 <code class="devsite-terminal">adb root</code>
@@ -80,7 +84,7 @@
 
 <h2 id="better_stack_traces">更出色的堆栈跟踪</h2>
 
-<p>AddressSanitizer 使用基于框架指针的快速展开程序 (unwinder),根据程序中的每个内存分配和取消分配事件来记录堆栈跟踪信息。大部分 Android 平台都未使用框架指针进行编译。因此,您通常仅会获得 1 个或 2 个有意义的框架。要解决此问题,请使用 ASan(推荐)或以下方法重新编译库:</p>
+<p>AddressSanitizer 使用基于帧指针的快速展开程序 (unwinder),根据程序中的每个内存分配和取消分配事件来记录堆栈跟踪信息。Android 的大部分组件都未使用帧指针进行编译。因此,您通常仅会获得 1 个或 2 个有意义的帧。要解决此问题,请使用 ASan(推荐)或以下选项重新编译库:</p>
 
 <pre class="devsite-click-to-copy">
 LOCAL_CFLAGS:=-fno-omit-frame-pointer
@@ -99,11 +103,11 @@
 
 <p>由于可以使用主机上的符号化库,因此第二种方法可以提供更多数据(即 file:line 位置)。</p>
 
-<h2 id="addresssanitizer_in_the_apps">应用中的 AddressSanitizer</h2>
+<h2 id="addresssanitizer_in_the_apps">在应用中使用 AddressSanitizer</h2>
 
-<p>AddressSanitizer 无法检查 Java 代码,但可以检测 JNI 库中的错误。因此,您需要使用 ASan 编译可执行文件(在此情况下是 <code>/system/bin/app_process(<em>32|64</em>)</code>)。这将在设备上的所有应用中同时启用 ASan,这会给设备带来一些压力,但 2GB 内存的设备可以从容处理这种情况。</p>
+<p>AddressSanitizer 无法检查 Java 代码,但可以检测 JNI 库中的错误。为此,您需要使用 ASan 编译可执行文件(在此情况下是 <code>/system/bin/app_process(<em>32|64</em>)</code>)。这将在设备上的所有应用中同时启用 ASan,这会给设备带来一些压力,但 2GB 内存的设备可以从容处理这种情况。</p>
 
-<p>向 <code>frameworks/base/cmds/app_process</code> 中的 app_process 编译规则添加常规 <code>LOCAL_SANITIZE:=address</code>。暂时忽略同一个文件中的 <code>app_process__asan</code> 目标(如果在您阅读该文件时这��目标仍存在于其中)。在 <code>system/core/rootdir/init.zygote(<em>32|64</em>).rc</code> 中修改 Zygote 记录,以添加以下行:</p>
+<p>向 <code>frameworks/base/cmds/app_process</code> 中的 app_process 编译规则添加常规的 <code>LOCAL_SANITIZE:=address</code>。暂时忽略同一个文件中的 <code>app_process__asan</code> 目标(如果在您阅读该文件时这个目标仍存在于其中)。在 <code>system/core/rootdir/init.zygote(<em>32|64</em>).rc</code> 中修改 Zygote 记录,以添加以下行:</p>
 
 <pre class="devsite-click-to-copy">
 setenv LD_LIBRARY_PATH /system/lib/asan:/system/lib
@@ -115,9 +119,9 @@
 
 <h2 id="using_the_wrap_property">使用 wrap 属性</h2>
 
-<p>上一部分中的方法将 AddressSanitizer 放置到了系统的每个应用中(实际上是放置到了 Zygote 进程的每个子级元素中)。可以仅运行一个(或几个)具有 ASan 的应��,从而占用部分内存空间,使应用启动速度变慢。</p>
+<p>上一部分中的方法将 AddressSanitizer 放置到了系统的每个应用中(实际上是放置到了 Zygote 进程的每个子项中)。您可以只通过 ASan 运行一个或少数几个应用,从而节省一些内存空间,但是应用启动速度会变慢。</p>
 
-<p>为实现这一目标,您可以借助“wrap”属性(用于在 Valgrind 下运行应用的同一属性)启动应用。下面是在 ASan 下运行 Gmail 应用的示例:</p>
+<p>为实现这一目标,您可以通过“wrap.”属性(与在 Valgrind 下运行应用时所用的属性相同)启动应用。下面是在 ASan 下运行 Gmail 应用的示例:</p>
 
 <pre class="devsite-click-to-copy">
 <code class="devsite-terminal">adb root</code>
@@ -125,7 +129,7 @@
 <code class="devsite-terminal">adb shell setprop wrap.com.google.android.gm "asanwrapper"</code>
 </pre>
 
-<p>在这种情况下,asanwrapper 会将 <code>/system/bin/app_process</code> 重写至 <code>/system/bin/asan/app_process</code>(使用 AddressSanitizer 编译)。此外,它还会在动态库搜索路径的开头处添加 <code>/system/lib/asan</code>。这样一来,借助 asanwrapper 运行应用时,与 <code>/system/lib</code> 中的普通库相比,系统更倾向于使用 <code>/system/lib/asan</code> 中用 ASan 进行测试的库。</p>
+<p>在此情况下,asanwrapper 会将 <code>/system/bin/app_process</code> 重写至(使用 AddressSanitizer 编译的)<code>/system/bin/asan/app_process</code>。此外,它还会在动态库搜索路径的开头处添加 <code>/system/lib/asan</code>。这样一来,通过 asanwrapper 运行应用时,系统会优先使用 <code>/system/lib/asan</code> 中可通过 ASan 进行测试的库,而非 <code>/system/lib</code> 中的普通库。</p>
 
 <p>同样,如果发现错误,应用会崩溃,且系统会将报告记录到日志中。</p>
 
@@ -148,9 +152,9 @@
 
 <p>写入时,现今的 Nexus 和 Pixel 设备会启动到该模式中的界面。</p>
 
-<p>其工作原理是编译两组共享库:<code>/system/lib</code> 中的常规库(第一次 make 调用),<code>/data/asan/lib</code> 中使用 ASan 进行测试的库(第二次 make 调用)。第二次编译出的可执行文件会覆盖第一次编译出的可执行文件。通过使用 PT_INTERP 中的“/system/bin/linker_asan”,使用 ASan 进行测试的可执行文件会获得一个不同的库搜索路径,该路径会在 <code>/system/lib</code> 前添加 <code>/data/asan/lib</code>。</p>
+<p>其工作原理是编译两组共享库:<code>/system/lib</code> 中的常规库(第一次 make 调用),<code>/data/asan/lib</code> 中可通过 ASan 进行测试的库(第二次 make 调用)。第二次编译出的可执行文件会覆盖第一次编译出的可执行文件。通过使用 PT_INTERP 中的“/system/bin/linker_asan”,可通过 ASan 进行测试的可执行文件会获得一个不同的库搜索路径(在该路径中,<code>/system/lib</code> 前面添加了 <code>/data/asan/lib</code>)。</p>
 
-<p>如果 <code>$SANITIZE_TARGET</code> 值已更改,则编译系统会重写中间对象目录。这样一来,系统便会强制重新编译所有目标,同时保留 <code>/system/lib</code> 下已安装的二进制文件。</p>
+<p><code>$SANITIZE_TARGET</code> 的值变更时,编译系统会重写中间对象目录。这样一来,系统便会强制重新编译所有目标,同时保留 <code>/system/lib</code> 下已安装的二进制文件。</p>
 
 <p>以下目标不能使用 ASan 进行编译:</p>
 
@@ -159,14 +163,14 @@
   </li><li><code>LOCAL_CLANG:=false</code> 目标</li><li>不会针对 <code>SANITIZE_TARGET=address</code> 进行 ASan 操作的 <code>LOCAL_SANITIZE:=false</code>
 </li></ul>
 
-<p>在 SANITIZE_TARGET 编译中,系统会跳过此类可执行文件,且会将第一次 make 调用中的版本留在 <code>/system/bin</code> 中。</p>
+<p>在 SANITIZE_TARGET 编译中,系统会跳过此类可执行文件,且会将第一次 make 调用中编译的版本留在 <code>/system/bin</code> 中。</p>
 
-<p>此类库只是未使用 ASan 进行编译,但它们仍然可以包含一些来自自己依赖的静态库的 ASan 代码。</p>
+<p>此类库只是未使用 ASan 进行编译,但它们仍然可包含来自其依赖的静态库的 ASan 代码。</p>
 
 <h2 id="supporting_documentation">支持文档</h2>
 
 <p><a href="https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid">AddressSanitizerOnAndroid</a> 公共项目网站</p>
 <p><a href="https://www.chromium.org/developers/testing/addresssanitizer">AddressSanitizer 和 Chromium</a></p>
-<p><a href="https://github.com/google/sanitizers">其他 Google 清理程序</a></p>
+<p><a href="https://github.com/google/sanitizers">其他 Google 排错程序</a></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 c315317..be66afc 100644
--- a/zh-cn/devices/tech/debug/index.html
+++ b/zh-cn/devices/tech/debug/index.html
@@ -24,15 +24,19 @@
 
 <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"><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>
+<p>本页面介绍了与崩溃转储有关的基本信息(可以在 logcat 输出中找到)。
+其他页面更详细地介绍了如何<a href="/devices/tech/debug/native-crash.html">诊断原生代码崩溃问题</a>,通过 <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>
+<h2 id="debuggerd">崩溃转储</h2>
 
-<p><code>debuggerd</code> 进程会转储寄存器并展开堆栈。当动态链接的可执行文件启动时,系统会注册多个信号处理程序,这些处理程序会在 SIGSEGV 或 SIGABRT 等信号发送至相应进程时连接到 <code>debuggerd</code>(或 <code>debuggerd64)</code>)。</p>
+<p>当动态链接的可执行文件启动时,系统会注册多个信号处理程序,这些处理程序会在出现崩溃时将基本崩溃转储写入 logcat,并将更详细的“tombstone”文件写入 <code>/data/tombstones/</code>。
+tombstone 是一个包含与崩溃进程相关的额外数据的文件。需要特别指出的是,它包含对以下内容进行的堆栈跟踪:崩溃��程中的所有线程(而不只是捕捉到信号的线程)、完整的内存映射,以及所有打开的文件描述符的列表。</p>
 
-<p><code>debuggerd</code> 仅在未连接任何其他内容时才可连接。这意味着,在使用 <code>strace</code> 或 <code>gdb</code> 等工具时,将无法使用 <code>debuggerd</code>。此外,您还可以通过调用 <code>prctl(PR_SET_DUMPABLE, 0)</code> 明确阻止 <code>debuggerd</code> 进行连接,这一点在您需要选择停用崩溃报告时非常有用。</p>
+在 Android 8.0 之前,崩溃由 <code>debuggerd</code> 和 <code>debuggerd64</code> 守护进程处理。在 Android O 和更高版本中,<code>crash_dump32</code> 和 <code>crash_dump64</code> 是根据需要生成的。<p></p>
 
-<p><code>debuggerd</code> 输出示例(已去除时间戳和无关信息):</p>
+<p>崩溃转储程序仅在未连接任何其他内容时才可连接。这意味着,在使用 <code>strace</code> 或 <code>gdb</code> 等工具时,将无法进行崩溃转储。</p>
+
+<p>输出示例(已去除时间戳和无关信息):</p>
 
 <pre class="devsite-click-to-copy">
 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
@@ -57,17 +61,17 @@
 Tombstone written to: /data/tombstones/tombstone_06
 </pre>
 
-<p><code>debuggerd</code> 输出的最后一行会向日志转储一个摘要,并向磁盘写入完整的 tombstone。<em></em>tombstone 仅仅是一个包含与崩溃进程相关的额外数据的文件;文件中的信息在调试崩溃时会非常有用,尤其是对崩溃进程中的所有线程(而不只是捕捉到信号的线程)和完整内存映射进行堆栈跟踪时。</p>
+<p>输出的最后一行提供了完整 tombstone 在磁盘上的位置。<em></em></p>
 
-<p>假设可以找到未剥离的二进制文件,您可以将上述示例粘贴到 <code>development/scripts/stack</code>,从而获取更详细的展开信息(包含行数信息):</p>
+<p>假设您有可用的未剥离二进制文件,则可以将堆栈粘贴到 <code>development/scripts/stack</code> 中,从而获取更详细的展开信息(包含行号信息):</p>
 
-<p class="key-point"><strong>提示</strong>:为方便起见,如果您已启动 <code>stack</code>,它将在您的 $PATH 上显示,因此您无需提供完整路径。</p>
+<p class="key-point"><strong>提示</strong>:为方便起见,如果您已运行 <code>lunch</code>,<code>stack</code> 将自动包含在您的 $PATH 中,因此您无需提供完整路径。</p>
 
 <pre class="devsite-terminal devsite-click-to-copy">
 development/tools/stack
 </pre>
 
-<p>输出示例:</p>
+<p>输出示例(基于上述 logcat 输出):</p>
 <pre class="devsite-click-to-copy">
 Reading native crash info from stdin
 03-02 23:53:49.477 17951 17951 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
@@ -112,7 +116,7 @@
   0001a7e5  __start_thread+34          bionic/libc/bionic/clone.cpp:46 (discriminator 1)
 </pre>
 
-<p class="note"><strong>注意</strong>:某些系统库是使用 <code>LOCAL_STRIP_MODULE := keep_symbols</code> 编译的,可直接从 <code>debuggerd</code> 提供可用的回溯,而不会像未剥离版本那样占用较大的空间。</p>
+<p class="note"><strong>注意</strong>:某些系统库是使用 <code>LOCAL_STRIP_MODULE := keep_symbols</code> 编译的,可直接提供可用的回溯,而不会像未剥离版本那样占用较大的空间。</p>
 
 <p>您也可以 <code>stack</code> 整个 tombstone。示例:</p>
 <pre class="devsite-terminal devsite-click-to-copy">
@@ -123,6 +127,7 @@
 
 <h2 id="tombstone">从正在运行的进程获取堆栈跟踪/tombstone</h2>
 
-<p>您也可以对正在运行的进程使用 <code>debuggerd</code>。在命令行中,使用进程 ID (PID) 调用 <code>debuggerd</code>,以将完整的 tombstone 转储至 <code>stdout</code>。要确切获取进程中每个线程的堆栈,请添加 <code>-b</code> 或 <code>--backtrace</code> 标记。</p>
+<p>您也可以使用 <code>debuggerd</code> 工具从正在运行的进程获取堆栈转储。
+在命令行中,使用进程 ID (PID) 调用 <code>debuggerd</code>,以将完整的 tombstone 转储至 <code>stdout</code>。要确切获取进程中每个线程的堆栈,请添加 <code>-b</code> 或 <code>--backtrace</code> 标记。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/debug/sanitizers.html b/zh-cn/devices/tech/debug/sanitizers.html
index 0747ebd..f1bb727 100644
--- a/zh-cn/devices/tech/debug/sanitizers.html
+++ b/zh-cn/devices/tech/debug/sanitizers.html
@@ -37,7 +37,7 @@
   <li>释放后再使用</li>
 </ul>
 <p>
-Android 允许在完整编译级别和在<a href="/devices/tech/debug/asan#addresssanitizer_in_the_apps">应用级别</a>(通过 asanwrapper)进行 <a href="/devices/tech/debug/asan">ASan 插桩</a>。
+Android 允许在完整编译级别��在<a href="/devices/tech/debug/asan#addresssanitizer_in_the_apps">应用级别</a>通过 asanwrapper 进行 <a href="/devices/tech/debug/asan">ASan 插桩</a>。
 </p>
 <p>
 AddressSanitizer 对所有与内存相关的函数调用(包括 alloca、malloc 和 free)进行插桩,并使用被读取或写入时会触发 ASan 回调的内存填充所有变量和已分配的内存区域。
@@ -93,7 +93,6 @@
 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
@@ -117,7 +116,6 @@
     srcs: ["sanitizer-status.c"],
 
     name: "sanitizer-status",
-    tags: ["debug"],
 
     sanitize: {
         misc_undefined: [
diff --git a/zh-cn/devices/tech/display/circular-icons.html b/zh-cn/devices/tech/display/circular-icons.html
index 35da2ab..8557fed 100644
--- a/zh-cn/devices/tech/display/circular-icons.html
+++ b/zh-cn/devices/tech/display/circular-icons.html
@@ -20,10 +20,9 @@
       limitations under the License.
   -->
 
-<p>Android 7.1.1 及更高版本支持使用圆形<a href="https://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html">启动器图标</a>。默认情况下,系统不会启用圆形启动器图标。要在设备实现中使用圆形图标,您必须修改设备上的<a href="/source/add-device.html#use-resource-overlays">资源覆盖层</a>才能予以启用。</p>
+<p>Android 7.1.1 及更高版本支持使用圆形<a href="https://developer.android.com/guide/practices/ui_guidelines/icon_design_launcher.html">启动器图标</a>。默认情况下,系统不会启用圆形启动器图标。要在设备实现中使用圆形图标,您必须修改设备上的<a href="/setup/add-device.html#use-resource-overlays">资源覆盖层</a>才能予以启用。</p>
 
-<p>您使用了叠加层的资源文件位于以下位置:
-<code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">frameworks/base/core/res/res/values/config.xml</a></code>
+<p>您使用了叠加层的资源文件位于以下位置:<code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/core/res/res/values/config.xml">frameworks/base/core/res/res/values/config.xml</a></code>
 
 </p><p>要启用圆形图标,请将叠加层文件中的 <code>config_useRoundIcon</code> 设置从 <code>false</code> 更改为 <code>true</code>:</p>
 
diff --git a/zh-cn/devices/tech/display/widgets-shortcuts.html b/zh-cn/devices/tech/display/widgets-shortcuts.html
index e0567a5..7acf600 100644
--- a/zh-cn/devices/tech/display/widgets-shortcuts.html
+++ b/zh-cn/devices/tech/display/widgets-shortcuts.html
@@ -32,7 +32,7 @@
 有关于各种系统类的文档可供参考。参考资料包括:
     </p>
     <ul>
-      <li><b><a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html">ShortuctManager.java</a></b><br />
+      <li><b><a href="https://developer.android.com/reference/android/content/pm/ShortcutManager.html">ShortcutManager.java</a></b><br />
 在标题中发布已固定的快捷方式部分。
       </li><li><b>Intent.java</b><br />关于 ACTION_CREATE_SHORTCUT 的 Javadoc。</li>
       <li><b>AppWidgetManager.java</b><br />关于 requestPinAppWidget 的 Javadoc。</li>
@@ -68,7 +68,7 @@
     </li></ul>
     <h2 id="validation">验证</h2>
     <p>
-要验证该功能,请尝试从 Chrome 或通讯录应用添加快捷方式,并验证系统是否会显示正确的确认提示。在用户接受提示后,图标应添加到主屏幕上,并且 Chrome 应显示一个提示添加成功的消息框。
+要验证该功能,请尝试从 Chrome 或通讯录应用添加快捷方式,并验证系统是否会显示正确的确认提示。在接受之后,图标应已添加到主屏幕上,并且 Chrome 应显示一个提示添加成功的消息框。
     </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/ab/ab_implement.html b/zh-cn/devices/tech/ota/ab/ab_implement.html
new file mode 100644
index 0000000..01af8cc
--- /dev/null
+++ b/zh-cn/devices/tech/ota/ab/ab_implement.html
@@ -0,0 +1,236 @@
+<html devsite><head>
+    <title>实现 A/B 更新</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+<p>想要实现 A/B 系统更新的原始设备制造商 (OEM) 和 SoC 供应商必须确保其引导加载程序实现 boot_control HAL,并将<a href="#kernel">正确的参数</a>传递到内核。</p>
+
+<h2 id="bootcontrol">实现启动控件 HAL</h2>
+<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>
+<img src="/devices/tech/ota/images/ab-updates-state-machine.png"/>
+<figcaption><strong>图 1.</strong> 引导加载程序状态机</figcaption>
+
+<h2 id="kernel">设置内核</h2>
+<p>要实现 A/B 系统更新,请执行以下操作:</p>
+<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>
+ </ul>
+</li>
+<li>确���内核命令行参数包含中以下额外参数:
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">skip_initramfs rootwait ro init=/init root="/dev/dm-0 dm=system none ro,0 1 android-verity &lt;public-key-id&gt; &lt;path-to-system-partition&gt;"</code></pre>
+其中 <code>&lt;public-key-id&gt;</code> 值是用于验证 verity 表签名的公钥 ID(有关详情,请参阅 <a href="/security/verifiedboot/dm-verity.html">dm-verity</a>)。</li>
+<li>将包含公钥的 .X509 证书添加到系统密钥环:
+ <ol>
+ <li>将设置为 <code>.der</code> 格式的 .X509 证书复制到 <code>kernel</code> 的根目录。如果 .X509 证书的格式为 <code>.pem</code> 文件,请使用以下 <code>openssl</code> 命令将证书格式从 <code>.pem</code> 转换为 <code>.der</code>:
+ <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>):
+<pre class="devsite-click-to-copy">
+angler:/# cat /proc/keys
+
+1c8a217e I------     1 perm 1f010000     0     0 asymmetri
+Android: 7e4333f9bba00adfe0ede979e28ed1920492b40f: X509.RSA 0492b40f []
+2d454e3e I------     1 perm 1f030000     0     0 keyring
+.system_keyring: 1/4</pre>
+如果 .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>
+
+<p>支持 A/B 更新的引导加载程序必须满足以下编译变量条件:</p>
+
+<table>
+<tbody><tr>
+<th>必须针对 A/B 更新目标定义的变量</th>
+<td>
+<ul>
+<li><code>AB_OTA_UPDATER := true</code></li>
+<li><code>AB_OTA_PARTITIONS := \</code><br />
+<code>  boot \</code><br />
+<code>  system \</code><br />
+<code>  vendor</code><br />
+以及通过 <code>update_engine</code> 更新的其他分区(无线装置、引导加载程序等)。</li>
+<li><code>BOARD_BUILD_SYSTEM_ROOT_IMAGE := true</code></li>
+<li><code>TARGET_NO_RECOVERY := true</code></li>
+<li><code>BOARD_USES_RECOVERY_AS_BOOT := true</code></li>
+<li><code>PRODUCT_PACKAGES += \</code><br />
+<code>  update_engine \</code><br />
+<code>  update_verifier</code></li>
+</ul>
+
+要查看示例,请参阅 <code><a href="https://android.googlesource.com/device/google/marlin/+/android-7.1.0_r1/device-common.mk" class="external">/device/google/marlin/+/android-7.1.0_r1/device-common.mk</a></code>。
+您可以选择执行<a href="#compilation">编译</a>中所述的安装后(但在重新启动前)dex2oat 步骤。
+</td>
+</tr>
+<tr><th>无法针对 A/B 目标定义的变量</th>
+<td>
+<ul>
+<li><code>BOARD_RECOVERYIMAGE_PARTITION_SIZE</code></li>
+<li><code>BOARD_CACHEIMAGE_PARTITION_SIZE</code></li>
+<li><code>BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE</code></li>
+</ul>
+</td>
+</tr>
+<tr>
+<th>(可选)针对调试版本定义的变量</th>
+<td><code>PRODUCT_PACKAGES_DEBUG += update_engine_client</code></td>
+</tr>
+<tr>
+</tr></tbody></table>
+
+<h2 id="partitions">设置分区(插槽)</h2>
+<p>A/B 设备不需要恢复分区或缓存分区,因为 Android 已不再使用这些分区。数据分区现在用于存储下载的 OTA 软件包,而恢复映像代码位于启动分区。
+A/B 化的所有分区都应按以下方法命名(插槽始终被命名为 <code>a</code>、<code>b</code> 等):<code>boot_a</code>、<code>boot_b</code>、<code>system_a</code>、<code>system_b</code>、<code>vendor_a</code>、<code>vendor_b</code>。</p>
+
+<h3 id="cache">缓存</h3>
+
+<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>
+
+<h3 id="fstab">Fstab</h3>
+
+<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
+wait,verify=&lt;path-to-block-device&gt;/metadata,slotselect
+</pre>
+
+<p>不得将任何分区命名为 <code>vendor</code>,而应选择 <code>vendor_a</code> 或 <code>vendor_b</code> 分区并将其装载到 <code>/vendor</code> 装载点上。</p>
+
+<h3 id="kernel-slot-arguments">内核插槽参数</h3>
+
+<p>应通过特定的设备树 (DT) 节点 (<code>/firmware/android/slot_suffix</code>) 或 <code>androidboot.slot_suffix</code> 命令行参数传递当前插槽后缀。</p>
+
+<p>默认情况下,fastboot 只会闪�� A/B 设备上的插槽 <code>a</code>,并将当前插槽设置为 <code>a</code>。如果更新软件包还包含插槽 <code>b</code> 的映像,则 fastboot 也会闪存这些映像。可用选项包括:</p>
+
+<ul>
+<li><code>--slot</code>。提示 fastboot 使用插槽 <code>b</code>,而非插槽 <code>a</code>。</li>
+<li><code>--set-active</code>。将插槽设置为活动插槽。</li>
+<li><code>fastboot --help</code>。获取有关命令的详细信息。</li>
+</ul>
+
+<p>如果引导加载程序实现 fastboot,则应该支持命令 <code>set_active &lt;slot&gt;</code>,该命令将当前活动插槽设置为指定插槽(此外,还必须清除该插槽的不可启动标记,并将重试计数重置为默认值)。引导加载程序还应支持以下变量:</p>
+
+<ul>
+<li><code>has-slot:&lt;partition-base-name-without-suffix&gt;</code>。如果指定分区支持插槽,则返回“yes”,否则返回“no”。</li>
+<li><code>current-slot</code>。返回接下来将从中启动的插槽后缀。</li>
+<li><code>slot-count</code>。返回一个表示可用插槽数量的整数。目前支持两个插槽,因此该值为 <code>2</code>。</li>
+<li><code>slot-successful:&lt;slot-suffix&gt;</code>。如果指定插槽已标记为成功启动,则返回“yes”,否则返回“no”。</li>
+<li><code>slot-unbootable:&lt;slot-suffix&gt;</code>。如果指定插槽已标记为不可引导,则返回“yes”,否则返回“no”。</li>
+<li><code>slot-retry-count<slot suffix></slot></code>。启动指定插槽的剩余重试次数。</li>
+</ul>
+
+<p>要查看所有变量,请运行 <code class="devsite-terminal devsite-click-to-copy">fastboot getvar all</code>。
+</p>
+
+<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>例如:</p>
+<ul>
+<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">
+./build/tools/releasetools/ota_from_target_files \
+  -i PREVIOUS-tardis-target_files.zip \
+  dist_output/tardis-target_files.zip incremental_ota_update.zip
+</pre>
+</li>
+</ul>
+
+<h2 id="configuration">配置分区</h2>
+
+<p><code>update_engine</code> 可以更新同一磁盘中定义的任何一对 A/B 分区。一对分区共用一个前缀(例如 <code>system</code> 或 <code>boot</code>),每个插槽设置一个后缀(例如 <code>_a</code>)。有效负载生成器为其定义更新的分区列表由 <code>AB_OTA_PARTITIONS</code> make 变量配置。</p>
+
+<p>例如,如果磁盘中有一对分区 <code>bootloader_a</code> 和 <code>booloader_b</code>(<code>_a</code> 和 <code>_b</code> 为插槽后缀),则您可以通过在产品或单板配置中指定以下变量来更新这些分区:</p>
+
+<pre class="devsite-click-to-copy">
+AB_OTA_PARTITIONS := \
+  boot \
+  system \
+  bootloader
+</pre>
+
+<p>由 <code>update_engine</code> 更新的所有分区不得由系统的其余部分修改。在增量更新期间,来自当前插槽的二进制数据将用于在新插槽中生成数据。<em></em>任何修改都可能导致新插槽数据在更新过程中无法通过验证,从而导致更新失败。</p>
+
+<h2 id="post-install">配置安装后步骤</h2>
+
+<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>
+
+<pre class="devsite-click-to-copy">
+AB_OTA_POSTINSTALL_CONFIG += \
+  RUN_POSTINSTALL_system=true \
+  POSTINSTALL_PATH_system=usr/bin/postinst \
+  FILESYSTEM_TYPE_system=ext4
+</pre>
+
+<h2 id="compilation">编译</h2>
+<p>出于安全考虑,<code>system_server</code> 无法使用<a href="/devices/tech/dalvik/jit-compiler">即时 (JIT)</a> 编译。
+这意味着,您必须至少为 <code>system_server</code> 及其依赖项提前编译 odex 文件;其他内容则可以先不编译。</p>
+
+<p>要在后台编译应用,您必须将以下内容添加到产品的设备配置(位于产品的 device.mk 中):</p>
+
+<ol>
+<li>向版本中添加原生组件,以确保编译脚本和二进制文件能够编译并添加到系统映像中。
+<pre class="devsite-click-to-copy">
+  # A/B OTA dexopt package
+  PRODUCT_PACKAGES += otapreopt_script
+</pre></li>
+<li>将编译脚本与 <code>update_engine</code> 相关联,以便后者可以作为安装后步骤运行。
+<pre class="devsite-click-to-copy">
+  # A/B OTA dexopt update_engine hookup
+  AB_OTA_POSTINSTALL_CONFIG += \
+    RUN_POSTINSTALL_system=true \
+    POSTINSTALL_PATH_system=system/bin/otapreopt_script \
+    FILESYSTEM_TYPE_system=ext4 \
+    POSTINSTALL_OPTIONAL_system=true
+</pre>
+</li>
+</ol>
+
+<p>要获取有关将预选文件安装到未使用的第二个系统分区的帮助,请参阅 <a href="/devices/tech/dalvik/configure.html#other_odex">DEX_PREOPT 文件的首次启动安装</a>。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/ab/index.html b/zh-cn/devices/tech/ota/ab/index.html
new file mode 100644
index 0000000..018530d
--- /dev/null
+++ b/zh-cn/devices/tech/ota/ab/index.html
@@ -0,0 +1,586 @@
+<html devsite><head>
+    <title>A/B(无缝)系统更新</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>A/B 系统更新(也称为无缝更新)的目标是确保在<a href="/devices/tech/ota/index.html">无线下载 (OTA) 更新</a>期间在磁盘上保留一个可正常启动和使用的系统。采用这种方式可以降低更新之后设备无法启动的可能性,这意味着用户需要将设备送到维修和保修中心进行更换和刷机的情况将会减少。其他某些商业级操作系统(例如 <a href="https://www.chromium.org/chromium-os">ChromeOS</a>)也成功运用了 A/B 更新机制。
+    </p>
+
+    <p>A/B 系统更新可带来以下好处:</p>
+
+    <ul>
+      <li>
+OTA 更新可以在系统运行期间进行,而不会打断用户。用户可以在 OTA 期间继续使用其设备。在更新期间,唯一的一次宕机发生在设备重新启动到更新后的磁盘���区时。
+      </li>
+      <li>
+更新后,重新启动所用的时间不会超过常规重新启动所用的时间。
+      </li>
+      <li>
+如果 OTA 无法应用(例如,因为刷机失败),用户将不会受到影响。用户将继续运行旧的操作系统,并且客户端可以重新尝试进行更新。
+      </li>
+      <li>
+如果 OTA 更新已应用但无法启动,设备将重新启动回旧分区,并且仍然可以使用。客户端可以重新尝试进行更新。
+      </li>
+      <li>
+任何错误(例如 I/O 错误)都只会影响<strong>未使用</strong>的分区组,并且用户可以进行重试。由于 I/O 负载被特意控制在较低水平,以免影响用户体验,因此发生此类错误的可能性也会降低。
+      </li>
+      <li>
+更新包可以流式传输到 A/B 设备,因此在安装之前不需要先下载更新包。流式更新意味着用户没有必要在 <code>/data</code> 或 <code>/cache</code> 上留出足够的可用空间来存储更新包。
+      </li>
+      <li>
+缓存分区不再用于存储 OTA 更新包,因此无需确保缓存分区的大小要足以应对日后的更新。
+      </li>
+      <li>
+        <a href="/security/verifiedboot/dm-verity.html">dm-verity</a> 可保证设备将使用未损坏的启动映像。如果设备因 OTA 错误或 dm-verity 问题而无法启动,则可以重新启动到旧映像。(Android <a href="/security/verifiedboot/">验证启动</a>不需要 A/B 更新。)
+      </li>
+    </ul>
+
+    <h2 id="overview">关于 A/B 系统更新</h2>
+
+      <p>
+进行 A/B 更新时,客户端和系统都需要进行更改。不过,OTA 更新包服务器应该不需要进行更改:更新包仍通过 HTTPS 提供。对于使用 Google OTA 基础架构的设备,系统更改全部是在 AOSP 中进行,并且客户端代码由 Google Play 服务提供。不使用 Google OTA 基础架构的原始设备制造商 (OEM) 将能够重复使用 AOSP 系统代码,但需要自行提供客户端。
+      </p>
+
+      <p>
+如果 OEM 自行提供客户端,客户端需要:
+      </p>
+
+      <ul>
+        <li>
+确定何时进行更新。由于 A/B 更新是在后台进行,因此不再需要由用户启动。为了避免干扰用户,建议将更新安排在设备处于闲时维护模式(如夜间)并已连接到 WLAN 网络时进行。不过,客户端可以使用您希望使用的任何启发法。
+        </li>
+        <li>
+向 OTA 更新包服务器进行核查,确定是否有可用的更新。这应与您现有的客户端代码大体相同,不过您需要表明相应设备支持 A/B 更新。(Google 的客户端还包含<strong>立即检查</strong>按钮,以便用户检查是否有最新更新。)
+        </li>
+        <li>
+调用 <code>update_engine</code>(使用 HTTPS 网址),以获取更新包(假设有可用的更新包)。<code>update_engine</code> 将在流式传输更新包的同时,在当前未使用的分区上更新原始数据块。
+        </li>
+        <li>
+根据 <code>update_engine</code> 结果代码向您的服务器报告安装是成功了还是失败了。如果更新已成功应用,<code>update_engine</code> 将会告知引导加载程序在下次重新启动时启动到新的操作系统。如果新的操作系统无法启动,引导加载程序将会回退到旧的操作系统,因此无需在客户端执行任何操作。如果更新失败,客户端将需要根据详细的错误代码确定何时(以及是否)重试。例如,优秀的客户端能够识别出是一部分(“diff”)OTA 更新包失败,并改为尝试完整的 OTA 更新包。
+        </li>
+      </ul>
+
+      <p>客户端可能会:</p>
+
+      <ul>
+        <li>
+显示通知,以提醒用户重新启动系统。如果您想要实施鼓励用户定期更新的政策,则可以将该通知添加到客户端。如果客户端不提示用户,用户将会在下次重新启动系统时收到更新。(Google 的客户端会有延迟,该延迟可按每次更新进行配置。)
+        </li>
+        <li>
+显示通知,以告知用户他们是启动到了新的操作系统版本,还是应启动到新的操作系统版本,但却回退到了旧的操作系统版本。(Google 的客户端通常不会显示此类通知。)
+        </li>
+      </ul>
+
+      <p>在系统方面,A/B 系统��新会影响以下各项:</p>
+
+      <ul>
+        <li>
+分区选择(槽位)、<code>update_engine</code> 守护进程,以及引导加载程序交互(如下所述)
+        </li>
+        <li>
+编译过程和 OTA 更新包生成(如<a href="/devices/tech/ota/ab/ab_implement.html">实现 A/B 更新</a>中所述)
+        </li>
+      </ul>
+
+      <aside class="note">
+        <strong>注意</strong>:只有对于新设备,才建议通过 OTA 实现 A/B 系统更新。
+      </aside>
+
+      <h3 id="slots">分区选择(槽位)</h3>
+
+        <p>
+A/B 系统更新使用两组称为槽位(通常是槽位 A ���槽位 B)的分区。<em></em>系统从“当前”槽位运行,但在正常操作期间,运行中的系统不会访问未使用的槽位中的分区。<em></em><em></em>这种方法通过将未使用的槽位保留为后备槽位,来防范更新出现问题:如果在更新期间或更新刚刚完成后出现错误,系统可以回滚到原来的槽位并继续正常运行。为了实现这一目标,当前槽位使用的任何分区(包括只有一个副本的分区)都不应在 OTA 更新期间进行更新。<em></em>
+        </p>
+
+        <p>
+每个槽位都有一个“可启动”属性,该属性用于表明相应槽位存储的系统正确无误,设备可从相应槽位启动。<em></em>系统运行时,当前槽位处于可启动状态,但另一个槽位则可能包含旧版本(仍然正确)的系统、包含更新版本的系统,或包含无效的数据。无论当前槽位是哪一个,都有一个槽位是活动槽位(引导加载程序在下次启动时将使用的槽位,也称为首选槽位)。<em></em><em></em><em></em>
+        </p>
+
+        <p>
+此外,每个槽位还都有一个由用户空间设置的“成功”属性,仅当相应槽位处于可启动状态时,该属性才具有相关性。<em></em>被标记为成功的槽位应该能够自行启动、运行和更新。未被标记为成功的可启动槽位(多次尝试使用它启动之后)应由引导加载程序标记为不可启动,其中包括将活动槽位更改为另一个可启动的槽位(通常是更改为在尝试启动到新的活动槽位之前正在运行的槽位)。关于相应接口的具体详细信息在 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/boot_control.h" class="external-link">
+          boot_control.h</a></code> 中定义。
+        </p>
+
+      <h3 id="update-engine">更新引擎守护进程</h3>
+
+        <p>
+A/B 系统更新过程会使用名为 <code>update_engine</code> 的后台守护进程来使系统做好准备,以启动到更新后的新版本。该守护进程可以执行以下操作:
+        </p>
+
+        <ul>
+          <li>
+按照 OTA 更新包的指示,从当前槽位 A/B 分区读取数据,然后将所有数据写入到未使用槽位 A/B 分区。
+          </li>
+          <li>
+在预定义的工作流程中调用 <code>boot_control</code> 接口。
+          </li>
+          <li>
+按照 OTA 更新包的指示,在将数据写入到所有未使用槽位分区之后,从新分区运行安装后程序。<em></em><em></em>(有关详细信息,请参阅<a href="#post-installation">安装后</a>)。
+          </li>
+        </ul>
+
+        <p>
+由于 <code>update_engine</code> 守护进程本身不会参与到启动流程中,因此该守护进程在更新期间可以执行的操作受当前槽位中的 <a href="/security/selinux/">SELinux</a> 政策和功能限制(在系统启动到新版本之前,此类政策和功能无法更新)。<em></em>为了维持一个稳定可靠的系统,更新流程<strong>不应</strong>修改分区表、当前槽位中各个分区的内容,以及无法通过恢复出厂设置擦除的非 A/B 分区的内容。
+        </p>
+
+        <h4 id="update_engine_source">更新引擎源代码</h4>
+
+        <p>
+<code>update_engine</code> 源代码位于 <code><a href="https://android.googlesource.com/platform/system/update_engine/" class="external">system/update_engine</a></code> 中。A/B OTA dexopt 文件分开放到了 <code>installd</code> 和一个程序包管理器中:
+        </p>
+
+        <ul>
+          <li>
+            <code><a href="https://android.googlesource.com/platform/frameworks/native/+/master/cmds/installd/" class="external-link">frameworks/native/cmds/installd/</a></code>ota* 包括安装后脚本、用于 chroot 的二进制文件、负责调用 dex2oat 的已安装克隆、OTA 后 move-artifacts 脚本,以及 move 脚本的 rc 文件。
+          </li>
+          <li>
+            <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/pm/OtaDexoptService.java" class="external-link">frameworks/base/services/core/java/com/android/server/pm/OtaDexoptService.java</a></code>(加上 <code><a href="https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/pm/OtaDexoptShellCommand.java" class="external-link">OtaDexoptShellCommand</a></code>)是负责为应用准备 dex2oat 命令的程序包管理器。
+          </li>
+        </ul>
+
+        <p>
+如需可使用的示例,请参阅 <code><a href="https://android.googlesource.com/device/google/marlin/+/nougat-dr1-release/device-common.mk" class="external-link">/device/google/marlin/device-common.mk</a></code>。
+        </p>
+
+        <h4 id="update_engine_logs">更新引擎日志</h4>
+
+          <p>
+对于 Android 8.x 及更低版本,可在 <code>logcat</code> 及错误报告中找到 <code>update_engine</code> 日志。要使 <code>update_engine</code> 日志可在文件系统中使用,请将以下更改添加到您的细分版本中:
+          </p>
+
+          <ul>
+            <li><a href="https://android-review.googlesource.com/c/platform/system/update_engine/+/486618">
+更改 486618</a></li>
+            <li><a href="https://android-review.googlesource.com/c/platform/system/core/+/529080">
+更改 529080</a></li>
+            <li><a href="https://android-review.googlesource.com/c/platform/system/update_engine/+/529081">
+更改 529081</a></li>
+            <li><a href="https://android-review.googlesource.com/c/platform/system/sepolicy/+/534660">
+更改 534660</a></li>
+          </ul>
+
+          <p>这些更改会将最新的 <code>update_engine</code> 日志的副本保存到 <code>/data/misc/update_engine_log/update_engine.log</code>。拥有<strong>日志</strong>组 ID 的用户将能够访问相应的文件系统日志。
+
+      </p><h3 id="bootloader-interactions">引导加载程序交互</h3>
+
+        <p>
+<code>boot_control</code> HAL 供 <code>update_engine</code>(可能还有其他守护进程)用于指示引导加载程序从何处启动。常见的示例情况及其相关状态包括:
+        </p>
+
+        <ul>
+          <li>
+            <strong>正常情况</strong>:系统正在从其当前槽位(槽位 A 或槽位 B)运行。到目前为止尚未应用任何更新。系统的当前槽位是可启动且被标记为成功的活动槽位。
+          </li>
+          <li>
+            <strong>正在更新</strong>:系统正在从槽位 B 运行,因此,槽位 B 是可启动且被标记为成功的活动槽位。由于槽位 A 中的内容正在更新,但是尚未完成,因此槽位 A 被标记为不可启动。在此状态下,应继续从槽位 B 重新启动。
+          </li>
+          <li>
+            <strong>已应用更新,正在等待重新启动</strong>:系统正在从槽位 B 运行,槽位 B 可启动且被标记为成功,但槽位 A 之前被标记为活动槽位(因此现在被标记为可启动)。槽位 A 尚未被标记为成功,引导加载程序应尝试从槽位 A 启动若干次。
+          </li>
+          <li>
+            <strong>系统已重新启动到新的更新</strong>:系统正在首次从槽位 A 运行,槽位 B 仍可启动且被标记为成功,而槽位 A 仅可启动,且仍是活动槽位,但未被标记为成功。在进行一些检查之后,用户空间守护进程 <code>update_verifier</code> 应将槽位 A 标记为成功。
+          </li>
+        </ul>
+
+      <h3 id="streaming-updates">流式更新支持</h3>
+
+        <p>
+用户设备并非在 <code>/data</code> 上总是有足够的空间来下载更新包。由于 OEM 和用户都不想浪费 <code>/cache</code> 分区上的空间,因此有些用户会因为设备上没有空间来存储更新包而不进行更新。为了解决这个问题,Android 8.0 中添加了对流式 A/B 更新(下载数据块后直接将数据块写入 B 分区,而无需将数据块存储在 <code>/data</code> 上)的支持。流式 A/B 更新几乎不需要临时存储空间,并且只需要能够存储大约 100KiB 元数据的存储空间即可。
+        </p>
+
+        <p>要在 Android 7.1 中实现流式更新,请选择以下补丁程序:</p>
+
+        <ul>
+          <li>
+            <a href="https://android-review.googlesource.com/333624" class="external">
+允许取消代理解析请求</a>
+          </li>
+          <li>
+            <a href="https://android-review.googlesource.com/333625" class="external">
+解决在解析代理时会终止传输的问题</a>
+          </li>
+          <li>
+            <a href="https://android-review.googlesource.com/333626" class="external">
+针对范围之间的 TerminateTransfer 添加单元测试</a>
+          </li>
+          <li>
+            <a href="https://android-review.googlesource.com/333627" class="external">
+清理 RetryTimeoutCallback()</a>
+          </li>
+        </ul>
+
+        <p>
+无论是使用 <a href="https://www.android.com/gms/">Google 移动服务 (GMS)</a>,还是使用任何其他更新客户端,都需要安装这些补丁程序,才能在 Android 7.1 中支持流式传输 A/B 更新包。
+        </p>
+
+    <h2 id="life-of-an-a-b-update">A/B 更新过程</h2>
+
+      <p>
+当有 OTA 更新包(在代码中称为有效负载)可供下载时,更新流程便开始了。<em></em>设备中的政策可以根据电池电量、用户活动、充电状态或其他政策来延迟下载和应用有效负载。此外,由于更新是在后台运行,因此用户可能并不知道正在进行更新。所有这些都意味着,更新流程可能随时会由于政策、意外重新启动或用户操作而中断。
+      </p>
+
+      <p>
+OTA 更新包本身所含的元数据可能会指示可进行流式更新,在这种情况下,相应更新包也可采用非流式安装方式。服务器可以利用这些元数据告诉客户端正在进行流式更新,以便客户端正确地将 OTA 移交给 <code>update_engine</code>。如果设备制造商具有自己的服务器和客户端,便可以通过确保以下两项来实现流式更新:确保服务器能够识别出更新是流式更新(或假定所有更新都是流式更新),并确保客户端能够正确调用 <code>update_engine</code> 来进行流式更新。制造商可以根据更新包是流式更新变体这一事实向客户端发送一个标记,以便在进行流式更新时触发向框架端的移交工作。
+      </p>
+
+      <p>有可用的有效负载后,更新流程将遵循如下步骤:</p>
+
+      <table>
+        <tbody><tr>
+          <th>步骤</th>
+          <th>操作</th>
+        </tr>
+        <tr>
+          <td>1</td>
+          <td>通过 <code>markBootSuccessful()</code> 将当前槽位(或“源槽位”)标记为成功(如果尚未标记)。</td>
+        </tr>
+        <tr>
+          <td>2</td>
+          <td>
+调用函数 <code>setSlotAsUnbootable()</code>,将未使用的槽位(或“目标槽位”)标记为不可启动。当前槽位始终会在更新开始时被标记为成功,以防止引导加载程序回退到未使用的槽位(该槽位中很快将会有无效数据)。如果系统已做好准备,可以开始应用更新,那么即使其他主要组件出现损坏(例如界面陷入崩溃循环),当前槽位也会被标记为成功,因为可以通过推送新软件来解决这些问题。
+            <br /><br />
+更新有效负载是不透明的 Blob,其中包含更新到新版本的指示。更新有效负载由以下部分组成:
+            <ul>
+              <li>
+                元数据。<em></em>元数据在更新有效负载中所占的比重相对较小,其中包含一系列用于在目标槽位上生成和验证新版本的操作。例如,某项操作可能会解压缩特定 Blob 并将其写入到目标分区中的特定块,或者从源分区读取数据、应用二进制补丁程序,然后写入到目标分区中的特定块。
+              </li>
+              <li>
+                额外数据。<em></em>与操作相关的额外数据在更新有效负载中占据了大部分比重,其中包含这些示例中的已压缩 Blob 或二进制补丁程序。
+              </li>
+            </ul>
+          </td>
+        </tr>
+        <tr>
+          <td>3</td>
+          <td>下载有效负载元数据。</td>
+        </tr>
+        <tr>
+          <td>4</td>
+          <td>
+对于元数据中定义的每项操作,都将按顺序发生以下行为:将相关数据(如果有)下载到内存中、应用操作,然后释放关联的内存。
+          </td>
+        </tr>
+        <tr>
+          <td>5</td>
+          <td>
+对照预期的哈希重新读取并验证所有分区。
+          </td>
+        </tr>
+        <tr>
+          <td>6</td>
+          <td>
+运行安装后步骤(如果有)。如果在执行任何步骤期间出现错误,则更新失败,系统可能会通过其他有效负载重新尝试更新。如果上述所有步骤均已成功完成,则更新成功,系统会执行最后一个步骤。
+          </td>
+        </tr>
+        <tr>
+          <td>7</td>
+          <td>
+<em></em>调用 <code>setActiveBootSlot()</code>,将未使用的槽位标记为活动槽位。将未使用的槽位标记为活动槽位并不意味着它将完成启动。如果引导加载程序(或系统本身)未读取到“成功”状��,则可以将活动槽位切换回来。
+          </td>
+        </tr>
+        <tr>
+          <td>8</td>
+          <td>
+安装后步骤(如下所述)包括从“新更新”版本中运行仍在旧版本中运行的程序。如果此步骤已在 OTA 更新包中定义,则为<strong>强制性</strong>步骤,且程序必须返回并显示退出代码 <code>0</code>,否则更新失败。
+          </td>
+        </tr>
+          <tr><td>9</td>
+          <td>
+在系统足够深入地成功启动到新槽位并完成重新启动后检查之后,系统会调用 <code>markBootSuccessful()</code>,将现在的当前槽位(原“目标槽位”)标记为成功。
+          </td>
+        </tr><tr>
+      </tr></tbody></table>
+
+      <aside class="note">
+        <strong>注意</strong>:第 3 步和第 4 步占用了大部分更新时间,因为这两个步骤涉及写入和下载大量数据,并且可能会因政策或重新启动等原因而中断。
+      </aside>
+
+      <h3 id="post-installation">安装后</h3>
+
+        <p>
+对于定义了安装后步骤的每个分区,<code>update_engine</code> 都会将新分区装载到特定位置,并执行与装载的分区相关的 OTA 中指定的程序。例如,如果安装后程序被定义为相应系统分区中的 <code>usr/bin/postinstall</code>,则系统会将未使用槽位中的这个分区装载到一个固定位置(例如 <code>/postinstall_mount</code>),然后执行 <code>/postinstall_mount/usr/bin/postinstall</code> 命令。
+        </p>
+
+        <p>
+为确保成功执行安装后步骤,旧内核必须能够:
+        </p>
+
+        <ul>
+          <li>
+            <strong>装载新的文件系统格式</strong>。文件系统类型不能更改(除非旧内核中支持这么做),包括使用的压缩算法(如果使用 SquashFS 等经过压缩的文件系统)等详细信息。
+          </li>
+          <li>
+            <strong>理解新分区的安装后程序格式</strong>。如果使用可执行且可链接格式 (ELF) 的二进制文件,则该文件应该与旧内核兼容(例如,如果架构从 32 位细分版本改为使用 64 位细分版本,则 64 位的新程序应该可以在旧的 32 位内核上运行)。除非加载程序 (<code>ld</code>) 收到使用其他路径或编译静态二进制文件的指令,否则将会从旧系统映像而非新系统映像加载各种库。
+          </li>
+        </ul>
+
+        <p>
+例如,您可以使用 shell 脚本作为安装后程序(由旧系统中顶部包含 <code>#!</code> 标记的 shell 二进制文件解析),然后从新环境设置库路径,以便执行更复杂的二进制安装后程序。或者,您可以从专用的较小分区执行安装后步骤,以便主系统分区中的文件系统格式可以得到更新,同时不会产生向后兼容问题或引发 stepping-stone 更新;这样一来,用户便可以从出厂映像直接更新到最新版本。
+        </p>
+
+        <p>
+新的安装后程序将受旧系统中定义的 SELinux 政策限制。因此,安装后步骤适用于在指定设备上执行设计所要求的任务或其他需要尽可能完成的任务(例如,更新支持 A/B 更新的固件或引导加载程序、为新版本准备数据库副本,等等)。安装后步骤<strong>不适用于</strong>重新启动之前的一次性错误修复(此类修复需要无法预见的权限)。
+        </p>
+
+        <p>
+所选的安装后程序在 <code>postinstall</code> SELinux 环境中运行。新装载的分区中的所有文件都将带有 <code>postinstall_file</code> 标记,无论在重新启动到新系统后它们的属性如何,都是如此。在新系统中对 SELinux 属性进行的更改不会影响安装后步骤。如果安装后程序需要额外的权限,则必须将这些权限添加到安装后环境中。
+        </p>
+
+      <h3 id="after_reboot">重新启动后</h3>
+
+        <p>
+重新启动后,<code>update_verifier</code> 会触发利用 dm-verity 进行完整性检查。系统会先启动该检查,然后再启动 zygote,以避免 Java 服务进行任何无法撤消且会导致无法进行安全回滚的更改。在此过程中,如果验证启动功能或 dm-verity 检测到任何损坏,引导加载程序和内核还可能会触发重新启动。检查完成后,<code>update_verifier</code> 会将启动标记为成功。
+        </p>
+
+        <p>
+          <code>update_verifier</code> 只会读取 <code>/data/ota_package/care_map.txt</code>(在使用 AOSP 代码时,该文件会包含在 A/B OTA 更新包中)中列出的数据块。Java 系统更新客户端(例如 GmsCore)会在重新启动设备前提取 <code>care_map.txt</code> 并设置访问权限,在系统成功启动到新版本后会删除所提取的这个文件。
+        </p>
+
+    <h2 id="faq">常见问题解答</h2>
+
+      <h3>Google 是不是在所有设备上都采用了 A/B OTA?</h3>
+
+        <p>
+是的。A/B 更新的营销名称是无缝更新。<em></em>从 2016 年 10 月份开始,Pixel 和 Pixel XL 手机在出厂时都具备 A/B 功能,并且所有 Chromebook 都使用相同的 <code>update_engine</code> A/B 实现。必要的平台代码实现在 Android 7.1 及更高版本中是公开的。
+        </p>
+
+      <h3>为什么 A/B OTA 更好?</h3>
+
+      <p>A/B OTA 能够为用户提供更好的更新体验。从每月安全更新数据中获得的指标显示,该功能被证明是成功的:截至 2017 年 5 月,95% 的 Pixel 用户在一个月内采纳最新的安全更新,而 Nexus 用户则为 87%,并且 Pixel 用户执行更新的时间早于 Nexus 用户。如果在 OTA 期间无法成功更新数据块,将不会再导致设备无法启动;在新系统映像成功启动之前,Android 仍能够回退到上一个可使用的系统映像。</p>
+
+      <h3>A/B 更新对 2016 Pixel 分区大小有什么影响?</h3>
+
+      <p>下表包含推出的 A/B 配置与经过内部测试的非 A/B 配置的详细信息:</p>
+
+      <table>
+        <tbody>
+          <tr>
+            <th>Pixel 分区大小</th>
+            <th width="33%">A/B</th>
+            <th width="33%">非 A/B</th>
+          </tr>
+          <tr>
+            <td>引导加载程序</td>
+            <td>50*2</td>
+            <td>50</td>
+          </tr>
+          <tr>
+            <td>启动</td>
+            <td>32*2</td>
+            <td>32</td>
+          </tr>
+          <tr>
+            <td>恢复</td>
+            <td>0</td>
+            <td>32</td>
+          </tr>
+          <tr>
+            <td>缓存</td>
+            <td>0</td>
+            <td>100</td>
+          </tr>
+          <tr>
+            <td>无线通讯</td>
+            <td>70*2</td>
+            <td>70</td>
+          </tr>
+          <tr>
+            <td>供应商</td>
+            <td>300*2</td>
+            <td>300</td>
+          </tr>
+          <tr>
+            <td>系统</td>
+            <td>2048*2</td>
+            <td>4096</td>
+          </tr>
+          <tr>
+            <td><strong>总计</strong></td>
+            <td><strong>5000</strong></td>
+            <td><strong>4680</strong></td>
+          </tr>
+        </tbody>
+      </table>
+
+      <p>要进行 A/B 更新,只需要在闪存中增加 320MiB,而通过移除恢复分区,可节省 32MiB,并且通过移除缓存分区,可另外节省 100MiB。这将平衡引导加载程序、启动分区和无线通讯分区的 B 分区带来的开销。供应商分区增大了一倍(在增加的大小中占了绝大部分)。Pixel 的 A/B 系统映像大小是原来的非 A/B 系统映像的一半。
+      </p>
+
+      <p>对于经过内部测试的 Pixel A/B 和非 A/B 变体(仅推出了 A/B 变体),所用空间仅差 320MiB。在空间为 32GiB 的设备上,这只相当于不到 1%。对于空间为 16GiB 的设备,这相当于不到 2%,对于空间为 8GiB 的设备,这几乎相当于 4%(假设所有三种设备都具有相同的系统映像)。</p>
+
+      <h3>你们为何不使用 SquashFS?</h3>
+
+      <p>我们尝试过 SquashFS,但无法实现高端设备所需的性能。我们不会为手持设备使用 SquashFS,也不推荐这么做。</p>
+
+      <p>更具体地说,使用 SquashFS 时,系统分区上节省了约 50% 的大小,但绝大多数压缩率较高的文件都是预编译的 .odex 文件。这些文件都具有非常高的压缩比(接近 80%),但系统分区其余部分的压缩比要低得多。另外,SquashFS 在 Android 7.0 中引发了以下性能问题:</p>
+
+      <ul>
+        <li>与以往的设备相比,Pixel 具有非常快的闪存,但并没有大量的空闲 CPU 周期,因此虽然从闪存读取的字节数更少,但却需要更多的 CPU 来处理 I/O,这是一个潜在的制约因素。</li>
+        <li>在没有任何负载的系统上,有些 I/O 变化在人为基准条件下不会出现任何问题,但在具有真实负载(如 Nexus 6 上的加密)的实际用例中有时则会出现问题。</li>
+        <li>在某些方面,基准化分析显示回归率达到 85%。</li>
+        </ul>
+
+      <p>随着 SquashFS 日趋成熟并且增加了旨在降低 CPU 影响的功能(例如,将不应压缩且经常访问的文件列入白名单),我们将继续对其进行评估并向设备制造商提供建议。</p>
+
+      <h3>在不使用 SquashFS 的情况下,你们是如何做到将系统分区的大小减半的?</h3>
+
+      <p>应用存储在 .apk 文件中,这些文件实际上是 ZIP 档案。每个 .apk 文件中都有一个或多个包含可移植 Dalvik 字节码的 .dex 文件。.odex 文件(经过优化的 .dex 文件)会与 .apk 文件分开放置,并且可以包含特定于设备的机器代码。如果存在 .odex 文件,Android 将能够以预先编译的速度运行应用,而无需在每次启动应用时等待系统编译代码。.odex 文件并不是绝对必需的:实际上 Android 可以通过解译或即时 (JIT) 编译来直接运行 .dex 代码,但使用 .odex 文件可以实现启动速度和运行时速度的最佳组合(如果有足够的空间)。</p>
+
+      <p>示例:对于运行 Android 7.1 且系统映像总大小为 2628MiB(2755792836 字节)的 Nexus 6P 中的 installed-files.txt,在系统映像总大小中占据比重最大的几种文件类型明细如下:
+      </p>
+
+      <table>
+      <tbody>
+      <tr>
+      <td>.odex</td>
+      <td>1391770312 字节</td>
+      <td>50.5%</td>
+      </tr>
+      <tr>
+      <td>.apk</td>
+      <td>846878259 字节</td>
+      <td>30.7%</td>
+      </tr>
+      <tr>
+      <td>.so(原生 C/C++ 代码)</td>
+      <td>202162479 字节</td>
+      <td>7.3%</td>
+      </tr>
+      <tr>
+      <td>.oat 文件/.art 映像</td>
+      <td>163892188 字节</td>
+      <td>5.9%</td>
+      </tr>
+      <tr>
+      <td>字体</td>
+      <td>38952361 字节</td>
+      <td>1.4%</td>
+      </tr>
+      <tr>
+      <td>icu 语言区域数据</td>
+      <td>27468687 字节</td>
+      <td>0.9%</td>
+      </tr>
+      </tbody>
+      </table>
+
+      <p>这些数字在其他设备上是类似的,因此在 Nexus/Pixel 设备上,.odex 文件会占用系统分区大约一半的空间。这意味着我们可以继续使用 EXT4,但会在出厂前将 .odex 文件写入 B 分区,然后在第一次启动时将它们复制到 <code>/data</code>。用于 EXT4 A/B 的实际存储空间与用于 SquashFS A/B 的相同,因为如果我们使用了 SquashFS,我们会将经过预先优化的 .odex 文件放入 system_a 而非 system_b。</p>
+
+      <h3>将 .odex 文件复制到 /data 难道不是意味着在 /system 上节省的空间会在 /data 上被用掉吗?</h3>
+
+      <p>不完全是。在 Pixel 上,.odex 文件占用的大部分空间会用于应用(通常位于 <code>/data</code> 上)。这些应用通过 Google Play 更新,因此系统映像上的 .apk 和 .odex 文件在设备生命周期的大部分时间内都不会用到。当用户实际使用每个应用时,此类文件可以被完全排除并替换为由配置��件驱动的小型 .odex 文件(因此,用户不使用的应用不需要空间)。有关详细信息,请观看 Google I/O 2016 演讲 <a href="https://www.youtube.com/watch?v=fwMM6g7wpQ8">ART 的演变</a>。</p>
+
+      <p>难以进行比较的几个主要原因:</p>
+      <ul>
+      <li>由 Google Play 更新的应用在收到其第一次更新时,始终会立即将 .odex 文件放在 <code>/data</code> 上。</li>
+      <li>用户不运行的应用根本不需要 .odex 文件。</li>
+      <li>配置文件驱动型编译生成的 odex 文件比预先编译生成的 .odex 文件要小(因为前者仅会优化对性能至关重要的代码)。</li>
+      </ul>
+
+      <p>如需详细了解可供 OEM 使用的调整选项,请参阅<a href="/devices/tech/dalvik/configure.html">配置 ART</a>。</p>
+
+      <h3>.odex 文件在 /data 上��是有两个副本吗?</h3>
+
+      <p>这个问题有点复杂。写入新的系统映像后,系统将针对新的 .dex 文件运行新版本的 dex2oat,以生成新的 .odex 文件。这个过程发生在旧系统仍在运行时,因此旧的和新的 .odex 文件同时位于 <code>/data</code> 上。
+      </p>
+
+      <p>在优化每个程序包之前,OtaDexoptService 中的代码 (<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/OtaDexoptService.java#200" class="external">frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/OtaDexoptService.java#200</a></code>) 都会调用 <code>getAvailableSpace</code>,以避免过度填充 <code>/data</code>。请注意,此处的可用数值仍然是保守估计:是指在达到通常的系统下限空间阈值之前剩余的空间量(以百分比和字节数计)。<em></em><em></em>所以如果 <code>/data</code> 已满,每个 .odex 文件便不会有两个副本。上述代码还��一个 BULK_DELETE_THRESHOLD:如果设备上的可用空间即将被填满(如上所述),则属于未使用应用的 .odex 文件将会被移除。这是每个 .odex 文件没有两个副本的另一种情况。</p>
+
+      <p>最糟糕的情况是 <code>/data</code> 已被完全填满,更新将等到设备重新启动到新系统,而不再需要旧系统的 .odex 文件时。PackageManager 可处理此情况:(<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/PackageManagerService.java#7215" class="external">frameworks/base/+/nougat-mr1-release/services/core/java/com/android/server/pm/PackageManagerService.java#7215</a></code>)。在新系统成功启动之后,<code>installd</code> (<code><a href="https://android.googlesource.com/platform/frameworks/native/+/nougat-mr1-release/cmds/installd/commands.cpp#2192" class="external">frameworks/native/+/nougat-mr1-release/cmds/installd/commands.cpp#2192</a></code>) 可以移除旧系统此前使用的 .odex 文件,从而使设备返回到只有一个副本的稳定状态。</p>
+
+      <p>因此,尽管 <code>/data</code> 可能会包含所有 .odex 文件的两个副本,但 (a) 这是暂时的,并且 (b) 只有在 <code>/data</code> 上有足够的可用空间时才会发生。除了在更新期间,将始终只有一个副本。作为 ART 通用健壮性功能的一部分,它永远不会让 <code>/data</code> 中填满 .odex 文件(因为在非 A/B 系统上,这也会是一个问题)。</p>
+
+      <h3>这种写入/复制操作不会增加闪存磨损吗?</h3>
+
+      <p>只有一小部分闪存会被重写:完整 Pixel 系统更新会写入大约 2.3GiB 的数据。(应用也会被重新编译,但非 A/B 更新也是如此。)一直以来,基于块的完整 OTA 会写入类似数量的数据,所以闪存磨损率应该是类似的。</p>
+
+      <h3>刷写两个系统分区会增加出厂刷写时间吗?</h3>
+
+      <p>不会。Pixel 的系统映像大小并没有增加(只是将空间划分到了两个分区)。</p>
+
+      <h3>如果将 .odex 文件保留在 B 分区上,不会导致恢复出厂设置后重新启动速度变慢吗?</h3>
+
+      <p>会。如果您已实际使用了一台设备,进行了 OTA,并且执行了恢复出厂设置,则首次重新启动的速度将会比未进行这些操作时慢(在 Pixel XL 上,分别为 1 分 40 秒和 40 秒),因为在进行第一次 OTA 之后,B 中将会失去 .odex 文件,所以这些文件无法复制到 <code>/data</code>。正所谓有得有失。</p>
+
+      <p>与常规启动相比,恢复出厂设置应该是一项极少执行的操作,因此所花费的时间不是很重要。(这不会影响从工厂获取设备的用户或审核者,因为在这种情况下,B 分区可用。)使用 JIT 编译器意味着我们不需要重新编译所有内容,所以情况不会像您想象的那样糟糕。<em></em>此外,还可以通过在清单 (<code><a href="https://android.googlesource.com/platform/frameworks/base/+/nougat-mr1-release/packages/SystemUI/AndroidManifest.xml#23" class="external">frameworks/base/+/nougat-mr1-release/packages/SystemUI/AndroidManifest.xml#23</a></code>) 中使用 <code>coreApp="true"</code> 将应用标记为需要预先编译。这是 <code>system_server</code> 当前采用的方式,因为出于安全考虑,不允许此进程进行 JIT 编译。</p>
+
+      <h3>如果将 .odex 文件保留在 /data 而非 /system 上,不会导致 OTA 后重新启动速度变慢吗?</h3>
+
+      <p>不会。如上所述,系统会在旧系统映像仍在运行时运行新的 dex2oat,以生成新系统将会需要的文件。在相关工作完成之前,更新会被视为不可用。</p>
+
+      <h3>我们可以(应该)推出 32GiB、16GiB 或 8GiB 的 A/B 设备吗?</h3>
+
+      <p>经证明,32GiB 空间在 Pixel 上能够很好地满足需求,而占用 16GiB 中的 320MiB 则意味着空间减少了 2%。同样,占用 8GiB 中的 320MiB 则意味着空间减少了 4%。显然,在空间为 4GiB 的设备上,不推荐使用 A/B 更新,因为 320MiB 的��销几乎占总可用空间的 10%。</p>
+
+      <h3>AVB2.0 需要 A/B OTA 吗?</h3>
+
+      <p>不需要。Android <a href="/security/verifiedboot/">验证启动</a>一直以来都是需要基于块的更新,但不一定是 A/B 更新。</p>
+
+      <h3>A/B OTA 需要 AVB2.0 吗?</h3>
+
+      <p>不需要。</p>
+
+      <h3>A/B OTA 会破坏 AVB2.0 的回滚保护吗?</h3>
+
+      <p>不会。这里存在一些混淆,因为如果 A/B 系统无法启动到新的系统映像,则会在重试一定的次数(由引导加载程序确定)后,自动恢复到“之前”的系统映像。但关键在于,对于使用 A/B 更新的系统而言,“之前”的系统映像实际上仍然是“当前”的系统映像。设备成功启动新映像后,回滚保护功能就会立即启动,以确保您无法再使用以前的系统启动。但是,在您实际成功启动新映像之前,回滚保护功能不会将其视为当前系统映像。</p>
+
+      <h3>如果在系统运行时安装更新,速度会不会很慢?</h3>
+
+      <p>使用非 A/B 更新时,目标是尽快安装更新,因为用户正在等待,并且在系统应用更新时,用户将无法使用其设备。使用 A/B 更新时,情况则恰恰相反。这是因为用户仍在使用其设备,于是目标就变成了尽可能减少影响,所以系统会有意缓慢地进行更新。通过 Java 系统更新客户端中的逻辑(对于 Google 来说是 GMSCore - 由 GMS 提供的核心程序包),Android 还会尝试选择用户完全不使用其设备的时间进行更新。该平台支持暂停/恢复更新,如果用户开始使用设备,客户端可以使用该功能来暂停更新,并在设备再次空闲时恢复更新。</p>
+
+      <p>在进行 OTA 时分两个阶段,这两个阶段在界面中的进度条下清楚地显示为“第 1 步(共 2 步)”和“第 2 步(共 2 步)”。<em></em><em></em>第 1 步是写入数据块,第 2 步是预编译 .dex 文件。这两个阶段在对性能的影响方面有很大差异。第一个阶段是简单的 I/O。这需要很少的资源(RAM、CPU、I/O),因为它只是缓慢地复制数据块。</p>
+
+      <p>第二个阶段是运行 dex2oat 来预编译新的系统映像。这显然在资源要求上没有明确的界限,因为它会编译实际应用。与编译小而简单的应用相比,编译大而复杂的应用所涉及的工作量显然要多出许多;而在第一个阶段,没有任何磁盘块会比其他磁盘块更大或更复杂。</p>
+
+      <p>该过程类似于 Google Play 先在后台安装应用更新,然后显示“已更新 5 个应用”通知,而这是多年来一直采用的做法。<em></em></p>
+
+      <h3>如果用户实际上正在等待更新,将会怎样?</h3>
+
+      <p>GmsCore ��的当前实现不区分后台更新和用户启动的更新,但将来可能会加以区分。届时,如果用户明确要求安装更新或正在查看更新进度屏幕,我们将假设他们正在等待系统完成更新,从而优先安排更新工作。</p>
+
+      <h3>如果无法应用更新,将会怎样?</h3>
+
+      <p>对于非 A/B 更新,如果更新无法应用,过去经常会导致用户的设备无法使用。唯一的例外情况是在尚未应用更新之前就出现问题(比如说因为更新包验证失败)。对于 A/B 更新,无法应用更新不会影响当前正在运行的系统。可以稍后重新尝试更新。</p>
+
+      <h3>哪些系统芯片 (SoC) 支持 A/B 更新?</h3>
+
+      <p>截至 2017 年 3 月 15 日,我们得到的信息如下:</p>
+      <table class="style0">
+      <tbody>
+      <tr>
+      <td></td>
+      <td><strong>Android 7.x 版本</strong></td>
+      <td><strong>Android 8.x 版本</strong></td>
+      </tr>
+      <tr>
+      <td><strong>Qualcomm</strong></td>
+      <td>根据 OEM 的请求而定</td>
+      <td>所有芯片组都将受支持</td>
+      </tr>
+      <tr>
+      <td><strong>Mediatek</strong></td>
+      <td>根据 OEM 的请求而定</td>
+      <td>所有芯片组都将受支持</td>
+      </tr>
+      </tbody>
+      </table>
+
+      <p>有关时间表的详细信息,请咨询您的 SoC 联系人。对于上面未列出的 SoC,请直接与您的 SoC 供应商联系。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/index.html b/zh-cn/devices/tech/ota/index.html
index e4fa88f..fa5bb3d 100644
--- a/zh-cn/devices/tech/ota/index.html
+++ b/zh-cn/devices/tech/ota/index.html
@@ -27,13 +27,13 @@
     <h2 id="ab_updates">A/B 更新</h2>
 
       <p>
-        现代 A/B 设备中的每个分区都有两个副本(A 和 B)。当系统运行但处于空闲状态时,设备会将更新应用到当前未使用的分区。A/B 设备不需要空间来下载更新软件包,因为它们可以在从网络中读取更新时应用该更新。这被称为<em>流式传输 A/B</em>。A/B 更新也被称为<em>无缝更新</em>。要详细了解有关 A/B 设备的 OTA 更新,请参阅 <a href="/devices/tech/ota/ab_updates.html">A/B(无缝)系统更新</a>。
+        现代 A/B 设备中的每个分区都有两个副本(A 和 B)。当系统运行但处于空闲状态时,设备会将更新应用到当前未使用的分区。A/B 设备不需要空间来下载更新软件包,因为它们可以在从网络中读取更新时应用该更新。这被称为“流式传输 A/B”。A/B 更新也被称为“无缝更新”。<em></em><em></em>要详细了解有关 A/B 设备的 OTA 更新,请参阅 <a href="/devices/tech/ota/ab/index.html">A/B(无缝)系统更新</a>。
       </p>
 
     <h2 id="nonab_updates">非 A/B 更新</h2>
 
       <p>
-        老款设备可在特殊的恢复分区中使用软件解压缩下载的更新包并将其应用于其他分区。有关详细信息,请查看<a href="/devices/tech/ota/nonab_updates.html">非 A/B 系统更新</a>。
+        老款设备可在特殊的恢复分区中使用软件解压缩下载的更新包并将其应用于其他分区。有关详细信息,请查看<a href="/devices/tech/ota/nonab/index.html">非 A/B 系统更新</a>。
       </p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/inside_packages.html b/zh-cn/devices/tech/ota/inside_packages.html
index 51103f8..160ef3f 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>
@@ -21,7 +21,7 @@
   -->
 
 <p>系统从 <code>bootable/recovery/updater
-</code> 构建更新程序二进制文件并将其用于 OTA 更新包。</p>更新包本身是包含可执行二进制文件 <code>META-INF/com/google/android/update-binary
+</code> 编译更新程序二进制文件并将其用于 OTA 更新包。</p>更新包本身是包含可执行二进制文件 <code>META-INF/com/google/android/update-binary
 </code> 的 .zip 文件(<code>ota_update.zip</code>、<code>incremental_ota_update.zip</code>)。
 
 <p>更新程序包含多个内建函数和一个可扩展脚本语言 (<b>Edify</b>) 解释器,该脚本语言支持用于执行更新相关的典型任务的命令。更新程序会从 .zip 压缩包文件中查找 <code>META-INF/com/google/android/updater-script</code> 文件中的脚本。</p>
@@ -73,16 +73,14 @@
 <p>支持特殊语法将 MTD(内存技术设备)分区的内容作为文件处理,以便为引导分区这样的原始分区打补丁。由于 MTD 分区没有文件结束标记,因此要读取该分区,您必须知道您要读取的数据量。您可以使用字符串“MTD:partition:size_1:sha1_1:size_2:sha1_2”作为文件名来读取给定的分区。<i></i><i></i><i></i><i></i><i></i>您必须至少指定一个(size,sha-1)对;如果您希望读取的内容有多种可能,则可以指定多个对。<i></i></p></dd>
 <dt><code>apply_patch_check(<i>filename</i>, <i>sha1</i>[, <i>sha1</i>, ...])
 </code></dt>
-<dd>如果 filename 的内容或缓存分区中的临时副本(如果存在)中的内容具有与给定的 sha1 值之一相等的 SHA1 校验和,则返回 True。sha1 值指定为 40 位十六进制数字。<i></i><i></i><i></i>
-该函数不同于 <code>sha1_check(read_file(<i>filename</i>),
+<dd>如果 filename 的内容或缓存分区中的临时副本(如果存在)中的内容具有与给定的 sha1 值之一相等的 SHA1 校验和,则返回 True。sha1 值指定为 40 位十六进制数字。<i></i><i></i><i></i>该函数不同于 <code>sha1_check(read_file(<i>filename</i>),
 <i>sha1</i> [, ...])</code>,因为它知道要检查缓存分区副本,因此即使文件被中断的 <code>apply_patch() update</code> 损坏,<code>apply_patch_check()</code> 也将成功。</dd>
 <dt><code>apply_patch_space(<i>bytes</i>)</code></dt>
 <dd>如果至少有 bytes 个字节的暂存空间可用于打二进制补丁程序,则返回 True。<i></i></dd>
 <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>重新格式化给定的分区。支持的分区类型如下:
@@ -124,9 +122,9 @@
 <dt><code>set_progress(<i>frac</i>)</code></dt>
 <dd>在最近的 <code>show_progress()</code> 调用所定义的块内设置进度条的位置。frac 必须介于 [0.0,1.0] 之间。<i></i>进度条从不向后移动;向后移动的尝试会被忽略。</dd>
 <dt><code>sha1_check(<i>blob</i>[, <i>sha1</i>])</code></dt>
-<dd>blob 参数是 <code>
+<dd><i></i>blob 参数是 <code>
 read_file()</code> 返回的 blob 类型或 <code>package_extract_file()
-</code> 的单参数形式 blob。<i></i>在没有 sha1 参数的情况下,此函数返回 blob 的 SHA1 哈希值(作为 40 位十六进制字符串)。<i></i>在提供了一个或多个 sha1 参数的情况下,如果 SHA1 哈希值等于其中一个参数,则该函数返回此 SHA1 哈希值;如果与任何一个参数都不相等,则返回空字符串。<i></i></dd>
+</code> 的单参数形�� blob。在没有 sha1 参数的情况下,此函数返回 blob 的 SHA1 哈希值(作为 40 位十六进制字符串)。<i></i>在提供了一个或多个 sha1 参数的情况下,如果 SHA1 哈希值等于其中一个参数,则该函数返回此 SHA1 哈希值;如果与任何一个参数都不相等,则返回空字符串。<i></i></dd>
 <dt><code>show_progress(<i>frac</i>, <i>secs</i>)</code></dt>
 <dd>在 secs 秒(必须为整数)内推动进度条向前移动下一个 frac 的长度。secs 可为 0,在这种情况下,进度条不会自动向前移动,而是通过使用上面所定义的 <code>
 set_progress()</code> 函数实现进度递增。<i></i><i></i><i></i></dd>
diff --git a/zh-cn/devices/tech/ota/nonab/block.html b/zh-cn/devices/tech/ota/nonab/block.html
new file mode 100644
index 0000000..210e036
--- /dev/null
+++ b/zh-cn/devices/tech/ota/nonab/block.html
@@ -0,0 +1,83 @@
+<html devsite><head>
+    <title>基于块的 OTA</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 5.0 的新设备启用基于块的无线 (OTA) 更新。OTA 是原始设备制造商 (OEM) 用于远程更新设备系统分区的机制:</p>
+<ul>
+<li><b>Android 5.0</b> 及更高版本使用块 OTA 更新,以确保每个设备使用的分区完全相同。块 OTA 不会比较各个文件,也不会分别计算各个二进制补丁程序,而是将整个分区处理为一个文件并计算单个二进制补丁程序,以确保生成的分区刚好包含预期的位数。这样一来,设备系统映像就能够通过 fastboot 或 OTA 达到相同的状态。</li>
+<li><b>Android 4.4</b> 及更低版本使用文件 OTA 更新,确保设���包含类似的文件内容、权限和模式,但允许时间戳和底部存储的布局等元数据在各设备之间因更新方法而异。</li>
+
+</ul>
+<p>因为块 OTA 可确保每个设备使用相同的分区,所以它能够使用 dm-verity 以加密的方式为系统分区签名。要详细了解 dm-verity,请参阅<a href="/security/verifiedboot/index.html">验证启动</a>。
+</p>
+
+<p class="note"><strong>注意</strong>:您必须拥有正常运行的块 OTA 系统才能使用 dm-verity。</p>
+
+<h2 id="Recommendations">推荐</h2>
+
+<p>对于使用 Android 5.0 或更高版本启动的设备,请在出厂 ROM 中使用块 OTA 更新。要为后续更新生成基于块的 OTA,请将 <code>--block</code> 选项传递到 <code>ota_from_target_files</code>。</p>
+
+<p>对于搭载 Android 4.4 或更低版本的设备,请使用文件 OTA 更新。虽然可以通过发送 Android 5.0 或更高版本的完整块 OTA 来转换设备,但这需要发送一个明显大于增量 OTA 的完整 OTA(因此不建议采用该方法)。
+</p>
+
+<p>由于仅在搭载 Android 5.0 或更高版本的新设备中提供 dm-verity 所需的引导加载程序支持,因此无法为现有设备启用 dm-verity。<i></i></p>
+
+<p>致力于开发 Android OTA 系统(生成 OTA 的恢复映像和脚本)的开发者可以订阅 <a href="https://groups.google.com/forum/#!forum/android-ota">android-ota@googlegroups.com</a> 邮寄名单以及时了解最新动态。</p>
+
+<h2 id="File vs. Block OTAs">文件与块 OTA</h2>
+
+<p>在进行基于文件的 OTA 期间,Android 会尝试在文件系统层更改系统分区的内容(逐个更改)。更新无法保证按照一致的顺序写入文件、具有一致的上次修改时间或超级块、甚至将块放置在块设备上的同一位置。因此,在启用 dm-verity 的设备上执行基于文件的 OTA 将会失败;进行 OTA 尝试后,设备不会启动。</p>
+<p>在执行基于块的 OTA 期间,Android 为设备提供两个块映像(而非两组文件)之间的差异。该更新使用以下方法之一在块级别(位于文件系统下方)针对相应构建服务器来检查设备版本:</p>
+<ul>
+<li><b>完整更新</b>:复制整个系统映像很容易操作且易于生成补丁程序,但同时导致生成的映像较大,因而增加了应用补丁程序的成本。</li>
+<li><b>增量更新</b>:使用二进制文件 differ 工具可生成较小的映像且易于应用补丁程序,但在生成补丁程序本身时却占用大量内存。</li>
+</ul>
+
+<p class="note"><strong>注意</strong>:<code>adb fastboot</code> 会在设备上放置与完整 OTA 完全相同的位数,以便刷写操作与块 OTA 兼容。</p>
+
+<h3 id="Unmodified Systems">更新未修改的系统</h3>
+
+<p>对于具有运行 Android 5.0 的未修改系统分区的设备,下载和安装块 OTA 的过程与文件 OTA 相同。不过,OTA 更新本身可能包括以下一个或多个区别:<i></i></p>
+<ul>
+<li><b>下载大小</b>:完整块 OTA 更新的大小接近完整文件 OTA 更新的大小,而增量更新可能只有几兆字节。<p></p>
+
+<img src="/devices/tech/images/ota_size_comparison.png" alt="比较 OTA 大小"/>
+
+<p class="img-caption"><strong>图 1.</strong> 比较 Android 5.0 和 Android 5.1 两个版本之间 Nexus 6 OTA 的大小(不同的目标版本更改)</p>
+
+<p>一般情况下,增量块 OTA 更新大于增量文件 OTA 更新的原因如下:</p>
+<ul>
+<li>数据保存��<i></i>基于块的 OTA 比基于文件的 OTA 保存的数据更多(文件元数据、dm-verity 数据、ext4 布局等)。</li>
+<li>计算算法不同:<i></i>在文件 OTA 更新中,如果两个版本的文件路径完全相同,则 OTA 包不包含该文件的任何数据。在块 OTA 更新中,确定文件中没有发生变化或发生很少变化取决于补丁程序计算算法的质量以及源系统和目标系统中文件数据的布局。</li>
+</ul>
+</li>
+<li><b>对错误 Flash 和 RAM 敏感</b>:如果文件已损坏,只要文件 OTA 没有接触到损坏的文件,则文件 OTA 就会成功;但如果块 OTA 在系统分区上检测到任何损坏,则块 OTA 失败。</li>
+</ul>
+
+<h3 id="Modified Systems">更新已修改的系统</h3>
+<p>对于具有运行 Android 5.0 的已修改系统分区的设备:<i></i></p>
+<ul>
+<li><b>增量块 OTA 更��失败</b>:系统分区可能会在 <code>adb remount</code> 期间或由于恶意软件而被修改。文件 OTA 允许对分区进行一些更改,例如添加不属于源版本或目标版本的文件。但是,块 OTA 不允许向分区添加内容,因此用户需要安装完整 OTA(覆盖所有系统分区修改)或刷写新的系统映像,以启用将来的 OTA。</li>
+<li><b>尝试更改已修改的文件会导致更新失败</b>:对于文件 OTA 和块 OTA 更新,如果 OTA 尝试更改已修改的文件,则 OTA 更新会失败。</li>
+<li><b>尝试访问已修改的文件会生成错误</b>(仅限 dm-verity):<i></i>对于文件 OTA 和块 OTA 更新,如果 dm-verity 已启用且 OTA 尝试访问系统文件系统的已修改部分,则 OTA 会生成错误。</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/nonab/device_code.html b/zh-cn/devices/tech/ota/nonab/device_code.html
new file mode 100644
index 0000000..704a690
--- /dev/null
+++ b/zh-cn/devices/tech/ota/nonab/device_code.html
@@ -0,0 +1,766 @@
+<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>恢复系统包括一些用于插入设备专属代码的钩子,以便 OTA 更新还可以更新设备中除 Android 系统以外的其他部分(例如,基带或无线电处理器)。</p>
+<p>下面的部分和示例对 <b>yoyodyne</b> 供应商生产的 <b>tardis</b> 设备进行了自定义。</p>
+
+<h2>分区映射</h2>
+<p>自 Android 2.3 版本起,该平台就开始支持 eMMc 闪存设备以及在这些设备上运行的 ext4 文件系统。此外,该平台还支持内存技术设备 (MTD) 闪存设备以及较旧��本的 yaffs2 文件系统。</p>
+<p>分区映射文件由 TARGET_RECOVERY_FSTAB 指定;recovery 二进制文件和软件包编译工具均使用该文件。您可以在 BoardConfig.mk 中的 TARGET_RECOVERY_FSTAB 中指定映射文件的名称。</p>
+<p>分区映射文件示例可能如下所示:</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/recovery.fstab
+</pre>
+
+<pre class="devsite-click-to-copy">
+# mount point       fstype  device       [device2]        [options (3.0+ only)]
+
+/sdcard     vfat    /dev/block/mmcblk0p1 /dev/block/mmcblk0
+/cache      yaffs2  cache
+/misc       mtd misc
+/boot       mtd boot
+/recovery   emmc    /dev/block/platform/s3c-sdhci.0/by-name/recovery
+/system     ext4    /dev/block/platform/s3c-sdhci.0/by-name/system length=-4096
+/data       ext4    /dev/block/platform/s3c-sdhci.0/by-name/userdata
+</pre>
+
+<p>除 <code>/sdcard</code>(可选)之外,本示例中的所有装载点都必须进行定义(设备也可以添加额外的分区)。支持的文件系统类型有下列 5 种:</p>
+<dl>
+<dt>yaffs2</dt>
+<dd>yaffs2 文件系统位于 MTD 闪存设备的顶部。MTD 分区的名称必须是“device”,且该名称必须显示在 <code>/proc/mtd</code> 中。</dd>
+<dt>mtd</dt>
+<dd>原始 MTD 分区,用于可引导分区(例如 boot 和 recovery)。MTD 实际上并未装载,但是装载点会被用作定位分区的键。<code>/proc/mtd</code> 中 MTD 分区的名称必须是“device”。</dd>
+<dt>ext4</dt>
+<dd>ext4 文件系统���于 eMMc 闪存设备的顶部。块设备的路径必须是“device”。</dd>
+<dt>emmc</dt>
+<dd>原始 eMMc 块设备,用于可引导分区(例如 boot 和 recovery)。与 mtd 类型相似,eMMc 从未实际装载,但装载点字符串会被用于定位表中的设备。</dd>
+<dt>vfat</dt>
+<dd>FAT 文件系统位于块设备的顶部,通常用于外部存储设备(如 SD 卡)。该设备是块设备;device2 是系统装载主设备失败时尝试装载的第二个块设备(旨在与可能(或可能没有)使用分区表进行格式化的 SD 卡兼容)。
+<p>所有分区都必须装载到根目录下(即装载点值必须以斜线开头,且不含其他斜线)。此限制仅适用于在 recovery 中装载文件系统;主系统可随意将其装载在任何位置。目录 <code>/boot</code>、<code>/recovery</code> 和 <code>/misc</code> 应为原始类型(mtd 或 emmc),而目录 <code>/system</code>、<code>/data</code>、<code>/cache</code> 和 <code>/sdcard</code>(如果有)则应为文件系���类型(yaffs2、ext4 或 vfat)。</p></dd></dl>
+
+<p>从 Android 3.0 开始,recovery.fstab 文件就新添了额外的可选字段,即“options”。<i></i>目前,唯一定义的选项是“length”,它可以让您明确指定分区的长度。<i></i>对分区重新进行格式化(例如,在执行数据清除/恢复出厂设置操作过程中对用户数据分区进行格式化,或在安装完整 OTA 更新包的过程中对系统分区进行格式化)时会使用此长度。如果长度值为负数,则将长度值与真正的分区大小相加,即可得出要格式化的大小。例如,设置“length=-16384”即表示在对该分区重新进行格式化时,该分区的最后 16k 将不会被覆盖。<i></i>该选项支持加密 userdata 分区(在这里,加密元数据会存储在不得被覆盖的分区的末尾部分)等功能。</p>
+
+<p class="note"><strong>注意</strong>:<b>device2</b> 和 <b>options</b> 字段均为可选字段,在解析时会产生歧义。如果该行第 4 个字段中的条目以“/”字符开头,则被视为 <b>device2</b> 条目;如果该条目不是以“/”字符开头,则被视为 <b>options</b> 字段。</p>
+
+<h2 id="boot-animation">启动动画</h2>
+
+<p>设备制造商可以自定义在启动 Android 设备时显示的动画。为此,请构建一个根据 <a href="https://android.googlesource.com/platform/frameworks/base/+/master/cmds/bootanimation/FORMAT.md">bootanimation 格式</a>中的规范组织和定位的 .zip 文件。</p>
+
+<p>对于 <a href="https://developer.android.com/things/hardware/index.html">Android Things</a> 设备,您可以在 Android Things 控制台中上传压缩文件,以便在所选产品中包含图片。</p>
+
+<p class="note"><strong>注意</strong>:这些图片必须符合 Android <a href="/setup/brands">品牌推广指南</a>。</p>
+
+<h2 id="recovery-ui">恢复界面</h2>
+<p>要支持配备不同可用硬件(物理按钮、LED、屏幕等)的设备,您可以自定义恢复界面以显示状态,并访问每台设备的手动操作隐藏功能。</p>
+<p>您的目标是编译一个包含一些 C++ 对象的小型静态库,以提供设备专属功能。默认情况下会使用 <code>
+<b>bootable/recovery/default_device.cpp</b></code> 文件,该文件正好可在为设备编写此文件的版本时供您复制。</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/recovery/recovery_ui.cpp
+</pre>
+
+<pre class="prettyprint">
+#include &lt;linux/input.h&gt;
+
+#include "common.h"
+#include "device.h"
+#include "screen_ui.h"
+</pre>
+
+<h3 id="header-item-functions">Headers 和 Item 函数</h3>
+<p>Device 类需要相关函数来返回隐藏恢复菜单中出现的标头和项。Headers 介绍了如何操作菜单(例如,用于更改/选择突出显示项的控制功能)。</p>
+
+<pre class="prettyprint">
+static const char* HEADERS[] = { "Volume up/down to move highlight;",
+                                 "power button to select.",
+                                 "",
+                                 NULL };
+
+static const char* ITEMS[] =  {"reboot system now",
+                               "apply update from ADB",
+                               "wipe data/factory reset",
+                               "wipe cache partition",
+                               NULL };
+</pre>
+
+<p class="note"><strong>注意</strong>:长行会被截断(而非换行),因此请留意您设备的屏幕宽度。</p>
+
+<h3 id="customize-checkkey">自定义 CheckKey</h3>
+<p>接下来,请定义您设备的 RecoveryUI 实现。本例假设 <b>tardis</b> 设备配有屏幕,因此,您可以沿用内置 ScreenRecoveryUIimplementation(请参阅有关<a href="#devices-without-screens">无屏幕设备</a>的说明)。可通过 ScreenRecoveryUI 自定义的唯一函数是 <code>CheckKey()</code>,该函数会执行初始异步键处理操作:</p>
+
+<pre class="prettyprint">
+class TardisUI : public ScreenRecoveryUI {
+  public:
+    virtual KeyAction CheckKey(int key) {
+        if (key == KEY_HOME) {
+            return TOGGLE;
+        }
+        return ENQUEUE;
+    }
+};
+</pre>
+
+<h4 id="key-constants">KEY 常量</h4>
+<p>KEY_* 常量在 <code>linux/input.h</code> 中定义。无论后续恢复流程执行什么操作,都会调用 <code>
+CheckKey()</code>:菜单切换为关闭状态时、菜单处于打开状态时、软件包安装期间以及用户数据清除期间等。它会返回下列 4 个常量中的一个:</p>
+
+<ul>
+<li><b>TOGGLE</b>. 切换菜单的显示状态以及(或)开启/关闭文本日志</li>
+<li><b>REBOOT</b>. 立即重新启动设备</li>
+<li><b>IGNORE</b>. 忽略此按键</li>
+<li><b>ENQUEUE</b>. 向队列中添加此按键以同步使用(即在启用显示时供恢复菜单系统使用)</li>
+</ul>
+
+<p>每次在 key-down 事件后执行同一按键的 key-up 事件时都会调用 <code>CheckKey()</code>(事件 A-down B-down B-up A-up 序列只会调用 <code>CheckKey(B)</code>)。<code>CheckKey()
+</code> 可以调用 <code>IsKeyPressed()</code>,以确定是否有其他键被按下(在上述键事件的序列中,如果 <code>CheckKey(B)
+</code> 调用了 <code>IsKeyPressed(A)</code>,则会返回 true)。</p>
+<p><code>CheckKey()</code> 可以在其类中保持状态,这有助于检测键的序列。本示例展示的是一个稍微复杂的设置:按住电源键并按下音量提高键可切换显示状态,连续按五次电源按钮可立即重新启动设备(无需使用其他键):</p>
+
+<pre class="prettyprint">
+class TardisUI : public ScreenRecoveryUI {
+  private:
+    int consecutive_power_keys;
+
+  public:
+    TardisUI() : consecutive_power_keys(0) {}
+
+    virtual KeyAction CheckKey(int key) {
+        if (IsKeyPressed(KEY_POWER) &amp;&amp; key == KEY_VOLUMEUP) {
+            return TOGGLE;
+        }
+        if (key == KEY_POWER) {
+            ++consecutive_power_keys;
+            if (consecutive_power_keys &gt;= 5) {
+                return REBOOT;
+            }
+        } else {
+            consecutive_power_keys = 0;
+        }
+        return ENQUEUE;
+    }
+};
+</pre>
+
+<h3 id="screenrecoveryui">ScreenRecoveryUI</h3>
+<p>如果您将自己的图片(错误图标、安装动画、进度条)与 ScreenRecoveryUI 搭���使用,则可以设置变量 <code>animation_fps</code> 来控制动画的速度(以每秒帧数 (FPS) 为单位)。</p>
+
+<p class="note"><strong>注意</strong>:通过最新的 <code>interlace-frames.py</code> 脚本,您可以将 <code>animation_fps</code> 信息存储到图片中。在早期版本的 Android 中,您必须自行设置 <code>animation_fps</code>。</p>
+
+<p>要设置变量 <code>animation_fps</code>,请替换子类中的 <code>ScreenRecoveryUI::Init()</code> 函数。设置值,然后调用 <code>parent Init() </code>函数以完成初始化。默认值 (20 FPS) 对应默认恢复图片;您在使用这些图片时无需提供 <code>Init()</code> 函数。
+有关图片的详细信息,请参阅<a href="#recovery-ui-images">恢复界面图片</a>。</p>
+
+<h3 id="device-class">Device 类</h3>
+<p>执行 RecoveryUI 实现后,请定义您的 Device 类(由内置 Device 类派生的子类)。它应该会创建您的 UI 类的单个实例,并通过 <code>GetUI()</code> 函数返回该实例:</p>
+
+<pre class="prettyprint">
+class TardisDevice : public Device {
+  private:
+    TardisUI* ui;
+
+  public:
+    TardisDevice() :
+        ui(new TardisUI) {
+    }
+
+    RecoveryUI* GetUI() { return ui; }
+</pre>
+
+<h3 id="startrecovery">StartRecovery</h3>
+<p><code>StartRecovery()</code> 方法的调用时机是:恢复开始时,界面已初始化且参数已解析之后,但在执行任何操作之前。默认的实现不会执行任何操作,因此,如果您没有可执行的操作,则无需在子类中提供此项。</p>
+
+<pre class="prettyprint">
+   void StartRecovery() {
+       // ... do something tardis-specific here, if needed ....
+    }
+</pre>
+
+<h3 id="supply-manage-recovery-menu">提供和管理恢复菜单</h3>
+<p>系统会调用两种方法来获取标头行列表和项列表。在此实现中,系统会返回文件顶部定义的静态数组:</p>
+
+<pre class="prettyprint">
+const char* const* GetMenuHeaders() { return HEADERS; }
+const char* const* GetMenuItems() { return ITEMS; }
+</pre>
+
+<h4 id="handlemenukey">HandleMenuKey</h4>
+<p>接下来,提供 <code>HandleMenuKey()</code> 函数,该函数会提取按键和当前菜单可见性,并确定���执行哪项操作。</p>
+
+<pre class="prettyprint">
+   int HandleMenuKey(int key, int visible) {
+        if (visible) {
+            switch (key) {
+              case KEY_VOLUMEDOWN: return kHighlightDown;
+              case KEY_VOLUMEUP:   return kHighlightUp;
+              case KEY_POWER:      return kInvokeItem;
+            }
+        }
+        return kNoAction;
+    }
+</pre>
+
+<p>该方法会提取按键代码(之前已通过界面对象的 <code>CheckKey()</code> 方法进行处理并加入队列),以及菜单/文本日志可见性的当前状态。返回值为整数。如果值不小于 0,则被视为会立即调用的菜单项的位置(请参阅下方的 <code>InvokeMenuItem()</code> 方法)。否则,它可能是以下预设常量之一:</p>
+
+<ul>
+<li><b>kHighlightUp</b>:将菜单突出显示移到上一项</li>
+<li><b>kHighlightDown</b>:将菜单突出显示移到下一项</li>
+<li><b>kInvokeItem</b>:调用当前突出显示的项</li>
+<li><b>kNoAction</b>:不使用此按键执行任何操作</li>
+</ul>
+
+<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 事件映射到相应的菜单操作即可。
+<i></i>由于无法针对 <code>CheckKey()</code> 实现此映射,因此不能将轨迹球运动作为重新启动或切换显示状态的触发器。</p>
+
+<h4 id="modifier-keys">辅助键</h4>
+<p>要查看作为辅助键按下的键,请调用您自己的界面对象的 <code>IsKeyPressed()
+</code> 方法。例如,在某些设备上,在恢复系统中按 Alt-W 会启动数据清除(无论菜单是否可见)。您可以按如下方式实现:</p>
+
+<pre class="prettyprint">
+   int HandleMenuKey(int key, int visible) {
+        if (ui-&gt;IsKeyPressed(KEY_LEFTALT) &amp;&amp; key == KEY_W) {
+            return 2;  // position of the "wipe data" item in the menu
+        }
+        ...
+    }
+</pre>
+
+<p class="note"><strong>注意</strong>:如果 <b>visible</b> 为 false,则返回操作菜单(移动突出显示项、调用突出显示项)的特殊值将毫无意义,因为用户看不到突出显示项。不过,您可以视需要返回相应的值。</p>
+
+<h4 id="invokemenuitem">InvokeMenuItem</h4>
+<p>接下来,提供 <code>InvokeMenuItem()</code> 方法,将由 <code>GetMenuItems()</code> 返回的项数组中的整数位置映射到相应的操作。对于 tardis 示例中的项数组,请使用:</p>
+
+<pre class="prettyprint">
+   BuiltinAction InvokeMenuItem(int menu_position) {
+        switch (menu_position) {
+          case 0: return REBOOT;
+          case 1: return APPLY_ADB_SIDELOAD;
+          case 2: return WIPE_DATA;
+          case 3: return WIPE_CACHE;
+          default: return NO_ACTION;
+        }
+    }
+</pre>
+
+<p>该方法可以返回 BuiltinAction 枚举的任何成员,以指示系统执行相应的操作(如果您不希望系统执行任何操作,则返回 NO_ACTION 成员)。您可以在这里提供除系统功能以外的其他恢复功能:在您的菜单中为其添加项,在调用菜单项时在此处执行此项,以及返回 NO_ACTION 以便让系统不执行其他任何操作。</p>
+<p>BuiltinAction 包含以下值:</p>
+<ul>
+<li><b>NO_ACTION</b>:不执行任何操作。</li>
+<li><b>REBOOT</b>:退出恢复系统,并正常重启设备。</li>
+<li><b>APPLY_EXT、APPLY_CACHE、APPLY_ADB_SIDELOAD</b>:从不同的位置安装更新程序包。如需了解详情,请��阅<a href="#sideloading">旁加载</a>。</li>
+<li><b>WIPE_CACHE</b>:仅将 cache 分区重新格式化。无需确认,因为此操作相对来说没有什么不良后果。</li>
+<li><b>WIPE_DATA</b>:将 userdata 和 cache 分区重新格式化,又称为恢复出厂设置。用户需要先确认这项操作,然后再继续。</li>
+</ul>
+<p>最后一种方法 <code>WipeData()</code> 是可选项,只要系统执行数据清除操作(通过菜单从退出恢复系统中执行,或当用户从主系统中选择恢复出厂设置时),就会调用此方法。该方法在清除 userdata 和 cache 分区之前调用。如果您的设备将用户数据存储在这两个分区之外的其他位置,您应在此处清空数据。您应返回 0 以表示成功,返回其他值以表示失败,不过目前系统会忽略返回值。无论您返回成功还是失败,userdata 和 cache 分区都会被清除。</p>
+
+<pre class="prettyprint">
+   int WipeData() {
+       // ... do something tardis-specific here, if needed ....
+       return 0;
+    }
+</pre>
+
+<h4 id="make-device">生成设备</h4>
+<p>最后,在创建并返回您的 Device 类实例的 <code>make_device()</code> 函数的 recovery_ui.cpp 文件末尾包含一些样板文件。</p>
+
+<pre class="prettyprint">
+class TardisDevice : public Device {
+   // ... all the above methods ...
+};
+
+Device* make_device() {
+    return new TardisDevice();
+}
+</pre>
+
+<h3 id="build-link-device-recovery">编译并链接到设备 recovery 分区</h3>
+<p>完成 recovery_ui.cpp 文件后,编译该文件并将其链接到您设备上的 recovery 分区。在 Android.mk 中,创建一个只包含此 C++ 文件的静态库:</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/recovery/Android.mk
+</pre>
+
+<pre class="devsite-click-to-copy">
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := eng
+LOCAL_C_INCLUDES += bootable/recovery
+LOCAL_SRC_FILES := recovery_ui.cpp
+
+# should match TARGET_RECOVERY_UI_LIB set in BoardConfig.mk
+LOCAL_MODULE := librecovery_ui_tardis
+
+include $(BUILD_STATIC_LIBRARY)
+</pre>
+
+<p>然后,在该设备的板配置中,将静态库指定为 TARGET_RECOVERY_UI_LIB 的值。</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/BoardConfig.mk
+ [...]
+
+# device-specific extensions to the recovery UI
+TARGET_RECOVERY_UI_LIB := librecovery_ui_tardis
+</pre>
+
+<h2 id="recovery-ui-images">恢复界面图片</h2>
+<p>恢复用户界面由图片组成。在理想情况下,用户从不与界面互动:在正常更新过程中,手机会启动进入恢复模式,填充安装进度条,并在无需用户输入任何内容的情况下启动返回新系统。如果系统更新出现问题,唯一可以执行的用户操作是呼叫客服中心。</p>
+<p>只含图片的界面无需进行本地化。不过,自 Android 5.0 起,更新会显示一串文本(如“正在安装系统更新…”)以及图片。如需了解详情,请参阅<a href="#recovery-text">经过本地化的恢复文本</a>。</p>
+
+<h3 id="recovery-5.x">Android 5.0 及更高版本</h3>
+<p>Android 5.0 及更高版本的恢复界面采用两种主要图片:<strong>错误</strong>图片和<strong>正在安装</strong>动画。</p>
+
+<table>
+<tbody>
+<tr>
+<td>
+<img src="/devices/tech/images/icon_error.png" alt="image shown during ota error"/>
+<p class="img-caption"><strong>图 1.</strong> icon_error.png</p>
+</td>
+<td>
+<img src="/devices/tech/images/icon_installing_5x.png" alt="image shown during ota install" height="275"/>
+<p class="img-caption"><strong>图 2.</strong> icon_installing.png</p>
+</td>
+</tr>
+</tbody>
+</table>
+
+<p>“正在安装”动画由一张 PNG 图片表示,动画的各帧行行交错(这就是图 2 呈现挤压效果的原因)。例如,为 200x200 的七帧动画创建一张 200x1400 的图片,其中第一帧表示第 0、7、14、21...行,第二帧表示第 1、8、15、22...行,以此类推。合并的图片包含表示动画帧数和每秒帧数 (FPS) 的文本块。<code>bootable/recovery/interlace-frames.py</code> 工具需要处理一组输入帧,并将其合并到 recovery 所用的必要合成图片中。</p>
+
+<p>默认图片以不同密度提供,其所在位置是 <code>bootable/recovery/res-$DENSITY/images</code> (如 <code>bootable/recovery/res-hdpi/images</code>)。要在安装过程中使用静态图片,您只需提供 icon_installing.png 图片,并将动画中的帧数设置为 0(错误图标不是动画;该图片一律为静态图片)即可。</p>
+
+<h3 id="recovery-4.x">Android 4.x 及更早版本</h3>
+<p>Android 4.x 及更早版本的恢复界面会采用<b>错误</b>图片(如上图所示)、<b>正在安装</b>动画以及几张叠加图片:</p>
+
+<table>
+<tbody>
+<tr>
+<td rowspan="2">
+<img src="/devices/tech/images/icon_installing.png" alt="image shown during ota install"/>
+<p class="img-caption"><strong>图 3.</strong> icon_installing.png</p>
+</td>
+<td>
+<img src="/devices/tech/images/icon_installing_overlay01.png" alt="image shown as first overlay"/>
+<p class="img-caption"><strong>图 4.</strong> icon-installing_overlay01.png
+</p>
+</td>
+</tr>
+<tr>
+<td>
+<img src="/devices/tech/images/icon_installing_overlay07.png" alt="image shown as seventh overlay"/>
+<p class="img-caption"><strong>图 5.</strong> icon_installing_overlay07.png
+</p>
+</td>
+</tr>
+</tbody>
+</table>
+
+<p>在安装过程中,屏幕显示通过绘制 icon_installing.png 图片进行构建,然后在适当的偏移量处绘制其中一张叠加帧。图中叠加的红色方框是用来突出显示叠加帧在基本图片上的放置位置:</p>
+
+<table style="border-collapse:collapse;">
+<tbody>
+<tr>
+<td><img align="center" src="/devices/tech/images/composite01.png" alt="composite image of install plus first overlay"/>
+<p class="img-caption"><strong>图 6.</strong> “正在安装”动画帧 1 (icon_installing.png + icon_installing_overlay01.png)
+</p></td>
+<td><img align="center" src="/devices/tech/images/composite07.png" alt="composite image of install plus seventh overlay"/>
+<p class="img-caption"><strong>图 7.</strong> “正在安装”动画帧 7 (icon_installing.png + icon_installing_overlay07.png)
+</p></td>
+</tr>
+</tbody>
+</table>
+
+<p>后续帧通过只绘制下一张已位于顶部的叠加图片显示;基本图片不会重新绘制。<i></i></p>
+
+<p>动画中的帧数,所需速度,以及叠加图片相对于基本图片的 x 轴和 y 轴偏移量均通过 ScreenRecoveryUI 类的成员变量来设置。如果您使用的是自定义图片而不是默认图片,请通过替换您子类中的 <code>Init()</code> 方法来更改自定义图片的这些值(如需了解详情,请参阅 <a href="#screenrecoveryui">ScreenRecoveryUI</a>)。<code>bootable/recovery/make-overlay.py
+</code> 脚本可协助将一组图片帧转为 recovery 所需的“基本图片 + 叠加图片”,其中包括计算所需的偏移量。</p>
+
+<p>默认图片位于 <code>bootable/recovery/res/images</code> 中。要在安装过程中使用静态图片,您只需提供 icon_installing.png 图片,并将动画中的帧数设置为 0(错误图标不是动画;该图片一律为静态图片)即可。</p>
+
+<h3 id="recovery-text">经过本地化的恢复文本</h3>
+<p>Android 5.x 会显示一串文本(如“正在安装系统更新…”)以及图片。如果主系统启动进入恢复模式,系统会将用户当前的语言区域作为命令行选项传递到恢复系统。对于每条要显示的消息,恢复系统都会为每个语言区域中的相应消息添加第二张带有预呈现文本字符串的合成图片。</p>
+
+<p>恢复文本字符串的示例图片:</p>
+
+<img src="/devices/tech/images/installing_text.png" alt="image of recovery text"/>
+<p class="img-caption"><strong>图 8.</strong> 恢复消息的本地化文本</p>
+
+<p>恢复文本会显示以下消息:</p>
+<ul>
+<li>正在安装系统更新…</li>
+<li>出错了!</li>
+<li>正在清除…(执行数据清除/恢复出厂设置时)</li>
+<li>无命令(用户手动启动进入恢复模式时)</li>
+</ul>
+
+<p><code>development/tools/recovery_l10/</code> 中的 Android 应用会呈现经过本地化的消息并创建合成图片。要详细了解如何使用该应用,请参阅 <code>development/tools/recovery_l10n/
+src/com/android/recovery_l10n/Main.java</code> 中的注解。
+
+</p><p>如果用户手动启动进入恢复模式,则语言区域可能不可用,且不会显示任何文本。不要让文本消息对恢复流程产生太多制约影响。</p>
+
+<p class="note"><strong>注意</strong>:隐藏界面(可显示日志消息并允许用户从菜单中选择操作)仅提供英文版。</p>
+
+<h2 id="progress-bars">进度条</h2>
+<p>进度条会显示在主要图片(或动画)的下方。进度条由两张输入图片(大小必须相同)合并而成:</p>
+
+<img src="/devices/tech/images/progress_empty.png" alt="empty progress bar"/>
+<p class="img-caption"><strong>图 9.</strong> progress_empty.png</p>
+<img src="/devices/tech/images/progress_fill.png" alt="full progress bar"/>
+<p class="img-caption"><strong>图 10.</strong> progress_fill.png</p>
+
+<p>fill 图片的左端显示在 empty 图片右端的旁边,从而形成进度条。<i></i><i></i>两张图片之间的边界位置会不时变更,以表示相应的进度。以上述几对输入图片为例,显示效果为:</p>
+
+<img src="/devices/tech/images/progress_1.png" alt="progress bar at 1%"/>
+<p class="img-caption"><strong>图 11.</strong> 进度条显示为 1%&gt;</p>
+<img src="/devices/tech/images/progress_10.png" alt="progress bar at 10%"/>
+<p class="img-caption"><strong>图 12.</strong> 进度条显示为 10%</p>
+<img src="/devices/tech/images/progress_50.png" alt="progress bar at 50%"/>
+<p class="img-caption"><strong>图 13.</strong> 进度条显示为 50%</p>
+
+<p>您可以将这些图片的设备专属版本放入(在本例中)<code>device/yoyodyne/tardis/recovery/res/images</code> 中,以提供这类版本的图片。
+ 文件名必须与上面列出的文件名相符;如果可在该目录下找到文件,则编译系统会优先使用该文件,而非对应的默认图片。仅支持采用 8 位色深的 RGB 或 RGBA 格式的 PNG 文件。
+</p>
+
+<p class="note"><strong>注意</strong>:在 Android 5.x 中,如果恢复模式下的语言区域是已知的,且采用从右至左 (RTL) 的语言模式(例如阿拉伯语、希伯来语等),则进度条将会按照从右向左的顺序进行填充。</p>
+
+<h2 id="devices-without-screens">没有屏幕的设备</h2>
+<p>并非所有 Android 设备都有屏幕。如果您的设备是无头装置或具备只支持音频的界面,那么您可能需要对恢复界面进行更广泛的自定义。请勿创建 ScreenRecoveryUI 的子类,而是直接针对其父类 RecoveryUI 创建子类。</p>
+<p>RecoveryUI 具有处理低级界面操作(如“切换显示”、“更新进度条”、“显示菜单”、“更改菜单选项”等)的方法。您可以替换这些操作以提供适合您设备的界面。也许您的设备有 LED,这样您可以使用不同的颜色或闪烁图案来指示状态;或许您还可以播放音频(您可能完全不想支持菜单或“文本显示”模式;您可以通过 <code>CheckKey()</code> 和 <code>HandleMenuKey()</code> 实现(一律不开启显示或一律不选择菜单项)来阻止对其进行访问在这种情况下,您需要提供的很多 RecoveryUI 方法都可以只是空的存根)。</p>
+<p>请参阅 <code>bootable/recovery/ui.h</code>,了解 RecoveryUI 声明,以查看您必须支持哪些方法。RecoveryUI 是抽象的(有些方法是纯虚拟的,必须由子类提供),但它包含处理键输入内容的代码。如果您的设备没有键或者您希望通过其他方式处理这些内容,也可以将其替换掉。</p>
+
+<h2 id="updater">更新程序</h2>
+<p>您可以提供自己的扩展函数(可从您的更新程序脚本中调用),从而在安装更新程序包的过程中使用设备专属代码。以下是适用于 tardis 设备的示例函数:</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/recovery/recovery_updater.c
+</pre>
+<pre class="prettyprint">
+#include &lt;stdlib.h&gt;
+#include &lt;string.h&gt;
+
+#include "edify/expr.h"
+</pre>
+
+<p>每个扩展函数都采用相同的签名。具体参数即调用函数的名称,<code>State*</code> Cookie、传入参数的数量和表示参数的 <code>Expr*</code> 指针数组。返回值是新分配的 <code>Value*</code>。</p>
+
+<pre class="prettyprint">
+Value* ReprogramTardisFn(const char* name, State* state, int argc, Expr* argv[]) {
+    if (argc != 2) {
+        return ErrorAbort(state, "%s() expects 2 args, got %d", name, argc);
+    }
+</pre>
+
+<p>您的参数在您调用函数时尚未进行评估,函数的逻辑决定了会对哪些参数进行评估以及评估多少次。因此,您可以使用扩展函数来实现自己的控制结构。<code>Call Evaluate()</code> 可用来评估 <code>Expr*
+</code> 参数,返回 <code>Value*</code>。如果 <code>Evaluate()</code> 可返回 NULL,您应该释放所持有的所有资源,并立即返回 NULL(此操作会将 abort 传播到 edify 堆栈中)。否则,您将获得所返回 Value 的所有权,并负责最终对其调用 <code>FreeValue()</code>。</p>
+
+<p>假设该函数需要两种参数:字符串值的 <b>key</b> 和 blob 值的 <b>image</b>。您可能会看到如下参数:</p>
+
+<pre class="prettyprint">
+   Value* key = EvaluateValue(state, argv[0]);
+    if (key == NULL) {
+        return NULL;
+    }
+    if (key-&gt;type != VAL_STRING) {
+        ErrorAbort(state, "first arg to %s() must be string", name);
+        FreeValue(key);
+        return NULL;
+    }
+    Value* image = EvaluateValue(state, argv[1]);
+    if (image == NULL) {
+        FreeValue(key);    // must always free Value objects
+        return NULL;
+    }
+    if (image-&gt;type != VAL_BLOB) {
+        ErrorAbort(state, "second arg to %s() must be blob", name);
+        FreeValue(key);
+        FreeValue(image)
+        return NULL;
+    }
+</pre>
+
+<p>为多个参数检查 NULL 并释放之前评估的参数可能会很繁琐。<code>ReadValueArgs()</code> 函数会让此变得更简单。您可以不使用上面的代码,而是写入下面的代码:</p>
+
+<pre class="prettyprint">
+   Value* key;
+    Value* image;
+    if (ReadValueArgs(state, argv, 2, &amp;key, &amp;image) != 0) {
+        return NULL;     // ReadValueArgs() will have set the error message
+    }
+    if (key-&gt;type != VAL_STRING || image-&gt;type != VAL_BLOB) {
+        ErrorAbort(state, "arguments to %s() have wrong type", name);
+        FreeValue(key);
+        FreeValue(image)
+        return NULL;
+    }
+</pre>
+
+<p><code>ReadValueArgs()</code> 不执行类型检查,因此您必须在这里执行这项检查;使用 <b>if</b> 语句执行这项检查会更方便,不过这样做也有一个弊端,那就是,如果操作失败,所显示的错误消息会不够具体。不过,如果有任何评估失败,<code>ReadValueArgs()</code> 会处理每个参数的评估操作,并释放之前评估的所有参数(以及设置有用的错误消息)。您可以使用 <code>
+ReadValueVarArgs()</code> 便捷函数来评估数量不定的参数(它会返回 <code>Value*</code> 的数组)。</p>
+
+<p>对参数进行评估后,执行以下函数:</p>
+
+<pre class="devsite-click-to-copy">
+   // key-&gt;data is a NUL-terminated string
+    // image-&gt;data and image-&gt;size define a block of binary data
+    //
+    // ... some device-specific magic here to
+    // reprogram the tardis using those two values ...
+</pre>
+
+<p>返回值必须是 <code>Value*</code> 对象;此对象的所有权将传递给调用程序。调用程序将获得此 <code>Value*</code> 所指向的所有数据的所有权,特别是数据成员。</p>
+<p>在这种情况下,您需要返回 true 或 false 值来表示成功。请记住以下惯例:空字符串为 false,所有其他字符串均为 true。<i></i><i></i>您必须使用要返回的常量字符串的经过 malloc 处理的副本来分配 Value 对象,因为调用程序会 <code>free()
+</code> 这两者。请切记对通过评估参数获得的对象调用 <code>FreeValue()</code>!</p>
+
+<pre class="prettyprint">
+   FreeValue(key);
+    FreeValue(image);
+
+    Value* result = malloc(sizeof(Value));
+    result-&gt;type = VAL_STRING;
+    result-&gt;data = strdup(successful ? "t" : "");
+    result-&gt;size = strlen(result-&gt;data);
+    return result;
+}
+</pre>
+
+<p>便捷函数 <code>StringValue()</code> 会将字符串封装到新的 Value 对象中。使用此函数可使上述代码的编写更加简洁:</p>
+
+<pre class="prettyprint">
+   FreeValue(key);
+    FreeValue(image);
+
+    return StringValue(strdup(successful ? "t" : ""));
+}
+</pre>
+
+<p>要将函数挂接到 edify 解释器中,请提供函数 <code>Register_<i>foo</i></code>(其中 foo 是包含此代码的静态库的名称)。<i></i>调用 <code>RegisterFunction()</code> 即可注册各个扩展函数。按照惯例,您需要对设备专属函数 <code><i>device</i>.<i>whatever</i></code> 进行命名,以免与将来添加的内置函数发生冲突。</p>
+
+<pre class="prettyprint">
+void Register_librecovery_updater_tardis() {
+    RegisterFunction("tardis.reprogram", ReprogramTardisFn);
+}
+</pre>
+
+<p>现在,您可以配置 makefile,以使用您的代码编译静态库(此 makefile 即是之前的区段中用于自定义恢复界面的 makefile;您设备的两个静态库可能都是在此定义的)。</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/recovery/Android.mk
+</pre>
+
+<pre class="devsite-click-to-copy">
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := recovery_updater.c
+LOCAL_C_INCLUDES += bootable/recovery
+</pre>
+
+<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>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/BoardConfig.mk
+</pre>
+
+<pre class="devsite-click-to-copy">
+ [...]
+
+# add device-specific extensions to the updater binary
+TARGET_RECOVERY_UPDATER_LIBS += librecovery_updater_tardis
+TARGET_RECOVERY_UPDATER_EXTRA_LIBS +=
+</pre>
+
+<p>您的 OTA 更新包中的更新程序脚本现已可以像其他脚本一样调用您的函数。要重新对您的 tardis 设备进行编程,更新脚本应包含:<code>tardis.reprogram("the-key", package_extract_file("tardis-image.dat"))
+</code>。它会使用单参数版本的内置函数 <code>
+package_extract_file()</code>,该函数会将从更新程序包中提取的文件内容作为 blob 返回,从而为新的扩展函数生成第二个参数。</p>
+
+<h2>生成 OTA 更新包</h2>
+<p>最终的组件是获取 OTA 更新包生成工具以了解您的设备专属数据,并发出 (emit) 包含对您的扩展函数进行调用的更新程序脚本。</p>
+<p>首先,让编译系统了解设备专属数据 blob。假设您的数据文件位于 <code>device/yoyodyne/tardis/tardis.dat</code> 中,请在您设备的 AndroidBoard.mk 中做出以下声明:</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/AndroidBoard.mk
+</pre>
+<pre class="devsite-click-to-copy">
+  [...]
+
+$(call add-radio-file,tardis.dat)
+</pre>
+
+<p>您也可以将其放在 Android.mk 中,但是之后必须通过设备检查提供保护,因为无论编译什么设备,树中的所有 Android.mk 文件都会加载(如果您���树中包含多个设备,那么您只需要在编译 tardis 设备时添加 tardis.dat 文件即可)。</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/Android.mk
+</pre>
+<pre class="devsite-click-to-copy">
+  [...]
+
+# an alternative to specifying it in AndroidBoard.mk
+ifeq (($TARGET_DEVICE),tardis)
+  $(call add-radio-file,tardis.dat)
+endif
+</pre>
+
+<p>由于历史原因,这些文件被称为无线电文件,但它们可能与设备无线电(如果存在)没有任何关系。它们只是编译系统复制到 OTA 生成工具所用的 target-files .zip 中的模糊数据 blob。在您执行编译时,tardis.dat 会作为 <code>RADIO/tardis.dat</code> 存储在 target-files.zip 中。您可以多次调用 <code>add-radio-file</code> 以根据需要添加任意数量的文件。</p>
+
+<h3 id="python-module">Python 模块</h3>
+<p>要扩展发布工具,请编写工具(如果有)可以调用的 Python 模块(必须命名为 releasetools.py)。示例:</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/releasetools.py
+</pre>
+<pre class="prettyprint">
+import common
+
+def FullOTA_InstallEnd(info):
+  # copy the data into the package.
+  tardis_dat = info.input_zip.read("RADIO/tardis.dat")
+  common.ZipWriteStr(info.output_zip, "tardis.dat", tardis_dat)
+
+  # emit the script code to install this data on the device
+  info.script.AppendExtra(
+      """tardis.reprogram("the-key", package_extract_file("tardis.dat"));""")
+</pre>
+
+<p>独立的函数可以处理生成增量 OTA 更新包的情况。在本例中,假设您只需要在两个版本号之间的 tardis.dat 文件发生更改时重新编程 tardis。</p>
+<pre class="prettyprint">
+def IncrementalOTA_InstallEnd(info):
+  # copy the data into the package.
+  source_tardis_dat = info.source_zip.read("RADIO/tardis.dat")
+  target_tardis_dat = info.target_zip.read("RADIO/tardis.dat")
+
+  if source_tardis_dat == target_tardis_dat:
+      # tardis.dat is unchanged from previous build; no
+      # need to reprogram it
+      return
+
+  # include the new tardis.dat in the OTA package
+  common.ZipWriteStr(info.output_zip, "tardis.dat", target_tardis_dat)
+
+  # emit the script code to install this data on the device
+  info.script.AppendExtra(
+      """tardis.reprogram("the-key", package_extract_file("tardis.dat"));""")
+</pre>
+
+<h4 id="module-functions">模块函数</h4>
+<p>您可以在模块中提供以下函数(仅实现所需函数)。</p>
+<dl>
+<dt><code>FullOTA_Assertions()</code></dt>
+<dd>在即将开始生成完整 OTA 时调用。此时非常适合发出 (emit) 关于设备当前状态的断言。请勿发出 (emit) 对设备进行更改的脚本命令。</dd>
+<dt><code>FullOTA_InstallBegin()</code></dt>
+<dd>在关于设备状态的断言都已传递但尚未进行任何更改时调用。您可以发出 (emit) 用于设备专属更新的命令(必须在设备上的其他内容发生更改之前运行)。</dd>
+<dt><code>FullOTA_InstallEnd()</code></dt>
+<dd>在脚本生成流程结束且已发出 (emit) 脚本命令(用于更新 boot 和 boot 分区)后调用。您还可以发出 (emit) 用于设备专属更新的其他命令。</dd>
+<dt><code>IncrementalOTA_Assertions()</code></dt>
+<dd>与 <code>FullOTA_Assertions()</code> 类似,但在生成增量更新包时调用。</dd>
+<dt><code>IncrementalOTA_VerifyBegin()</code></dt>
+<dd>在关于设备状态的断言都已传递但尚未进行任何更改时调用。您可以发出 (emit) 用于设备专属更新的命令(必须在设备上的其他任何内容发生更改之前运行)。</dd>
+<dt><code>IncrementalOTA_VerifyEnd()</code></dt>
+<dd>在验证阶段结束且脚本确认即将接触的文件具有预期开始内容时调用。此时,设备上的内容尚未发生任何更改。您还可以发出 (emit) 用于��他设备专属验证的代码。</dd>
+<dt><code>IncrementalOTA_InstallBegin()</code></dt>
+<dd>在要修补的文件已被验证为具有预期 before 状态但尚未进行任何更改时调用。<i></i>您可以发出 (emit) 用于设备专属更新的命令(必须在设备上的其他任何内容发生更改之前运行)。</dd>
+<dt><code>IncrementalOTA_InstallEnd()</code></dt>
+<dd>与其完整的 OTA 更新包类似的是,这项函数在脚本生成结束阶段且已发出 (emit) 用于更新 boot 和 system 分区的脚本命令后调用。您还可以发出 (emit) 用于设备专属更新的其他命令。</dd>
+</dl>
+
+<p class="note"><strong>注意</strong>:如果设备电量耗尽了,OTA 安装可能会从头重新开始。请准备好针对已全部或部分运行这些命令的设备进行相应的操作。</p>
+
+<h4 id="pass-functions-to-info">将函数传递到 info 对象</h4>
+<p>将函数传递到包含各种实用项的单个 info 对象:
+</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
+</code> 对象(安装增量包时版本号已在设备上)。</li>
+<li><b>info.target_zip</b>:(仅限增量 OTA)目标 target-files .zip 的 <code>zipfile.ZipFile
+</code> 对象(增量包置于设备上的版本号)。</li>
+<li><b>info.output_zip</b>:正在创建的更新包;为进行写入而打开的 <code>zipfile.ZipFile
+</code> 对象。使用 common.ZipWriteStr(info.output_zip、<i>filename</i>、<i>data</i>)将文件添加到文件包。</li>
+<li><b>info.script</b>:可���附加命令的目标脚本对象。调用 <code>info.script.AppendExtra(<i>script_text</i>)</code> 以将文本输出到脚本中。请确保输出文本以分号结尾,这样就不会运行到随后发出 (emit) 的命令中。</li>
+</ul>
+
+<p>有关 info 对象的详细信息,请参阅<a href="http://docs.python.org/library/zipfile.html">针对 ZIP 归档的 Python 软件基础文档</a>。</p>
+
+<h4 id="specify-module-location">指定模块位置</h4>
+<p>指定您设备的 releasetools.py 脚本在 BoardConfig.mk 文件中的位置:</p>
+
+<pre class="devsite-click-to-copy">
+device/yoyodyne/tardis/BoardConfig.mk
+</pre>
+
+<pre class="devsite-click-to-copy">
+ [...]
+
+TARGET_RELEASETOOLS_EXTENSIONS := device/yoyodyne/tardis
+</pre>
+
+<p>如果未设置 TARGET_RELEASETOOLS_EXTENSIONS,则默认位置为 <code>
+$(TARGET_DEVICE_DIR)/../common</code> 目录(在本例中为 <code>device/yoyodyne/common
+</code>)。最好明确指定 releasetools.py 脚本的位置。编译 tardis 设备时,releasetools.py 脚本会包含在 target-files .zip 文件 (<code>META/releasetools.py
+</code>) 中。</p>
+<p>当您运行发布工具(<code>img_from_target_files</code> 或 <code>ota_from_target_files</code>)时,target-files .zip 中的 releasetools.py 脚本(如果存在)将优先于 Android 源代码树中的脚本而执行。您还可以通过优先级最高的 <code>-s</code>(或 <code>--device_specific</code>)选项明确指定设备专属扩展程序的路径。这样一来,您就可以在发布工具扩展程序中更正错误及做出更改,并将这些更改应用于旧的目标文件。</p>
+<p>现在,当您运行 <code>ota_from_target_files</code> 时,它会自动从 target_files .zip 文件获取设备专属模块,并在生成 OTA 更新包时使用该模块:</p>
+
+<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</code>
+</pre>
+
+<p>或者,您可以在运行 <code>ota_from_target_files</code> 时指定设备专属扩展程序。</p>
+
+<pre class="devsite-click-to-copy">
+<code class="devsite-terminal">./build/tools/releasetools/ota_from_target_files -s device/yoyodyne/tardis -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip</code>
+</pre>
+
+<p class="note"><strong>注意</strong>:如需查看完整的选项��表,请参阅 <code>
+build/tools/releasetools/ota_from_target_files</code> 中的 <code>ota_from_target_files</code> 注释。</p>
+
+<h2 id="sideloading">旁加载</h2>
+<p>恢复系统采用<b>旁加载</b>机制,可手动安装更新包(无需主系统通过无线方式下载)。旁加载有助于在主系统无法启动的设备上进行调试或更改。</p>
+<p>一直以来,旁加载都是通过将更新包下载到设备的 SD 卡上而完成,如果设备无法启动,则可以使用其他计算机将更新包放于 SD 卡上,然后将 SD 卡插入设备中。为了支持没有可拆卸外部存储设备的 Android 设备,恢复系统还支持另外两种旁加载机制:从 cache 分区加载更新包,以及使用 adb 通过 USB 进行加载。</p>
+<p>要调用每种旁加载机制,您设备的 <code>
+Device::InvokeMenuItem()</code> 方法可以返回以下 BuiltinAction 值:</p>
+
+<ul>
+<li><b>APPLY_EXT</b>:从外部存储设备(<code>
+/sdcard</code> 目录)旁加载更新包。您的 recovery.fstab 必须定义 <code>/sdcard
+</code> 装载点。这在通过符号链接到 <code>/data</code> 来模拟 SD 卡(或其他类似机制)的设备上不可用。<code>/data
+</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>
+</ul>
+
+<p>一些注意事项:</p>
+<ul>
+<li>仅支持 USB 传输。</li>
+<li>如果您的恢复系统可以正常运行 adbd(对于 userdebug 和 eng 版本来说通常是这样),则会在设备处于 adb 旁加载模式时关闭,并将在 adb 旁加载完成接收更新包后重新启动。在 adb 旁加载模式下,只有 <code>sideload</code> 命令可以发挥作用(<code>logcat</code>、<code>reboot</code>、<code>push</code>、<code>pull</code>、<code>shell</code> 等都不起作用)。</li>
+<li>您无法在设备上退出 adb 旁加载模式。要终止,您可以将 <code>/dev/null</code>(或有效��新包以外的其他任何文件)作为更新包进行发送,然后设备将无法对其进行验证,并会停止安装程序。RecoveryUI 实现的 <code>CheckKey()</code> 方法将继续为按键所调用,因此,您可以提供可重新启动设备并在 adb 旁加载模式下运行的按键序列。</li>
+</ul>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/nonab/index.html b/zh-cn/devices/tech/ota/nonab/index.html
new file mode 100644
index 0000000..a5bbbbc
--- /dev/null
+++ b/zh-cn/devices/tech/ota/nonab/index.html
@@ -0,0 +1,150 @@
+<html devsite><head>
+    <title>非 A/B 系统更新</title>
+    <meta name="project_path" value="/_project.yaml"/>
+    <meta name="book_path" value="/_book.yaml"/>
+  </head>
+  <body>
+  <!--
+      Copyright 2017 The Android Open Source Project
+
+      Licensed under the Apache License, Version 2.0 (the "License");
+      you may not use this file except in compliance with the License.
+      You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+      Unless required by applicable law or agreed to in writing, software
+      distributed under the License is distributed on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      See the License for the specific language governing permissions and
+      limitations under the License.
+  -->
+
+    <p>在老款的没有 A/B 分区的 Android 设备上,闪存空间通常包含以下分区:</p>
+
+    <dl>
+      <dt>引导</dt>
+      <dd>
+        包含 Linux 内核和最小的根文件系统(加载到 RAM 磁盘)。它装载了系统和其它分区,并启动位于系统分区上的运行时。
+      </dd>
+
+      <dt>系统</dt>
+      <dd>
+        包含在 Android 开源项目 (AOSP) 上提供源代码的系统应用和库。在正常操作期间,此分区被装载为只读分区;其内容仅在 OTA 更新期间更改。
+      </dd>
+
+      <dt>供应商</dt>
+      <dd>
+        包含在 Android 开源项目 (AOSP) 上<em>未</em>提供源代码的系统应用和库。在正常操作期间,此分区被装载为只读分区;其内容仅在 OTA 更���期间更改。
+      </dd>
+
+      <dt>用户数据</dt>
+      <dd>
+        存储由用户安装的应用所保存的数据等。OTA 更新过程通常不会触及该分区。
+      </dd>
+
+      <dt>缓存</dt>
+      <dd>
+        几个应用使用的临时保留区域(访问此分区需要使用特殊的应用权限),用于存储下载的 OTA 更新包。其他程序也可使用该空间,但是此类文件可能会随时消失。安装某些 OTA 更新包可能会导致此分区被完全擦除。缓存还包含 OTA 更新的更新日志。
+      </dd>
+
+      <dt>恢复</dt>
+      <dd>
+        包含第二个完整的 Linux 系统,其中包括一个内核和特殊的恢复二进制文件(该文件可读取一个软件包并使用其内容来更新其他分区)。
+      </dd>
+
+      <dt>其他</dt>
+      <dd>
+        执行恢复操作时使用的微小分区,可在应用 OTA 更新包并重新启动设备时,隐藏某些进程的信息。
+      </dd>
+    </dl>
+
+    <h2 id="life-ota-update">OTA 更新过程</h2>
+
+      <p>典型 OTA 更新包含以下步骤:</p>
+
+      <ol>
+        <li>
+          设备会与 OTA 服务器进行定期确认,并被告知是否有更新可用,包括更新软件包的 URL 和向用户显示的描述字符串。
+        </li>
+        <li>
+          将更新下载到缓存或��据分区,并根据 <code>/system/etc/security/otacerts.zip</code> 中的证书验证加密签名。系统提示用户安装更新。
+        </li>
+        <li>
+          设备重新启动进入恢复模式,引导恢复分区中的内核和系统启动,而非引导分区中的内核。
+        </li>
+        <li>
+          恢复分区的二进制文件由 init 启动。它会在 <code>/cache/recovery/command</code> 中寻找将其指向下载软件包的命令行参数。
+        </li>
+        <li>
+          恢复操作会根据 <code>/res/keys</code> (包含在恢复分区中的 RAM 磁盘的一部分)中的公钥来验证软件包的加密签名。
+        </li>
+        <li>
+          从软件包中提取数据,并根据需要使用该数据更新引导、系统和/或供应商分区。系统分区上其中一个新文件包含新恢复分区内容。
+        </li>
+        <li>设备正常重启。
+          <ol style="list-style-type:lower-alpha">
+            <li>
+              加载最新更新的引导分区,在最新更新的系统分区中装载并开始执行二进制文件。
+            </li>
+            <li>
+              作为正常启动的一部分,系统会根据所需内容(预先存储为 <code>/system</code> 中的一个文件)检查恢复分区的内容。二者内容不同,所以恢复分区会被所需内容重新刷写(在后续引导中,恢复分区已经包含新内容,因此无需重新刷写)。
+            </li>
+          </ol>
+        </li>
+      </ol>
+
+      <p>系统更新完成!更新日志可以在 <code>/cache/recovery/last_log.<var>#</var></code> 中找到。</p>
+
+    <h2 id="migrating">从更早版本迁移</h2>
+
+      <p>
+        当从 Android 2.3/3.0/4.0 版本进行迁移时,主要变化是将设备专属的功能从一组具有预定义名称的 C 函数转换为 C++ 对象。下表列出了用途大致相同的旧函数和新方法:
+      </p>
+
+      <table>
+        <tbody><tr>
+          <th>C 函数</th>
+          <th>C ++ 方法</th>
+        </tr>
+
+        <tr>
+          <td>device_recovery_start()</td>
+          <td>Device::RecoveryStart()</td>
+        </tr>
+
+        <tr>
+          <td>device_toggle_display()<br />
+          device_reboot_now()<br />
+          </td>
+          <td>RecoveryUI::CheckKey()<br />
+          (also RecoveryUI::IsKeyPressed())<br />
+          </td>
+        </tr>
+
+        <tr>
+          <td>device_handle_key()</td>
+          <td>Device::HandleMenuKey()</td>
+        </tr>
+
+        <tr>
+          <td>device_perform_action()</td>
+          <td>Device::InvokeMenuItem()</td>
+        </tr>
+
+        <tr>
+          <td>device_wipe_data()</td>
+          <td>Device::WipeData()</td>
+        </tr>
+
+        <tr>
+          <td>device_ui_init()</td>
+          <td>ScreenRecoveryUI::Init()</td>
+        </tr>
+      </tbody></table>
+
+      <p>
+        将旧函数转化为新方法应尽量简单直观。不要忘记添加新的 <code>make_device()</code> 函数来创建并返回新设备子类的实例。
+      </p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/nonab/inside_packages.html b/zh-cn/devices/tech/ota/nonab/inside_packages.html
new file mode 100644
index 0000000..7f0ee74
--- /dev/null
+++ b/zh-cn/devices/tech/ota/nonab/inside_packages.html
@@ -0,0 +1,155 @@
+<html devsite><head>
+    <title>OTA 软件包内部</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>bootable/recovery/updater
+</code> 构建更新程序二进制文件并将其用于 OTA 更新包。</p>更新包本身是包含可执行二进制文件 <code>META-INF/com/google/android/update-binary
+</code> 的 .zip 文件(<code>ota_update.zip</code>、<code>incremental_ota_update.zip</code>)。
+
+<p>更新程序包含多个内建函数和一个可扩展脚本语言 (<b>Edify</b>) 解释器,该脚本语言支持用于执行更新相关的典型任务的命令。更新程序会从 .zip 压缩包文件中查找 <code>META-INF/com/google/android/updater-script</code> 文件中的脚本。</p>
+
+<p class="note"><strong>注意</strong>:Edify 脚本和/或内建函数并不常用,但当您需要调试更新文件时会很有用。</p>
+
+<h2 id="edify-syntax">Edify 语法</h2>
+<p>Edify 脚本是一个单一的表达式,其中的所有值都是字符串。从布尔值角度考虑,空字符串为 False,其他所有字符串均为 True。<i></i><i></i>Edify 支持以下运算符(具有常规含义):</p>
+
+<pre>
+(<i>expr</i> )
+ <i>expr</i> <b>+</b> <i>expr</i>  # string concatenation, not integer addition
+ <i>expr</i> <b>==</b> <i>expr</i>
+ <i>expr</i> <b>!=</b> <i>expr</i>
+ <i>expr</i> <b>&amp;&amp;</b> <i>expr</i>
+ <i>expr</i> <b>||</b> <i>expr</i>
+ ! <i>expr</i>
+ if <i>expr</i> <b>then</b> <i>expr</i> <b>endif</b>
+ if <i>expr</i> <b>then</b> <i>expr</i> <b>else</b> <i>expr</i> <b>endif</b>
+ <i>function_name</i><b>(</b><i>expr</i><b>,</b> <i>expr</i><b>,</b><i>...</i><b>)</b>
+ <i>expr</i><b>;</b> <i>expr</i>
+</pre>
+
+<p><i></i>由 a-z、A-Z、0-9、_、:、/、. 组成的任何字符串,只要不属于非保留字,均视为字符串字面值。(保留字为 <b>if else</b> then <b>endif</b>。)字符串字面值也可以用双引号引起来;通过这种方法可以使用空格和上述集合之外的其他字符来创建值。\n、\t、\" 和 \\ 充当带引号的字符串中的转义字符,\x## 亦如此。<i></i></p>
+<p>&amp;&amp; 和 || 为短路运算符;如果逻辑结果由左侧确定,则不评估右侧。下���两个表达式是对等的:</p>
+<pre>
+<i>e1</i> <b>&amp;&amp;</b> <i>e2</i>
+<b>if</b> <i>e1</i> <b>then</b> <i>e2</i> <b>endif</b></pre>
+<p>分号“;”运算符是序列点;表示要先评估左侧,再评估右侧。它的值是右侧表达式的值。分号也可以出现在表达式之后,其效果与 C 风格语句相仿:</p>
+
+<pre>
+<b>prepare();
+do_other_thing("argument");
+finish_up();</b>
+</pre>
+
+<h2 id="builtin-functions">内建函数</h2>
+<p>大部分更新功能都包含在可供脚本执行的函数中。(严格来说,这些是“宏”,而不是 Lisp 意义上的函数,因为它们不需要评估所有参数。)<i></i><i></i>除非另有说明,函数在��功时返回 <b>True</b>,出错时返回 <b>False</b>。如果您希望在出错时中止脚本执行,请使用 <code>abort()</code> 和/或 <code>assert()</code> 函数。您也可以扩展更新程序中的可用函数集,以提供<a href="/devices/tech/ota/nonab/device_code.html">特定于设备的功能</a>。
+
+</p><dl>
+<dt><code>abort([<i>msg</i>])</code></dt>
+<dd>使用可选的 msg 立即中止脚本执行。<i></i>如果用户开启了文本显示功能,msg 将出现在恢复日志和屏幕上。<i></i></dd>
+<dt><code>assert(<i>expr</i>[, <i>expr</i>, ...])</code></dt>
+<dd>依序评估每个 expr。<i></i>如果出现 false,则立即中止执行并显示“assert failed”和失败的表达式的源文本。</dd>
+<dt><code>apply_patch(<i>src_file</i>, <i>tgt_file</i>, <i>tgt_sha1</i>, <i>
+tgt_size</i>, <i>patch1_sha1</i>, <i>patch1_blob</i>, [...])</code></dt>
+<dd>将二进制补丁程序应用于 src_file 以生成 tgt_file。<i></i><i></i>如果设定的目标文件与源文件相同,则传递“-”作为 tgt_file。tgt_sha1 和 tgt_size 分别是目标文件的预期最终 SHA1 哈希值和文件大小。<i></i><i></i><i></i>其余参数必须成对出现:一个 SHA1 哈希值(40 个字符的十六进制字符串)和一个 Blob。如果源文件当前的内容具有给定的 SHA1,该 Blob 即为要应用的补丁程序。
+<p>打补丁以一种安全的方式完成,该方式可保证目标文件要么具有所需的 SHA1 哈希值和大小,要么不发生变化,而不会处于不可恢复的中间状态。如果在打补丁过程中进程中断,目标文件可能会处于中间状态;这时缓存分区中会存在一个副本,重新启动更新便可成功更新文件。</p>
+<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>),
+<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>
+<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>重新格式化给定的分区。支持的分区类型如下:
+<ul>
+<li>fs_type =“yaffs2”和 partition_type =“MTD”。Location 必须为 MTD 分区的名称;将在该位置构建一个空的 yaffs2 文件系统。其余参数未使用。</li>
+<li>fs_type =“ext4”和 partition_type =“EMMC”。Location 必须为该分区的设备文件。将在该位置构建一个空的 ext4 文件系统。<i></i>如果 fs_size 为零,则文件系统将占用整个分区。<i></i>如果 fs_size 为正数,则文件系统将占用分区的前 fs_size 个字节。<i></i>如果 fs_size 为负数,则文件系统将占用分区中除最后 |fs_size| 个字节以外的所有字节。<i></i><i></i></li>
+<li>fs_type =“f2fs” 和 partition_type =“EMMC”。Location 必须为该分区的设备文件。fs_size<i></i> 必须为非负数。<i></i>如果 fs_size 为零,则文件系统将占用整个分区。如果 fs_size 为正数,则文件系统将占用分区的前 fs_size 个字节。<i></i><i></i></li>
+<li>mount_point 应为文件系统的未来挂载点。</li></ul>
+</dd>
+<dt><code>getprop(<i>key</i>)</code></dt>
+<dd>返回系统属性 key 的值(或者,如果未定义,则返回空字符串)。<i></i>由恢复分区定义的系统属性值未必与主系统属性值相同。此函数返回恢复分区中的值。</dd>
+<dt><code>greater_than_int(<i>a</i>, <i>b</i>)</code></dt>
+<dd>当且仅当 (iff) a(解析为整数)大于 b(解析为整数)时,才返回 True。<i></i><i></i></dd>
+<dt><code>ifelse(<i>cond</i>, <i>e1</i>[, <i>e2</i>])</code></dt>
+<dd>评估 cond,如果为 True,则评估并返回 e1 的值,否则评估并返回 e2(如果存在)。<i></i><i></i><i></i>“if ... else ... then ... endif”结构就是此函数的语法糖。</dd>
+<dt><code>is_mounted(<i>mount_point</i>)</code></dt>
+<dd>当且仅当 mount_point 挂载了文件系统时,才返回 True。<i></i></dd>
+<dt><code>is_substring(<i>needle</i>, <i>haystack</i>)</code></dt>
+<dd>当且仅当 needle 是 haystack 的子字符串时,才返回 True。<i></i><i></i></dd>
+<dt><code>less_than_int(<i>a</i>, <i>b</i>)</code></dt>
+<dd>当且仅当 a(解析为整数)小于 b(解析为整数)时,才返回 True。<i></i><i></i></dd>
+<dt><code>mount(<i>fs_type</i>, <i>partition_type</i>, <i>name</i>,
+<i>mount_point</i>)</code></dt>
+<dd>在 mount_point 挂�� fs_type 的文件系统。<i></i><i></i>
+partition_type<i></i> 必须为以下类型之一:<ul>
+<li><b>MTD</b>。Name 是 MTD 分区的名称(例如:system、userdata;有关完整列表,请参见设备上的 <code>/proc/mtd</code>)。</li>
+<li><b>EMMC。</b></li>
+</ul>
+<p>默认情况下,恢复分区不挂载任何文件系统(如果用户正在手动从 SD 卡安装软件包,则 SD 卡除外);您的脚本必须挂载需要修改的所有分区。</p></dd>
+<dt><code>package_extract_dir(<i>package_dir</i>, <i>dest_dir</i>)</code></dt>
+<dd>从 package_dir 下的文件包中提取所有文件,并将它们写入 dest_dir 下相应的树形结构中。<i></i><i></i>所有现有文件都将被覆盖。</dd>
+<dt><code>package_extract_file(<i>package_file</i>[, <i>dest_file</i>])</code>
+</dt>
+<dd>从更新包中提取单个 package_file 并将其写入 dest_file,如有必要,覆盖现有文件。<i></i><i></i>在没有 dest_file 参数的情况下,将更新包文件的内容作为二进制 blob 返回。<i></i></dd>
+<dt><code>read_file(<i>filename</i>)</code></dt>
+<dd>读取 filename 并将其内容作为二进制 blob 返回。<i></i></dd>
+<dt><code>run_program(<i>path</i>[, <i>arg</i>, ...])</code></dt>
+<dd>在 path 上执行二进制文件并传入 arg。<i></i><i></i>返回程序的退出状态。</dd>
+<dt><code>set_progress(<i>frac</i>)</code></dt>
+<dd>在最近的 <code>show_progress()</code> 调用所定义的块内设置进度条的位置。frac 必须介于 [0.0,1.0] 之间。<i></i>进度条从不向后移动;向后移动的尝试会被忽略。</dd>
+<dt><code>sha1_check(<i>blob</i>[, <i>sha1</i>])</code></dt>
+<dd>“blob”<i></i>参数是 <code>
+read_file()</code> 返回的类型的 blob 或 <code>package_extract_file()
+</code> 的单参数形式的 blob。在没有 sha1 参数的情况下,此函数返回 blob 的 SHA1 哈希值(作为 40 位十六进制字符串)。<i></i>在提供了一个或多个 sha1 参数的情况下,如果 SHA1 哈希值等于其中一个参数,则该函数返回此 SHA1 哈希值;如果与任何一个参数都不相等,则返回空字符串。<i></i></dd>
+<dt><code>show_progress(<i>frac</i>, <i>secs</i>)</code></dt>
+<dd>在 secs 秒(必须为整数)内推动进度条向前移动下一个 frac 的长度。secs 可为 0,在这种情况下,进度条不会自动向前移动,而是通过使用上面所定义的 <code>
+set_progress()</code> 函数实现进度递增。<i></i><i></i><i></i></dd>
+<dt><code>sleep(<i>secs</i>)</code></dt>
+<dd>休眠 secs 秒(必须为整数)。<i></i></dd>
+<dt><code>stdout(<i>expr</i>[, <i>expr</i>, ...])</code></dt>
+<dd>评估每个表达式并将其值转储到 stdout。这在调试时很有用。</dd>
+<dt><code>tune2fs(<i>device</i>[, <i>arg</i>, …])</code></dt>
+<dd>调整 device 上的可调参数 arg。<i></i><i></i></dd>
+<dt><code>ui_print([<i>text</i>, ...])</code></dt>
+<dd>连接所有 text 参数并将结果输出到界面(如果用户已开启文本显示功能,界面上将显示该结果)。<i></i></dd>
+<dt><code>unmount(<i>mount_point</i>)</code></dt>
+<dd>将挂载在 mount_point 上的文件系统卸载。<i></i></dd>
+<dt><code>wipe_block_device(<i>block_dev</i>, <i>len</i>)</code></dt>
+<dd>擦除给定块设备 block_dev 的 len 个字节。<i></i><i></i></dd>
+<dt><code>wipe_cache()</code></dt>
+<dd>可实现在安装过程成功结束时擦除缓存分区。</dd>
+<dt><code>write_raw_image(<i>filename_or_blob</i>, <i>partition</i>)</code>
+</dt>
+<dd>将 filename_or_blob 中的映像写入 MTD 分区。<i></i><i></i>
+filename_or_blob 可以是一个指代本地文件的字符串或一个包含要写入的数据的 blob 值参数。<i></i>要将文件从 OTA 包复制到分区,请使用:<code>write_raw_image(package_extract_file("zip_filename"), "partition_name");
+</code>
+</dd>
+</dl>
+
+<p class="note"><strong>注意</strong>:对于 Android 4.1 之前的版本,仅接受 filename。因此要完成该操作,必须先将数据解压到临时本地文件中。</p>
+
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/ota/sign_builds.html b/zh-cn/devices/tech/ota/sign_builds.html
index bd0c9a4..700b7bd 100644
--- a/zh-cn/devices/tech/ota/sign_builds.html
+++ b/zh-cn/devices/tech/ota/sign_builds.html
@@ -39,7 +39,7 @@
 <code class="devsite-terminal">mkdir ~/.android-certs</code>
 <code class="devsite-terminal">for x in releasekey platform shared media; do \
     ./development/tools/make_key ~/.android-certs/$x "$subject"; \
-done</code>
+  done</code>
 </pre>
 
 <p>您需要对 <code>$subject</code> 进行更改以反映贵组织的信息。您可以使用任何目录,但要注意选择一个已备份且安全的位置。部分供应商会使用强密码加密私钥,并将其存储在源代码控制系统中;其他供应商则将他们的发布密钥完全存储在其他地方,如气隙阻隔的计算机上。</p>
diff --git a/zh-cn/devices/tech/ota/tools.html b/zh-cn/devices/tech/ota/tools.html
index 01a3154..09e5591 100644
--- a/zh-cn/devices/tech/ota/tools.html
+++ b/zh-cn/devices/tech/ota/tools.html
@@ -54,7 +54,7 @@
 </pre>
 
 <p>该版本与上一个版本非常类似,而且增量更新软件包(约 1 MB)比对应的完整更新软件包 (60 MB) 小得多。</p>
-<p class="note"><strong>注意</strong>:要为后续更新生成<a href="/devices/tech/ota/block.html">基于块的 OTA</a>,请将 <code>--block</code> 选项传递到 <code>ota_from_target_files</code>。</p>
+<p class="note"><strong>注意</strong>:要为后续更新生成<a href="/devices/tech/ota/nonab/block.html">基于块的 OTA</a>,请将 <code>--block</code> 选项传递到 <code>ota_from_target_files</code>。</p>
 <p>仅当设备运行的上一个版本与相应增量更新软件包的起点版本完全一样时,才向其分发该增量更新软件包。如果尝试在运行其他版本的设备上安装该增量包,系统将会显示恢复错误图标。此时用户只要重新启动设备,即可回到旧系统;软件包会先验证它要更新的所有文件是否已回到之前的状态,然后再对其执行操作,因此,如果发生上述情况,设备不应留在半升级状态。</p>
 
 <h2 id="update-packages">更新软件包</h2>
@@ -65,6 +65,6 @@
 <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/nonab/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 2b411cf..907addf 100644
--- a/zh-cn/devices/tech/perf/boot-times.html
+++ b/zh-cn/devices/tech/perf/boot-times.html
@@ -212,15 +212,9 @@
 <h3 id="deferring-initialization">延迟初始化</h3>
 
 <p>
-很多进程都在设备启动期间启动,但只有关键路径 (bootloader &gt; kernel &gt; init &gt; file system mount &gt; zygote &gt; system server) 中的组件才会直接影响启动时间。在内核启动期间分析 <strong>initcall</strong> 的执行来识别对启动 init 进程不重要的外设/组件,然后将这些外设/组件延迟到启动过程的后期来启动。
+很多进程都在设备启动期间启动,但只有���键路径 (bootloader &gt; kernel &gt; init &gt; file system mount &gt; zygote &gt; system server) 中的组件才会直接影响启动时间。在内核启动期间执行 <strong>initcall</strong> 来识别对启动 init 进程不重要的外设/组件,然后将这些外设/组件延迟到启动过程的后期来启动。
 </p>
 
-<pre
-class="prettyprint">
-BoardConfig-common.mk:
-    BOARD_KERNEL_CMDLINE += initcall_debug ignore_loglevel
-</pre>
-
 <h2 id="optimizing-i-o-efficiency">优化 I/O 效率</h2>
 
 <p>
@@ -556,4 +550,4 @@
 <strong>注意</strong>:Chrome 无法处理过大的文件。请考虑使用 <code>tail</code>、<code>head</code> 或 <code>grep</code> 分割 <code>boot_trace</code> 文件,以获得必要的部分。由于事件过多,I/O 分析通常需要直接��析获取的 <code>boot_trace</code>。
 </p>
 
-</body></html>
+</body></html>
\ No newline at end of file
diff --git a/zh-cn/devices/tech/perf/low-ram.html b/zh-cn/devices/tech/perf/low-ram.html
index 872ce00..fa0e34e 100644
--- a/zh-cn/devices/tech/perf/low-ram.html
+++ b/zh-cn/devices/tech/perf/low-ram.html
@@ -28,21 +28,21 @@
 
 <h3 id="opt-mgmt">改善了内存管理</h3>
 <ul>
-<li>验证了可节省内存的内核配置:内核同页合并 (KSM) 和交换到 ZRAM。</li>
+<li>采用了经验证可节省内存的内核配置:交换到 ZRAM。</li>
 <li>终止那些即将被取消缓存且过大的缓存进程。</li>
-<li>不允许大型服务自行返回至 A 服务(以免导致启动器终止)。</li>
+<li>不允许大型服务自行返回至 A 服务状态(以免导致启动器终止)。</li>
 <li>终止那些处于空闲维护状态中的过大进程(甚至终止当前 IME 等通常不可终止的进程)。</li>
 <li>对后台服务的启动进行序列化。</li>
-<li>微调了低内存设备的内存使用情况:采用更严格的内存不足 (OOM) 调整级别、缩减图形缓存大小,等等。</li>
+<li>优化了低内存设备的内存使用方式:采用更严格的内存不足 (OOM) 调整级别、缩减图形缓存大小,等等。</li>
 </ul>
 
-<h3 id="opt-mem">减少了系统内存</h3>
+<h3 id="opt-mem">减少了系统内存占用</h3>
 <ul>
 <li>删减了 system_server 和 SystemUI 进程(节省了几兆的内存)。</li>
 <li>在 Dalvik 中预加载 dex 缓存(节省了几兆的内存)。</li>
-<li>验证了 JIT-off 选项(每个进程最多可节省 1.5MB 的内存)。</li>
+<li>采用了经验证的 JIT-off 选项(每个进程最多可节省 1.5MB 的内存)。</li>
 <li>减少了各进程的字体缓存开销。</li>
-<li>引入了占用内存更小的 ArrayMap/ArraySet,并在框架中广泛地使用其来替代 HashMap/HashSet。</li>
+<li>引入了占用内存更少的 ArrayMap/ArraySet,并在框架中广泛地使用其来替代 HashMap/HashSet。</li>
 </ul>
 
 <h3 id="opt-proc">Procstats</h3>
@@ -52,46 +52,36 @@
 
 <h3 id="opt-api">API</h3>
 <p>
-新增了 ActivityManager.isLowRamDevice(),使应用不仅能够检测是否是在低内存设备上运行,还能选择停用那些占用内存较大的功能。
+新增了 ActivityManager.isLowRamDevice(),使应用不仅能够检测是否是在低内存设备上运行,还能选择停用那些占用内存较多的功能。
 </p>
 
 <h3 id="opt-track">内存跟踪</h3>
 <p>
-新的 memtrack HAL 可以跟踪图形内存分配情况、<code>dumpsys</code> meminfo 中的其他信息,以及 meminfo 中的阐明性总结(例如,所报告的可用内存包括缓存进程的内存,这样 OEM 就不会试图优化错误的对象)。
+新的 memtrack HAL 可以跟踪图形内存分配情况、<code>dumpsys</code> meminfo 中的更多信息,以及 meminfo 中的阐明性总结(例如,所报告的可用内存包括缓存进程占用的内存,这样 OEM 就不会搞错优化对象)。
 </p>
 
 <h2 id="build-time">编译时配置</h2>
 <h3 id="flag">启用低内存设备标志</h3>
-<p>我们引入了一个称为 <code>ActivityManager.isLowRamDevice()</code> 的新 API,以便应用能够确定是否应关闭在低内存设备上表现非常差的特定内存密集型功能。</p>
+<p>我们引入了 <code>ActivityManager.isLowRamDevice()</code> 这个新 API,以便应用确定是否应关闭在低内存设备上表现非常差的某些内存密集型功能。</p>
 <p>对于内存为 512MB 的设备,该 API 应返回 <code>true</code>。可以通过在设备 makefile 中使用以下系统属性来启用该 API:</p>
 <pre class="devsite-click-to-copy">
 PRODUCT_PROPERTY_OVERRIDES += ro.config.low_ram=true
 </pre>
 
-<h3 id="jit">停用 JIT</h3>
-
-  <p>系统级的 JIT 内存使用情况取决于正在运行的应用的数量以及这些应用的代码所占用的空间。JIT ���为编译后代码的缓存设定大小上限,并会根据需要处理其中的页面。在典型的运行系统中,JIT 会占用 3M 到 6M 的内存。<br />
-  <br />
-大型应用往往很快就会达到代码缓存大小上限(默认情况下向来都是 1M)。平均来说,每个应用的 JIT 缓存使用量会介于 100K 和 200K 字节之间。减小缓存的大小上限在某种程度上有助于改进内存使用情况,但如果将这一上限设得过低,则会将 JIT 置于颠簸模式。对于内存确实很低的设备,我们建议完全停用 JIT。</p>
-
-<p>若要完全停用 JIT,请在产品 makefile 中添加下面这行内容:</p>
-<pre class="devsite-click-to-copy">
-PRODUCT_PROPERTY_OVERRIDES += dalvik.vm.jit.codecachesize=0
-</pre>
 <h3 id="launcher">启动器配置</h3>
 
-  <p>请务必确保启动器上的默认壁纸设置<strong>未</strong>使用动态壁纸。低内存设备不应预安装任���动态壁纸。</p>
+  <p>请务必确保启动器的默认壁纸设置<strong>未</strong>使用动态壁纸。低内存设备不应预装任何动态壁纸。</p>
 
 <h2 id="kernel">内核配置</h2>
-<h3 id="kernel-tuning">微调内核/ActivityManager 以减少直接回收</h3>
+<h3 id="kernel-tuning">优化内核/ActivityManager 以减少直接回收</h3>
 
-  <p>当进程或内核尝试分配(直接分配或因新页面中存在故障而分配)内存页面并且内核已用尽所有可用内存时,就会发生直接回收。在这种情况下,内核便需要阻止分配并释放一个页面,而这通常又需要磁盘 I/O 清理一个有文件支持的脏页或等待 <code>lowmemorykiller</code> 终止一个进程。最终可能会导致任意线程(包括界面线程)中出现额外 I/O。</p>
+  <p>当进程或内核尝试分配(直接分配��因新页面中存在故障而分配)内存页面并且内核已用尽所有可用内存时,就会发生直接回收。在这种情况下,内核需要释放一个页面,并在此过程中阻断分配操作。而这通常又需要磁盘 I/O 清理一个有文件支持的脏页或等待 <code>lowmemorykiller</code> 终止一个进程。最终可能会导致任意线程(包括界面线程)中出现额外 I/O。</p>
 
   <p>为避免出现直接回收,内核已配有可触发 <code>kswapd</code> 或后台回收的水印。此线程会尝试释放页面,以便下次分配的真实线程能够快速顺利启动。</p>
 
-  <p>用于触发后台回收的默认阈值相当低 - 在 2GB 设备上约为 2MB,在 512MB 设备上约为 636KB。而且,内核通过后台回收仅能回收几兆的内存。这即意味着,任何快速分配超过几兆字节的内容的进程都会快速导致直接回收。</p>
+  <p>用于触发后台回收的默认阈值相当低 - 在 2GB 设备上约为 2MB,在 512MB 设备上约为 636KB。而且,内核通过后台回收仅能回收几兆的内存。这意味着,任何快速分配超过几 MB 内容的进程都会快速导致直接回收。</p>
 
-<p>在 android-3.4 内核分支中,我们以补丁程序 92189d47f66c67e5fd92eafaa287e153197a454f(“添加额外的可调可用千字节”)的形式添加了对可调新内核的支持。选择将该补丁程序添加到设备内核中,会让 ActivityManager 告知内核尝试保留能容纳 3 个全屏 32 bpp 缓冲区的可用内存空间。</p>
+<p>在 android-3.4 内核分支中,我们通过补丁程序 92189d47f66c67e5fd92eafaa287e153197a454f(“添加用于扩展可用内存空间的可调选项”)添加了对新内核可调选项的支持。如果您选择将该补丁程序添加到设备内核中,ActivityManager 会告知内核尝试保留能容纳 3 个全屏 32 bpp 缓冲区的可用内存空间。</p>
 
 <p>这些阈值可通过框架 config.xml 进行配置</p>
 
@@ -119,11 +109,11 @@
 &lt;integer name="config_extraFreeKbytesAdjust"&gt;0&lt;/integer&gt;
 </pre>
 
-<h3 id="lowmem">微调 LowMemoryKiller</h3>
+<h3 id="lowmem">优化 LowMemoryKiller</h3>
 
-<p>ActivityManager 可配置 LowMemoryKiller 的阈值,以匹配它对在每个优先级存储分区中运行进程时所需的文件支持页面(缓存页面)工作集的预期。如果设备对工作集有很高的要求(例如:如果供应商界面需要更多内存,或者如果添加了更多服务),则可增大阈值。</p>
+<p>ActivityManager 可配置 LowMemoryKiller 的阈值,使其符合它对在每个优先级分段中运行进程时所需的文件支持页面(缓存页面)工作集的预期。如果设备对工作集有很高的要求(例如:如果供应商界面需要更多内存,或者如果添加了更多服务),则可增大阈值。</p>
 
-<p>如果为文件支持页面预留了太多内存,则可减小阈值,以便系统能够早在因缓存变得过小而导致磁盘颠簸之前就终止后台进程。</p>
+<p>如果为文件支持页面预留了太多内存,则可减小阈值,以便系统能够在因缓存变得过小而导致磁盘超负荷之前就终止后台进程。</p>
 
 <pre class="devsite-click-to-copy">
 &lt;!-- Device configuration setting the minfree tunable in the lowmemorykiller
@@ -149,24 +139,6 @@
 &lt;integer name="config_lowMemoryKillerMinFreeKbytesAdjust"&gt;0&lt;/integer&gt;
 </pre>
 
-<h3 id="ksm">KSM(内核同页合并)</h3>
-
-<p>KSM 是一个在后台运行的内核线程,可对内存中已由用户空间标为 <code>MADV_MERGEABLE</code> 的页面进行比较。如果发现两个页面相同,KSM 线程即会将它们合并为内存的单个写入时复制页面。</p>
-
-<p>从长远来看,KSM 会为所运行的系统节省内存,但它是以 CPU 功耗为代价来获得重复的内存,这可能会对电池寿命产生不良影响。功耗损失与通过启用 KSM 而节省的内存到底孰重孰轻?您应认真地权衡一下。</p>
-
-<p>为便于测试 KSM,我们建议您查看长时间运行(运行数小时)的设备,并观察 KSM 是否对启动时间和渲染时间起到了明显的改善作用。</p>
-
-<p>要启用 KSM,请先启用内核中的 <code>CONFIG_KSM</code>,然后将下列各行内容添加到 <code>init.&lt;device&gt;.rc</code> 文件中:<br />
-
-</p><pre class="devsite-click-to-copy">
-write /sys/kernel/mm/ksm/pages_to_scan 100
-write /sys/kernel/mm/ksm/sleep_millisecs 500
-write /sys/kernel/mm/ksm/run 1
-</pre>
-
-<p>启用后,有几种实用工具可帮助进行调试,这几种工具分别是:procrank、librank 和 ksminfo。借助这些实用工具,您可以查看 KSM 内存与进程之间的映射关系,以及哪些进程占用的 KSM 内存最���。一旦发现看起来值得探索的内存块,您便可以使用 hat 实用工具进行探索(如果它是 dalvik 堆上的重复对象)。</p>
-
 <h3 id="zram">交换到 zRAM</h3>
 
 <p>zRAM 交换可通过压缩内存页面并将其放入动态分配的内存交换区来增加系统中的可用内存量。</p>
@@ -195,40 +167,39 @@
 /dev/block/zram0 u:object_r:swap_block_device:s0
 </pre>
   </li>
-  <li>默认情况下,Linux 内核每次会换入 8 页内存。当使用 ZRAM 时,由每次读取 1 页而产生的增量成本微乎其微,且可能有助于防止设备承受极端的内存压力。要想每次只读取 1 页,请将以下内容添加到 <code>init.rc</code> 中:<pre class="devsite-click-to-copy">
+  <li>默认情况下,Linux 内核每次会换入 8 页内存。当使用 ZRAM 时,每次读取 1 页内存产生的增量开销微乎其微,因此在设备承受着极大的内存压力时可能有所助益���要想每次只读取 1 页内存,请将以下内容添加到 <code>init.rc</code> 中:<pre class="devsite-click-to-copy">
 write /proc/sys/vm/page-cluster 0
 </pre>
   </li>
-  <li>在 <code>init.rc</code> 中的 <code>mount_all /fstab.X</code> 行后面,添加以下内容:
-<pre class="devsite-click-to-copy">
+  <li>在 <code>init.rc</code> 中的 <code>mount_all /fstab.X</code> 行后面,添加以下内容:<pre class="devsite-click-to-copy">
 swapon_all /fstab.X
 </pre>
   </li>
   <li>如果在内核中启用了此功能,系统便会在启动时自动配置内存 cgroup。</li>
-  <li>如果内存 cgroup 可用,ActivityManager 就会将优先级较低的线程标为比其他线程更易于交换。如果需要内存,Android 内核则会开始将内存页面迁移到 zRAM 交换区,并会优先处理那些已被 ActivityManager 标记的内存页面。</li>
+  <li>如果内存 cgroup 可用,ActivityManager 就会将优先级较低的线程标为比其他线程更适合交换。在需要内存时,Android 内核会开始将内存页面迁移到 zRAM 交换区,并会优先处理那些已被 ActivityManager 标记的内存页面。</li>
 </ul>
 
 <h3 id="carveouts">Carveout、Ion 和连续内存分配 (CMA)</h3>
 
-<p>对于低内存设备,需要特别注意 carveout,尤其是未必会一直被充分利用的 carveout,例如用于安全地播放视频的 carveout。有几种解决方案可最大限度地减小 carveout 区域的影响,具体取决于硬件的确切要求。</p>
+<p>对于低内存设备,需要特别注意 carveout,尤其是不会一直得到充分利用的 carveout,例如用于安全地播放视频的 carveout。有几种解决方案可最大限度地减小 carveout 区域的影响,具体取决于硬件的确切要求。</p>
 
-<p>如果硬件允许不连续的内存���配,则 Ion 系统堆可从系统内存中分配内存,这样便无需使用 carveout。它还会尝试进行大量分配以消除外围设备上的 TLB 压力。如果内存区域必须连续或必须限定在某个特定地址范围内,则可以使用连续内存分配器 (CMA)。</p>
+<p>如果硬件允许不连续的内存分配,则可利用 Ion 系统堆从系统内存中分配内存,这样便无需使用 carveout。它还会尝试增大分配的内存空间以消除外围设备上的 TLB 压力。如果内存区域必须连续或必须限定在某个特定地址范围内,则可以使用连续内存分配器 (CMA)。</p>
 
-<p>以这种方式创建的 carveout 也可供系统用于处理可移动页面。当需要该区域时,可移动页面就会被从中移出,以便系统将一个处于空闲状态的大型 carveout 用于其他目的。您可以直接使用 CMA,也可以借助 Ion(通过使用离子 CMA 堆)更轻松地使用 CMA。</p>
+<p>以这种方式创建的 carveout 也可供系统用于处理可移动页面。当需要该区域时,可移动页面就会从中移出,以便系统将处于空闲状态的大型 carveout 用于其他目的。您可以���接使用 CMA,也可以借助 Ion(通过使用 Ion CMA 堆)更轻松地使用 CMA。</p>
 
 <h2 id="app-opts">应用优化提示</h2>
 <ul>
-   <li>查看<a href="http://developer.android.com/training/articles/memory.html">管理您的应用内存</a>和与同一主题相关的以往博文:<ul>
+   <li>查看<a href="http://developer.android.com/training/articles/memory.html">管理您的应用内存</a>和同一主题的过往博文:<ul>
     <li><a href="http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html">http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html</a></li>
     <li><a href="http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html">http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html</a></li>
     <li><a href="http://android-developers.blogspot.com/2009/02/track-memory-allocations.html">http://android-developers.blogspot.com/2009/02/track-memory-allocations.html</a></li>
     <li> <a href="http://tools.android.com/recent/lintperformancechecks">http://tools.android.com/recent/lintperformancechecks</a></li>
     </ul>
 </li>
-  <li>从预安装应用中检查/移除所有未使用的资源 - development/tools/findunused(应该会有助于减小应用所占用的空间)。</li>
-<li>对资源(特别是具有透明区域的资源)使用 PNG 格式</li>
-<li>如果要编写本机代码,请使用 calloc() 而非 malloc/memset</li>
-<li>不要启用会将 Parcel 数据写入磁盘并会在日后读取此数据的代码。</li>
+  <li>检查/移除系统预装应用中未使用的所有资源 - development/tools/findunused(应该会有助于减小应用所占用的空间)。</li>
+<li>为资源(特别是具有透明区域的资源)使用 PNG 格式</li>
+<li>编写原生代码��,请使用 calloc() 而非 malloc/memset</li>
+<li>不要使用会将 Parcel 数据写入磁盘并在之后读取此数据的代码。</li>
 <li>不要订阅已安装的所有软件包,而应使用 ssp 过滤。请添加如下所示的过滤条件:<pre class="devsite-click-to-copy">
 &lt;data android:scheme="package" android:ssp="com.android.pkg1" /&gt;
 &lt;data android:scheme="package" android:ssp="com.myapp.act1" /&gt;
@@ -240,9 +211,9 @@
 
   <ul>
   <li><p>SERVICE - SERVICE_RESTARTING<br />
-因自身原因自动在后台运行的应用。这是频繁在后台运行的应用最常出现的问题。%duration * pss 很可能是一个绝佳的“不良”指标,但该组合的目标过于明确,也许只执行 %duration 就能更好地筛选出我们完全不希望运行的应用。</p></li>
+因自身原因而自行转入后台运行的应用。这是频繁在后台运行的应用最常出现的问题。%duration * pss 很可能是一个绝佳的“不良”指标,但该组合的目标过于明确,也许只依靠 %duration 就能更好地筛选出我们完全不希望运行的应用。</p></li>
   <li><p>IMPORTANT_FOREGROUND - RECEIVER<br />
-因任何原因在后台运行的应用(不直接与用户交互)。这些应用都会增加系统的内存负载。在这种情况下,使用 (%duration * pss) 不良值很可能是对这些进程进行排序的最佳方式:许多此类进程都会因合理原因而需要一直运行,因此它们的 pss 大小将会是它们的内存负载的重要组成部分。</p></li>
+因任何原因而在后台运行的应用(不直接与用户交互)。这些应用都会增加系统的内存负载。在这种情况下,(%duration * pss) 不良值很可能是对这些进程进行排序的最佳方式:许多此类进程都会因合理原因而需要一直运行,因此它们的 pss 大小将会是它们的内存负载的重要组成部分。</p></li>
   <li><p>PERSISTENT<br />
 持续的系统进程。跟踪 pss 可监视这些进程是否会变得过大。</p></li>
   <li><p>TOP<br />
@@ -250,7 +221,7 @@
   <li><p>HOME - CACHED_EMPTY<br />
 所有此类底部进程均是系统保留的备用进程;此类进程可随时终止,并可根据需要重建。这些进程是我们计算内存状态时参照的依据 -“正常”、“中等”、“低”、“严重”均是基于系统可以保留多少个此类进程而定的。pss 亦是这些进程的关键指标;当这些进程处于该状态时,它们应尽量减少自身的内存占用空间,以便系统能够保留尽可能多的进程。一般来说,与在 TOP 状态下相比,运行状况良好的应用在该状态下的 pss 占用空间明显更小。</p></li>
   <li>
-    <p>比较 TOP 与 CACHED_ACTIVITY-CACHED_ACTIVITY_CLIENT<em><br />
+    <p>TOP 与 CACHED_ACTIVITY-CACHED_ACTIVITY_CLIENT 的差异<em><br />
 </em>进���处于 TOP 状态时的 pss 和进程处于上述任一种缓存状态时的 pss 之间会存在差异,而这种差异是表明进程在进入后台运行时的内存释放能力的最佳数据。排除 CACHED_EMPTY 状态可以改善该数据,因为这项操作会排除因某些原因(不仅仅是为了呈现界面)而启动进程的情况,因此无需在与用户交互时处理所有的界面开销。</p></li>
   </ul>
 
@@ -258,11 +229,11 @@
 
 <h3 id="app-startup">分析应用启动时间</h3>
 
-<p>使用带有 <code>-P</code> 或 <code>--start-profiler</code> 选项的 <code>$ adb shell am start</code> 在应用启动时运行分析器。这样一来,当您的进程从 zygote 分岔之后,分析器就会立即启动,虽然此时您的任何代码都还未加载到其中。</p>
+<p>配合 <code>-P</code> 或 <code>--start-profiler</code> 选项使用 <code>$ adb shell am start</code>,以便在应用启动的��候运行分析器。这样一来,当您的进程从 zygote 分岔之后,分析器就会立即启动,而此时您的任何代码都还未加载到其中。</p>
 
-<h3 id="bug-reports">使用错误报告进行分析</h3>
+<h3 id="bug-reports">根据错误报告进行分析</h3>
 
-<p>现已包含可用于进行调试的各种信息。这些服务包括 <code>batterystats</code>、<code>netstats</code>、<code>procstats</code> 和 <code>usagestats</code>。您可以使用如下所示的各行内容找到它们:</p>
+<p>错误报告现包含可用于进行调试的各种信息。相关服务包括 <code>batterystats</code>、<code>netstats</code>、<code>procstats</code> 和 <code>usagestats</code>。您可以在如下所示的报告行中找到对应的信息:</p>
 
 <pre class="devsite-click-to-copy">
 ------ CHECKIN BATTERYSTATS (dumpsys batterystats --checkin) ------
@@ -272,11 +243,11 @@
 
 <h3 id="persistent">检查是否存在任何持续进程</h3>
 
-<p>重新启动设备并检查进程。<br />
-运行几个小时,然后再次检查进程。不应存在任何长时间运行的进程。</p>
+<p>重新启动设备并检查进程情况。<br />
+让设备运行几个小时,然后再次检查进程情况。不应存在任何长时间运行的进程。</p>
 
-<h3 id="longevity">长时测试</h3>
+<h3 id="longevity">运行长时测试</h3>
 
-<p>运行较长时间,并跟踪进程的内存。内存是增加了,还是保持不变?请创建规范的用例,并针对这些情形运行长时测试。</p>
+<p>让设备运行较长时间,并跟踪进程的内存占用情况。内存占用是增加了,还是保持不变?请拟订规范的使用情形,并针对这些情形运行长时测试。</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 7ce7842..40a220b 100644
--- a/zh-cn/devices/tech/power/component.html
+++ b/zh-cn/devices/tech/power/component.html
@@ -146,7 +146,7 @@
 
 <p><code>wifi.on</code> 值测量 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><code>wifi.scan</code> 值可测量接入点 WLAN 扫描时的功耗。应用可以使用 WifiManager 类 <a href="http://developer.android.com/reference/android/net/wifi/WifiManager.html"><code>startScan()</code>API</a> 来触发 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/device.html b/zh-cn/devices/tech/power/device.html
index 92a1e8e..c27b3d5 100644
--- a/zh-cn/devices/tech/power/device.html
+++ b/zh-cn/devices/tech/power/device.html
@@ -1,5 +1,5 @@
 <html devsite><head>
-    <title>测量设备电量</title>
+    <title>测量设备功率</title>
     <meta name="project_path" value="/_project.yaml"/>
     <meta name="book_path" value="/_book.yaml"/>
   </head>
diff --git a/zh-cn/devices/tech/test_infra/tradefed/full_example.html b/zh-cn/devices/tech/test_infra/tradefed/full_example.html
index 994dd9b..956ac22 100644
--- a/zh-cn/devices/tech/test_infra/tradefed/full_example.html
+++ b/zh-cn/devices/tech/test_infra/tradefed/full_example.html
@@ -112,7 +112,7 @@
 </pre>
 
 <h2 id="deviceinteract">与设备交互(D、R)</h2>
-<p>到目前为止,我们的 HelloWorldTest 还没有执行任何有趣的操作。Tradefed 专门用于使用 Android 设备运行测试,所以我们向测试中添加一个 Android 设备吧。</p>
+<p>到目前为止,我们的 HelloWorldTest 还没有执行任何有趣的操作。Tradefed 的专长是使用 Android 设备运行测试,所以我们向测试中添加一个 Android 设备吧。</p>
 
 <p>测试可以通过实现 <a href="/reference/com/android/tradefed/testtype/IDeviceTest.html">IDeviceTest</a> 接口来获得 Android 设备引用。以下为展示此步骤的���现示例:</p>
 <pre class="prettyprint">
@@ -141,7 +141,7 @@
 }
 </pre>
 
-<p>现在重建 tradefed 并检查设备列表:</p>
+<p>现在重新编译 tradefed 并检查设备列表:</p>
 <pre class="devsite-terminal devsite-click-to-copy">
 tradefed.sh
 </pre>
@@ -183,7 +183,7 @@
 <p>TF 包括几个可以重复使用的 <code>IRemoteTest</code> 实现,因而您无需从头开始编写您自己的实现。例如,<a href="/reference/com/android/tradefed/testtype/InstrumentationTest.html">InstrumentationTest</a> 可在 Android 设备上远程运行 Android 应用测试、解析结果,并将这些结果转发到 <code>ITestInvocationListener</code>。有关详情,请参阅<a href="/reference/com/android/tradefed/testtype/package-summary.html">测试类型</a>。</p>
 
 <h2 id="storeresults">存储测试结果 (I)</h2>
-<p>TF 配置的默认测试监听器实现为 <a href="/reference/com/android/tradefed/result/TextResultReporter.html">TextResultReporter</a>,它会将调用结果转储到 stdout。请运行上一节中的 HelloWorldTest 配置文件,以进行详细说明:</p>
+<p>TF 配置的默认测试监听器实现为 <a href="/reference/com/android/tradefed/result/TextResultReporter.html">TextResultReporter</a>,它会将调用结果转储到 stdout。请运行上一节中的 HelloWorldTest 配置,以进行详细说明:</p>
 <pre class="devsite-terminal devsite-click-to-copy">
 ./tradefed.sh
 </pre>
@@ -197,7 +197,7 @@
 05-16 20:03:15 I/InvocationToJUnitResultForwarder: run ended 0 ms
 </pre>
 
-<p>要将调用结果存储在其他位置(如某个文件中),请使用配置中的 <code>result_reporter</code> 标签来���定自定义 <code>ITestInvocationListener</code> 实现。</p>
+<p>要将调用结果存储在其他位置(如某个文件中),请在配置中使用 <code>result_reporter</code> 标签来指定自定义 <code>ITestInvocationListener</code> 实现。</p>
 
 <p>TF 还包括 <a href="/reference/com/android/tradefed/result/XmlResultReporter.html">XmlResultReporter</a> 监听器,该监听器会将测试结果写入 XML 文件,并且所采用的格式与 ant JUnit XML 写入器所采用的格式类似。<em></em>要在配置中指定 result_reporter,请修改 <code>…/res/config/example/helloworld.xml</code> 配置:</p>
 <pre class="prettyprint">
@@ -207,7 +207,7 @@
 &lt;/configuration&gt;
 </pre>
 
-<p>现在重建 tradefed 并重新运行 hello world 示例:</p>
+<p>现在重新编译 tradefed 并重新运行 hello world 示例:</p>
 <pre class="devsite-click-to-copy">
 tf&gt; run example/helloworld
 05-16 21:07:07 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
@@ -229,9 +229,9 @@
 &lt;/testsuite&gt;
 </pre>
 
-<p>您还可以编写您自己的自定义调用监听器 - 它们只需要实现 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html">ITestInvocationListener</a> 接口。</p>
+<p>您还可以编写您自己的自定义调用监听器 - 它们只需要实现 <a href="/reference/com/android/tradefed/result/ITestInvocationListener.html">ITestInvocationListener</a> 接口即可。</p>
 
-<p>Tradefed 支持多个调用监听器,因此您可以将测试结果发送到多个独立的目的地。只需在配置文件中指定多个 <code>&lt;result_reporter&gt;</code> 标签,即可完成此步骤。</p>
+<p>Tradefed 支持多个调用监听器,因此您可以将测试结果发送到多个独立的目的地。只需在配置中指定多个 <code>&lt;result_reporter&gt;</code> 标签,即可完成此步骤。</p>
 
 <h2 id="logging">日志记录(D、I、R)</h2>
 <p>TF 的日志记录设备具有以下功能:</p>
@@ -259,7 +259,7 @@

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

@@ -286,9 +286,9 @@
 </pre>
 
 <h2 id="optionhandling">处理选项(D、I、R)</h2>
-<p>从 TF 配置中加载的对象(也称为<b>配置对象</b>)亦可通过使用 <code>@Option</code> 注释接收命令行参数中的数据。</p><p>
+<p>从 TF 配置中加载的对象(也称为<b>配置对象</b>)亦可通过使用 <code>@Option</code> 注解接收命令行参数中的数据。</p><p>
 
-</p><p>要参与其中,配置对象类会将 <code>@Option</code> 注释应用于相关成员字段,并为其指定一个唯一的名称。这样您便可以通过命令行选项填充该成员字段值(并自动将该选项添加到配置帮助系统)。</p>
+</p><p>要参与其中,配置对象类会将 <code>@Option</code> 注解应用于相关成员字段,并为其指定一个唯一的名称。这样您便可以通过命令行选项填充该成员字段值(并自动将该选项添加到配置帮助系统)。</p>
 
 <p class="note"><strong>注意</strong>:部分字段类型可能不受支持。要了解受支持的字段类型,请参阅 <a href="/reference/com/android/tradefed/config/OptionSetter.html">OptionSetter</a>。
 </p>
@@ -311,7 +311,7 @@
     CLog.logAndDisplay(LogLevel.INFO, "I received option '%s'", mMyOption);
 </pre>
 
-<p>最后,重建 TF 并运行 helloworld;您应该会看到一条带有 <code>my_option</code> 默认值的日志消息:</p>
+<p>最后,重新编译 TF 并运行 helloworld;您应该会看到一条带有 <code>my_option</code> 默认值的日志消息:</p>
 <pre class="devsite-click-to-copy">
 tf&gt; run example/helloworld

@@ -366,7 +366,7 @@
     -m, --my_option      this is the option's help text Default: fromxml.
 </pre>
 
-<p>helloworld 配置中包含的其他配置对象(如 <code>FileLogger</code>)也接受选项。选项 <code>--log-level-display</code> 比较有意思,因为它会过滤在 stdout 上显示的日志。在本教程前面的部分中,您可能已经注意到:当我们改用 <code>FileLogger</code> 后,stdout 上不再显示“Hello, TF World! I have device ...”这一日志消息。您可以通过传入 <code>--log-level-display</code> 参数提高 stdout 上日志记录的详细程度。</p>
+<p>helloworld 配置中包含的其他配置对象(如 <code>FileLogger</code>)也接受选项。选项 <code>--log-level-display</code> 比较有意思,因为它会过滤在 stdout 上显示的日志。在本教程前面的部分中,您可能已经注意到:当我们改用 <code>FileLogger</code> 后,stdout 上不再显示“Hello, TF World! I have device …”这一日志消息。您可以通过传入 <code>--log-level-display</code> 参数提高 stdout 上日志记录的详细程度。</p>
 
 <p>请立即尝试,您应该可以看到“I have device”这一日志消息再次出现在 stdout 上,并被记录到某个文件中:</p>
 <pre class="devsite-click-to-copy">
@@ -376,6 +376,6 @@
 </pre>
 
 <h2 id="conclusion">讲解完毕,谢谢大家!</h2>
-<p>在此提醒您,如果您遇到任何问题,可在 <a href="https://android.googlesource.com/platform/tools/tradefederation/+/master">Trade Federation 源代码</a>中找到并未在本文档中公开的大量实用信息。如果所有其他尝试均以失败告终,请尝试在 <a href="/source/community.html">android-platform</a> Google 网上论坛中咨询(在消息主题中提及“Trade Federation”)。</p>
+<p>在此提醒您,如果您遇到任何问题,可在 <a href="https://android.googlesource.com/platform/tools/tradefederation/+/master">Trade Federation 源代码</a>中找到并未在本文档中公开的大量实用信���。如果所有其他尝试均以失败告终,请尝试在 <a href="/setup/community.html">android-platform</a> Google 网上论坛中咨询(在消息主题中提及“Trade Federation”)。</p>
 
 </body></html>
\ No newline at end of file
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 4b7c460..777e1c3 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
@@ -20,7 +20,7 @@
       limitations under the License.
   -->
 
-<p>Trade Federation 通过 AOSP 进行分发,并使用 Android 编译系统来创建二进制文件。请先<a href="/source/initializing.html">搭建一个编译环境</a>,以便使用 Android 源代码树来编译和运行软件包。
+<p>Trade Federation 通过 AOSP 进行分发,并使用 Android 编译系统来创建二进制文件。请先<a href="/setup/initializing.html">搭建一个编译环境</a>,以便使用 Android 源代码树来编译和运行软件包。
 </p>
 
 <h2>创建 TradeFed</h2>
diff --git a/zh-cn/devices/tv/index.html b/zh-cn/devices/tv/index.html
index 691ffd0..7a0436f 100644
--- a/zh-cn/devices/tv/index.html
+++ b/zh-cn/devices/tv/index.html
@@ -88,7 +88,7 @@
 <p>TV Provider 支持频道 (<code>android.provider.TvContract.Channels</code>) 和节目 (<code>android.provider.TvContract.Programs</code>) 表格中的结构化数据。这些表格由 TV Input 和系统应用(如 TV 应用)进行填充和访问。这些表格具有四种类型的字段:</p>
 
 <ul>
-  <li><strong>显示</strong>:显示字段包含应用可能希望向用户显示的信息,如频道名称 (<code>COLUMN_DISPLAY_NAME</code>) 或数字 (<code>COLUMN_DISPLAY_NUMBER</code>) 或正在观看的节目的标题。
+  <li><strong>显示</strong>:显示字段包含应用可能希望向用户显示的信息,如频道名称 (<code>COLUMN_DISPLAY_NAME</code>) 或编号 (<code>COLUMN_DISPLAY_NUMBER</code>) 或正在观看的节目的标题。
   </li><li><strong>元数据</strong>:根据相关标准,有三个字段可用于识别内容,如频道的传输流 ID (<code>COLUMN_TRANSPORT_STREAM_ID</code>)、原始网络 ID (<code>COLUMN_ORIGINAL_NETWORK_ID</code>) 和服务 ID (<code>COLUMN_SERVICE_ID</code>)。
   </li><li><strong>内部数据</strong>:用于自定义 TV Input 用途的字段。<br />某些字段(如 <code>COLUMN_INTERNAL_PROVIDER_DATA</code>)是可自定义的 BLOB 字段,TV Input 可以在这些字段中存储有关其频道或节目的任意元数据。
   </li><li><strong>标记</strong>:标记字段表示是否应禁止搜索、浏览或查看某个频道。只能在频道级别进行此设置。所有节目均应遵循此项频道设置。
@@ -193,7 +193,8 @@
 
 <h2 id="tv_app">TV 应用</h2>
 
-<p>系统 TV 应用向用户呈现直播电视内容。Android 平台提供了一个参考 TV 应用 (Live TV),设备制造商可以直接按原样使用该应用、对其进行定制、扩展或将其替换掉。Android 开放源代码项目中提供了<a href="https://android.googlesource.com/platform/packages/apps/TV/">源代码</a>,您可以按照<a href="/devices/tv/reference-tv-app.html">参考 TV 应用</a>一文中的说明开始构建 TV 应用。</p>
+<p>系统 TV 应用向用户呈现直播电视内容。Android 平台提供了一个参考 TV 应用 (Live TV),设备制造商可以直接按原样使用该应用、对其进行定制、扩展或将其替换掉。
+Android 开源项目中提供了<a href="https://android.googlesource.com/platform/packages/apps/TV/">源代码</a>,您可以按照<a href="/devices/tv/reference-tv-app.html">参考 TV 应用</a>一文中的说明开始构建 TV 应用。</p>
 
 <p>设备制造商可以扩展他们的 TV 应用来实现适用于特定设备制造商或国家/地区的功能,但这不属于 TIF 或参考 TV 应用的职责范畴。</p>
 
diff --git a/zh-cn/license.html b/zh-cn/license.html
index 8f5a648..65976fa 100644
--- a/zh-cn/license.html
+++ b/zh-cn/license.html
@@ -54,7 +54,7 @@
 <li>使用 SDK 中提供(或本文档中显示)的示例源代码时,需遵循 <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 许可</a>中详述的条件。</li>
 </ul>
 
-<h2 id="attribution">注明出处</h2>
+<h2 id="attribution">归因理论</h2>
 <p>当您重复使用网页上显示的根据 Creative Commons Attribution 许可条款提供的内容或创建其修改版本时,需注明相应的出处。在该网站上,需注明出处的要求仅适用于非文档内容(如上文所述)。要了解关于注明出处的完整要求,请参阅 <a href="https://creativecommons.org/licenses/by/3.0/legalcode">Creative Commons 法律规定</a>的 4b 部分。
 </p>
 <p>在实际使用情形中,我们要求您根据创作作品所用媒介的特点,尽可能注明出处来自 Android 开放源代码项目。此要求可能适用于以下几种典型方式:</p>
diff --git a/zh-cn/security/bulletin/2016-08-01.html b/zh-cn/security/bulletin/2016-08-01.html
index 5782014..3569e52 100644
--- a/zh-cn/security/bulletin/2016-08-01.html
+++ b/zh-cn/security/bulletin/2016-08-01.html
@@ -25,7 +25,7 @@
 Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。除了公告之外,我们还通过无线下载 (OTA) 更新的方式发布了针对 Nexus 设备的安全更新。我们还在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布了 Nexus 固件映像。2016 年 8 月 5 日(或之后)的安全补丁程序级别均已解决这些问题。请参阅此<a href="https://support.google.com/nexus/answer/4457705#nexus_devices">文档</a>,了解如何检查安全补丁程序级别。
 </p>
 <p>
-我们的合作伙伴在 2016 年 7 月 6 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序(如果适用)。本公告还提供了 AOSP 之外的补丁程序的链接。
+我们的合作伙伴在 2016 年 7 月 6 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开源项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序(如果适用)。本公告还提供了 AOSP 之外的补丁程序的链接。
 </p>
 <p>
 这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。
@@ -365,7 +365,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3833</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/01875b0274e74f97edf6b0d5c92de822e0555d03">A-29189712</a> [<a href="https://android.googlesource.com/platform/frameworks/base/+/4e4743a354e26467318b437892a9980eb9b8328a">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/01875b0274e74f97edf6b0d5c92de822e0555d03">A-29189712</a>
+[<a href="https://android.googlesource.com/platform/frameworks/base/+/4e4743a354e26467318b437892a9980eb9b8328a">2</a>]</td>
    <td>中</td>
    <td>所有 Nexus 设备</td>
    <td>5.0.2、5.1.1、6.0、6.0.1</td>
@@ -700,9 +701,9 @@
   </tr>
   <tr>
    <td>CVE-2014-9866</td>
-   <td>A-28747684<p>
-<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=8e6daae70422ad35146a87700e6634a747d1ff5d">
-QC-CR#511358</a>
+   <td>A-28747684
+<p>
+<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=8e6daae70422ad35146a87700e6634a747d1ff5d">QC-CR#511358</a>
 </p>
 </td>
    <td>高</td>
@@ -711,7 +712,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9867</td>
-   <td>A-28749629<p>
+   <td>A-28749629
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=322c518689a7f820165ca4c5d6b750b02ac34665">QC-CR#514702</a>
 </p>
 </td>
@@ -721,7 +723,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9868</td>
-   <td>A-28749721<p>
+   <td>A-28749721
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=1f274b74c00187ba1c379971503f51944148b22f">QC-CR#511976</a>
 </p>
 </td>
@@ -731,8 +734,10 @@
   </tr>
   <tr>
    <td>CVE-2014-9869</td>
-   <td>A-28749728<p>
-<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=8d1f7531ff379befc129a6447642061e87562bca">QC-CR#514711</a> [<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=7a26934e4196b4aa61944081989189d59b108768">2</a>]</p>
+   <td>A-28749728
+<p>
+<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=8d1f7531ff379befc129a6447642061e87562bca">QC-CR#514711</a>
+[<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=7a26934e4196b4aa61944081989189d59b108768">2</a>]</p>
 </td>
    <td>高</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -750,7 +755,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9871</td>
-   <td>A-28749803<p>
+   <td>A-28749803
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=f615e40c706708f74cd826d5b19c63025f54c041">QC-CR#514717</a>
 </p>
 </td>
@@ -760,7 +766,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9872</td>
-   <td>A-28750155<p>
+   <td>A-28750155
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=fc787ebd71fa231cc7dd2a0d5f2208da0527096a">QC-CR#590721</a>
 </p>
 </td>
@@ -770,7 +777,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9873</td>
-   <td>A-28750726<p>
+   <td>A-28750726
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm/commit/?id=ef29ae1d40536fef7fb95e4d5bb5b6b57bdf9420">QC-CR#556860</a>
 </p>
 </td>
@@ -780,7 +788,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9874</td>
-   <td>A-28751152<p>
+   <td>A-28751152
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm/commit/?id=56ff68b1f93eaf22e5e0284648fd862dc08c9236">QC-CR#563086</a>
 </p>
 </td>
@@ -800,7 +809,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9876</td>
-   <td>A-28767796<p>
+   <td>A-28767796
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=7efd393ca08ac74b2e3d2639b0ad77da139e9139">QC-CR#483408</a>
 </p>
 </td>
@@ -810,7 +820,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9877</td>
-   <td>A-28768281<p>
+   <td>A-28768281
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=f0c0112a6189747a3f24f20210157f9974477e03">QC-CR#547231</a>
 </p>
 </td>
@@ -820,7 +831,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9878</td>
-   <td>A-28769208<p>
+   <td>A-28769208
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=96a62c1de93a44e6ca69514411baf4b3d67f6dee">QC-CR#547479</a>
 </p>
 </td>
@@ -830,7 +842,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9879</td>
-   <td>A-28769221<p>
+   <td>A-28769221
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=ecc8116e1befb3a764109f47ba0389434ddabbe4">QC-CR#524490</a>
 </p>
 </td>
@@ -850,7 +863,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9881</td>
-   <td>A-28769368<p>
+   <td>A-28769368
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=ba3f404a10b3bb7e9c20440837df3cd35c5d0c4b">QC-CR#539008</a>
 </p>
 </td>
@@ -860,8 +874,10 @@
   </tr>
   <tr>
    <td>CVE-2014-9882</td>
-   <td>A-28769546<p>
-<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=3a4ebaac557a9e3fbcbab4561650abac8298a4d9">QC-CR#552329</a> [<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=0f6afe815b1b3f920f3502be654c848bdfe5ef38">2</a>]</p>
+   <td>A-28769546
+<p>
+<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=3a4ebaac557a9e3fbcbab4561650abac8298a4d9">QC-CR#552329</a>
+[<a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=0f6afe815b1b3f920f3502be654c848bdfe5ef38">2</a>]</p>
  </td>
    <td>高</td>
    <td>Nexus 7 (2013)</td>
@@ -869,7 +885,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9883</td>
-   <td>A-28769912<p>
+   <td>A-28769912
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=cbf79a67348e48557c0d0bb9bc58391b3f84bc46">QC-CR#565160</a>
 </p>
 </td>
@@ -879,7 +896,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9884</td>
-   <td>A-28769920<p>
+   <td>A-28769920
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=f4948193c46f75e16d4382c4472485ab12b7bd17">QC-CR#580740</a>
 </p>
 </td>
@@ -899,7 +917,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9886</td>
-   <td>A-28815575<p>
+   <td>A-28815575
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=80be0e249c906704085d13d4ae446f73913fc225">QC-CR#555030</a>
 </p>
 </td>
@@ -909,7 +928,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9887</td>
-   <td>A-28804057<p>
+   <td>A-28804057
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=b1bc773cf61265e0e3871b2e52bd6b3270ffc6c3">QC-CR#636633</a>
 </p>
 </td>
@@ -919,7 +939,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9888</td>
-   <td>A-28803642<p>
+   <td>A-28803642
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=f044936caab337a4384fbfe64a4cbae33c7e22a1">QC-CR#642735</a>
 </p>
 </td>
@@ -929,7 +950,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9889</td>
-   <td>A-28803645<p>
+   <td>A-28803645
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit?id=f4e2f2d4ef58c88340774099dff3324ec8baa24a">QC-CR#674712</a>
 </p></td>
    <td>高</td>
@@ -938,7 +960,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8937</td>
-   <td>A-28803962<p>
+   <td>A-28803962
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=c66202b9288cc4ab1c38f7c928fa1005c285c170">QC-CR#770548</a>
 </p>
 </td>
@@ -948,7 +971,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8938</td>
-   <td>A-28804030<p>
+   <td>A-28804030
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=51c39420e3a49d1a7f05a77c64369b7623088238">QC-CR#766022</a></p></td>
    <td>高</td>
    <td>Nexus 6</td>
@@ -956,7 +980,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8939</td>
-   <td>A-28398884<p>
+   <td>A-28398884
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm/commit/?id=884cff808385788fa620833c7e2160a4b98a21da">QC-CR#779021</a></p></td>
    <td>高</td>
    <td>Nexus 7 (2013)</td>
@@ -964,7 +989,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8940</td>
-   <td>A-28813987<p>
+   <td>A-28813987
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=e13ebd727d161db7003be6756e61283dce85fa3b">QC-CR#792367</a></p></td>
    <td>高</td>
    <td>Nexus 6</td>
@@ -972,7 +998,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8941</td>
-   <td>A-28814502<p>
+   <td>A-28814502
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=d4d4d1dd626b21e68e78395bab3382c1eb04877f">QC-CR#792473</a></p></td>
    <td>高</td>
    <td>Nexus 6、Nexus 7 (2013)</td>
@@ -980,7 +1007,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8942</td>
-   <td>A-28814652<p>
+   <td>A-28814652
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=9ec380c06bbd79493828fcc3c876d8a53fd3369f">QC-CR#803246</a></p></td>
    <td>高</td>
    <td>Nexus 6</td>
@@ -988,7 +1016,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8943</td>
-   <td>A-28815158<p>
+   <td>A-28815158
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm/commit/?id=ad376e4053b87bd58f62f45b6df2c5544bc21aee">QC-CR#794217</a></p>
 <p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm/commit/?id=ad376e4053b87bd58f62f45b6df2c5544bc21aee">QC-CR#836226</a></p></td>
@@ -998,7 +1027,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9891</td>
-   <td>A-28749283<p>
+   <td>A-28749283
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=c10f03f191307f7114af89933f2d91b830150094">QC-CR#550061</a></p></td>
    <td>中</td>
    <td>Nexus 5</td>
@@ -1006,7 +1036,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9890</td>
-   <td>A-28770207<p>
+   <td>A-28770207
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=14e0c8614d2715589583d8a95e33c422d110eb6f">QC-CR#529177</a></p></td>
    <td>中</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -1034,7 +1065,8 @@
   </tr>
   <tr>
    <td>CVE-2015-2686</td>
-   <td>A-28759139<p>
+   <td>A-28759139
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4de930efc23b92ddf88ce91c405ee645fe6e27ea">上游内核</a></p></td>
    <td>严重</td>
    <td>所有 Nexus 设备</td>
@@ -1042,7 +1074,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3841</td>
-   <td>A-28746669<p>
+   <td>A-28746669
+<p>
 <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=45f6fad84cc305103b28d73482b344d7f5b76f39">上游内核</a></p></td>
    <td>严重</td>
    <td>所有 Nexus 设备</td>
@@ -1077,7 +1110,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3842</td>
-   <td>A-28377352<p>QC-CR#1002974</p></td>
+   <td>A-28377352
+<p>QC-CR#1002974</p></td>
    <td>严重</td>
    <td>Nexus 5X、Nexus 6、Nexus 6P</td>
    <td>2016 年 4 月 25 日</td>
@@ -1110,7 +1144,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3843</td>
-   <td>A-28086229*<p>QC-CR#1011071</p></td>
+   <td>A-28086229*
+<p>QC-CR#1011071</p></td>
    <td>严重</td>
    <td>Nexus 5X、Nexus 6P</td>
    <td>2016 年 4 月 7 日</td>
@@ -1170,7 +1205,8 @@
   </tr>
   <tr>
    <td>CVE-2015-1593</td>
-   <td>A-29577822<p>
+   <td>A-29577822
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4e7c22d447bb6d7e37bfe39ff658486ae78e8d77">上游内核</a></p></td>
    <td>高</td>
    <td>Nexus Player</td>
@@ -1178,7 +1214,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3672</td>
-   <td>A-28763575<p>
+   <td>A-28763575
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8b8addf891de8a00e4d39fc32f93f7c5eb8feceb">上游内核</a></p></td>
    <td>高</td>
    <td>Nexus Player</td>
@@ -1206,7 +1243,8 @@
   </tr>
   <tr>
    <td>CVE-2016-2544</td>
-   <td>A-28695438<p>
+   <td>A-28695438
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=3567eb6af614dac436c4b16a8d426f9faed639b3">上游内核</a></p></td>
    <td>高</td>
    <td>所有 Nexus 设备</td>
@@ -1214,7 +1252,8 @@
   </tr>
   <tr>
    <td>CVE-2016-2546</td>
-   <td>A-28694392<p>
+   <td>A-28694392
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=af368027a49a751d6ff4ee9e3f9961f35bb4fede">上游内核</a></p></td>
    <td>高</td>
    <td>Pixel C</td>
@@ -1222,7 +1261,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9904</td>
-   <td>A-28592007<p>
+   <td>A-28592007
+<p>
 <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6217e5ede23285ddfee10d2e4ba0cc2d4c046205">上游内核</a></p></td>
    <td>高</td>
    <td>Nexus 5X、Nexus 6、Nexus 6P、Nexus 9、Nexus Player</td>
@@ -1250,7 +1290,8 @@
   </tr>
   <tr>
    <td>CVE-2012-6701</td>
-   <td>A-28939037<p>
+   <td>A-28939037
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a70b52ec1aaeaf60f4739edb1b422827cb6f3893">上游内核</a></p></td>
    <td>高</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -1278,7 +1319,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3844</td>
-   <td>A-28299517*<p>N-CVE-2016-3844</p></td>
+   <td>A-28299517*
+<p>N-CVE-2016-3844</p></td>
    <td>高</td>
    <td>Nexus 9、Pixel C</td>
    <td>2016 年 4 月 19 日</td>
@@ -1367,14 +1409,16 @@
   </tr>
   <tr>
    <td>CVE-2016-3847</td>
-   <td>A-28871433*<p>N-CVE-2016-3847</p></td>
+   <td>A-28871433*
+<p>N-CVE-2016-3847</p></td>
    <td>高</td>
    <td>Nexus 9</td>
    <td>2016 年 5 月 19 日</td>
   </tr>
   <tr>
    <td>CVE-2016-3848</td>
-   <td>A-28919417*<p>N-CVE-2016-3848</p></td>
+   <td>A-28919417*
+<p>N-CVE-2016-3848</p></td>
    <td>高</td>
    <td>Nexus 9</td>
    <td>2016 年 5 月 19 日</td>
@@ -1433,7 +1477,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3850</td>
-   <td>A-27917291<p>
+   <td>A-27917291
+<p>
 <a href="https://source.codeaurora.org/quic/la/kernel/lk/commit/?id=030371d45a9dcda4d0cc3c76647e753a1cc1b782">QC-CR#945164</a></p></td>
    <td>高</td>
    <td>Nexus 5、Nexus 5X、Nexus 6P、Nexus 7 (2013)</td>
@@ -1530,7 +1575,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9892</td>
-   <td>A-28770164<p>
+   <td>A-28770164
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=591b1f455c32206704cbcf426bb30911c260c33e">QC-CR#568717</a></p></td>
    <td>高</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -1538,7 +1584,8 @@
   </tr>
   <tr>
    <td>CVE-2015-8944</td>
-   <td>A-28814213<p>
+   <td>A-28814213
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=e758417e7c31b975c862aa55d0ceef28f3cc9104">QC-CR#786116</a></p></td>
    <td>高</td>
    <td>Nexus 6、Nexus 7 (2013)</td>
@@ -1546,7 +1593,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9893</td>
-   <td>A-28747914<p>
+   <td>A-28747914
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=bfc6eee5e30a0c20bc37495233506f4f0cc4991d">QC-CR#542223</a></p></td>
    <td>中</td>
    <td>Nexus 5</td>
@@ -1554,7 +1602,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9894</td>
-   <td>A-28749708<p>
+   <td>A-28749708
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=83214431cd02674c70402b160b16b7427e28737f">QC-CR#545736</a></p></td>
    <td>中</td>
    <td>Nexus 7 (2013)</td>
@@ -1562,7 +1611,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9895</td>
-   <td>A-28750150<p>
+   <td>A-28750150
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm/commit/?id=cc4b26575602e492efd986e9a6ffc4278cee53b5">QC-CR#570757</a></p></td>
    <td>中</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -1570,7 +1620,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9896</td>
-   <td>A-28767593<p>
+   <td>A-28767593
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=89f2bcf1ac860b0b380e579e9a8764013f263a7d">QC-CR#551795</a></p></td>
    <td>中</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -1578,7 +1629,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9897</td>
-   <td>A-28769856<p>
+   <td>A-28769856
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=46135d80765cb70a914f02a6e7b6abe64679ec86">QC-CR#563752</a></p></td>
    <td>中</td>
    <td>Nexus 5</td>
@@ -1586,7 +1638,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9898</td>
-   <td>A-28814690<p>
+   <td>A-28814690
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la/kernel/msm-3.10/commit/?id=80be0e249c906704085d13d4ae446f73913fc225">QC-CR#554575</a></p></td>
    <td>中</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -1594,7 +1647,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9899</td>
-   <td>A-28803909<p>
+   <td>A-28803909
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=8756624acb1e090b45baf07b2a8d0ebde114000e">QC-CR#547910</a></p></td>
    <td>中</td>
    <td>Nexus 5</td>
@@ -1602,7 +1656,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9900</td>
-   <td>A-28803952<p>
+   <td>A-28803952
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//kernel/msm-3.10/commit/?id=63c317dbee97983004dffdd9f742a20d17150071">QC-CR#570754</a></p></td>
    <td>中</td>
    <td>Nexus 5、Nexus 7 (2013)</td>
@@ -1630,7 +1685,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9903</td>
-   <td>A-28731691<p>
+   <td>A-28731691
+<p>
 <a href="https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4efbc454ba68def5ef285b26ebfcfdb605b52755">上游内核</a></p></td>
    <td>高</td>
    <td>Nexus 5X、Nexus 6P</td>
@@ -1639,7 +1695,7 @@
 </tbody></table>
 
 <h3 id="information-disclosure-vulnerability-in-mediatek-wi-fi-driver-device-specific">
-MediaTek WLAN 驱动程序中的信息披露漏洞(与特定设备有关)</h3>
+MediaTek WLAN 驱动程序中的信息披露漏洞(特定设备)</h3>
 <p>
 MediaTek WLAN 驱动程序中的信息披露漏洞可让本地恶意应用获取超出其权限范围的数据。由于该漏洞可用于在未经用户明确许可的情况下获取敏感数据,因此我们将其严重程度评为“高”。
 </p>
@@ -1658,7 +1714,8 @@
   </tr>
   <tr>
    <td>CVE-2016-3852</td>
-   <td>A-29141147*<p>M-ALPS02751738</p></td>
+   <td>A-29141147*
+<p>M-ALPS02751738</p></td>
    <td>高</td>
    <td>Android One</td>
    <td>2016 年 4 月 12 日</td>
@@ -1687,7 +1744,8 @@
   </tr>
   <tr>
    <td>CVE-2016-4482</td>
-   <td>A-28619695<p>
+   <td>A-28619695
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=681fef8380eb818c0b845fca5d2ab1dcbab114ee">上游内核</a></p></td>
    <td>高</td>
    <td>所有 Nexus 设备</td>
@@ -1718,7 +1776,8 @@
   </tr>
   <tr>
    <td>CVE-2014-9901</td>
-   <td>A-28670333<p>
+   <td>A-28670333
+<p>
 <a href="https://us.codeaurora.org/cgit/quic/la//platform/vendor/qcom-opensource/wlan/prima/commit/?id=637f0f7931dd7265ac1c250dc2884d6389c66bde">QC-CR#548711</a></p></td>
    <td>高</td>
    <td>Nexus 7 (2013)</td>
@@ -1729,7 +1788,7 @@
 <h3 id="elevation-of-privilege-vulnerability-in-google-play-services">
 Google Play 服务中的提权漏洞</h3>
 <p>
-Google Play 服务中的提权漏洞可让本地攻击者绕过“恢复出厂设置保护”机制,并获取对设备的访问权限。由于该漏洞可能会让有心人士绕过“恢复出厂设置保护”机制,从而成功重置设备并清除所有数据,因为我们将其严重程度评为“中”。
+Google Play 服务中的提权漏洞可让本地攻击者绕过“恢复出厂设置保护”机制并获取设备使用权限。由于该漏洞可能会让有心人士绕过“恢复出厂设置保护”机制,从而成功重置设备并清除所有数据,因为我们��其严重程度评为“中”。
 </p>
 <table>
   <colgroup><col width="18%" />
@@ -1809,7 +1868,8 @@
   </tr>
   <tr>
    <td>CVE-2016-4486</td>
-   <td>A-28620102<p>
+   <td>A-28620102
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=5f8e44741f9f216e33736ea4ec65ca9ac03036e6">上游内核</a></p></td>
    <td>中</td>
    <td>所有 Nexus 设备</td>
@@ -1837,7 +1897,8 @@
   </tr>
   <tr>
    <td>CVE-2016-4569</td>
-   <td>A-28980557<p>
+   <td>A-28980557
+<p>
 <a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=cec8f96e49d9be372fdb0c3836dcf31ec71e457e">上游内核</a></p></td>
    <td>中</td>
    <td>所有 Nexus 设备</td>
@@ -1845,8 +1906,10 @@
   </tr>
   <tr>
    <td>CVE-2016-4578</td>
-   <td>A-28980217<p>
-<a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e4ec8cc8039a7063e24204299b462bd1383184a5">上游内核</a> [<a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9a47e9cff994f37f7f0dbd9ae23740d0f64f9fe6">2</a>]</p></td>
+   <td>A-28980217
+<p>
+<a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=e4ec8cc8039a7063e24204299b462bd1383184a5">上游内核</a>
+[<a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9a47e9cff994f37f7f0dbd9ae23740d0f64f9fe6">2</a>]</p></td>
    <td>中</td>
    <td>所有 Nexus 设备</td>
    <td>2016 年 5 月 11 日</td>
@@ -1902,10 +1965,10 @@
 </strong>
 </p>
 <p>
-2016-08-01(或之后)的安全补丁程序级别解决了与 2016-8-01 安全补丁程序字符串级别相关的所有问题。2016-08-05(或之后)的安全补丁程序级别解决了与 2016-08-05 安全补丁程序字符串级别相关的所有问题。请访问<a href="https://support.google.com/nexus/answer/4457705">帮助中心</a>,了解核实安全补丁程序级别的相关操作说明。提供这些更新的设备制造商应将补丁程序字符串级别设为:[ro.build.version.security_patch]:[2016-08-01] 或 [ro.build.version.security_patch]:[2016-08-05]。
+2016-08-01(或之后)的安全补丁程序级别解决了与 2016-08-01 安全补丁程序字符串���别相关的所有问题。2016-08-05(或之后)的安全补丁程序级别解决了与 2016-08-05 安全补丁程序字符串级别相关的所有问题。请访问<a href="https://support.google.com/nexus/answer/4457705">帮助中心</a>,了解核实安全补丁程序级别的相关操作说明。提供这些更新的设备制造商应将补丁程序字符串级别设为:[ro.build.version.security_patch]:[2016-08-01] 或 [ro.build.version.security_patch]:[2016-08-05]。
 </p>
 <p>
-<strong>2. 为何此公告有两个安全补丁程序级别字符串?</strong>
+<strong>2. 为何本公告有两个安全补丁程序级别字符串?</strong>
 </p>
 <p>
 本公告有两个安全补丁程序级别字符串,目的是让 Android 合作伙伴能够灵活地、更快速地采取措施,以修复所有 Android 设备上类似的一系列漏洞。我们建议 Android 合作伙伴修复本公告中的所有问题并使用最新的安全补丁程序级别字符串。
diff --git a/zh-cn/security/bulletin/2016-10-01.html b/zh-cn/security/bulletin/2016-10-01.html
index 1001552..0a8f942 100644
--- a/zh-cn/security/bulletin/2016-10-01.html
+++ b/zh-cn/security/bulletin/2016-10-01.html
@@ -32,7 +32,7 @@
 这些问题中危险性最高的是严重程度为“严重”的设备专属代码中的安全漏洞,此类漏洞可能会通过内核执行远程代码,进而导致本地设备永久损坏,而用户可能需要通过重写操作系统来修复设备。<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 平台的安全性。
+我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <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>
 我们建议所有用户在自己的设备上接受这些更新。
@@ -72,12 +72,12 @@
   <li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen:CVE-2016-3860</li>
   <li>Google Project Zero 的 Jann Horn:CVE-2016-3900、CVE-2016-3885</li>
   <li><a href="http://keybase.io/jasonrogena">Jason Rogena</a>:CVE-2016-3917</li>
-  <li>奇虎 360 科技有限公司 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-6688、CVE-2016-6677、CVE-2016-6673、CVE-2016-6687、CVE-2016-6686、CVE-2016-6681、CVE-2016-6682、CVE-2016-3930</li>
+  <li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-6688、CVE-2016-6677、CVE-2016-6673、CVE-2016-6687、CVE-2016-6686、CVE-2016-6681、CVE-2016-6682、CVE-2016-3930</li>
   <li>Joshua Drake (<a href="https://twitter.com/jduck">@jduck</a>):CVE-2016-3920</li>
   <li>Google 安全团队的 Maciej Szawłowski:CVE-2016-3905</li>
   <li>Google Project Zero 的 Mark Brand:CVE-2016-6689</li>
   <li><a href="https://github.com/michalbednarski">Michał Bednarski</a>:CVE-2016-3914、CVE-2016-6674、CVE-2016-3911、CVE-2016-3912</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-3933、CVE-2016-3932</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-3933、CVE-2016-3932</li>
   <li>Nightwatch Cybersecurity Research (<a href="https://twitter.com/nightwatchcyber">@nightwatchcyber</a>):CVE-2016-5348</li>
   <li>IBM X-Force 安全研究员 Roee Hay:CVE-2016-6678</li>
   <li>Google 的 Samuel Tan:CVE-2016-3925</li>
@@ -113,7 +113,7 @@
   </tr>
   <tr>
    <td>CVE-2016-3900</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/native/+/d3c6ce463ac91ecbeb2128beb475d31d3ca6ef42">A-29431260</a> [<a href="https://android.googlesource.com/platform/frameworks/native/+/047eec456943dc082e33220d28abb7df4e089f69">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/native/+/d3c6ce463ac91ecbeb2128beb475d31d3ca6ef42">A-29431260</a>[<a href="https://android.googlesource.com/platform/frameworks/native/+/047eec456943dc082e33220d28abb7df4e089f69">2</a>]</td>
    <td>高</td>
    <td>所有 Nexus 设备</td>
    <td>5.0.2、5.1.1、6.0、6.0.1、7.0</td>
@@ -170,7 +170,7 @@
   </tr>
   <tr>
    <td>CVE-2016-3909</td>
-   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/d4271b792bdad85a80e2b83ab34c4b30b74f53ec">A-30033990</a> [<a href="https://android.googlesource.com/platform/frameworks/av/+/c48ef757cc50906e8726a3bebc3b60716292cdba">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/d4271b792bdad85a80e2b83ab34c4b30b74f53ec">A-30033990</a>[<a href="https://android.googlesource.com/platform/frameworks/av/+/c48ef757cc50906e8726a3bebc3b60716292cdba">2</a>]</td>
    <td>高</td>
    <td>所有 Nexus 设备</td>
    <td>4.4.4、5.0.2、5.1.1、6.0、6.0.1、7.0</td>
@@ -1361,7 +1361,7 @@
   <tr>
    <td>CVE-2016-6679</td>
    <td>A-29915601<br />
-      <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/prima/commit/?id=d39345f0abc309959d831d09fcbf1619cc0ae0f5">QC-CR#1000913</a> [<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=f081695446679aa44baa0d00940ea18455eeb4c5">2</a>]</td>
+      <a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/prima/commit/?id=d39345f0abc309959d831d09fcbf1619cc0ae0f5">QC-CR#1000913</a>[<a href="https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=f081695446679aa44baa0d00940ea18455eeb4c5">2</a>]</td>
    <td>中</td>
    <td>Nexus 5X、Android One</td>
    <td>2016 年 6 月 30 日</td>
diff --git a/zh-cn/security/bulletin/2017-01-01.html b/zh-cn/security/bulletin/2017-01-01.html
index 7162e74..bbe05bf 100644
--- a/zh-cn/security/bulletin/2017-01-01.html
+++ b/zh-cn/security/bulletin/2017-01-01.html
@@ -24,7 +24,7 @@
 
 <p>Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。除了公告之外,我们还通过无线下载 (OTA) 更新的方式发布了针对 Google 设备的安全更新。我们还在 <a href="https://developers.google.com/android/nexus/images">Google Developers 网站</a>上发布了 Google 设备固件映像。2017 年 1 月 5 日(或之后)的安全补丁程序级别均已解决所有这些问题。请参阅 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>,了解如何检查设备的安全补丁程序级别。</p>
 
-<p>我们的合作伙伴在 2016 年 12 月 5 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提���了 AOSP 之外的补丁程序的链接。</p>
+<p>��们的合作伙伴在 2016 年 12 月 5 日(或之前)就已收到本公告中说明的这些问题的相关通知。我们已在 Android 开源项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
 
 <p>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导致在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功规避或出于开发目的而被停用)。</p>
 
@@ -569,7 +569,7 @@
 </tbody></table>
 
 <h2 id="2017-01-05-details">2017-01-05 安全补丁程序级别 - 漏洞详情</h2>
-<p>我们在下面提供了 2017-01-05 补丁程序级��涵盖的每个安全漏洞的详细信息,其中包括问题描述、严重程度阐述以及一个包含 CVE、相关参考信息、严重程度、已更新的 Google 设备、已更新的 AOSP 版本(如果适用)及报告日期的表格。如果有解决 Bug ID 所对应问题的公开更改记录(如 AOSP 代码更改列表),我们也提供了相应链接。如果某个 Bug 有多条相关的更改记录,我们还通过 Bug ID 后面的数字链接到了更多参考信息。</p>
+<p>我们在下面提供了 2017-01-05 补丁程序级别涵盖的每个安全漏洞的详细信息,其中包括问题描述、严重程度阐述以及一个包含 CVE、相关参考信息、严重程度、已更新的 Google 设备、已更新的 AOSP 版本(如果适用)及报告日期的表格。在适用的情况下,我们会将 Bug ID 链接到解决相应问题的公开更改记录(如 AOSP 代码更改列表)。如果某个 Bug 有多条相关的更改记录,我们还将通过 Bug ID 后面的数字链接到更多参考信息。</p>
 
 <h3 id="eop-in-kernel-memory-subsystem">内核内存子系统中的提权漏洞</h3>
 <p>
@@ -637,7 +637,7 @@
 
 <h3 id="eop-in-kernel-file-system">内核文件系统中的提权漏洞</h3>
 <p>
-内核文件系统中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
+内核文件系统中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久损坏,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
 </p>
 
 <table>
@@ -663,12 +663,12 @@
   </tr>
 </tbody></table>
 <p>
-* 搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
+*搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
 </p>
 
 <h3 id="eop-in-nvidia-gpu-driver">NVIDIA GPU 驱动程序中的提权漏洞</h3>
 <p>
-NVIDIA GPU 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
+NVIDIA GPU 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久损坏,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
 </p>
 
 <table>
@@ -756,12 +756,12 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="eop-in-mediatek-driver">MediaTek 驱动程序中的提权漏洞</h3>
 <p>
-MediaTek 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
+MediaTek 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久损坏,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
 </p>
 
 <table>
@@ -822,7 +822,7 @@
 
 <h3 id="eop-in-nvidia-gpu-driver-2">NVIDIA GPU 驱动程序中的提权漏洞</h3>
 <p>
-NVIDIA GPU 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
+NVIDIA GPU 驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久损坏,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
 </p>
 
 <table>
@@ -847,12 +847,12 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="eop-in-qualcomm-video-driver">Qualcomm 视频驱动程序中的提权漏洞</h3>
 <p>
-Qualcomm 视频驱动程序中的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会对本地设备造成永久性损害,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
+Qualcomm 视频驱动程序���的提权漏洞可让本地恶意应用通过内核执行任意代码。由于该漏洞有可能会造成本地设备永久损坏,而用户可能需要通过重写操作系统来修复设备,因此我们将其严重程度评为“严重”。
 </p>
 
 <table>
@@ -971,7 +971,7 @@
   </tr>
 </tbody></table>
 <p>
-* 这些漏洞的严重程度评级由供应商决定。
+*这些漏洞的严重程度评级由供应商决定。
 </p>
 <p>
 * 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
@@ -1015,7 +1015,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="eop-in-mediatek-components">MediaTek 组件中的提权漏洞</h3>
@@ -1066,10 +1066,10 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 <p>
-** 搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
+**搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
 </p>
 
 <h3 id="eop-in-qualcomm-wi-fi-driver">Qualcomm WLAN 驱动程序中的提权漏洞</h3>
@@ -1127,7 +1127,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="eop-in-qualcomm-sound-driver">Qualcomm 声音驱动程序中的提权漏洞</h3>
@@ -1185,10 +1185,10 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 <p>
-** 搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
+**搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
 </p>
 
 <h3 id="eop-in-kernel-security-subsystem">内核安全子系统中的提权漏洞</h3>
@@ -1246,7 +1246,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="eop-in-kernel-sound-subsystem">内核声音子系统中的提权漏洞</h3>
@@ -1448,7 +1448,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="id-in-nvidia-video-driver">NVIDIA 视频驱动程序中的信息披露漏洞</h3>
@@ -1478,7 +1478,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="id-in-bootloader">引导加载程序中的信息披露漏洞</h3>
@@ -1515,7 +1515,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最���二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="dos-in-qualcomm-fuse-file-system">Qualcomm FUSE 文件系统中的拒绝服务漏洞</h3>
@@ -1546,7 +1546,7 @@
   </tr>
 </tbody></table>
 <p>
-* 搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
+*搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。
 </p>
 
 <h3 id="dos-in-bootloader">引导加载程序中的拒绝服务漏洞</h3>
@@ -1576,7 +1576,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="eop-in-broadcom-wi-fi-driver-2">Broadcom WLAN 驱动程序中的提权漏洞</h3>
@@ -1650,7 +1650,7 @@
   </tr>
 </tbody></table>
 <p>
-* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。
+*针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的��新二进制驱动程序中包含相应更新。
 </p>
 
 <h3 id="id-in-nvidia-camera-driver">NVIDIA 相机驱动程序中的信息披露漏洞</h3>
@@ -1910,7 +1910,7 @@
 
 <p><strong>3. 如何确定各个问题都会影响哪些 Google 设备?</strong></p>
 
-<p>在 <a href="#2017-01-01-details">2017-01-01</a> 和 <a href="#2017-01-05-details">2017-01-05</a> 安全漏洞详情部分,每个表均包含“已更新的 Google 设备”列,其中列出了针对每个问题更新过的受影响的 Google 设备系列。<em></em>此列有以下几种情形:</p>
+<p>在 <a href="#2017-01-01-details">2017-01-01</a> 和 <a href="#2017-01-05-details">2017-01-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>
diff --git a/zh-cn/security/bulletin/2017-03-01.html b/zh-cn/security/bulletin/2017-03-01.html
index c9f1604..ea4d380 100644
--- a/zh-cn/security/bulletin/2017-03-01.html
+++ b/zh-cn/security/bulletin/2017-03-01.html
@@ -49,20 +49,11 @@
 </li><li>阿里巴巴移动安全团队的 Baozeng Ding、Chengming Yang、Peng Xiao 和 Yang Song:CVE-2017-0506
 </li><li>阿里巴巴移动安全团队的 Baozeng Ding、Ning You、Chengming Yang、Peng Xiao 和 Yang Song:CVE-2017-0463
 </li><li>Android 安全团队的 Billy Lau:CVE-2017-0335、CVE-2017-0336、CVE-2017-0338、CVE-2017-0460
-</li><li><a href="mailto:derrek.haxx@gmail.com">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>):CVE-2016-8413、CVE-2016-8477、CVE-2017-0531
-</li><li><a href="mailto:derrek.haxx@gmail.com">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>) 和 <a href="mailto:sbauer@plzdonthack.me">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0521
-</li><li>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>):CVE-2017-0334、CVE-2017-0456、CVE-2017-0457、CVE-2017-0525
-</li><li><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>) 和 Bo Liu:CVE-2017-0490
-</li><li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2017-0500、CVE-2017-0501、CVE-2017-0502、CVE-2017-0503、CVE-2017-0509、CVE-2017-0524、CVE-2017-0529、CVE-2017-0536
-</li><li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen 和 Guang Gong:CVE-2017-0453、CVE-2017-0461、CVE-2017-0464
+</li><li><a href="mailto:derrek.haxx@gmail.com">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>):CVE-2016-8413、CVE-2016-8477、CVE-2017-0531</li><li><a href="mailto:derrek.haxx@gmail.com">derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>) 和 <a href="mailto:sbauer@plzdonthack.me">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0521</li><li>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Di Shen (<a href="https://twitter.com/returnsme">@returnsme</a>):CVE-2017-0334、CVE-2017-0456、CVE-2017-0457、CVE-2017-0525</li><li><a href="http://www.ms509.com">MS509Team</a> 的 En He (<a href="https://twitter.com/heeeeen4x">@heeeeen4x</a>) 和 Bo Liu:CVE-2017-0490</li><li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2017-0500、CVE-2017-0501、CVE-2017-0502、CVE-2017-0503、CVE-2017-0509、CVE-2017-0524、CVE-2017-0529、CVE-2017-0536</li><li>奇虎 360 科技有限公司 Alpha 团队的 Hao Chen 和 Guang Gong:CVE-2017-0453、CVE-2017-0461、CVE-2017-0464
 </li><li>索尼移动通信股份有限公司的 Hiroki Yamamoto 和 Fang Chen:CVE-2017-0481
 </li><li>IBM X-Force 安全研究员 Sagi Kedmi 和 Roee Hay:CVE-2017-0510
-</li><li><a href="https://skyeye.360safe.com">奇虎 360 天眼实验室</a>的 Jianjun Dai (<a href="https://twitter.com/Jioun_dai">@Jioun_dai</a>):CVE-2017-0478
-</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-8416、CVE-2016-8478、CVE-2017-0458、CVE-2017-0459、CVE-2017-0518、CVE-2017-0519、CVE-2017-0533、CVE-2017-0534
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:zlbzlb815@163.com">Lubo Zhang</a>、<a href="mailto:segfault5514@gmail.com">Tong Lin</a>、<a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2016-8479
-</li><li>Google 的 Makoto Onuki:CVE-2017-0491
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)、<a href="mailto:arnow117@gmail.com">Hanxiang Wen</a> 和 Xuxian Jiang:CVE-2017-0479、CVE-2017-0480
-</li><li>Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0535
+</li><li><a href="https://skyeye.360safe.com">奇虎 360 天眼实验室</a>的 Jianjun Dai (<a href="https://twitter.com/Jioun_dai">@Jioun_dai</a>):CVE-2017-0478</li><li>奇虎 360 IceSword 实验室的 Jianqiang Zhao (<a href="https://twitter.com/jianqiangzhao">@jianqiangzhao</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2016-8416、CVE-2016-8478、CVE-2017-0458、CVE-2017-0459、CVE-2017-0518、CVE-2017-0519、CVE-2017-0533、CVE-2017-0534</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:zlbzlb815@163.com">Lubo Zhang</a>、<a href="mailto:segfault5514@gmail.com">Tong Lin</a>、<a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2016-8479</li><li>Google 的 Makoto Onuki:CVE-2017-0491
+</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)、<a href="mailto:arnow117@gmail.com">Hanxiang Wen</a> 和 Xuxian Jiang:CVE-2017-0479、CVE-2017-0480</li><li>Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0535
 </li><li>特斯拉汽车公司产品安全团队的 Nathan Crandall (<a href="https://twitter.com/natecray">@natecray</a>):CVE-2017-0306
 </li><li>百度安全实验室的丁鹏飞、包沉浮和韦韬:CVE-2016-8417
 </li><li>腾讯科恩实验室的何淇丹 (<a href="https://twitter.com/flanker_hqd">@flanker_hqd</a>):CVE-2017-0337、CVE-2017-0476
@@ -70,18 +61,13 @@
 </li><li>蚂蚁金服巴斯光年安全实验室的 Quhe 和 wanchouchou:CVE-2017-0522
 </li><li>DarkMatter 安全通信部门的 <a href="mailto:keun-o.park@darkmatter.ae">Sahara</a>:CVE-2017-0528
 </li><li>加利福尼亚大学圣巴巴拉分校 Shellphish Grill 团队的 salls (<a href="https://twitter.com/chris_salls">@chris_salls</a>):CVE-2017-0505
-</li><li><a href="mailto:sbauer@plzdonthack.me">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0504、CVE-2017-0516
-</li><li>Sean Beaupre (beaups):CVE-2017-0455
+</li><li><a href="mailto:sbauer@plzdonthack.me">Scott Bauer</a> (<a href="https://twitter.com/ScottyBauer1">@ScottyBauer1</a>):CVE-2017-0504、CVE-2017-0516</li><li>Sean Beaupre (beaups):CVE-2017-0455
 </li><li>趋势科技的 Seven Shen (<a href="https://twitter.com/lingtongshen">@lingtongshen</a>):CVE-2017-0452
 </li><li>富士通的 Shinichi Matsumoto:CVE-2017-0498
-</li><li><a href="http://www.byterev.com">ByteRev</a> 的 <a href="mailto:smarques84@gmail.com">Stéphane Marques</a>:CVE-2017-0489
-</li><li>Google 的 Svetoslav Ganov:CVE-2017-0492
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:segfault5514@gmail.com">Tong Lin</a>、<a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0333
-</li><li><a href="http://www.trendmicro.com">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>):CVE-2017-0466、CVE-2017-0467、CVE-2017-0468、CVE-2017-0469、CVE-2017-0470、CVE-2017-0471、CVE-2017-0472、CVE-2017-0473、CVE-2017-0482、CVE-2017-0484、CVE-2017-0485、CVE-2017-0486、CVE-2017-0487、CVE-2017-0494、CVE-2017-0495
-</li><li>蚂蚁金服巴斯光年安全实验室的吴潍浠 (<a href="https://twitter.com/wish_wu">@wish_wu</a>):CVE-2017-0477
+</li><li><a href="http://www.byterev.com">ByteRev</a> 的 <a href="mailto:smarques84@gmail.com">Stéphane Marques</a>:CVE-2017-0489</li><li>Google 的 Svetoslav Ganov:CVE-2017-0492
+</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:segfault5514@gmail.com">Tong Lin</a>、<a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0333</li><li><a href="http://www.trendmicro.com">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>):CVE-2017-0466、CVE-2017-0467、CVE-2017-0468、CVE-2017-0469、CVE-2017-0470、CVE-2017-0471、CVE-2017-0472、CVE-2017-0473、CVE-2017-0482、CVE-2017-0484、CVE-2017-0485、CVE-2017-0486、CVE-2017-0487、CVE-2017-0494、CVE-2017-0495</li><li>蚂蚁金服巴斯光年安全实验室的吴潍浠 (<a href="https://twitter.com/wish_wu">@wish_wu</a>):CVE-2017-0477
 </li><li>奇虎 360 科技有限公司 Vulpecker 团队的 Yu Pan:CVE-2017-0517、CVE-2017-0532
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0526、CVE-2017-0527
-</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 Yuqi Lu (<a href="https://twitter.com/nikos233__">@nikos233</a>)、<a href="mailto:vancouverdou@gmail.com">Wenke Dou</a>、<a href="mailto:shaodacheng2016@gmail.com">Dacheng Shao</a>、Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang:CVE-2017-0483</li>
+</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 <a href="mailto:computernik@gmail.com">Yuan-Tsung Lo</a> 和 Xuxian Jiang:CVE-2017-0526、CVE-2017-0527</li><li><a href="http://c0reteam.org">C0RE 团队</a>的 Yuqi Lu (<a href="https://twitter.com/nikos233__">@nikos233</a>)、<a href="mailto:vancouverdou@gmail.com">Wenke Dou</a>、<a href="mailto:shaodacheng2016@gmail.com">Dacheng Shao</a>、Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>) 和 Xuxian Jiang:CVE-2017-0483</li>
 <li>奇虎 360 科技有限公司成都安全响应中心的 Zinuo Han (<a href="https://weibo.com/ele7enxxh">weibo.com/ele7enxxh</a>):CVE-2017-0475、CVE-2017-0497
 </li></ul>
 
@@ -138,8 +124,7 @@
   <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>6.0、6.0.1、7.0、7.1.1</td>
@@ -148,8 +133,7 @@
   <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>6.0、6.0.1、7.0、7.1.1</td>
@@ -158,8 +142,7 @@
   <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>6.0、6.0.1、7.0、7.1.1</td>
@@ -376,8 +359,7 @@
   <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>
+[<a href="https://android.googlesource.com/platform/frameworks/av/+/8415635765380be496da9b4578d8f134a527d86b">2</a>]</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>
@@ -386,8 +368,7 @@
   <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>
+[<a href="https://android.googlesource.com/platform/frameworks/av/+/8415635765380be496da9b4578d8f134a527d86b">2</a>]</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>
@@ -528,8 +509,7 @@
     <td>CVE-2017-0490</td>
    <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>6.0、6.0.1、7.0、7.1.1</td>
@@ -730,8 +710,7 @@
   <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>
+[<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>
@@ -2033,7 +2012,7 @@
 </tbody></table>
 <p>* 针对该问题的补丁程序未公开发布。<a href="https://developers.google.com/android/nexus/drivers">Google Developers 网站</a>上提供的 Nexus 设备的最新二进制驱动程序中包含相应更新。</p>
 <h2 id="common-questions-and-answers">常见问题和解答</h2>
-<p>这���部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
+<p>本部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
 <p><strong>1. 如何确定我的设备是否已更新到解决了这些问题的版本?
 </strong></p>
 <p>要了解如何检查设备的安全补丁程序级别,请阅读 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>中的说明。</p>
diff --git a/zh-cn/security/bulletin/2017-04-01.html b/zh-cn/security/bulletin/2017-04-01.html
index db801aa..72ceae5 100644
--- a/zh-cn/security/bulletin/2017-04-01.html
+++ b/zh-cn/security/bulletin/2017-04-01.html
@@ -23,7 +23,7 @@
 <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>这些问题中危险性最高的是一个严重程度为“严重”的安全漏洞,它可能会导��在处理媒体文件的过程中,可通过电子邮件、网页和彩信等多种方式在受影响的设备上执行远程代码。<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>
@@ -52,14 +52,14 @@
   <li>腾讯玄武实验室的 Daxing Guo (<a href="https://twitter.com/freener0">@freener0</a>):CVE-2017-0585、CVE-2017-0553</li>
   <li><a href="mailto:derrek.haxx@gmail.com">Derrek</a> (<a href="https://twitter.com/derrekr6">@derrekr6</a>) 和 Scott Bauer:CVE-2017-0576</li>
   <li>Project Zero 的 Gal Beniamini:CVE-2017-0571、CVE-2017-0570、CVE-2017-0572、CVE-2017-0569、CVE-2017-0561</li>
-  <li>奇虎 360 科技有限公司冰刃实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf </a>:CVE-2017-6426、CVE-2017-0581、CVE-2017-0329、CVE-2017-0332、CVE-2017-0566、CVE-2017-0573</li>
+  <li>奇虎 360 科技有限公司 IceSword 实验室的 Gengjia Chen (<a href="https://twitter.com/chengjia4574">@chengjia4574</a>) 和 <a href="http://weibo.com/jfpan">pjf</a>:CVE-2017-6426、CVE-2017-0581、CVE-2017-0329、CVE-2017-0332、CVE-2017-0566、CVE-2017-0573</li>
   <li>奇虎 360 科技有限公司 Alpha 团队的龚广 (<a href="https://twitter.com/oldfresher">@oldfresher</a>):CVE-2017-0547</li>
   <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://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="http://c0reteam.org">C0RE 团队</a>的 Lubo Zhang (<a href="mailto:zlbzlb815@163.com">zlbzlb815@163.com</a>) 和冰刃实验室的 Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>):CVE-2017-0564</li>
+  <li>奇虎 360 IceSword 实验室的 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="http://c0reteam.org">C0RE 团队</a>的 Lubo Zhang (<a href="mailto:zlbzlb815@163.com">zlbzlb815@163.com</a>) 和 IceSword 实验室的 Yonggang Guo (<a href="https://twitter.com/guoygang">@guoygang</a>):CVE-2017-0564</li>
   <li>Google 的 <a href="mailto:salyzyn@android.com">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>
@@ -316,8 +316,7 @@
   </tr>
   <tr>
     <td>CVE-2017-0551</td>
-    <td><a href="https://android.googlesource.com/platform/external/libavc/+/8b5fd8f24eba5dd19ab2f80ea11a9125aa882ae2">A-34097231</a>
-[<a href="https://android.googlesource.com/platform/external/libavc/+/494561291a503840f385fbcd11d9bc5f4dc502b8">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/external/libavc/+/8b5fd8f24eba5dd19ab2f80ea11a9125aa882ae2">A-34097231</a>[<a href="https://android.googlesource.com/platform/external/libavc/+/494561291a503840f385fbcd11d9bc5f4dc502b8">2</a>]</td>
     <td>高</td>
     <td>所有</td>
     <td>6.0、6.0.1、7.0、7.1.1</td>
@@ -381,8 +380,7 @@
   </tr>
   <tr>
     <td>CVE-2017-0554</td>
-    <td><a href="https://android.googlesource.com/platform/packages/services/Telephony/+/aeb795ef2290af1a0e4b14909363bc574e6b3ee7">A-33815946</a>
-[<a href="https://android.googlesource.com/platform/frameworks/base/+/3294256ba5b9e2ba2d8619d617e3d900e5386564">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/packages/services/Telephony/+/aeb795ef2290af1a0e4b14909363bc574e6b3ee7">A-33815946</a>[<a href="https://android.googlesource.com/platform/frameworks/base/+/3294256ba5b9e2ba2d8619d617e3d900e5386564">2</a>]</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>
@@ -1170,8 +1168,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">
-[2]</a></td>
+        <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>
     <td>2017 年 1 月 10 日</td>
@@ -1375,9 +1372,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">
-[2]</a></td>
+        <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>
     <td>2014 年 5 月 9 日</td>
@@ -1403,10 +1398,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">
-[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>
+        <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>
     <td>高</td>
     <td>Nexus 5X、Nexus 6、Nexus 6P、Pixel、Pixel XL、Android One</td>
     <td>2016 年 6 月 1 日</td>
@@ -1432,8 +1424,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">
-[2]</a></td>
+        <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>
     <td>2017 年 1 月 10 日</td>
@@ -2009,7 +2000,7 @@
 <p>*** 搭载 Android 7.0(或更高版本)且已安装所有可用更新的受支持的 Google 设备不受此漏洞的影响。</p>
 
 <h2 id="common-questions-and-answers">常见问题和解答</h2>
-<p>本部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
+<p>这一部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
 <p><strong>1. 如何确定我的设备是否已更新到解决了这些问题的版本?</strong></p>
 <p>要了解如何检查���备的安全补丁程序级别,请阅读 <a href="https://support.google.com/pixelphone/answer/4457705#pixel_phones&nexus_devices">Pixel 和 Nexus 更新时间表</a>中的说明。</p>
 <ul>
@@ -2030,7 +2021,7 @@
 </ul>
 <p>我们建议合作伙伴在一次更新中汇总要解决的所有问题的修复方案。</p>
 <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>
+<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>
@@ -2071,7 +2062,7 @@
   <li>2017 年 4 月 5 日:修订了本公告,添加了多个 AOSP 链接。</li>
   <li>2017 年 4 月 21 日:更正了 CVE-2016-10231 和 CVE-2017-0586 的致谢信息。</li>
   <li>2017 年 4 月 27 日:从本公告中移除了 CVE-2017-0540。</li>
-  <li>2017 年 8月 17 日:修订了本公告,更新了参考编号。</li>
+  <li>2017 年 8 月 17 日:修订了本公告,更新了参考编号。</li>
 </ul>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/security/bulletin/2017-07-01.html b/zh-cn/security/bulletin/2017-07-01.html
index dde2646..36e8dcd 100644
--- a/zh-cn/security/bulletin/2017-07-01.html
+++ b/zh-cn/security/bulletin/2017-07-01.html
@@ -44,7 +44,7 @@
 </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 以外的应用的用户来说,这项功能尤为重要。
@@ -221,8 +221,7 @@
   </tr>
   <tr>
    <td>CVE-2017-0675</td>
-   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/726108468dcfdabb833b8d55333de53cf6350aaa">A-34779227</a>
-[<a href="https://android.googlesource.com/platform/external/libhevc/+/4395fc2288e3f692765c73fce416e831fdaa5463">2</a>]</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/726108468dcfdabb833b8d55333de53cf6350aaa">A-34779227</a>[<a href="https://android.googlesource.com/platform/external/libhevc/+/4395fc2288e3f692765c73fce416e831fdaa5463">2</a>]</td>
    <td>RCE</td>
    <td>严重</td>
    <td>6.0.1、7.0、7.1.1、7.1.2</td>
@@ -414,8 +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>
@@ -557,8 +555,7 @@
   <tr>
    <td>CVE-2015-5707</td>
    <td>A-35841297<br />
-<a href="//git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=451a2886b6bf90e2fb378f7c46c655450fb96e81">上游内核</a>
-[<a href="//git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fdc81f45e9f57858da6351836507fbcf1b7583ee">2</a>]</td>
+<a href="//git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=451a2886b6bf90e2fb378f7c46c655450fb96e81">上游内核</a>[<a href="//git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fdc81f45e9f57858da6351836507fbcf1b7583ee">2</a>]</td>
    <td>EoP</td>
    <td>中</td>
    <td>SCSI 驱动程序</td>
@@ -566,9 +563,7 @@
   <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>
+<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>
    <td>EoP</td>
    <td>中</td>
    <td>网络驱动程序</td>
@@ -702,8 +697,7 @@
   <tr>
    <td>CVE-2017-8273</td>
    <td>A-35400056<br />
-<a href="//source.codeaurora.org/quic/la//kernel/lk/commit/?id=dfe6691ba301c769179cabab12d74d4e952462b9">QC-CR#1094372</a>
-[<a href="//source.codeaurora.org/quic/la//kernel/lk/commit/?id=30d94c33dec0ffedc875d7853635a9773921320a">2</a>]</td>
+<a href="//source.codeaurora.org/quic/la//kernel/lk/commit/?id=dfe6691ba301c769179cabab12d74d4e952462b9">QC-CR#1094372</a>[<a href="//source.codeaurora.org/quic/la//kernel/lk/commit/?id=30d94c33dec0ffedc875d7853635a9773921320a">2</a>]</td>
    <td>EoP</td>
    <td>高</td>
    <td>引导加载程序</td>
@@ -1431,7 +1425,7 @@
   </tr>
 </tbody></table>
 <h2 id="common-questions-and-answers">常见问题和解答</h2>
-<p>本部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
+<p>这一部分针对阅读本公告后可能产生的常见问题提供了相应的解答。</p>
 
 <p><strong>1. 如何确定我的设备是否已更新到解决了这些问题的版本?
 </strong></p>
diff --git a/zh-cn/security/bulletin/2017-11-01.html b/zh-cn/security/bulletin/2017-11-01.html
index f3463f4..3f63b87 100644
--- a/zh-cn/security/bulletin/2017-11-01.html
+++ b/zh-cn/security/bulletin/2017-11-01.html
@@ -31,7 +31,7 @@
 这些问题中危险性最高的是媒体框架中的一个严重程度为“严重”的安全漏洞,该漏洞可让远程攻击者使用特制文件通过特许进程执行任意代码。<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 平台的安全性。
+我们尚未收到用户因这些新报告的问题而遭到主动攻击或这些问题遭到滥用的报告。请参阅 <a href="#mitigations">Android 和 Google Play 保护机制缓解措施</a>部分,详细了解 <a href="/security/enhancements/index.html">Android 安全平台防护功能</a>和 Google Play 保护机制;这些功能可提高 Android 平台的安全性。
 </p>
 <p class="note">
 <strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 <a href="/security/bulletin/pixel/2017-11-01">2017 年 11 月 Pixel/Nexus 安全公告</a>。
@@ -43,7 +43,7 @@
 </ul>
 <h2 id="mitigations">Android 和 Google 服务缓解措施</h2>
 <p>
-这一部分总结了 <a href="/security/enhancements/index.html">Android 安全平台</a>和服务防护功能(如 <a href="//www.android.com/play-protect">Google Play 保护机制</a>)提供的缓解措施。这些功能可降低 Android 上的安全漏洞被成功利用的可能性。
+本部分总结了 <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>
@@ -78,8 +78,7 @@
   </tr>
   <tr>
     <td>CVE-2017-0831</td>
-    <td><a href="https://android.googlesource.com/platform/frameworks/base/+/c510ecb3ec0eeca5425f5bc96fae80ea56f85be6">A-37442941</a>
-    [<a href="https://android.googlesource.com/platform/packages/apps/Settings/+/94c52029653426846c50c639e7f6b5404cedd472">2</a>]</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/base/+/c510ecb3ec0eeca5425f5bc96fae80ea56f85be6">A-37442941</a>[<a href="https://android.googlesource.com/platform/packages/apps/Settings/+/94c52029653426846c50c639e7f6b5404cedd472">2</a>]</td>
     <td>EoP</td>
     <td>高</td>
     <td>8.0</td>
@@ -293,8 +292,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/qcacld-3.0/commit/?id=c9f8654b11a1e693022ad7f163b3bc477fea8ce8">2</a>]</td>
+        <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>
     <td>WLAN</td>
@@ -302,8 +300,7 @@
   <tr>
     <td>CVE-2017-11015</td>
     <td>A-64438728<br />
-        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=ec58bc99e29d89f8e164954999ef8a45cec21754">QC-CR#2060959</a>
-[<a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=1ef6add65a36de6c4da788f776de2b5b5c528d8e">2</a>]</td>
+        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=ec58bc99e29d89f8e164954999ef8a45cec21754">QC-CR#2060959</a>[<a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=1ef6add65a36de6c4da788f776de2b5b5c528d8e">2</a>]</td>
     <td>RCE</td>
     <td>严重</td>
     <td>WLAN</td>
@@ -341,8 +338,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=6724296d3f3b2821b83219768c1b9e971e380a9f">2</a>]</td>
+        <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>
     <td>相机</td>
diff --git a/zh-cn/security/bulletin/2018-01-01.html b/zh-cn/security/bulletin/2018-01-01.html
index 3db2f9a..a73b6a2 100644
--- a/zh-cn/security/bulletin/2018-01-01.html
+++ b/zh-cn/security/bulletin/2018-01-01.html
@@ -19,15 +19,13 @@
       See the License for the specific language governing permissions and
       limitations under the License.
   -->
-<p><em>发布时间:2018 年 1 月 2 日</em></p>
+<p><em>发布时间:2018 年 1 月 2 日 | 更新时间:2018 年 1 月 5 日</em></p>
 
 <p>
 Android 安全公告详细介绍了会影响 Android 设备的安全漏洞。2018-01-05(或之后)的安全补丁程序级别均已解决所有这些问题。要了解如何检查设备的安全补丁程序级别,请参阅<a href="https://support.google.com/pixelphone/answer/4457705">查看并更新 Android 版本</a>。
 </p>
 <p>
-Android 合作伙伴在本公告发布前至少一个月就已收到所有问题的相关通知。
-我们会在接下来的 48 小时内在 Android 开源项目 (AOSP) 代码库中发布针对相关问题的源代码补丁程序。届时,我们将会修订本公告,将相关 AOSP 链接增补到本文中。
-</p>
+Android 合作伙伴在本公告发布前至少一个月就已收到所有问题的相关通知。我们已在 Android 开放源代码项目 (AOSP) 代码库中发布了针对相关问题的源代码补丁程序,并在本公告中提供了相应链接。本公告还提供了 AOSP 之外的补丁程序的链接。</p>
 <p>
 这些问题中危险性最高的是媒体框架中的一个严重程度为“严重”的安全漏洞,该漏洞可让远程攻击者使用特制文件通过特许进程执行任意代码。<a href="/security/overview/updates-resources.html#severity">严重程度评估</a>的依据是漏洞被利用后可能会对受影响设备造成的影响大小(假设相关平台和服务缓解措施被成功��避或出于开发目的而被关闭)。
 </p>
@@ -38,12 +36,20 @@
 <strong>注意</strong>:如需了解与适用于 Google 设备的最新无线下载更新 (OTA) 和固件映像相关的信息,请参阅 2018 年 1 月 Pixel/Nexus 安全公告。
 </p>
 <h2 id="announcements">公告</h2>
+<aside class="note">
+<p><strong>注意</strong>:与处理器中的推测执行相关的一系列漏洞(CVE-2017-5715、CVE-2017-5753 和 CVE-2017-5754)已公开披露。Android 并未发现此类漏洞(会导致在任何基于 ARM 的 Android 设备上出现未经授权的信息披露)成功再现。
+</p>
+<p>
+为了提供额外的保护,本公告中包含的针对 CVE-2017-13218 的更新减少了对高精度定时器的访问权限,这有助于限制对 ARM 处理器的所有已知变体的旁路攻击(例如 CVE-2017-5715、CVE-2017-5753 和 CVE-2017-5754)。
+</p>
+<p>我们建议 Android 用户在自己的设备上接受可用的安全更新。要了解更多详细信息,请参阅 <a href="https://security.googleblog.com/2018/01/todays-cpu-vulnerability-what-you-need.html">Google 安全博客</a>。</p>
+</aside>
 <p>
 我们推出了新的 <a href="/security/bulletin/pixel/">Pixel / Nexus 安全公告</a>,其中介绍了在 Pixel 和 Nexus 设备上解决的其他安全漏洞和实现的功能改进。Android 设备制造商可以选择在其设备上解决这些问题。如需了解详情,请参阅<a href="#common-questions-and-answers">常见问题和解答</a>。
 </p>
 <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 上的安全漏洞被成功利用的可能性。
+本部分总结了 <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></ul>
@@ -70,7 +76,7 @@
   </tr>
   <tr>
     <td>CVE-2017-13176</td>
-    <td>A-68341964</td>
+    <td><a href="https://android.googlesource.com/platform/frameworks/base/+/4afa0352d6c1046f9e9b67fbf0011bcd751fcbb5">A-68341964</a></td>
     <td>EoP</td>
     <td>高</td>
     <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
@@ -94,109 +100,109 @@
     <th>已更新的 AOSP 版本</th>
   </tr>
   <tr>
-    <td>CVE-2017-13177</td>
-    <td>A-68320413</td>
-    <td>RCE</td>
-    <td>严重</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13177</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/b686bb2df155fd1f55220d56f38cc0033afe278c">A-68320413</a></td>
+   <td>RCE</td>
+   <td>严重</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13178</td>
-    <td>A-66969281</td>
-    <td>RCE</td>
-    <td>严重</td>
-    <td>6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13178</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/646a18fef28d19ba5beb6a2e1c00ac4c2663a10b">A-66969281</a></td>
+   <td>RCE</td>
+   <td>严重</td>
+   <td>6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13179</td>
-    <td>A-66969193</td>
-    <td>RCE</td>
-    <td>严重</td>
-    <td>6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13179</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/47d4b33b504e14e98420943f771a9aecd6d09516">A-66969193</a></td>
+   <td>RCE</td>
+   <td>严重</td>
+   <td>6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13180</td>
-    <td>A-66969349</td>
-    <td>EoP</td>
-    <td>高</td>
-    <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13180</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/cf1e36f93fc8776e3a8109149424babeee7f8382">A-66969349</a></td>
+   <td>EoP</td>
+   <td>高</td>
+   <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13181</td>
-    <td>A-67864232</td>
-    <td>EoP</td>
-    <td>高</td>
-    <td>7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13181</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/d64e9594d3d73c613010ca9fafc7af9782e9225d">A-67864232</a></td>
+   <td>EoP</td>
+   <td>高</td>
+   <td>7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13182</td>
-    <td>A-67737022</td>
-    <td>EoP</td>
-    <td>高</td>
-    <td>8.0、8.1</td>
+   <td>CVE-2017-13182</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/f1652e1b9f1d2840c79b6bf784d1befe40f4799e">A-67737022</a></td>
+   <td>EoP</td>
+   <td>高</td>
+   <td>8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13184</td>
-    <td>A-65483324</td>
-    <td>EoP</td>
-    <td>高</td>
-    <td>8.0、8.1</td>
+   <td>CVE-2017-13184</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/native/+/16392a119661fd1da750d4d4e8e03442578bc543">A-65483324</a></td>
+   <td>EoP</td>
+   <td>高</td>
+   <td>8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-0855</td>
-    <td>A-64452857</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
+   <td>CVE-2017-0855</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/av/+/d7d6df849cec9d0a9c1fd0d9957a1b8edef361b7">A-64452857</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0</td>
   </tr>
   <tr>
-    <td>CVE-2017-13191</td>
-    <td>A-64380403</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13191</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/f5b2fa243b4c45a4cd885e85f49ae548ab88c264">A-64380403</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13192</td>
-    <td>A-64380202</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13192</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/52ca619511acbd542d843df1f92f858ce13048a5">A-64380202</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13193</td>
-    <td>A-65718319</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13193</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/b3f31e493ef6fa886989198da9787807635eaae2">A-65718319</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13195</td>
-    <td>A-65398821</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13195</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/066e3b1f9c954d95045bc9d33d2cdc9df419784f">A-65398821</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13196</td>
-    <td>A-63522067</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13196</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/f5b2fa243b4c45a4cd885e85f49ae548ab88c264">A-63522067</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13197</td>
-    <td>A-64784973</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13197</td>
+   <td><a href="https://android.googlesource.com/platform/external/libhevc/+/0a714d3a14d256c6a5675d6fbd975ca26e9bc471">A-64784973</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13199</td>
-    <td>A-33846679</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>8.0、8.1</td>
+   <td>CVE-2017-13199</td>
+   <td><a href="https://android.googlesource.com/platform/frameworks/base/+/42b2e419b48a26d2ba599d87e3a2a02c4aa625f4">A-33846679</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>8.0、8.1</td>
   </tr>
 </tbody></table>
 
@@ -217,32 +223,32 @@
     <th>已更新的 AOSP 版本</th>
   </tr>
   <tr>
-    <td>CVE-2017-13208</td>
-    <td>A-67474440</td>
-    <td>RCE</td>
-    <td>严重</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13208</td>
+   <td><a href="https://android.googlesource.com/platform/system/core/+/b71335264a7c3629f80b7bf1f87375c75c42d868">A-67474440</a></td>
+   <td>RCE</td>
+   <td>严重</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13209</td>
-    <td>A-68217907</td>
-    <td>EoP</td>
-    <td>高</td>
-    <td>8.0、8.1</td>
+   <td>CVE-2017-13209</td>
+   <td><a href="https://android.googlesource.com/platform/system/libhidl/+/a4d0252ab5b6f6cc52a221538e1536c5b55c1fa7">A-68217907</a>[<a href="https://android.googlesource.com/platform/system/tools/hidl/+/8539fc8ac94d5c92ef9df33675844ab294f68d61">2</a>][<a href="https://android.googlesource.com/platform/system/hwservicemanager/+/e1b4a889e8b84f5c13b76333d4de90dbe102a0de">3</a>]</td>
+   <td>EoP</td>
+   <td>高</td>
+   <td>8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13210</td>
-    <td>A-67782345</td>
-    <td>EoP</td>
-    <td>高</td>
-    <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
+   <td>CVE-2017-13210</td>
+   <td><a href="https://android.googlesource.com/platform/system/media/+/e770e378dc8e2320679272234285456ca2244a62">A-67782345</a></td>
+   <td>EoP</td>
+   <td>高</td>
+   <td>5.1.1、6.0、6.0.1、7.0、7.1.1、7.1.2、8.0、8.1</td>
   </tr>
   <tr>
-    <td>CVE-2017-13211</td>
-    <td>A-65174158</td>
-    <td>DoS</td>
-    <td>高</td>
-    <td>8.0</td>
+   <td>CVE-2017-13211</td>
+   <td><a href="https://android.googlesource.com/platform/system/bt/+/181144a50114c824cfe3cdfd695c11a074673a5e">A-65174158</a></td>
+   <td>DoS</td>
+   <td>高</td>
+   <td>8.0</td>
   </tr>
 </tbody></table>
 
@@ -320,7 +326,7 @@
     <td>A-68266545<a href="#asterisk">*</a></td>
     <td>ID</td>
     <td>高</td>
-    <td>定时器</td>
+    <td>高精度定时器</td>
   </tr>
 </tbody></table>
 
@@ -527,7 +533,7 @@
 
 <h2 id="common-questions-and-answers">常见问题和解答</h2>
 <p>
-本部分针对阅读本公告后可能产生的常见问题提供了相应的解答。
+这一部分针对阅读本公告后可能产生的常见问题提供了相应的解答。
 </p>
 <p>
 <strong>1. 如何确定我的设备是否已更新到解决了这些问题的版本?
@@ -569,7 +575,7 @@
   <colgroup><col width="25%" />
   <col width="75%" />
   </colgroup><tbody><tr>
-   <th>缩写词</th>
+   <th>缩写</th>
    <th>定义</th>
   </tr>
   <tr>
@@ -594,7 +600,7 @@
   </tr>
 </tbody></table>
 <p>
-<strong>4.<em></em>“参考信息”列中的条目表示什么意思?</strong>
+<strong>4.“参考信息”列中的条目表示什么意思?<em></em></strong>
 </p>
 <p>
 漏洞详情表的“参考信息”列中的条目可能包含用于标识参考值所属组织的前缀。<em></em>
@@ -639,13 +645,13 @@
 <p>
 本安全公告中记录的安全漏洞是在 Android 设备上采用最新安全补丁程序级别所必不可少的。
 在设备/合作伙伴安全公告中记录的其他安全漏洞不是采用安全补丁程序级别所必需的。
-我们建议 Android 设备和芯片组制造商通过自己的安全网站(例如 <a href="https://security.samsungmobile.com/securityUpdate.smsb">Samsung</a>、<a href="https://lgsecurity.lge.com/security_updates.html">LGE</a> 或 <a href="/security/bulletin/pixel/">Pixel/Nexus</a> 安全公告)记录其设备上存在的其他修复方案。
+我们建议 Android 设备和芯片组制造商通过自己的安全网站(例如 <a href="https://security.samsungmobile.com/securityUpdate.smsb">Samsung</a>、<a href="https://lgsecurity.lge.com/security_updates.html">LGE</a> 或 <a href="/security/bulletin/pixel/">Pixel/Nexus</a> 安全公告)记录其设备上存在的其他修复程序。
 </p>
 <h2 id="versions">版本</h2>
 <table>
-  <colgroup><col width="25%" />
+  <colgroup><col width="15%" />
   <col width="25%" />
-  <col width="50%" />
+  <col width="60%" />
   </colgroup><tbody><tr>
    <th>版本</th>
    <th>日期</th>
@@ -656,6 +662,16 @@
    <td>2018 年 1 月 2 日</td>
    <td>发布了本公告。</td>
   </tr>
+  <tr>
+   <td>1.1</td>
+   <td>2018 年 1 月 3 日</td>
+   <td>更新了本公告,添加了关于 CVE-2017-13218 的通告。</td>
+  </tr>
+  <tr>
+   <td>1.2</td>
+   <td>2018 年 1 月 5 日</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 0533ad8..e13e6ca 100644
--- a/zh-cn/security/bulletin/pixel/2017-11-01.html
+++ b/zh-cn/security/bulletin/pixel/2017-11-01.html
@@ -399,9 +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-2.0/commit/?id=cc1896424ae7a346090f601bc69c6ca51d9c3e04">2</a>]</td>
+        <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>
     <td>WLAN</td>
@@ -454,9 +452,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-4.4/commit/?id=d815f54f15d765b5e0035a9d208d71567bcaace0">2</a>]</td>
+        <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>
     <td>显示屏</td>
@@ -488,9 +484,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-3.18/commit/?id=74ab23917b82769644a3299da47b58e080aa63f2">2</a>]</td>
+        <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>
     <td>相机</td>
@@ -572,8 +566,7 @@
   <tr>
     <td>CVE-2017-11022</td>
     <td>A-64440918<br />
-        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=1379bfb6c09ee2ad5969db45c27fb675602b4ed0">QC-CR#1086582</a>
-[<a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=f41e3dbc92d448d3d56cae5517e41a4bafafdf3f">2</a>]</td>
+        <a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/commit/?id=1379bfb6c09ee2ad5969db45c27fb675602b4ed0">QC-CR#1086582</a>[<a href="//source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0/commit/?id=f41e3dbc92d448d3d56cae5517e41a4bafafdf3f">2</a>]</td>
     <td>ID</td>
     <td>中</td>
     <td>WLAN</td>
@@ -712,7 +705,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/enhancements/enhancements50.html b/zh-cn/security/enhancements/enhancements50.html
index a6fc26f..2f84c3a 100644
--- a/zh-cn/security/enhancements/enhancements50.html
+++ b/zh-cn/security/enhancements/enhancements50.html
@@ -25,10 +25,10 @@
 <ul>
   <li><strong>默认加密:</strong> 在以开箱即用���方式搭载 L 的设备上,会默认启用全盘加密功能,以便更好地保护丢失设备或被盗设备上的数据。对于更新到 L 的设备,可以在<strong>设置</strong> &gt; <strong>安全性</strong>部分进行加密。
   </li><li><strong>经过改进的全盘加密功能:</strong> 使用 <code>scrypt</code> 保护用户密码免遭暴力破解攻击;在可能的情况下,该密钥会绑定到硬件密钥库,以防范来自设备外的攻击。和以往一样,Android 屏幕锁定密钥和设备加密密钥不会被发送到设备以外,也不会提供给任何应用。
-  </li><li><strong>通过 SELinux 得到增强的 Android 沙盒</strong>:对于所有域,Android 现在都要求 SELinux 处于强制模式。SELinux 是 Linux 内核中的强制访问控制 (MAC) 系统,用于增强现有的自主访问控制 (DAC) 安全模型。这个新层为防范潜在的安全漏洞提供了额外的保护屏障。
+  </li><li><strong>通过 SELinux 得到增强的 Android 沙盒</strong>:对于所有域,Android 现在都要求 SELinux 处于强制模式。SELinux 是 Linux 内核中的强制访问控制 (MAC) 系统,用于增强现有的自主访问控制 (DAC) 安全模型。这个新的安全层为防范潜在的安全漏洞提供了额外的保护屏障。
   </li><li><strong>Smart Lock:</strong>Android 现在包含一些 Trustlet,它们可以提供更灵活的设备解锁方式。例如,Trustlet 可让设备在靠近其他可信设备(通过 NFC、蓝牙)时或用户拥有可信面孔时自动解锁。
   </li><li><strong>面向手机和平板电脑的多用户功能、受限个人资料和访客模式:</strong> Android 现在为手机提供了多用户功能,并包含一个访客模式。利用访客模式,您可以让访客轻松地临时使用您的设备,而不向他们授予对您的数据和应用的访问权限。
-  </li><li><strong>不使用 OTA 的 WebView 更新方式:</strong> 现在可以独立于框架对 WebView 进行更新,而且无需使用系统 OTA。这有助于更快速地应对 WebView 中的潜在安全问题。
+  </li><li><strong>不使用 OTA 的 WebView 更新方式:</strong> 现在可以独立于框架对 WebView 进行更新,而且无需采用系统 OTA 方式。这有助于���快速地应对 WebView 中的潜在安全问题。
   </li><li><strong>经过更新的 HTTPS 和 TLS/SSL 加密功能</strong>:现在启用了 TLSv1.2 和 TLSv1.1,首选是正向加密,启用了 AES-GCM,停用了弱加密套件(MD5、3DES 和导出密码套件)。如需更多详细信息,请访问 <a href="https://developer.android.com/reference/javax/net/ssl/SSLSocket.html">https://developer.android.com/reference/javax/net/ssl/SSLSocket.html</a>。
   </li><li><strong>移除了非 PIE 链接器支持:</strong> Android 现在要求所有动态链接的可执行文件都要支持 PIE(位置无关可执行文件)。这有助于增强 Android 的地址空间布局随机化 (ASLR) 实现。
   </li><li><strong>FORTIFY_SOURCE 改进:</strong> 以下 libc 函数现在实现了 FORTIFY_SOURCE 保护功能:<code>stpcpy()</code>、<code>stpncpy()</code>、<code>read()</code>、<code>recvfrom()</code>、<code>FD_CLR()</code>、<code>FD_SET()</code> 和 <code>FD_ISSET()</code>。这有助于防范涉及这些函数的内存损坏漏洞。
diff --git a/zh-cn/security/index.html b/zh-cn/security/index.html
index cdb4f17..8ac2271 100644
--- a/zh-cn/security/index.html
+++ b/zh-cn/security/index.html
@@ -76,7 +76,7 @@
 <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>
-  <li><strong>应用服务</strong>:可让 Android 应用使用云功能(例如,应用数据和设置<a href="https://developer.android.com/guide/topics/data/backup.html">备份</a>功能,以及用于推送消息的“云端至设备消息传递”(<a href="https://developers.google.com/cloud-messaging/">C2DM</a>) 功能)的框架。</li>
+  <li><strong>应用服务</strong>:可让 Android 应用使用云端功能(例如,应用数据和设置<a href="https://developer.android.com/guide/topics/data/backup.html">备份</a>功能,以及用于推送消息的“云端至设备消息传递”(<a href="https://developers.google.com/cloud-messaging/">C2DM</a>) 功能)的框架。</li>
   <li><strong>验证应用</strong>:在用户安装有害应用时发出警告或自动阻止安装;持续扫描设备上的应用,并在发现<a href="https://support.google.com/accounts/answer/2812853">有害应用</a>时发出警告或将其移除。
   </li>
   <li><strong>SafetyNet</strong>:一款旨在保护隐私的入侵检测系统,能够帮助 Google 跟踪和降低已知的安全威胁,并能够发现新的安全威胁。</li>
diff --git a/zh-cn/security/keystore/tags.html b/zh-cn/security/keystore/tags.html
index f40a544..477d4e4 100644
--- a/zh-cn/security/keystore/tags.html
+++ b/zh-cn/security/keystore/tags.html
@@ -22,8 +22,8 @@
 
 <p>本页提供了一些对 Keymaster HAL 实现人员很有帮助的详细信息。
 其中介绍了 HAL 中的每个标记、提供相应标记的 Keymaster 版本以及相应标记是否可重复使用。除非标记说明中另有注明,否则以下所有标记都是在密钥生成期间用于指定密钥特性。</p>
-<p>对于 Keymaster 3,标记在 <code>platform/hardware/interfaces/keymaster/3.0/types.hal</code> 中定义。对于 Keymaster 2 及更低版本,标记在 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware">
-hardware/libhardware/include/hardware/keymaster_defs.h</a></code> 中定义。</p>
+<p>对于 Keymaster 3,标记在 <code>platform/hardware/interfaces/keymaster/3.0/types.hal</code> 中定义。对于 Keymaster 2 及更低版本,标记是在 <code><a href="https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware">
+hardware/libhardware/include/hardware/keymaster_defs.h</a></code> 中定义的。</p>
 
 <p>要了解具体函数,请参阅 <a href="/security/keystore/implementer-ref">Keymaster 函数</a>页面。</p>
 
@@ -93,7 +93,7 @@
 <p><strong>版本</strong>:1、2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<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>当提供给 <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>
 
@@ -104,7 +104,7 @@
 <p><strong>版本</strong>:1、2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<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>当提供给 <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>
 
@@ -206,7 +206,7 @@
 
 <p>用于指定授权在多长时间内使用相应密钥(以秒数计,从通过身份验证开始算起)。如果 <a href="#user_secure_id">Tag::USER_SECURE_ID</a> 存在而此标记不存在,那么每次使用相应密钥时都需要通过身份验证(要详细了解各项操作的身份验证流程,请参阅 <a href="/security/keystore/implementer-ref#begin">begin</a>)。</p>
 
-<p>此标记的值是一个 32 位的整数,用于指定可在多长时间内使用相应密钥(以秒数计,从使用通过 <a href="#mac_length">Tag::USER_AUTH_TYPE</a> 指定的身份验证方法对通过 <a href="#user_secure_id">Tag::USER_SECURE_ID</a> 指定的用户成功进行身份验证开始算起)。</p>
+<p>此标记的值是一个 32 位的整数,用于指定可在多长时间内使用相应密钥(以秒数计,从使用通过 <a href="#user_secure_id">Tag::USER_AUTH_TYPE</a> 指定的身份验证方法对通过 <a href="#mac_length">Tag::USER_SECURE_ID</a> 指定的用户成功进行身份验证后开始算起)。</p>
 
 <h2 id="auth_token">Tag::AUTH_TOKEN</h2>
 
@@ -275,7 +275,7 @@
 } keymaster_block_mode_t;
 </pre>
 
-<p>此标记可重复使用;对于 AES 密钥操作,要在 <a href="/security/keystore/implementer-ref#begin">bigin</a> 的 <code>additionalParams</code> 参数中指定模式。
+<p>此标记可重复使用;对于 AES 密钥操作,要在 <a href="/security/keystore/implementer-ref#begin">begin</a> 的 <code>additionalParams</code> 参数中指定模式。
 如果指定的模式不在相应密钥的关联模式之列,操作会失败并显示 <code>ErrorCode::INCOMPATIBLE_BLOCK_MODE</code>。</p>
 
 <h2 id="bootloader_only">Tag::BOOTLOADER_ONLY</h2>
@@ -397,7 +397,7 @@
 
 <p>用于指定相应密钥的大小(以位数计,按适用于相应密钥算法的一般方式衡量)。例如,对于 RSA 密钥,<code>Tag::KEY_SIZE</code> 用于指定公开模数的大小。对于 AES 密钥,此标记用于指定密钥私密材料的长度。</p>
 <p class="note">在 Keymaster 2 及更高版本中,<code>Tag::KEY_SIZE</code> 不再是选择 ECC(椭圆曲线加密)曲线的首选机制。
-虽然其他密钥类型不变,但使用标记 <a href="#ec_curve"><code>Tag::EC_CURVE</code></a> 选择 ECC 曲线。</p>
+虽然对于其他密钥类型而言是没有变化的,但 ECC 曲线是使用标记 <a href="#ec_curve"><code>Tag::EC_CURVE</code></a> 选择的。</p>
 
 <h2 id="mac_length">Tag::MAC_LENGTH</h2>
 
@@ -438,7 +438,7 @@
 
 <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 会为带有此标记的密钥维护一份使用次数计数器表格。
+<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>
@@ -455,7 +455,7 @@
 <p><strong>版本</strong>:1、2、3</p>
 <p><strong>是否可重复使用</strong>?否</p>
 
-<p>用于提供或返回进行 AES GCM、CBC 或 CTR 加密/解密时使用的随机数或初始化矢量 (IV)。在加密和解密操作期间,可以将此标记提供给 <a href="/security/keystore/implementer-ref#begin">begin</a>。仅当相应密钥带有 <a href="#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>
 
diff --git a/zh-cn/security/overview/acknowledgements.html b/zh-cn/security/overview/acknowledgements.html
index 2835480..3c27a68 100644
--- a/zh-cn/security/overview/acknowledgements.html
+++ b/zh-cn/security/overview/acknowledgements.html
@@ -46,7 +46,7 @@
    <td>CVE-2017-0846</td>
   </tr>
   <tr>
-   <td>阿里巴巴安全团队 Pandora 实验室的 Baozeng Ding (<a href="https://twitter.com/sploving1">@sploving</a>)、Chengming Yang 和 Yang Song</td>
+   <td>阿里巴巴安全团队潘多拉实验室的 Baozeng Ding (<a href="https://twitter.com/sploving1">@sploving</a>)、Chengming Yang 和 Yang Song</td>
    <td>CVE-2017-13222、CVE-2017-13220</td>
   </tr>
   <tr>
@@ -82,7 +82,7 @@
    <td>CVE-2017-13224</td>
   </tr>
   <tr>
-   <td><a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (周明建) (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
+   <td><a href="http://c0reteam.org">C0RE 团队</a>的周明建 (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
    <td>CVE-2017-13184、CVE-2017-13201</td>
   </tr>
   <tr>
@@ -98,7 +98,7 @@
    <td>CVE-2017-13176</td>
   </tr>
   <tr>
-   <td><a href="http://www.trendmicro.com">趋势科技</a>的<a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>)</td>
+   <td><a href="http://www.trendmicro.com">趋势科技</a><a href="http://blog.trendmicro.com/trendlabs-security-intelligence/category/mobile/">移动威胁响应团队</a>的 V.E.O (<a href="https://twitter.com/vysea">@VYSEa</a>)</td>
    <td>CVE-2017-13196、CVE-2017-13186</td>
   </tr>
   <tr>
@@ -285,7 +285,7 @@
    <td>CVE-2017-0493</td>
   </tr>
   <tr>
-   <td>索尼移动通信股份有限公司的 Fang Chen</td>
+   <td>Sony Mobile Communications Inc. 的 Fang Chen</td>
    <td>CVE-2017-0481</td>
   </tr>
   <tr>
@@ -465,7 +465,7 @@
    <td>CVE-2017-0327、CVE-2017-0328</td>
   </tr>
   <tr>
-   <td><a href="http://c0reteam.org/">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</td>
+   <td><a href="http://c0reteam.org/">C0RE 团队</a>的周明建 (<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、CVE-2017-0836、CVE-2017-0837、CVE-2017-0840、CVE-2017-0857、CVE-2017-8080、CVE-2017-6276、CVE-2017-13152、CVE-2017-13154、CVE-2017-13166、CVE-2017-13169、CVE-2017-14904</td>
   </tr>
   <tr>
@@ -981,7 +981,7 @@
 
 <p>Android 安全团队的 Min Chong</p>
 
-<p><a href="http://www.360safe.com/">奇虎 360</a> <a href="http://c0reteam.org">C0RE 团队</a>的 Mingjian Zhou (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</p>
+<p><a href="http://www.360safe.com/">奇虎 360</a> <a href="http://c0reteam.org">C0RE 团队</a>的周明建 (<a href="https://twitter.com/Mingjian_Zhou">@Mingjian_Zhou</a>)</p>
 
 <p>Google 的 Miriam Gershenson</p>
 
@@ -1015,7 +1015,7 @@
 
 <p><a href="http://www.wooyun.org/">乌云 TangLab</a> 的 Qianwei Hu (<a href="mailto:rayxcp@gmail.com">rayxcp@gmail.com</a>)</p>
 
-<p>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的 Qidan He (<a href="https://twitter.com/@Flanker_hqd">@Flanker_hqd</a>)</p>
+<p>腾讯科恩实验室 (<a href="https://twitter.com/keen_lab">@keen_lab</a>) 的何淇丹 (<a href="https://twitter.com/@Flanker_hqd">@Flanker_hqd</a>)</p>
 
 <p>Richard Shupak</p>
 
@@ -1289,7 +1289,7 @@
 
 <p><a href="https://labs.mwrinfosecurity.com/">MWR 实验室</a>的 <a href="http://blog.redfern.me/">Joseph Redfern</a> <br />(<a href="https://twitter.com/JosephRedfern">@JosephRedfern</a>)</p>
 
-<p><a href="https://www.samsungknox.com/">三星 KNOX 安全团队</a>的 Kunal Patel (<a href="mailto:kunal.patel1@samsung.com">kunal.patel1@samsung.com</a>)</p>
+<p><a href="https://www.samsungknox.com/">Samsung KNOX 安全团队</a>的 Kunal Patel (<a href="mailto:kunal.patel1@samsung.com">kunal.patel1@samsung.com</a>)</p>
 
 <p><a href="http://www.linkedin.com/in/luander">Luander Michel Ribeiro</a> (<a href="https://twitter.com/luanderock">@luanderock</a>)</p>
 
@@ -1307,7 +1307,7 @@
 <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>
+<p><a href="http://www.samsung.com">Samsung Mobile</a></p>
 
 <p>犹他大学的 Scotty Bauer (<a href="mailto:sbauer@eng.utah.edu">sbauer@eng.utah.edu</a>)</p>
 
@@ -1349,7 +1349,7 @@
 
 <p>印第安纳大学布卢明顿分校的 <a href="http://www.informatics.indiana.edu/xw7/">Xiaofeng Wang</a> (<a href="mailto:xw7@indiana.edu">xw7@indiana.edu</a>)</p>
 
-<p><a href="http://www.cs.indiana.edu/~zhou/">印第安纳大学布卢明顿分校</a>的 Xiaoyong Zhou <br />(<a href="https://twitter.com/xzhou">@xzhou</a>、<a href="mailto:zhou.xiaoyong@gmail.com">zhou.xiaoyong@gmail.com</a>)</p>
+<p><a href="http://www.cs.indiana.edu/~zhou/">印第安纳大学布卢明顿分校</a>的 Xiaoyong Zhou <br />(<a href="https://twitter.com/xzhou">@xzhou</a>、<a href="mailto:zhou.xiaoyong@gmail.com">zhou.xiaoyong@gmail.com</a>)</p>
 
 <p>北京大学的 Xinhui Han (<a href="mailto:hanxinhui@pku.edu.cn">hanxinhui@pku.edu.cn</a>)</p>
 
@@ -1380,7 +1380,8 @@
 <p>印第安纳大学布卢明顿分校的 <a href="http://homes.soic.indiana.edu/luyixing">Luyi Xing</a> (<a href="mailto:xingluyi@gmail.com">xingluyi@gmail.com</a>)</p>
 
 <p><a href="https://isecpartners.com/">iSEC Partners</a> 的 <a href="https://lacklustre.net/">Mike Ryan</a>
-<br />(<a href="https://twitter.com/mpeg4codec">@mpeg4codec</a>、<a href="mailto:mikeryan@isecpartners.com">mikeryan@isecpartners.com</a>)</p>
+<br />(<a href="https://twitter.com/mpeg4codec">@mpeg4codec</a>、<a href="mailto:mikeryan@isecpartners.com">mikeryan@isecpartners.com
+</a>)</p>
 
 <p><a href="http://illinois.edu/">伊利诺伊大学厄巴纳-尚佩恩分校</a>的 <a href="http://cryptoonline.com/">Muhammad Naveed</a>
 <br />(<a href="mailto:naveed2@illinois.edu">naveed2@illinois.edu</a>)</p>
diff --git a/zh-cn/security/overview/kernel-security.html b/zh-cn/security/overview/kernel-security.html
index f2c32f0..cc6d84d 100644
--- a/zh-cn/security/overview/kernel-security.html
+++ b/zh-cn/security/overview/kernel-security.html
@@ -20,9 +20,9 @@
       limitations under the License.
   -->
 
-<p>在操作系统级别,Android 平台不仅提供 Linux 内核的安全功能,而且还提供安全的进程间通信 (IPC) 机制,以便在不同进程中运行的应用之间安全通信。操作系统级别的这些安全功能旨在确保即使是本机代码也要受应用沙盒的限制。无论相应代码是自带应用行为导致的结果,还是利用应用漏洞导致的结果,系统都能防止恶意应用危害其他应用、Android 系统或设备本身。要了解您可以采取哪些措施来增强设备上的内核,请参阅<a href="/devices/tech/config/kernel.html">内核配置</a>。要了解必需的设置,请参阅 <a href="/compatibility/cdd.html">Android 兼容性定义文档 (CDD)</a>。</p>
+<p>在操作系统级别,Android 平台不仅提供 Linux 内核的安全功能,而且还提供安全的进程间通信 (IPC) 机制,以便在不同进程中运行的应用之间安全通信。操作系统级别的这些安全功能旨在确保即使是原生代码也要受应用沙盒的限制。无论相应代码是自带应用行为导致的结果,还是利用应用漏洞导致的结果,系统都能防止违规应用危害其他应用、Android 系统或设备本身。要了解您可以采取哪些措施来增强设备的内核安全性,请参阅<a href="/devices/tech/config/kernel.html">内核配置</a>。要了解必需的设置,请参阅 <a href="/compatibility/cdd.html">Android 兼容性定义文档 (CDD)</a>。</p>
 <h2 id="linux-security">Linux 安全</h2>
-<p>Android 平台的基础是 Linux 内核。Linux 内核多年来一直应用得非常广泛,并且用在了数百万种安全敏感型环境中。在历经数以千计的开发者不断研究、攻击和修复之后,Linux 已成为��多公司和安全专业人士信任的一款既稳定又安全的内核。</p>
+<p>Android 平台的基础是 Linux 内核。Linux 内核多年来得到了非常广泛的应用,在千百万对安全敏感的环境中都有它的身影。在历经无数攻击以及成千上万的开发者的不断研究和修复之后,Linux 已成为许多公司和安全专业人士信任的一款既稳定又安全的内核。</p>
 <p>作为移动计算环境的基础,Linux 内核为 Android 提供了一些关键的安全功能,其中包括:</p>
 <ul>
   <li>基于用户的权限模式</li>
@@ -30,7 +30,7 @@
   <li>用于实现安全 IPC 的可扩展机制</li>
   <li>能够移除内核中不必要的和可能不安全的部分</li>
 </ul>
-<p>作为多用户操作系统,Linux 内核的一个基本安全目标是将用户资源彼此隔离开来。Linux 的安全理念是防范用户资源之间相互侵扰。因此,Linux 可以:</p>
+<p>作为一种多用户操作系统,Linux 内核的一个基本安全目标是将用户资源彼此隔离开来。Linux 的安全理念是防范用户资源之间相互侵扰。因此,Linux 可以:</p>
 <ul>
   <li>防止用户 A 读取用户 B 的文件</li>
   <li>确保用户 A 不会占用用户 B 的内存</li>
@@ -39,48 +39,52 @@
 </ul>
 <h2 id="the-application-sandbox">应用沙盒</h2>
 <p>Android 平台利用基于用户的 Linux 保护机制来识别和隔离应用资源。Android 系统会为每个 Android 应用分配一个独一无二的用户 ID (UID),并使它们以这个用户身份在单独的进程中运行。这种方法与其他操作系统(包括传统的 Linux 配置)采用的方法不同。在其他操作系统中,多个应用会以相同的用户权限运行。</p>
-<p>这样就设置了一个内核级应用沙盒。内核会在进程级别通过标准的 Linux 内容(例如,分配给应用的用户 ID 和组 ID)强制执行应用和系统之间的安全功能。默认情��下,应用不能彼此交互,而且应用对操作系统的访问权限会受到限制。如果应用 A(一个单独的应用)尝试执行恶意操作,例如在没有权限的情况下读取应用 B 的数据或拨打电话,操作系统会阻止此类操作,因为应用 A 没有适当的用户权限。沙盒非常简单,可审核,并且基于已有数十年历史的 UNIX 风格的进程用户隔离和文件权限机制。</p>
-<p>由于应用沙盒位于内核中,因此该安全模型的保护范围扩展到了本机代码和操作系统应用。位于内核上方的所有软件(例如,操作系统库、应用框架、应用运行时和所有应用)都会在应用沙盒中运行。在某些平台上,为了强制执行安全功能,会限制开发者只能使用特定的开发框架、API 组或语言。在 Android 上,并没有限制必须如何编写应用才能强制执行安全功能;在这一方面,本机代码与直译码一样安全。</p>
-<p>在某些操作系统中,一个应用中的内存损坏错误可能会导致位于同一内存空间中的其他应用出现损坏,进而导致设备的安全性完全遭到破坏。由于所有应用及其资源都在操作系统级别的沙盒���,因此,如果出现内存损坏错误,将只有在相应应用的环境中才能发生任意执行代码的行为,而且只能是以操作系统确立的权限执行代码。</p>
+<p>这样就设置了一个内核级应用沙盒。内核会在进程级别利用标准的 Linux 机制(例如,分配给应用的用户 ID 和组 ID)实现应用和系统之间的安全防护。默认情况下,应用不能彼此交互,而且应用对操作系统的访问权限会受到限制。如果应用 A(一个单独的应用)尝试执行恶意操作,例如在没有权限的情况下读取应用 B 的数据或拨打电话,操作系统会阻止此类操作,因为应用 A 没有适当的用户权限。这一沙盒机制非常简单,可审核,并且基于已有数十年历史的 UNIX 风格的进程用户隔离和文件权限机制。</p>
+<p>由于应用沙盒位于内核层面,因此该安全模型的保护范围扩展到了原生代码和操作系统应用。位于更高层面的所有软件(例如,操作系统库、应用框架、应用运行时环境和所有应用)都会在应用沙盒中运行。在某些平台上,为了执行安全防护机制,会限制开发者只能使用特定的开发框架、API 或语言。在 Android 上,并没有为此而限制开发者必须如何编写应用,在这方面,原生代码与解释型代码一样安全。</p>
+<p>在某些操作系统中,一个应用中的内存异常可能会破坏位于同一内存空间中的其他应用的内存数据,进而导致设备的安全性荡然无存。在 Android 中,由于所有应用及其资源都在操作系统级别的沙盒内,因此,即使出现内存数据损坏,也只能在相应应用的环境内执行代码,而且只能以操作系统确立的权限执行代码。</p>
 <p>与所有安全功能一样,应用沙盒并不是坚不可摧的。不过,要在经过适当配置的设备上攻破应用沙盒这道防线,必须要先攻破 Linux 内核的安全功能。</p>
 <h2 id="system-partition-and-safe-mode">系统分区和安全模式</h2>
 <p>系统分区包含 Android 的内核,以及操作系统库、应用运行时、应用框架和应用。该分区设为了只读分区。当用户将设备启动到安全模式时,第三方应用可由设备所有者手动启动,但不会默认启动。</p>
 <h2 id="filesystem-permissions">文件系统权限</h2>
 <p>在 UNIX 风格的环境中,文件系统权限可确保一个用户不能更改或读取另一个用户的文件。在 Android 中,每个应用都以自己的用户身份运行。除非开发者明确地与其他应用共享文件,否则一个应用不能读取或更改另一个应用创建的文件。</p>
 <h2 id="se-linux">安全增强型 Linux</h2>
-<p>Android 使用安全增强型 Linux (SELinux) 来应用访问控制策略并对进程建立强制访问控制 (mac)。如需详细信息,请参阅 <a href="/security/selinux/index.html">Android 中的安全增强型 Linux</a>。</p>
+<p>Android 使用安全增强型 Linux (SELinux) 来实施访问控制策略并针对进程建立强制访问控制 (mac) 机制。如需详细信息,请参阅 <a href="/security/selinux/index.html">Android 中的安全增强型 Linux</a>。</p>
 <h2 id="verified-boot">验证启动</h2>
-<p>Android 6.0 及更高版本支持验证启动功能和 device-mapper-verity。验证启动功能旨在保证设备软件(从硬件��任根直到系统分区)的完整性。在启动过程中,无论是在每个阶段,都会在进入下一个阶段之前先验证下一个阶段的完整性和真实性。
+<p>
+Android 6.0 及更高版本支持验证启动功能和 device-mapper-verity。验证启动功能旨在保证设备软件(从硬件信任根直到系统分区)的完整性。在启动过程中,无论是在哪个阶段,都会在进入下一个阶段之前以加密形式先验证下一个阶段的完整性和正确性。
 </p>
-<p>Android 7.0 及更高版本支持严格强制执行的验证启动,这意味着遭到入侵的设备将无法启动。
+<p>
+Android 7.0 及更高版本支持严格强制执行的验证启动,这意味着遭到入侵的设备将无法启动。
 </p>
-<p>如需更多详细信息,请参阅<a href="/security/verifiedboot/index.html">验证启动</a>。
+<p>
+如需更多详细信息,请参阅<a href="/security/verifiedboot/index.html">���证启动</a>。
 </p>
 
 <h2 id="crypto">加密</h2>
-<p>Android 提供了一套加密 API 供应用使用,其中包括标准和常用加密基元(例如,AES、RSA、DSA 和 SHA)的实现 API。此外,Android 还提供了适用于更高级别协议(例如,SSL 和 HTTPS)的 API。</p>
+<p>Android 提供了一系列加密 API 供应用使用,其中包括标准和常用加密基元(例如,AES、RSA、DSA 和 SHA)的实现。此外,Android 还提供了适用于更高级别协议(例如,SSL 和 HTTPS)的 API。</p>
 <p>Android 4.0 中引入了 <a href="http://developer.android.com/reference/android/security/KeyChain.html">KeyChain</a> 类,以便应用使用系统凭据存储空间来存储私钥和证书链。</p>
 <h2 id="rooting-devices">获取设备的 Root 权限</h2>
-<p>默认情况下,在 Android 上,只有内核和一小部分核心应用能够以 Root 权限运行。Android 不会阻止具有 Root 权限的用户或应用修改操作��统、内核或任何其他应用。一般来说,Root 对所有应用和所有应用数据拥有完整访问权限。如果用户在 Android 设备上更改权限来向应用授予 Root 访问权限,则会使遭受恶意应用攻击以及遭受潜在应用缺陷侵扰的安全风险增加。</p>
-<p>能够修改自己的 Android 设备对于使用 Android 平台的开发者来说非常重要。在许多 Android 设备上,用户都可以解锁引导加载程序,以便安装替代操作系统。这些替代操作系统可能会允许所有者获得 Root 访问权限,以便他们调试应用和系统组件,或者访问 Android API 未提供给应用的功能。</p>
-<p>在有些设备上,能够亲手控制设备并拥有 USB 数据线的用户可以安装能够向其提供 Root 权限的新操作系统。为了保护所有现有用户数据免遭入侵,引导加载程序解锁机制要求引导加载程序在解锁期间清空所有现有用户数据。利用内核错误或安全漏洞获得 Root 访问权限后,可以绕过这种保护机制。</p>
-<p>使用存储在设备上的密钥对数据进行加密的做法并不能防止 Root 用户访问应用数据。应用可以使用存储在设备之外的密���(例如,存储在服务器上的密钥,或用户密码)进行加密,从而添加一道数据保护屏障。如果不提供密钥的话,这种方法可以提供临时保护,但在某些时候,必须要先将密钥提供给应用,然后 Root 用户才能访问相应应用。</p>
-<p>一种更强大的防止 Root 用户获取数据的方式是使用硬件解决方案。原始设备制造商 (OEM) 可以选择实现仅允许访问特定类型的内容的硬件解决方案,例如,适用于视频播放的 DRM 或适用于 Google 电子钱包的 NFC 相关可信存储空间。</p>
-<p>如果设备丢失或被盗,Android 设备上的全文件系统加密功能可以使用设备密码来保护加密密钥,这样一来,修改启动加载程序或操作系统的做法将不足以在没有用户设备密码的情况下访问用户数据。</p>
+<p>默认情况下,在 Android 上,只有内核和一小部分核心应用能够以 Root 权限运行。Android 不会阻止具有 Root 权限的用户或应用修改操作系统、内核或任何其他应用。一般来说,Root 对所有应用和所有应用数据拥有完整访问权限。如果用户在 Android 设备上更改权限来向应用授予 Root ���问权限,那么在面对恶意应用以及潜在应用缺陷时,安全风险会更大。</p>
+<p>能够修改自己的 Android 设备对于使用 Android 平台的开发者来说非常重要。在许多 Android 设备上,用户都可以解锁引导加载程序,以便安装替代操作系统。这些替代操作系统可能会允许所有者获得 Root 访问权限,以便他们调试应用和系统组件,或者使用 Android API 未提供给应用的功能。</p>
+<p>在某些设备上,能够亲手控制设备并拥有 USB 数据线的用户可以安装能够向其提供 Root 权限的新操作系统。为了保护所有现有用户数据免遭入侵,引导加载程序解锁机制要求引导加载程序在解锁期间清空所有现有用户数据。利用内核错误或安全漏洞获得 Root 访问权限后,可以绕过这种保护机制。</p>
+<p>使用存储在设备上的密钥对数据进行加密的做法并不能防止 Root 用户访问应用数据。应用可以使用存储在设备之外的密钥(例如,存储在服务器上的密钥,或用户密码)进行加密,从而添加一道数据保护屏障。在没有密钥的情况下,这种方法可以提供临时保护,但应用迟��要获取密钥来进行解密,此时 Root 用户也就可以取得相应密钥了。</p>
+<p>一种更强大的防止 Root 用户获取数据的方式是使用硬件解决方案。OEM 可以选择实现可限制特定类型的内容的访问权限的硬件解决方案,例如,适用于视频播放的 DRM 解决方案或适用于 Google 电子钱包的 NFC 相关可信存储空间。</p>
+<p>如果设备丢失或被盗,Android 设备上的全文件系统加密功能会用设备密码来保护加密密钥,这样一来,修改启动加载程序或操作系统的做法将不足以在没有用户设备密码的情况下访问用户数据。</p>
 <h2 id="user-security">用户安全功能</h2>
 <h3 id="filesystem-encryption">文件系统加密</h3>
 <p>Android 3.0 及更高版本提供全文件系统加密功能,因此所有用户数据都可以在内核中进行加密。</p>
-<p>Android 5.0 及更高版本支持<a href="/security/encryption/full-disk.html">全盘加密</a>。全盘加密功能旨在使用单个密钥(由用户的设备密码加以保护)来保护设备的整个用户数据分区。在启动时,用户必须先提供其凭据,然后才能访问磁盘的任何部分。
+<p>Android 5.0 及更高版本支持<a href="/security/encryption/full-disk.html">全盘加密</a>。全盘加密功能旨在用一个密钥(由用户的设备密码加以保护)来保护设备的整个用户数据分区。在启动时,用户必须先提供其凭据,然后才能访问磁盘的任何部分。
 </p>
-<p>Android 7.0 及更高版本支持<a href="/security/encryption/file-based.html">文件级加密</a>。采用文件级加密时,可以使用不同的密钥对不同的文件进行加密,并且可以对这些文件进行单独解密。
+<p>
+Android 7.0 及更高版本支持<a href="/security/encryption/file-based.html">文件级加密</a>。采用文件级加密时,可以使用不同的密钥对不同的文件进行加密,并且可以对这些文件进行单独解密。
 </p>
 
-<p>如需关于实现文件系统加密的更多详细信息,请参阅<a href="/security/encryption/index.html">加密</a>部分。</p>
+<p>如需详细了解如何实现文件系统加密,请参阅<a href="/security/encryption/index.html">加密</a>部分。</p>
 <h3 id="password-protection">密码保护</h3>
-<p>Android 可以配置为在提供对设备的访问权限之前先验证用户提供的密码。除了防止未经授权使用设备外,该密码还可以保护用于进行全文件系统加密的加密密钥。</p>
-<p>设备管理员可以要求使用密码和/或密码复杂度规则。</p>
+<p>Android 可以配置为先验证用户提供的密码,然后再提供对设备的访问权限。除了防止未经授权使用设备外,该密码还可以保护用于进行全文件系统加密的加密密钥。</p>
+<p>设备管理员可以要求使用密码和/或设置密码复杂度规则。</p>
 <h2 id="device-administration">设备管理</h2>
-<p>Android 2.2 及更高版本提供 Android Device Administration API,该 API 在系统级别提供设备管理功能。例如,内置的 Android 电子邮件应用可以使用该 API 来改善 Exchange 支持。通过电子邮件应用,Exchange 管理员可以跨设备强制执行密码政策(其中密码包括字母数字密码或数字 PIN 码)。管理员还可以远程清除(即恢复出厂默认设置)丢失或被盗手机上的数据。</p>
-<p>除了在 Android 系统自带的应用中使用外,该 API 还可供提供设备管理解决方案的第三方使用。如需详细了解该 API,请参阅<a href="https://developer.android.com/guide/topics/admin/device-admin.html">设备管理</a>。</p>
+<p>Android 2.2 及更高版本提供 Android Device Administration API,该 API 在系统级别提供设备管理功能。例如,内置的 Android 电子邮件应用可以使用该 API 来改善 Exchange 支持。在此情况下,Exchange 管理员可以跨设备强制执行密码政策(字母数字密码或数字 PIN 码都算作密码)。管理员还可以远程清除(即恢复出厂默认设置)丢失或被盗手机上的数据。</p>
+<p>除了 Android 系统自带的应用,提供设备管理解决方案的第三方也可使用该 API。如需详细了解该 API,请参阅<a href="https://developer.android.com/guide/topics/admin/device-admin.html">设备管理</a>。</p>
 
 </body></html>
\ No newline at end of file
diff --git a/zh-cn/security/selinux/validate.html b/zh-cn/security/selinux/validate.html
index 701feef..2e44276 100644
--- a/zh-cn/security/selinux/validate.html
+++ b/zh-cn/security/selinux/validate.html
@@ -20,19 +20,19 @@
       limitations under the License.
   -->
 
-<p>Android 强烈建议原始设备制造商 (OEM) 全面测试其 SELinux 实现。制造商在实现 SELinux 时,应先为设备上需要测试的所有内容应用新政策。</p>
+<p>Android 强烈建议 OEM 全面测试其 SELinux 实现。制造商在实现 SELinux 时,应先在一组测试设备上实施新政策。</p>
 
-<p>应用新政策后,可以通过执行 getenforce 命令来确认 SELinux 在设备上的运行模式是否正确</p>
+<p>实施新政策后,可通过执行 getenforce 命令来确认 SELinux 在设备上的运行模式是否正确</p>
 
 <p>该命令将会显示全局 SELinux 模式:强制或宽容。请注意,该命令只会显示全局 SELinux 模式。要确定每个域的 SELinux 模式,您必须查看相应的文件,或运行带有适当 (-p) 标记的最新版 <code>sepolicy-analyze</code>(位于 /platform/system/sepolicy/tools/ 中)。</p>
 
 <h2 id="reading_denials">读取拒绝事件</h2>
 
-<p>接下来是检查是否存在错误���错误会以事件日志的形式路由到 dmesg 和 <code>logcat</code>,并可在设备上从本地查看。制造商应先检查这些设备上路由到 dmesg 的 SELinux 输出并优化设置,然后再在宽容模式下公开发布,最后切换到强制模式。SELinux 日志消息中包含“avc:”,因此可以通过 <code>grep</code> 轻松找到。可以通过运行 <code>cat /proc/kmsg</code> 来获取当前的拒绝事件日志,也可以通过运行 cat <code>/proc/last_kmsg</code> 来获取上次启动时的拒绝事件日志。</p>
+<p>接下来是检查是否存在错误。错误会以事件日志的形式传给 dmesg 和 <code>logcat</code>,并可在设备上从本地查看。制造商应先检查这些设备上传给 dmesg 的 SELinux 输出并优化设置,然后再在宽容模式下公开发布,最后切换到强制模式。SELinux 日志消息中包含“avc:”字样,因此可使用 <code>grep</code> 轻松找到。您可以使用 <code>cat /proc/kmsg</code> 来获取当前的拒绝事件日志,也可以使用 cat <code>/proc/last_kmsg</code> 来获取上次启动时的拒绝事件日志。</p>
 
-<p>借助这种输出,制造商可以轻松发现系统用户或组件违反 SELinux 政策的行为。然后,制造商便可以通过对相应软件和/或 SELinux 政策进行更改来防范这种恶意行为。</p>
+<p>根据这些输出内容,制造商可以轻松发现系统用户或组件违反 SELinux 政策的行为。然后,制造商便可更改相应软件和/或 SELinux 政策,以防范此类恶意行为。</p>
 
-<p>具体来说就是,这些日志消息会指明在强制模式下哪些进行会失败以及失败原因。示例如下:</p>
+<p>具体来说,这些日志消息会指明在强制模式下哪些进程会失败以及失败原因。示例如下:</p>
 
 <pre>
 avc: denied  { connectto } for  pid=2671 comm="ping" path="/dev/socket/dnsproxyd"
@@ -42,10 +42,10 @@
 <p>该输出的解读如下:</p>
 
 <ul>
-  <li>上方的 <code>{ connectto }</code> 表示正在执行的操作。通过它和末尾的 <code>tclass</code> (<code>unix_stream_socket</code>),您可以大致了解正在对什么对象执行什么操作,在该示例中是某个操作方正在试图连接到 UNIX 信息流套接字。
-  </li><li><code>scontext (u:r:shell:s0)</code> 旨在告诉您发起相应操作的环境,在该示例中是某个作为 shell 运行的操作方。
-  </li><li><code>tcontext (u:r:netd:s0)</code> 旨在告诉您操作目标的环境,在该示例中是某个归 <code>netd</code> 所有的 unix_stream_socket。
-  </li><li>顶部的 <code>comm="ping"</code> 旨在为您提供更多提示,让您了解拒绝事件发生时正在运行的操作。在该示例中,这是一个非常实用的提示。
+  <li>上方的 <code>{ connectto }</code> 表示执行的操作。根据它和末尾的 <code>tclass</code> (<code>unix_stream_socket</code>),您可以大致了解是对什么对象执行什么操作。在此例中,是操作方正在试图连接到 UNIX 信息流套接字。
+  </li><li><code>scontext (u:r:shell:s0)</code> 表示发起相应操作的环境,在此例中是 shell 中运行的某个程序。
+  </li><li><code>tcontext (u:r:netd:s0)</code> 表示操作目标的环境,在此例中是归 <code>netd</code> 所有的某个 unix_stream_socket。
+  </li><li>顶部的 <code>comm="ping"</code> 可帮助您了解拒绝事件发生时正在运行的程序。在此示例中,给出的信息非常清晰明了。
 </li></ul>
 
 <p>下面是另一个示例:</p>
@@ -60,22 +60,22 @@
 <p>以下是此拒绝事件的关键元素:</p>
 
 <ul>
-  <li><em></em>操作 - 试图进行的操作使用括号突出显示:<code>read write</code> 或 <code>setenforce</code>。
-  </li><li><em></em>操作方 - <code>scontext</code>(来源环境)��目表示操作方;在该示例中为<code> rmt_storage</code> 守护进程。
-  </li><li><em></em>对象 - <code>tcontext</code>(目标环境)条目表示正在对哪个对象执行操作;在该示例中为 kmem。
-  </li><li><em></em>结果 - <code>tclass</code>(目标类别)条目表示当前操作对象的类型;在该示例中为 <code>chr_file</code>(字符设备)。
+  <li><em></em>操作 - 试图进行的操作列在花括号中:<code>read write</code> 或 <code>setenforce</code>。
+  </li><li><em></em>操作方 - <code>scontext</code>(来源环境)条目表示操作方;在此例中为 <code> rmt_storage</code> 守护进程。
+  </li><li><em></em>对象 - <code>tcontext</code>(目标环境)条目表示是对哪个对象执行操作;在此例中为 kmem。
+  </li><li><em></em>结果 - <code>tclass</code>(目标类别)条目表示操作对象的类型;在此��中为 <code>chr_file</code>(字符设备)。
 </li></ul>
 
 <h2 id="switching_to_permissive">切换到宽容模式</h2>
 
-<p class="caution"><strong>重要提示</strong>:生产设备不支持宽容模式。CTS 测试可确认是否已启用强制模式。</p>
+<p class="caution"><strong>重要提示</strong>:生产设备不支持宽容模式。CTS 测试会确认是否已启用强制模式。</p>
 
-<p>SELinux 强制模式可以在 userdebug 或 eng 版本中通过 ADB 启用。为此,请先运行 <code>adb root</code> 以将 ADB 切换为 root 权限。然后,要停用 SELinux 强制模式,请运行以下命令:
+<p>SELinux 强制模式可以在 userdebug 或 eng 版本中通过 ADB 停用。为此,请先运行 <code>adb root</code> 以将 ADB 切换为 root 权限。然后,要停用 SELinux 强制模式,请运行以下命令:
 </p><pre class="devsite-terminal devsite-click-to-copy">
 adb shell setenforce 0
 </pre>
 
-<p>或在内核命令行中输入以下命令(在设备启动初期):</p>
+<p>或在内核命令行中输入以下命令(适用于设备开发初期):</p>
 
 <pre class="devsite-click-to-copy">
 <code class="devsite-terminal">androidboot.selinux=permissive</code>
@@ -85,7 +85,7 @@
 <h2 id="using_audit2allow">使用 audit2allow</h2>
 
 <p><code>selinux/policycoreutils/audit2allow</code> 工具可以获取 <code>dmesg</code> 拒绝事件并将其转换成相应的 SELinux 政策声明。因此,该工具有助于大幅加快 SELinux 开发速度。
-<code>audit2allow</code> 会作为 Android 源代码树的���部分被移植到设备上,并会在您基于源代码编译 Android 时自动进行编译。</p>
+<code>audit2allow</code> 包含在 Android 源代码树中,会在您基于源代码编译 Android 时自动编译。</p>
 
 <p>要使用该工具,请运行以下命令:</p>
 
@@ -94,10 +94,10 @@
 <code class="devsite-terminal">adb logcat -b all -d | audit2allow -p policy</code>
 </pre>
 
-<p class="note"><strong>注意</strong>:运行这些命令不会更改 bugreport.txt,因为所有日志都已经存在,包括上次重新启动之前存在的日志。在运行 OTA 或开发闪存的设备上,旧的和新的违规行为会混合在一起,直到下一次重新启动。要解决此问题,请重新启动设备,或者从您的错误报告中过滤出 LAST_KMSG 和 LAST_LOGCAT。
+<p class="note"><strong>注意</strong>:运行这些命令不会更改 bugreport.txt,因为所有日志都已���存在,包括上次重新启动之前存在的日志。在设备进行 OTA 更新或向设备刷入开发版系统时,新旧违规行为会混杂在一起,直到下一次重新启动为止。要解决此问题,请重新启动设备,或者从您的错误报告中滤除 LAST_KMSG 和 LAST_LOGCAT。
 </p>
 
-<p>不过,在检查各种潜在增加项是否存在越界权限时务必要谨慎。例如,为 audit2allow 馈送之前显示的 <code>rmt_storage</code> 拒绝事件会导致以下建议的 SELinux 政策声明:</p>
+<p>不过,请务必仔细审核要添加到政策中的条目,以免出现权限过宽的情况。例如,如果将上面的 <code>rmt_storage</code> 拒绝事件输入到 audit2allow 中,会生成以下 SELinux 政策声明建议:</p>
 
 <pre>
 #============= shell ==============
@@ -106,6 +106,6 @@
 allow rmt kmem_device:chr_file { read write };
 </pre>
 
-<p>这会授予 <code>rmt</code> 向内核内存写入内容的权限,从而形成明显的安全漏洞。通常情况下,<code>audit2allow</code> 声明只是一个起点。在使用这些声明之后,您可能需要更改来源域和目标的标签,并纳入适当的宏,才能获得好的政策。有时,要解决正在检查的拒绝事件,不应对政策进行任何更改;而是应更改违规的应用。</p>
+<p>这会授予 <code>rmt</code> 向内核内存写入内容的权限,从而形成明显的安全漏洞。通常情况下,<code>audit2allow</code> 给出的声明建议只是一个大致的基础。在添加这些声明后,您可能需要更改来源域和目标标签,并纳入适当的宏,才能实现良好的政策配置。有时,拒绝事件的合理应对方式不是对政策进行更改,而是更改违规的应用。</p>
 
 </body></html>
\ No newline at end of file