summaryrefslogtreecommitdiffstats
path: root/docs/html-intl
diff options
context:
space:
mode:
authorDavid Friedman <dmail@google.com>2015-07-07 20:11:08 -0700
committerDavid Friedman <dmail@google.com>2015-07-07 20:11:08 -0700
commit2f47c23925a341c51cfafde4fcc4c1960c4c91dd (patch)
treea96556f1e4d5a7e8bcaded4ec1ede41e72737fab /docs/html-intl
parent41a722ab49e8b6dfed1de317e58867afd5bb5077 (diff)
downloadframeworks_base-2f47c23925a341c51cfafde4fcc4c1960c4c91dd.zip
frameworks_base-2f47c23925a341c51cfafde4fcc4c1960c4c91dd.tar.gz
frameworks_base-2f47c23925a341c51cfafde4fcc4c1960c4c91dd.tar.bz2
Docs: L10N of remaining M Preview pages for zh-cn
Change-Id: Id28c630d362b9a59da1ef06c82449008755a1bf0
Diffstat (limited to 'docs/html-intl')
-rw-r--r--docs/html-intl/intl/zh-cn/preview/backup/index.jd327
-rw-r--r--docs/html-intl/intl/zh-cn/preview/download.jd348
-rw-r--r--docs/html-intl/intl/zh-cn/preview/features/app-linking.jd123
-rw-r--r--docs/html-intl/intl/zh-cn/preview/index.jd67
-rw-r--r--docs/html-intl/intl/zh-cn/preview/license.jd143
-rw-r--r--docs/html-intl/intl/zh-cn/preview/samples.jd70
-rw-r--r--docs/html-intl/intl/zh-cn/preview/setup-sdk.jd207
-rw-r--r--docs/html-intl/intl/zh-cn/preview/support.jd67
-rw-r--r--docs/html-intl/intl/zh-cn/preview/testing/guide.jd187
-rw-r--r--docs/html-intl/intl/zh-cn/preview/testing/performance.jd656
10 files changed, 2195 insertions, 0 deletions
diff --git a/docs/html-intl/intl/zh-cn/preview/backup/index.jd b/docs/html-intl/intl/zh-cn/preview/backup/index.jd
new file mode 100644
index 0000000..39786a3
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/backup/index.jd
@@ -0,0 +1,327 @@
+page.title=自动备份应用
+page.tags=备份, 预览版资源, androidm
+page.keywords=备份, 自动备份, 预览版
+page.image=images/cards/card-auto-backup_2x.png
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#overview">概览</a></li>
+ <li><a href="#configuring">配置数据备份</a></li>
+ <li><a href="#testing">测试备份配置</a></li>
+ <li><a href="#issues">已知问题</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>
+ 通常,用户需要投入大量的时间和精力在应用内创建数据和设置首选项。
+如果用户更换破损设备或升级至新设备,则保留用户数据对于确保提供卓越的用户体验至关重要。
+在这些情况下,运行 Android M 预览版系统的设备可以通过将应用数据自动备份到 Google Drive,帮助确保提供卓越的用户体验。
+
+这样,即使用户更换或升级设备,应用数据也可自动恢复。
+
+</p>
+
+<p>
+ 对于运行 Android M 预览版的设备中所有已安装的应用,均可启用自动备份。无需额外提供应用代码。
+该系统允许用户选择禁止自动数据备份。
+此外,您还可以选择限制要备份应用中的哪些数据。
+</p>
+
+<p>
+ 本文介绍了新系统行为,阐述了如何指定要为应用备份哪些数据。
+
+</p>
+
+<h2 id="overview">概览</h2>
+
+<p>
+ 自动备份功能可以通过将应用在用户设备中创建的数据上传到用户的 Google Drive 帐户并进行加密,来保留这些数据。
+您或用户无需为数据存储付费,且保存的数据不计入用户个人的 Drive 配额。
+在 M 预览版运行期间,用户可针对每个 Android 应用存储多达 25MB 的数据。
+
+</p>
+
+<p>
+ 当设备处于空闲、充电以及连接至 Wi-Fi 网络时,会每 24 小时自动备份一次数据。
+满足上述这些条件后,备份管理器服务会将所有可用的备份数据上传至云端。
+当用户改用新设备或卸载并重新安装备份的应用时,恢复操作会将备份的数据复制到新安装的应用的数据目录中。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>如果应用使用旧版 <a href="{@docRoot}google/backup/index.html">Android 备份服务</a>,则此新行为不适用,不过现有的备份行为会照常运行。
+
+
+</p>
+
+
+<h3 id="auto-exclude">自动排除的数据文件</h3>
+
+<p>
+ 并非所有应用数据均应备份,例如临时文件和缓存文件就无需备份,因此自动备份服务会默认排除如下一些特定的数据文件:
+
+</p>
+
+<ul>
+ <li>通过 {@link android.content.Context#getCacheDir
+ getCacheDir()} 和 {@link android.content.ContextWrapper#getCodeCacheDir getCodeCacheDir()}
+ 方法所引用的目录中的文件
+ </li>
+
+ <li>位于外部存储中的文件,除非这些文件是驻留在通过
+{@link android.content.Context#getExternalFilesDir getExternalFilesDir()}
+ 方法所引用的目录中
+ </li>
+
+ <li>位于通过
+{@link android.content.Context#getNoBackupFilesDir getNoBackupFilesDir()} 方法所引用的目录中的文件
+ </li>
+</ul>
+
+<h2 id="configuring">配置数据备份</h2>
+
+<p>
+ 除了上一部分中列出的自动排除的文件外,凡 M 预览版设备中安装的任何应用所创建的数据均会备份。
+您可以使用应用清单文件中的设置,进一步限制和配置应用中的哪些数据需要备份。
+
+</p>
+
+<h3 id="include-exclude">包括或排除数据</h3>
+
+<p>
+ 根据应用所需的数据及其保存方式,您可能需要针对包括或排除哪些特定的文件或目录设置具体的规则。
+自动备份服务支持使用 XML 配置文件和应用清单文件来设置这些备份规则。
+
+您可以在应用清单文件中指定备份架构配置文件,如下例所示:
+
+</p>
+
+<pre>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.my.appexample"&gt;
+ &lt;uses-sdk android:minSdkVersion="MNC"/&gt;
+ &lt;uses-sdk android:targetSdkVersion="MNC"/&gt;
+ &lt;app ...
+<strong> android:fullBackupContent="&#64;xml/mybackupscheme"&gt;</strong>
+ &lt;/app&gt;
+ ...
+&lt;/manifest&gt;
+</pre>
+
+<p>
+ 在此示例代码中,<code>android:fullBackupContent</code> 属性指定了一个 XML 文件。该文件名为
+<code>mybackupscheme.xml</code>,位于应用开发项目的 <code>res/xml/</code> 目录中。
+此配置文件包括关于要备份哪些文件的规则。
+下列示例代码显示了将某一特定文件排除在备份之外的配置文件:
+
+</p>
+
+<pre>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;full-backup-content&gt;
+ &lt;exclude domain="database" path="device_info.db"/&gt;
+&lt;/full-backup-content&gt;
+</pre>
+
+<p>
+ 此示例备份配置仅将一个特定数据库文件排除在备份之外。
+ 所有其他文件均予以备份。
+</p>
+
+<h4>备份配置语法</h4>
+
+<p>
+ 您可以通过备份服务配置指定备份中要包括或排除哪些文件。
+数据备份配置 xml 文件的语法如下:
+</p>
+
+<pre>
+&lt;full-backup-content&gt;
+ &lt;include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /&gt;
+ &lt;exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /&gt;
+&lt;/full-backup-content&gt;
+</pre>
+
+<p>
+ 您可以使用下列元素和属性指定备份中要包括或排除哪些文件:
+
+</p>
+
+<ul>
+ <li>
+ <code>&lt;include&gt;</code>。如果您想指定一组要备份的资源,而不是默认由系统备份应用中的所有数据,请使用此元素。
+如果您指定了 <code>&lt;include&gt;</code> 标记,系统将仅备份使用此元素指定的资源。<em></em>
+
+
+ </li>
+
+ <li>
+ <code>&lt;exclude&gt;</code>。使用此元素指定一组要排除在备份之外的资源。
+除了使用此元素指定的资源外,系统将备份应用中的所有数据。
+
+ </li>
+
+ <li>
+ <code>domain.</code> 您想要在备份中包括或排除的资源类型。您可为此属性指定的有效值包括:
+
+ </li>
+
+ <li style="list-style: none">
+ <ul>
+ <li>
+ <code>root</code>。指定资源处于应用的根目录中
+ </li>
+
+ <li>
+ <code>file</code>。与通过
+{@link android.content.Context#getFilesDir getFilesDir()} 方法返回的目录中的某个资源相对应
+ </li>
+
+ <li>
+ <code>database</code>。与通过
+{@link android.content.Context#getDatabasePath getDatabasePath()} 方法或使用
+{@link android.database.sqlite.SQLiteOpenHelper} 类返回的某个数据库相对应
+ </li>
+
+ <li>
+ <code>sharedpref</code>。与通过 {@link android.content.Context#getSharedPreferences getSharedPreferences()}
+ 方法返回的某个 {@link android.content.SharedPreferences} 对象相对应
+
+ </li>
+
+ <li>
+ <code>external</code>。指定资源位于外部存储中,且与通过
+{@link android.content.Context#getExternalFilesDir getExternalFilesDir()} 方法返回的目录中的某个文件相对应
+
+ </li>
+
+ <li>
+ <code>path</code>。您想要在备份中包括或排除的资源的文件路径
+
+ </li>
+ </ul>
+ </li>
+</ul>
+
+
+<h3 id="prohibit">禁止数据备份</h3>
+
+<p>
+ 通过在清单文件的应用元素中将
+<code>android:allowBackup</code> 属性设置为 <code>false</code>,您可选择阻止自动备份任何应用数据。
+此设置如下列示例代码所示:
+</p>
+
+<pre>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.my.appexample"&gt;
+ &lt;uses-sdk android:minSdkVersion="MNC"/&gt;
+ &lt;uses-sdk android:targetSdkVersion="MNC"/&gt;
+ &lt;app ...
+<strong> android:allowBackup="false"&gt;</strong>
+ &lt;/app&gt;
+ ...
+&lt;/manifest&gt;
+</pre>
+
+
+<h2 id="testing">测试备份配置</h2>
+
+<p>
+ 创建备份配置后,您应立即进行测试,确保应用能够保存数据,且数据能够正确恢复。
+
+</p>
+
+
+<h4>启用备份日志记录</h4>
+
+<p>
+ 要帮助确定备份功能如何解析 XML 文件,请在执行测试备份之前启用日志记录功能:
+
+</p>
+
+<pre class="noprettyprint">
+$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE
+</pre>
+
+<h4>测试备份</h4>
+
+<p>要手动运行备份,您首先必须通过调用下列命令初始化备份管理器:
+
+</p>
+
+<pre class="noprettyprint">
+$ adb shell bmgr run
+</pre>
+
+<p>
+ 然后,使用下列命令并以 <code>&lt;PACKAGE&gt;</code> 参数指定应用的软件包名称来手动备份应用:
+
+</p>
+
+<pre class="noprettyprint">
+$ adb shell bmgr fullbackup &lt;PACKAGE&gt;</pre>
+
+
+<h4>测试恢复</h4>
+
+<p>
+ 要在备份应用数据后手动启动数据恢复,请调用下列命令,并以 <code>&lt;PACKAGE&gt;</code> 参数指定应用的软件包名称:
+
+</p>
+
+<pre class="noprettyprint">
+$ adb shell bmgr restore &lt;PACKAGE&gt;
+</pre>
+
+<p class="warning">
+ <b>警告:</b>执行恢复操作之前,此操作将阻止您的应用运行并擦除其数据。
+
+</p>
+
+<p>
+ 您可以通过卸载并重新安装应用来启动数据恢复进程。应用安装完成后,系统会立即自动从云中恢复应用数据。
+
+</p>
+
+
+<h4>诊断备份问题</h4>
+
+<p>
+ 如果遇到问题,可通过在<strong>设置 &gt; 备份</strong>中先关闭然后重新打开备份、将设备恢复出厂设置或者调用以下命令,来清除备份数据及关联的元数据:
+
+
+</p>
+
+<pre>$ adb shell bmgr wipe &lt;TRANSPORT&gt; &lt;PACKAGE&gt;</pre>
+
+<p>
+ <code>&lt;TRANSPORT&gt;</code> 值必须以 <code>com.google.android.gms</code> 为前缀。
+ 要获取传输列表,请调用下列命令:
+</p>
+
+<pre>$ adb shell bmgr list transports</pre>
+
+<h2 id="issues">已知问题</h2>
+
+<p>以下是自动备份服务的已知问题:</p>
+
+<ul>
+ <li><strong>Google 云消息传递</strong>:对于使用 Google 云消息传递推送通知的应用,存在一个已知问题,即:备份通过 Google 云消息传递注册所返回的注册 ID 时,可能会中断已恢复应用的推送通知。为此,应用安装到新设备后,务必查询 API,看是否具有新注册 ID,这一点至关重要。如果已备份旧注册 ID,则不会出现这种情况。
+
+
+
+
+为避免这种现象,请从已备份文件集中排除注册 ID。
+
+ </li>
+</ul>
diff --git a/docs/html-intl/intl/zh-cn/preview/download.jd b/docs/html-intl/intl/zh-cn/preview/download.jd
new file mode 100644
index 0000000..f6e4d40
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/download.jd
@@ -0,0 +1,348 @@
+page.title=下载
+page.image=images/cards/card-download_16-9_2x.png
+
+@jd:body
+
+<div style="position:relative; min-height:600px">
+
+ <div class="wrap" id="tos" style="position:absolute;display:none;width:inherit;">
+
+ <p class="sdk-terms-intro">在下载和安装预览版 Android SDK 的组件之前,您必须同意下列条款和条件。
+</p>
+
+ <h2 class="norule">条款和条件</h2>
+
+ <div class="sdk-terms" onfocus="this.blur()" style="width:678px">
+本协议是 Android SDK 预览版许可协议(以下称为“许可协议”)。
+
+1. 简介
+
+1.1 Android SDK 预览版(在本许可协议中简称为“预览版”,具体包括 Android 系统文件、封装 API 以及预览版库文件(若可用))依据本许可协议的条款授权您使用。本许可协议在您与 Google 之间就您对“预览版”的使用构成具有法律约束力的合约。
+
+1.2 “Android”是指以 Android 开源项目(项目网址为 http://source.android.com/,其内容会不时更新)名义提供、面向设备的 Android 软件栈。
+
+1.3 “Google”是指 Google Inc.,是一家特拉华州公司,主要营业地位于:1600 Amphitheatre Parkway, Mountain View, CA 94043, United States。
+
+2. 接受许可协议
+
+2.1 要使用“预览版”,您必须先同意本许可协议。如果您不接受本许可协议,则不得使用“预览版”。
+
+2.2 点击接受并/或使用“预览版”,即表示您特此同意本许可协议的条款。
+
+2.3 如果依照美国或其他国家/地区(包括您居住或您使用“预览版”所在的国家/地区)的法律,您被禁止获取“预览版”,则您不得使用“预览版”,也不得接受本许可协议。
+
+2.4 如果您将在贵公司或组织内部使用“预览版”,则您同意代表您的雇主或其他实体接受本许可协议的约束,并且您表示并保证您拥有完全的合法授权令您的雇主或上述实体受本许可协议的约束。如果您不具备必要的授权,则不得代表您的雇主或其他实体接受本许可协议或使用“预览版”。
+
+3. Google 预览版许可
+
+3.1 Google 依据本许可协议的条款授予您个人或在贵公司或组织内部有限使用“预览版”的免版税、不可转让、非独占性、不可再授权且可撤销的许可,其用途仅限开发在 Android 平台上运行的应用。
+
+3.2 您同意 Google 或第三方拥有“预览版”中存在或相关的全部合法权利、所有权和利益,包括“预览版”中存在的任何知识产权。“知识产权”是指根据专利法、版权法、商业机密法、商标法享有的任何及全部权利,以及其他任何及全部专有权利。Google 保留所有未明确授予您的权利。
+
+3.3 您不得将“预览版”用于本许可协议未明确允许的任何用途。您不得:(a) 对“预览版”或“预览版”的任何部分进行复制(备份用途除外)、修改、改编、再分发、反编译、逆向工程、反汇编或创建其衍生品;或 (b) 将“预览版”的任何部分加载到移动手持终端或除个人计算机之外的任何其他硬件设备上,将“预览版”的任何部分与其他软件合并,或者发行任何融入“预览版”某一部分的软件或设备。
+
+3.4 您同意您将不会进行任何可能引起或导致 Android 碎片化的行动,包括但不限于分发、参与创建或以任何方式推广从“预览版”衍生的软件开发工具包。
+
+3.5 对于依据开源软件许可授权的“预览版”组件,其使用、复制和分发仅受该开源软件许可条款的制约,不受本许可协议的约束。您同意在依照被授予的所有权利作为被许可方期间,在遵守此类开源软件许可协议方面始终保持良好的信誉,并避免进行任何可能导致终止、暂停或违反此类权利的行动。
+
+3.6 您同意 Google 所提供“预览版”的形式和性质可随时发生变更,而无需事先通知您,并且未来的“预览版”版本可能会与在之前的“预览版”版本上开发的应用不兼容。您同意 Google 可单方面决定在未事先通知您的情况下全面停止(永久性或暂时性)向您或用户提供“预览版”(或“预览版”内的任何功能)。
+
+3.7 本许可协议内没有任何条款授予您使用 Google 的任何商品名、商标、服务标志、徽标、域名或其他独特品牌特征的权利。
+
+3.8 您同意您不会移除、遮盖或篡改“预览版”上可能贴有或“预览版”内可能包含的任何专有权利声明(包括版权声明和商标声明)。
+
+4. 您对“预览版”的使用
+
+4.1 Google 同意本许可协议中的任何条款均未授予 Google 从您(或您的许可方)处获取您依照本许可协议使用“预览版”开发的任何软件应用中存在或与其相关的权利、所有权或利益,包括这些应用中存在的任何知识产权。
+
+4.2 您同意只出于 (a) 本许可协议和 (b) 相关管辖区域内任何适用法律、法规或公认惯例或准则(包括有关向美国或其他相关国家/地区出口数据或软件或从美国或其他相关国家/地区进口数据或软件的任何法律)所允许的目的而使用“预览版”和编写应用。
+
+4.3 您同意,如果您使用“预览版”开发应用,您将会保护用户的隐私权和合法权利。如果用户向您提供用户名、密码或其他登录信息或个人信息,您必须确保用户知晓这些信息将供您的应用使用,并且您必须为这些用户提供足以满足法律要求的隐私声明和保护。如果您的应用存储由用户提供的个人信息或敏感信息,其存储方式必须安全。如果用户向您提供 Google 帐户信息,您的应用只能在用户允许时出于用户所许可的有限目的使用该信息访问用户的 Google 帐户。
+
+4.4 您同意您不会利用“预览版”从事任何干扰、中断、损坏或以未经授权方式访问 Google 或任何第三方的服务器、网络或其他财产或服务的Activity(包括应用的开发或分发)。
+
+4.5 您同意您对通过 Android 和/或 Android 应用创建、传输或显示的任何数据、内容或资源以及您的行为所导致的后果(包括 Google 可能遭受的任何损失或损害)负全责(Google 在上述方面对您或任何第三方不承担任何责任)。
+
+4.6 您同意您为违反本许可协议、任何适用的第三方合约或服务条款或任何适用法律或法规下的义务以及任何上述违规行为所导致的后果(包括 Google 或任何第三方可能遭受的任何损失或损害)负全责(Google 在上述方面对您或任何第三方不承担任何责任)。
+
+4.7 “预览版”正在开发中,您的测试和反馈是开发过程的重要环节。使用“预览版”,即表示您承认某些功能仍在开发实现之中,您不应期望“预览版”具备稳定版本的全部功能。您同意不使用此“预览版”公开发布或发运任何应用,因为此“预览版”在 Android SDK 正式发行之后将不再受支持。
+
+5. 您的开发者凭据
+
+5.1 您同意,对于 Google 可能向您发放或可能由您自行选择的任何开发者凭据,您有责任保持其机密性,并且您对以您的开发者凭据名义开发的所有应用负全责。
+
+6. 隐私权和信息
+
+6.1 为持续创新和改进“预览版”,Google 可能会从软件收集某些使用统计数据,包括但不限于唯一标识符、关联的 IP 地址、软件的版本号以及有关软件使用了“预览版”中哪些工具和/或服务及其使用方式的信息。在收集任何上述信息之前,“预览版”都会通知您并征求您的同意。如果您拒绝同意,我们将不会收集这些信息。
+
+6.2 我们会对收集的数据进行汇总调查,以便改进“预览版”,并会按照 Google 的隐私政策(网址为 http://www.google.com/policies/privacy/)维护数据。
+
+7. 第三方应用
+
+7.1 如果您使用“预览版”运行由第三方开发或访问由第三方提供的数据、内容或资源的应用,您同意 Google 对这些应用、数据、内容或资源不承担任何责任。您理解,您通过上述第三方应用可能访问到的所有数据、内容或资源由其提供者负全责,Google 对您因使用或访问其中任何第三方应用、数据、内容或资源而遭受的任何损失或损害不承担任何责任。
+
+7.2 您应知晓,通过此类第三方应用提供给您的数据、内容和资源可能受提供商(或代表他们的其他人员或公司)所拥有的知识产权的保护。除非相关所有者明确给予许可,否则您不得修改、出租、租赁、借出、出售、分发这些数据、内容或资源(的全部或部分),或以其为基础创建衍生品。
+
+7.3 您承认您对上述第三方应用、数据、内容或资源的使用可能受到您与相关第三方之间单独订立的条款的制约。
+
+8. 使用 Google API
+
+8.1 Google API
+
+8.1.1 如果您使用任何 API 从 Google 检索数据,即表示您承认这些数据可能受到 Google 或这些数据提供方(或代表他们的其他人员或公司)拥有的知识产权的保护。您对任何上述 API 的使用可能受到附加服务条款的制约。除非相关服务条款允许,否则您不得修改、出租、租赁、借出、出售、分发这些数据(的全部或部分),或以其为基础创建衍生品。
+
+8.1.2 如果您使用任何 API 从 Google 检索用户数据,即表示您承认并同意您只有在征得用户明确同意时才会检索数据,并且只能在用户允许时出于用户许可的有限目的检索数据。
+
+9. 终止许可协议
+
+9.1 本许可协议将持续有效,直至您或 Google 按以下规定终止本协议。
+
+9.2 如果您想终止本许可协议,可通过停止使用“预览版”以及任何相关开发者凭据予以终止。
+
+9.3 Google 有权在向您在作出通知后,有理由或无理由地随时终止与您订立的这份许可协议。
+
+9.4 本许可协议将在下列情况下自动终止,而无需另行通知或采取其他行动,以先符合条件者为准:
+(A) Google 在您居住或使用服务所在国家/地区停止向用户提供“预览版”或“预览版”的某些部分;
+(B) Google 发行 Android SDK 的最终版本。
+
+9.5 在本许可协议终止时,本许可协议中向您授予的许可将终止,您应立即完全停止使用“预览版”,并且第 10、11、12 和 14 节的条款将无限期继续存在。
+
+10. 免责声明
+
+10.1 您明确理解并同意,您使用“预览版”的风险将由您自行承担,并且“预览版”是按“原样”和“现状”提供,Google 不提供任何类型的担保。
+
+10.2 您对“预览版”的使用以及通过使用“预览版”下载或以其他方式获得的任何材料由您自行决定,风险自负,并且对于因此类使用而对您的计算机系统或其他设备造成的任何损害或数据损失由您单方面负责。在不对上文所述予以限制的条件下,您了解“预览版”并非稳定版本,可能存在将导致重大损害的错误、缺陷和安全漏洞,包括无法挽回地完全无法使用您的计算机系统或其他设备。
+
+10.3 Google 进一步明确拒绝任何类型的所有担保和条件,无论明示或暗示,包括但不限于有关适销性、特定用途适用性以及非侵权的暗示担保和条件。
+
+11. 有限责任
+
+11.1 您明确理解并同意,对于您可能遭遇的任何直接、间接、附带、特殊、继发或惩罚性损害(包括任何数据损失),Google 及其子公司和附属公司以及其许可方在任何责任理论下对您概不承担任何责任,无论 Google 或其代表是否已被告知或是否本应知晓发生任何上述损失的可能性。
+
+12. 赔偿
+
+12.1 您同意,在法律所允许的最大限度内,为 Google、其附属公司及其各自的董事、高管、员工和代理商提供辩护,使其免于因下列情况引起或产生的任何及所有索赔、诉讼、起诉或诉讼程序以及任何及所有损失、债务、损害、成本和费用(包括合理的律师费用)而承担责任或遭受损害:(a) 您对“预览版”的使用;(b) 您在“预览版”上开发的任何应用侵犯任何人的任何知识产权或诽谤任何人或侵犯其公开权或隐私权;以及 (c) 您的任何行为有悖于本许可协议
+
+13. 许可协议的更改
+
+13.1 Google 可能会在分发新版本“预览版”时对许可协议做出更改。做出这些更改后,Google 将在提供“预览版”的网站上公布新版本的许可协议。
+
+14. 一般法律条款
+
+14.1 本许可协议构成您与 Google 之间的完整法律协议,管辖您对“预览版”(不包括 Google 可能依据另外的书面协议向您提供的任何服务)的使用,并完全取代您之前与 Google 之间签订的、与“预览版”有关的任何协议。
+
+14.2 您同意,如果 Google 未行使或未强制执行本许可协议包含的任何法定权利或救济(或 Google 在任何适用法律下享有的相关利益),不得视为 Google 正式放弃这些权利,Google 仍可获得这些权利或救济。
+
+14.3 如果任何拥有管辖权的法院将本许可协议的任何条款裁定为无效,则该条款将从本许可协议中删除,而不会影响本许可协议的其余部分。本许可协议的其余条款将继续有效且可强制执行。
+
+14.4 您承认并同意,Google 集团旗下的每一家公司都将成为本许可协议的第三方受益人,并且此类其他公司将有权直接强制执行和依赖本许可协议中任何授予其利益(或支持其权利)的条款。除此之外,任何其他人员或公司均不得成为本许可协议的第三方受益人。
+
+14.5 出口限制。“预览版”受美国出口法律和法规的制约。您必须遵守适用于“预览版”的所有国内和国际出口法律和法规。这些法律包括目的地、最终用户和最终用途方面的限制。
+
+14.6 未经 Google 事先书面批准,您不得擅自转让或转移本许可协议,未经此类批准而试图进行的任何转让均为无效。未经 Google 事先书面批准,您不得委托您依据本许可协议所应承担的责任或义务。
+
+14.7 本许可协议以及您与 Google 依据本许可协议而建立的关系受加利福尼亚州法律管辖,而无论其是否与其他法律条款冲突。您与 Google 同意服从位于加利福尼亚州圣克拉拉县内法院的专属司法管辖权,以解决本许可协议引起的任何法律事务。尽管有上述规定,您同意仍允许 Google 在任何管辖区域申请禁令救济(或同等类型的紧急法律救济)。
+ </div><!-- sdk terms -->
+
+
+
+ <div id="sdk-terms-form">
+ <p>
+ <input id="agree" type="checkbox" name="agree" value="1" onclick="onAgreeChecked()" />
+ <label id="agreeLabel" for="agree">我已阅读并同意上述条款和条件</label>
+ </p>
+ <p><a href="" class="button disabled" id="downloadForRealz" onclick="return onDownloadForRealz(this);"></a></p>
+ </div>
+
+
+ </div><!-- end TOS -->
+
+
+ <div id="landing">
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#sdk">预览版 SDK</a></li>
+ <li><a href="#docs">开发者文档</a></li>
+ <li><a href="#images">硬件系统映像</a></li>
+ </ol>
+ </div>
+</div>
+
+
+<p>
+ Android M 预览版 SDK 包括开发工具、Android 系统文件和库文件,旨在帮助您在下一版本的平台中测试您的应用以及该平台提供的新 API。
+本文旨在介绍如何获得“预览版”的可下载组件,以便测试您的应用。
+
+</p>
+
+
+<h2 id="sdk">预览版 SDK</h2>
+
+<p>
+ 预览版 SDK 可通过 <a href="{@docRoot}tools/help/sdk-manager.html">Android SDK 管理器</a>下载。如需了解有关下载和配置预览版 SDK 的详细信息,请参阅<a href="{@docRoot}preview/setup-sdk.html#downloadSdk">设置预览版 SDK</a>。
+
+</p>
+
+
+<h2 id="docs">开发者文档</h2>
+
+<p>
+ 开发者文档下载软件包提供详细的 API 参考信息和“预览版”的 API 差异报告。
+</p>
+
+<table>
+ <tr>
+ <th scope="col">描述</th>
+ <th scope="col">下载/校验和</th>
+ </tr>
+ <tr id="docs-dl">
+ <td>Android M 预览版<br>开发者文档</td>
+ <td><a href="#top" onclick="onDownload(this)">m-preview-1-developer-docs.zip</a><br>
+ MD5: b65201b0d35416f5a1b7a071b52854a7<br>
+ SHA-1: d47e856aa65e06897e6edd902ad8d2b1f05ac3ec
+ </td>
+ </tr>
+<table>
+
+
+<h2 id="images">硬件系统映像</h2>
+
+<p>
+ 这些系统映像允许您在实际设备上安装预览版平台,以便进行测试。
+通过使用这些映像之一配置设备,您可以安装并测试您的应用,以了解其在下一版本平台上的性能表现。
+在设备上安装系统映像的过程会<em>删除设备中的所有数据</em>,因此您应该在安装系统映像之前备份数据。
+
+
+</p>
+
+<p class="warning">
+ <b>警告:</b>以下 Android 系统映像是预览版,可能会随时发生变化。您对这些系统映像的使用受 Android SDK 预览版许可协议的制约。
+Android 预览版系统映像并非稳定版本,可能包含会对您的计算机系统、设备和数据造成损害的错误和缺陷。
+
+Android 预览版系统映像未经过与出厂操作系统相同的测试,可能会导致您的手机和安装的服务与应用停止工作。
+
+
+</p>
+
+<table>
+ <tr>
+ <th scope="col">设备</th>
+ <th scope="col">下载/校验和</th>
+ </tr>
+ <tr id="hammerhead">
+ <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
+ <td><a href="#top" onclick="onDownload(this)">hammerhead-MPZ44Q-preview-55d76d3a.tgz</a><br>
+ MD5:9e2631b06c6525e401ceaae3677ff320<br>
+ SHA-1:55d76d3a379b18f3363f28d8a462c236ab96fc36
+ </td>
+ </tr>
+ <tr id="shamu">
+ <td>Nexus 6 <br>"shamu"</td>
+ <td><a href="#top" onclick="onDownload(this)">shamu-MPZ44Q-preview-c1d6506a.tgz</a><br>
+ MD5:307cbf9dab0a38df4ab2639d02be12aa<br>
+ SHA-1: c1d6506a74094bdb2f4b8677c7fe4967334f9ea8
+ </td>
+ </tr>
+ <tr id="volantis">
+ <td>Nexus 9 <br>"volantis"</td>
+ <td><a href="#top" onclick="onDownload(this)">volantis-MPZ44Q-preview-d15ad483.tgz</a><br>
+ MD5: fae40377fd999d2b09128665c915264d<br>
+ SHA-1:7ab05f96093b2cb370b226f65931202714cbc2ca
+ </td>
+ </tr>
+ <tr id="fugu">
+ <td>Nexus Player <br>"fugu"</td>
+ <td><a href="#top" onclick="onDownload(this)">fugu-MPZ44Q-preview-2406ba05.tgz</a><br>
+ MD5:815902141a85cc65e7725f005cad31d5<br>
+ SHA-1:2406ba0598dea1e69110497ac0bc8e16789bc8fb
+ </td>
+ </tr>
+</table>
+
+<h3 id="install-image">将映像安装到设备</h3>
+
+<p>
+ 要使用设备映像进行测试,您必须将其安装到兼容设备上。请按照下面的说明安装系统映像:
+
+</p>
+
+<ol>
+ <li>下载并解压此处列出的系统映像包之一。</li>
+ <li>备份设备中您希望予以保留的任何数据。</li>
+ <li>按照
+<a href="https://developers.google.com/android/nexus/images#instructions">developers.google.com/android</a>
+ 中的说明将映像刷入设备中。</li>
+</ol>
+
+<p class="note">
+ <strong>注:</strong>为开发设备刷入预览版系统映像之后,它将通过无线 (OTA) 更新自动升级到下一个预览版本。
+
+</p>
+
+<h3 id="revertDevice">将设备还原至出厂规格</h3>
+
+<p>
+ 如果您想要卸载预览版并将设备还原至出厂规格,请转到
+<a href="http://developers.google.com/android/nexus/images">developers.google.com/android</a> 并下载要为设备刷入的映像。
+按照该页面上的说明将映像刷入设备中。
+
+</p>
+
+ </div><!-- landing -->
+
+</div><!-- relative wrapper -->
+
+
+
+<script>
+ var urlRoot = "http://storage.googleapis.com/androiddevelopers/shareables/preview/";
+ function onDownload(link) {
+
+ $("#downloadForRealz").html("Download " + $(link).text());
+ $("#downloadForRealz").attr('href', urlRoot + $(link).text());
+
+ $("#tos").fadeIn('fast');
+ $("#landing").fadeOut('fast');
+
+ return true;
+ }
+
+
+ function onAgreeChecked() {
+ /* verify that the TOS is agreed */
+ if ($("input#agree").is(":checked")) {
+ /* reveal the download button */
+ $("a#downloadForRealz").removeClass('disabled');
+ } else {
+ $("a#downloadForRealz").addClass('disabled');
+ }
+ }
+
+ function onDownloadForRealz(link) {
+ if ($("input#agree").is(':checked')) {
+ /*
+ $("#tos").fadeOut('fast');
+ $("#landing").fadeIn('fast');
+ */
+
+ ga('send', 'event', 'M Preview', 'System Image', $("#downloadForRealz").html());
+
+ /*
+ location.hash = "";
+ */
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ $(window).hashchange( function(){
+ if (location.hash == "") {
+ location.reload();
+ }
+ });
+
+</script>
diff --git a/docs/html-intl/intl/zh-cn/preview/features/app-linking.jd b/docs/html-intl/intl/zh-cn/preview/features/app-linking.jd
new file mode 100644
index 0000000..77a532f
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/features/app-linking.jd
@@ -0,0 +1,123 @@
+page.title=应用链接
+page.image=images/cards/card-app-linking_2x.png
+page.keywords=应用链接, 深层链接, 意向
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#web-assoc">声明网站关联</a></li>
+ <li><a href="#verfy-links">请求应用链接验证</a></li>
+ <li><a href="#user-manage">管理应用链接设置</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>
+ Android 意向系统是一种让应用能够处理内容和请求的灵活机制。
+ 可能会有多个应用在其意向过滤器中声明一致的 URI 模式。如果用户点击的 Web 链接没有默认的启动处理程序,平台可能会显示一个对话框,让用户从一系列已声明一致意向过滤器的应用中进行选择。
+
+
+</p>
+
+<p>
+ Android M 开发者预览版引入了对应用链接的支持,后者在现有链接处理方式基础上进行了改进,允许应用开发者将应用与他们拥有的 Web 域进行关联。
+当开发者创建此关联时,平台可以自动确定在处理特定 Web 链接时默认使用的应用,略过询问用户的步骤。
+
+
+</p>
+
+
+<h2 id="web-assoc">声明网站关联</h2>
+
+<p>
+ 网站所有者必须声明与应用的关联才能建立应用链接。网站所有者可以通过在域上众所周知的位置承载一个名为 {@code statements.json} 的 JSON 文件声明与应用的关系:
+
+
+</p>
+
+<pre>http://&lt;domain&gt;:&lt;optional port&gt;/.well-known/statements.json</pre>
+
+<p class="note">
+ <strong>注:</strong>
+ 在 M 开发者预览版运行期间,系统会通过 HTTP 协议对该 JSON 文件进行验证。当平台正式发布后,系统将通过 HTTPS 加密协议对该文件进行验证。
+
+</p>
+
+<p>
+ 该 JSON 文件指定应作为该域下 URL 默认处理程序使用的 Android 应用。
+它根据以下字段标识该应用:
+</p>
+
+<ul>
+ <li>{@code package_name}:该应用的清单文件中声明的软件包名称;</li>
+
+ <li>{@code sha256_cert_fingerprints}:应用签名证书的 SHA256 指纹。
+ 您可以利用 Java 密钥工具,通过以下命令生成该指纹:
+ <pre>keytool -list -v -keystore my-release-key.keystore</pre>
+ </li>
+</ul>
+
+<p>
+ 以下文件清单显示的是一个
+{@code statements.json} 文件的内容和格式示例:
+</p>
+
+<pre>
+[{
+ "relation": ["delegate_permission/common.handle_all_urls"],
+ "target": {
+ "namespace": "android_app",
+ "package_name": "<strong>&lt;package name&gt;</strong>",
+ "sha256_cert_fingerprints": ["<strong>6C:EC:C5:0E:34:AE....EB:0C:9B</strong>"]
+ }
+}]
+</pre>
+
+
+<h2 id="verfy-links">请求应用链接验证</h2>
+
+<p>
+ 应用可以请求平台自动根据相应 Web 域上承载的 {@code statements.json} 文件验证由其意向过滤器数据元素内的主机名称定义的任何应用链接。
+
+要请求应用链接验证,请按以下清单文件代码段中所示向清单文件中所需的每个意向过滤器添加一个 {@code android:autoVerify}
+ 属性:
+
+</p>
+
+<pre>
+&lt;activity ...&gt;
+ &lt;intent-filter <strong>android:autoVerify="true"</strong>&gt;
+ &lt;action android:name="android.intent.action.VIEW" /&gt;
+ &lt;category android:name="android.intent.category.DEFAULT" /&gt;
+ &lt;category android:name="android.intent.category.BROWSABLE" /&gt;
+ &lt;data android:scheme="http" android:host="www.android.com" /&gt;
+ &lt;data android:scheme="https" android:host="www.android.com" /&gt;
+ &lt;/intent-filter&gt;
+&lt;/activity&gt;
+</pre>
+
+<p>
+ 如果应用清单文件中存在 {@code android:autoVerify} 属性,平台会在安装应用时尝试验证应用链接。
+如果平台无法成功验证应用链接,则不会将应用设置为处理 Web 链接的首选应用。
+用户下一次打开其中一个链接时,平台将退回原有模式,向用户显示一个对话框。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>在测试时,如果验证失败,但用户已经使用系统的“设置”应用显式允许应用在不询问用户的情况下打开受支持的链接,则可能会出现误报。在这种情况下,不会显示对话框,链接会直接指向您的应用,不过这完全是由于用户设置的缘故,并不是因为验证成功。
+
+
+
+</p>
+
+
+<h2 id="user-manage">管理应用链接设置</h2>
+
+<p>
+ 用户可以更改应用链接设置,让系统按首选方式处理 URL。您可以在系统“设置”应用的<strong>设置 &gt; 应用 &gt; 应用信息 &gt; 默认打开</strong>下查看和管理应用链接。
+
+
+</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/index.jd b/docs/html-intl/intl/zh-cn/preview/index.jd
new file mode 100644
index 0000000..19b4b78
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/index.jd
@@ -0,0 +1,67 @@
+page.title=Android M 开发者预览版
+page.tags="preview",
+meta.tags="preview, M preview", androidm
+fullpage=true
+section.landing=true
+header.hide=1
+footer.hide=1
+@jd:body
+
+<section class="dac-expand dac-hero dac-light" >
+ <div class="wrap">
+ <div class="cols dac-hero-content">
+ <div class="col-9of16 col-push-7of16 dac-hero-figure">
+ <img class="dac-hero-image" src="{@docRoot}images/home/devices-hero_620px_2x.png" srcset="{@docRoot}images/home/devices-hero_620px.png 1x,
+ {@docRoot}images/home/devices-hero_620px_2x.png 2x">
+ </div>
+ <div class="col-7of16 col-pull-9of16">
+ <h1 class="dac-hero-title">Android M 开发者预览版</h1>
+ <p class="dac-hero-description">
+ 准备迎接 Android 的下一版本。在 Nexus 5、6、9 和 Player 中测试应用。
+了解新功能:<strong>运行权限</strong>、<strong>瞌睡</strong>和<strong>应用待机</strong>省电功能、新的<strong>协助技术</strong>等。
+
+
+ </p>
+
+ <a class="dac-hero-cta" href="{@docRoot}preview/overview.html">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ 开始!
+</a><br>
+ </div>
+ </div>
+ <div class="dac-section dac-small">
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:preview/landing/resources"
+ data-cardSizes="6x2"
+ data-maxResults="6"></div>
+ </div>
+ </div>
+</section>
+
+<section class="dac-section dac-gray"><div class="wrap">
+ <h1 class="dac-section-title">资源</h1>
+ <div class="dac-section-subtitle">
+ 帮助您的应用准备使用 Android M 的必备信息。
+ </div>
+
+ <div class="resource-widget resource-flow-layout col-16"
+ data-query="collection:preview/landing/more"
+ data-cardSizes="6x6"
+ data-maxResults="16"></div>
+
+ <ul class="dac-section-links">
+ <li class="dac-section-link">
+ <a href="https://code.google.com/p/android-developer-preview/">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ 报告问题
+</a>
+ </li>
+ <li class="dac-section-link"><a href="http://g.co/dev/AndroidMDevPreview">
+ <span class="dac-sprite dac-auto-chevron"></span>
+ 加入 G+ 社区
+</a>
+ </li>
+ </ul>
+ </div>
+</section>
+
diff --git a/docs/html-intl/intl/zh-cn/preview/license.jd b/docs/html-intl/intl/zh-cn/preview/license.jd
new file mode 100644
index 0000000..31363be
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/license.jd
@@ -0,0 +1,143 @@
+page.title=许可协议
+
+@jd:body
+
+<p>
+在开始使用 Android SDK 预览版之前,您必须同意下列条款和条件。正如下文所述,请注意:这是 Android SDK 的预览版本,可能随时更改,恕不另行通知,您使用此版本的风险由您自行承担。
+Android SDK 预览版并非稳定版本,可能包含会对您的计算机系统、设备和数据造成损害的错误和缺陷。
+</p>
+
+<p>
+本协议是 Android SDK 预览版许可协议(以下称为“许可协议”)。
+</p>
+<div class="sdk-terms" style="height:auto;border:0;padding:0;width:700px">
+1. 简介
+
+1.1 Android SDK 预览版(在本许可协议中简称为“预览版”,具体包括 Android 系统文件、封装 API 以及预览版库文件(若可用))依据本许可协议的条款授权您使用。本许可协议在您与 Google 之间就您对“预览版”的使用构成具有法律约束力的合约。
+
+1.2 “Android”是指以 Android 开源项目(项目网址为 http://source.android.com/,其内容会不时更新)名义提供、面向设备的 Android 软件栈。
+
+1.3 “Google”是指 Google Inc.,是一家特拉华州公司,主要营业地位于:1600 Amphitheatre Parkway, Mountain View, CA 94043, United States。
+
+2. 接受许可协议
+
+2.1 要使用“预览版”,您必须先同意本许可协议。如果您不接受本许可协议,则不得使用“预览版”。
+
+2.2 点击接受并/或使用“预览版”,即表示您特此同意本许可协议的条款。
+
+2.3 如果依照美国或其他国家/地区(包括您居住或您使用“预览版”所在的国家/地区)的法律,您被禁止获取“预览版”,则您不得使用“预览版”,也不得接受本许可协议。
+
+2.4 如果您将在贵公司或组织内部使用“预览版”,则您同意代表您的雇主或其他实体接受本许可协议的约束,并且您表示并保证您拥有完全的合法授权令您的雇主或上述实体受本许可协议的约束。如果您不具备必要的授权,则不得代表您的雇主或其他实体接受本许可协议或使用“预览版”。
+
+3. Google 预览版许可
+
+3.1 Google 依据本许可协议的条款授予您个人或在贵公司或组织内部有限使用“预览版”的免版税、不可转让、非独占性、不可再授权且可撤销的许可,其用途仅限开发在 Android 平台上运行的应用。
+
+3.2 您同意 Google 或第三方拥有“预览版”中存在或相关的全部合法权利、所有权和利益,包括“预览版”中存在的任何知识产权。“知识产权”是指根据专利法、版权法、商业机密法、商标法享有的任何及全部权利,以及其他任何及全部专有权利。Google 保留所有未明确授予您的权利。
+
+3.3 您不得将“预览版”用于本许可协议未明确允许的任何用途。您不得:(a) 对“预览版”或“预览版”的任何部分进行复制(备份用途除外)、修改、改编、再分发、反编译、逆向工程、反汇编或创建其衍生品;或 (b) 将“预览版”的任何部分加载到移动手持终端或除个人计算机之外的任何其他硬件设备上,将“预览版”的任何部分与其他软件合并,或者发行任何融入“预览版”某一部分的软件或设备。
+
+3.4 您同意您将不会进行任何可能引起或导致 Android 碎片化的行动,包括但不限于分发、参与创建或以任何方式推广从“预览版”衍生的软件开发工具包。
+
+3.5 对于依据开源软件许可授权的“预览版”组件,其使用、复制和分发仅受该开源软件许可条款的制约,不受本许可协议的约束。您同意在依照被授予的所有权利作为被许可方期间,在遵守此类开源软件许可协议方面始终保持良好的信誉,并避免进行任何可能导致终止、暂停或违反此类权利的行动。
+
+3.6 您同意 Google 所提供“预览版”的形式和性质可随时发生变更,而无需事先通知您,并且未来的“预览版”版本可能会与在之前的“预览版”版本上开发的应用不兼容。您同意 Google 可单方面决定在未事先通知您的情况下全面停止(永久性或暂时性)向您或用户提供“预览版”(或“预览版”内的任何功能)。
+
+3.7 本许可协议内没有任何条款授予您使用 Google 的任何商品名、商标、服务标志、徽标、域名或其他独特品牌特征的权利。
+
+3.8 您同意您不会移除、遮盖或篡改“预览版”上可能贴有或“预览版”内可能包含的任何专有权利声明(包括版权声明和商标声明)。
+
+4. 您对“预览版”的使用
+
+4.1 Google 同意本许可协议中的任何条款均未授予 Google 从您(或您的许可方)处获取您依照本许可协议使用“预览版”开发的任何软件应用中存在或与其相关的权利、所有权或利益,包括这些应用中存在的任何知识产权。
+
+4.2 您同意只出于 (a) 本许可协议和 (b) 相关管辖区域内任何适用法律、法规或公认惯例或准则(包括有关向美国或其他相关国家/地区出口数据或软件或从美国或其他相关国家/地区进口数据或软件的任何法律)所允许的目的而使用“预览版”和编写应用。
+
+4.3 您同意,如果您使用“预览版”开发应用,您将会保护用户的隐私权和合法权利。如果用户向您提供用户名、密码或其他登录信息或个人信息,您必须确保用户知晓这些信息将供您的应用使用,并且您必须为这些用户提供足以满足法律要求的隐私声明和保护。如果您的应用存储由用户提供的个人信息或敏感信息,其存储方式必须安全。如果用户向您提供 Google 帐户信息,您的应用只能在用户允许时出于用户所许可的有限目的使用该信息访问用户的 Google 帐户。
+
+4.4 您同意您不会利用“预览版”从事任何干扰、中断、损坏或以未经授权方式访问 Google 或任何第三方的服务器、网络或其他财产或服务的Activity(包括应用的开发或分发)。
+
+4.5 您同意您对通过 Android 和/或 Android 应用创建、传输或显示的任何数据、内容或资源以及您的行为所导致的后果(包括 Google 可能遭受的任何损失或损害)负全责(Google 在上述方面对您或任何第三方不承担任何责任)。
+
+4.6 您同意您为违反本许可协议、任何适用的第三方合约或服务条款或任何适用法律或法规下的义务以及任何上述违规行为所导致的后果(包括 Google 或任何第三方可能遭受的任何损失或损害)负全责(Google 在上述方面对您或任何第三方不承担任何责任)。
+
+4.7 “预览版”正在开发中,您的测试和反馈是开发过程的重要环节。使用“预览版”,即表示您承认某些功能仍在开发实现之中,您不应期望“预览版”具备稳定版本的全部功能。您同意不使用此“预览版”公开发布或发运任何应用,因为此“预览版”在 Android SDK 正式发行之后将不再受支持。
+
+5. 您的开发者凭据
+
+5.1 您同意,对于 Google 可能向您发放或可能由您自行选择的任何开发者凭据,您有责任保持其机密性,并且您对以您的开发者凭据名义开发的所有应用负全责。
+
+6. 隐私权和信息
+
+6.1 为持续创新和改进“预览版”,Google 可能会从软件收集某些使用统计数据,包括但不限于唯一标识符、关联的 IP 地址、软件的版本号以及有关软件使用了“预览版”中哪些工具和/或服务及其使用方式的信息。在收集任何上述信息之前,“预览版”都会通知您并征求您的同意。如果您拒绝同意,我们将不会收集这些信息。
+
+6.2 我们会对收集的数据进行汇总调查,以便改进“预览版”,并会按照 Google 的隐私政策(网址为 http://www.google.com/policies/privacy/)维护数据。
+
+7. 第三方应用
+
+7.1 如果您使用“预览版”运行由第三方开发或访问由第三方提供的数据、内容或资源的应用,您同意 Google 对这些应用、数据、内容或资源不承担任何责任。您理解,您通过上述第三方应用可能访问到的所有数据、内容或资源由其提供者负全责,Google 对您因使用或访问其中任何第三方应用、数据、内容或资源而遭受的任何损失或损害不承担任何责任。
+
+7.2 您应知晓,通过此类第三方应用提供给您的数据、内容和资源可能受提供商(或代表他们的其他人员或公司)所拥有的知识产权的保护。除非相关所有者明确给予许可,否则您不得修改、出租、租赁、借出、出售、分发这些数据、内容或资源(的全部或部分),或以其为基础创建衍生品。
+
+7.3 您承认您对上述第三方应用、数据、内容或资源的使用可能受到您与相关第三方之间单独订立的条款的制约。
+
+8. 使用 Google API
+
+8.1 Google API
+
+8.1.1 如果您使用任何 API 从 Google 检索数据,即表示您承认这些数据可能受到 Google 或这些数据提供方(或代表他们的其他人员或公司)拥有的知识产权的保护。您对任何上述 API 的使用可能受到附加服务条款的制约。除非相关服务条款允许,否则您不得修改、出租、租赁、借出、出售、分发这些数据(的全部或部分),或以其为基础创建衍生品。
+
+8.1.2 如果您使用任何 API 从 Google 检索用户数据,即表示您承认并同意您只有在征得用户明确同意时才会检索数据,并且只能在用户允许时出于用户许可的有限目的检索数据。
+
+9. 终止许可协议
+
+9.1 本许可协议将持续有效,直至您或 Google 按以下规定终止本协议。
+
+9.2 如果您想终止本许可协议,可通过停止使用“预览版”以及任何相关开发者凭据予以终止。
+
+9.3 Google 有权在向您作出通知后,有理由或无理由地随时终止与您订立的这份许可协议。
+
+9.4 本许可协议将在下列情况下自动终止,而无需另行通知或采取其他行动,以先符合条件者为准:
+(A) Google 在您居住或使用服务所在国家/地区停止向用户提供“预览版”或“预览版”的某些部分;
+(B) Google 发行 Android SDK 的最终版本。
+
+9.5 在本许可协议终止时,本许可协议中向您授予的许可将终止,您应立即完全停止使用“预览版”,并且第 10、11、12 和 14 节的条款将无限期继续存在。
+
+10. 免责声明
+
+10.1 您明确理解并同意,您使用“预览版”的风险将由您自行承担,并且“预览版”是按“原样”和“现状”提供,Google 不提供任何类型的担保。
+
+10.2 您对“预览版”的使用以及通过使用“预览版”下载或以其他方式获得的任何材料由您自行决定,风险自负,并且对于因此类使用而对您的计算机系统或其他设备造成的任何损害或数据损失由您单方面负责。在不对上文所述予以限制的条件下,您了解“预览版”并非稳定版本,可能存在将导致重大损害的错误、缺陷和安全漏洞,包括无法挽回地完全无法使用您的计算机系统或其他设备。
+
+10.3 Google 进一步明确拒绝任何类型的所有担保和条件,无论明示或暗示,包括但不限于有关适销性、特定用途适用性以及非侵权的暗示担保和条件。
+
+11. 有限责任
+
+11.1 您明确理解并同意,对于您可能遭遇的任何直接、间接、附带、特殊、继发或惩罚性损害(包括任何数据损失),Google 及其子公司和附属公司以及其许可方在任何责任理论下对您概不承担任何责任,无论 Google 或其代表是否已被告知或是否本应知晓发生任何上述损失的可能性。
+
+12. 赔偿
+
+12.1 您同意,在法律所允许的最大限度内,为 Google、其附属公司及其各自的董事、高管、员工和代理商提供辩护,使其免于因下列情况引起或产生的任何及所有索赔、诉讼、起诉或诉讼程序以及任何及所有损失、债务、损害、成本和费用(包括合理的律师费用)而承担责任或遭受损害:(a) 您对“预览版”的使用;(b) 您在“预览版”上开发的任何应用侵犯任何人的任何知识产权或诽谤任何人或侵犯其公开权或隐私权;以及 (c) 您的任何行为有悖于本许可协议
+
+13. 许可协议的更改
+
+13.1 Google 可能会在分发新版本“预览版”时对许可协议做出更改。做出这些更改后,Google 将在提供“预览版”的网站上公布新版本的许可协议。
+
+14. 一般法律条款
+
+14.1 本许可协议构成您与 Google 之间的完整法律协议,管辖您对“预览版”(不包括 Google 可能依据另外的书面协议向您提供的任何服务)的使用,并完全取代您之前与 Google 之间签订的、与“预览版”有关的任何协议。
+
+14.2 您同意,如果 Google 未行使或未强制执行本许可协议包含的任何法定权利或救济(或 Google 在任何适用法律下享有的相关利益),不得视为 Google 正式放弃这些权利,Google 仍可获得这些权利或救济。
+
+14.3 如果任何拥有管辖权的法院将本许可协议的任何条款裁定为无效,则该条款将从本许可协议中删除,而不会影响本许可协议的其余部分。本许可协议的其余条款将继续有效且可强制执行。
+
+14.4 您承认并同意,Google 集团旗下的每一家公司都将成为本许可协议的第三方受益人,并且此类其他公司将有权直接强制执行和依赖本许可协议中任何授予其利益(或支持其权利)的条款。除此之外,任何其他人员或公司均不得成为本许可协议的第三方受益人。
+
+14.5 出口限制。“预览版”受美国出口法律和法规的制约。您必须遵守适用于“预览版”的所有国内和国际出口法律和法规。这些法律包括目的地、最终用户和最终用途方面的限制。
+
+14.6 未经 Google 事先书面批准,您不得擅自转让或转移本许可协议,未经此类批准而试图进行的任何转让均为无效。未经 Google 事先书面批准,您不得委托您依据本许可协议所应承担的责任或义务。
+
+14.7 本许可协议以及您与 Google 依据本许可协议而建立的关系受加利福尼亚州法律管辖,而无论其是否与其他法律条款冲突。您与 Google 同意服从位于加利福尼亚州圣克拉拉县内法院的专属司法管辖权,以解决本许可协议引起的任何法律事务。尽管有上述规定,您同意仍允许 Google 在任何管辖区域申请禁令救济(或同等类型的紧急法律救济)。
+
+
+</div> \ No newline at end of file
diff --git a/docs/html-intl/intl/zh-cn/preview/samples.jd b/docs/html-intl/intl/zh-cn/preview/samples.jd
new file mode 100644
index 0000000..9f16319
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/samples.jd
@@ -0,0 +1,70 @@
+page.title=示例
+page.image=images/cards/samples-new_2x.png
+@jd:body
+
+<p>
+ 以下是 M 开发者预览版的代码示例。要在 Android Studio 中下载示例,请选择<b>文件 &gt; 导入示例</b>菜单选项。
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>这些可下载的项目设计用于与 Gradle 和 Android Studio 结合使用。
+
+</p>
+
+
+<h3 id="RuntimePermissions">运行时权限</h3>
+
+<p>
+ Android M 改变了系统权限运行的方式。系统会在运行时(而不是安装期间)要求用户批准权限请求。
+此示例显示了如何请求这些权限。
+
+</p>
+
+<p><a href="https://github.com/googlesamples/android-RuntimePermissions">在 GitHub 中获取</a></p>
+
+<h3 id="ConfirmCredentials">确认凭据</h3>
+
+<p>
+ 此示例演示了在您的应用中如何使用设备凭据作为身份验证方法。
+</p>
+
+<p><a href="https://github.com/googlesamples/android-ConfirmCredential">在 GitHub 中获取</a>
+</p>
+
+<h3 id="FingerprintDialog">指纹对话框</h3>
+
+<p>
+ 此示例演示了在您的应用中如何识别已注册的指纹以验证用户的身份。
+
+</p>
+
+<p><a href="https://github.com/googlesamples/android-FingerprintDialog">在 GitHub 中获取</a></p>
+
+<h3 id="AutomaticBackup">自动备份应用</h3>
+
+<p>
+ Android M 引入了自动备份应用设置功能。此示例演示如何向应用添加筛选规则,以管理设置备份。
+
+</p>
+
+<p><a href="https://github.com/googlesamples/android-AutoBackupForApps">在 GitHub 中获取</a></p>
+
+<h3 id="CameraRaw">相机 2 RAW</h3>
+
+<p>
+ 演示如何使用 <code>Camera2</code> API 捕获 RAW 相机缓冲区并将其另存为 <code>DNG</code> 文件。
+
+</p>
+
+<p><a href="https://github.com/googlesamples/android-Camera2Raw">在 GitHub 中获取</a></p>
+
+<h3 id="ActiveNotification">活动通知</h3>
+
+<p>
+ 此示例演示 <a href="{@docRoot}reference/android/app/NotificationManager.html"><code>NotificationManager</code></a>
+ 如何让您了解应用当前显示的通知数量。
+
+</p>
+
+<p><a href="https://github.com/googlesamples/android-ActiveNotifications">在 GitHub 中获取</a></p>
diff --git a/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd b/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd
new file mode 100644
index 0000000..e9910b4
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd
@@ -0,0 +1,207 @@
+page.title=设置预览版 SDK
+page.image=images/cards/card-set-up_16-9_2x.png
+
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#get-as13">获取 Android Studio 1.3</a></li>
+ <li><a href="#get-sdk">获取预览版 SDK</a></li>
+ <li><a href="#create-update">创建或更新项目</a></li>
+ <li><a href="#setup-test">测试设置</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>M 开发者预览版 SDK 可通过 Android SDK 管理器获取。本文假定您熟悉 Android 应用开发的相关操作,例如:使用 Android SDK 管理器和创建项目。
+
+如果您是首次使用 Android,请先参阅<a href="{@docRoot}training/basics/firstapp/index.html">开发您的第一款应用</a>培训课程。</a>
+
+</p>
+
+<h2 id="get-as13">获取 Android Studio 1.3</h2>
+
+<p>开发者预览版与处于预览版状态的 Android Studio 1.3 结合使用时效果最佳。
+强烈建议您安装 Android Studio 1.3 的预览版本,以便与预览版 SDK 结合使用。
+</p>
+
+<p class="caution"><strong>注意:</strong>Android Studio 1.3 的 Canary 预览版仍处于活动的开发状态。
+如果您正使用主要开发机器测试开发者预览版,则可创建另一套 Android Studio 安装系统供测试使用。
+
+</p>
+
+<p>要安装 Android Studio 1.3 预览版,请执行以下操作:</p>
+
+<ol>
+ <li>下载并启动 <a href="{@docRoot}tools/studio/index.html">Android Studio</a>。
+
+ </li>
+
+ <li>打开<strong>设置</strong>窗口(在 Windows 中,您可通过选择<strong>文件 &gt; 设置</strong>执行此操作)。
+选择<strong>外观和行为 &gt; 系统设置 &gt; 更新</strong>面板。
+
+
+
+ <p class="aside">在 OSX 中,您可在 Android Studio 的<strong>首选项</strong>窗口中找到<strong>外观和行为</strong>面板。
+
+</p>
+ </li>
+
+ <li> 在<strong>更新</strong>面板中,选择选项<strong>自动检查更新:
+Canary 渠道</strong>。
+ </li>
+
+ <li>在<strong>更新</strong>面板中,选择<strong>立即检查</strong>,以检查最新的 Canary 内部版本。
+当系统出现提示时,请下载并安装该内部版本。
+
+ </li>
+</ol>
+
+<h2 id="get-sdk">获取预览版 SDK</h2>
+
+<p>要将预览版 SDK 组件添加到开发环境,请执行以下操作:</p>
+
+<ol>
+ <li>启动 Android Studio 1.3 预览版。
+ </li>
+
+ <li>打开<strong>设置</strong>窗口(在 Windows 中,您可通过选择<strong>文件 &gt; 设置</strong>执行此操作)。
+选择<strong>外观和行为 &gt; 系统设置 &gt; 更新</strong>面板。
+
+
+
+ <p class="aside">在 OSX 中,您可在 Android Studio 的<strong>首选项</strong>窗口中找到<strong>外观和行为</strong>面板。
+
+</p>
+ </li>
+
+ <li>在<strong>更新</strong>面板中,选择选项<strong>自动检查更新:
+Canary 渠道</strong>和<strong>自动检查 Android SDK 的更新:
+预览版渠道</strong>。
+ </li>
+
+ <li>启动 <strong>Android SDK 管理器</strong>。(对于 Android Studio 1.3,SDK 管理器已集成至 Android Studio,而不是独立应用。)
+
+
+ </li>
+
+ <li>在<strong>平台</strong>部分下,选择 <strong>Android MNC 预览版</strong>。
+
+ </li>
+
+ <li>在<strong>工具</strong>部分中,选择最新的 Android <strong>SDK 工具</strong>、<strong>平台工具</strong>和<strong>构建工具</strong>。
+
+
+ </li>
+
+ <li>点击<strong>安装软件包</strong>并接受所有软件包的许可协议。
+
+ </li>
+
+ <li>验证是否已安装 M 开发者预览版,具体方式如下:打开<strong>设置</strong>窗口并选择<strong>外观与行为 &gt; 系统设置 &gt; Android SDK</strong> 面板。
+
+</li>
+
+ <li>在 <strong>Android SDK</strong> 面板中,选择 <strong>SDK 平台</strong>选项卡。
+<strong>Android MNC 预览版</strong>应作为“已安装”列出<em></em>。
+另外,打开 <strong>SDK 工具</strong>选项卡,确认是否已安装最新工具。
+
+
+ </li>
+</ol>
+<p>完成上述步骤后,预览版组件即可用于您的开发环境。
+ </p>
+
+
+<h2 id="create-update">创建或更新项目</h2>
+
+<p>
+ 为使用预览版 API,您必须创建或更新一个使用预览版组件的开发项目。
+
+</p>
+
+
+<h3 id="create">创建新项目</h3>
+
+<p>
+ 建议使用 Android Studio 创建一个使用该预览版的项目。按照<a href="{@docRoot}sdk/installing/create-project.html">创建项目</a>中所描述的步骤操作,直到转到项目向导中的“外形”<em></em>屏幕为止。
+
+然后执行下列步骤,创建为该预览版配置的项目。
+
+</p>
+
+<ul>
+ <li>选中<strong>手机和平板电脑</strong>。</li>
+ <li>选择 <strong>MNC:Android M (预览版)</strong>(在<strong>最低 SDK</strong> 中)。
+</li>
+</ul>
+
+
+<h3 id="update">更新现有项目</h3>
+
+<p>
+ 对于现有项目,您必须修改项目配置以启用预览版 API。在开发环境中,打开模块的 <code>build.gradle</code> 文件,并按如下所示设置这些值:
+
+
+</p>
+
+<ul>
+ <li>将 <code>compileSdkVersion</code> 设置为 <code>'android-MNC'</code></li>
+ <li>将 <code>minSdkVersion</code> 设置为 <code>'MNC'</code></li>
+ <li>将 <code>targetSdkVersion</code> 设置为 <code>'MNC'</code></li>
+</ul>
+
+
+<h2 id="setup-test">测试设置</h2>
+
+<p>
+ 要使用预览版测试应用,您必须拥有已配置平台预览版本的物理设备或虚拟设备。
+如果您拥有兼容设备,则可安装预览版平台进行测试。
+另外,您可以配置用于测试的虚拟设备。
+</p>
+
+<h3 id="setup-device">设置物理设备</h3>
+
+<p>
+ 如果您拥有 Nexus 5、Nexus 6、Nexus 9 或 Android TV,则可在这些设备中安装预览版系统映像,来测试您的应用。通过使用 Android 虚拟设备管理器工具,您可从 Android Studio 内设置带有平台预览版本的虚拟设备。
+
+
+
+</p>
+
+<p class="caution">
+ <strong>重要说明:</strong>在设备中安装预览版映像会删除此设备中的所有数据,因此您应在安装预览版映像之前备份数据。<em></em>
+
+</p>
+
+<h3 id="setupAVD">设置虚拟设备</h3>
+
+<p>
+ 通过使用 Android 虚拟设备管理器工具,您可从 Android Studio 内设置带有平台预览版本的虚拟设备。
+
+</p>
+
+<p>要使用 AVD 管理器创建 AVD,请执行以下操作:</p>
+
+<ol>
+ <li>在开发环境中安装预览版 SDK,如<a href="{@docRoot}preview/setup-sdk.html">设置预览版 SDK</a> 中所述。
+
+</li>
+ <li>按照<a href="{@docRoot}tools/devices/managing-avds.html">使用 AVD 管理器管理 AVD </a>中的步骤操作。
+
+使用以下设置:
+ <ul>
+ <li><strong>设备:</strong>Nexus 5、Nexus 6、Nexus 9 或 Android TV</li>
+ <li><strong>目标:</strong>
+ Android M(预览版)- API 级别 M</li>
+ <li><strong>ABI:</strong>x86</li>
+ </ul>
+ </li>
+</ol>
+
+<p>
+ 如需了解有关创建测试用虚拟设备的详细信息,请参阅<a href="{@docRoot}tools/devices/index.html">管理虚拟设备</a>。
+</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/support.jd b/docs/html-intl/intl/zh-cn/preview/support.jd
new file mode 100644
index 0000000..a62417b
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/support.jd
@@ -0,0 +1,67 @@
+page.title=支持
+page.image=images/cards/card-support_16-9_2x.png
+
+@jd:body
+
+<p>
+ 如果您遇到错误或要提供有关 M 开发者预览版的反馈,请在我们的问题跟踪器上<a href="https://code.google.com/p/android-developer-preview/">创建问题</a>。
+
+
+</p>
+
+<p>
+ 有关更多支持,请加入 <a href="http://g.co/dev/AndroidMDevPreview">M 开发者预览版 Google+ 社区</a>,讨论您的开发体验。
+
+
+</p>
+
+<h2 id="release-notes">版本说明</h2>
+
+<!--
+<div class="toggle-content opened">
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img"
+ alt=""/>M Developer Preview, Revision 2</a> <em>(Month 2015)</em>
+ </p>
+
+ <div class="toggle-content-toggleme">
+
+ <dl>
+
+ <dt>Fix Category 1</dt>
+ <dd>
+ <ul>
+ <li>Fixed issue X.</li>
+ <li>Fixed issue Y.</li>
+ <li>Fixed issue Z.</li>
+ </ul>
+ </dd>
+
+ <dt>Fix Category 2</dt>
+ <dd>
+ <ul>
+ <li>Fixed issue X.</li>
+ <li>Fixed issue Y.</li>
+ <li>Fixed issue Z.</li>
+ </ul>
+ </dd>
+
+ </dl>
+ </div>
+</div>
+-->
+
+<div class="toggle-content opened">
+ <p><a href="#" onclick="return toggleContent(this)">
+<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" alt="" />M 开发者预览版,版本 1</a>(2015 年 5 月)<em></em>
+ </p>
+
+ <div class="toggle-content-toggleme">
+
+ <dl>
+ <dt>初始版本。</dt>
+ </dl>
+ </div>
+</div>
+
+
diff --git a/docs/html-intl/intl/zh-cn/preview/testing/guide.jd b/docs/html-intl/intl/zh-cn/preview/testing/guide.jd
new file mode 100644
index 0000000..256d5bb
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/testing/guide.jd
@@ -0,0 +1,187 @@
+page.title=测试指南
+page.image=images/cards/card-build_16x9_2x.png
+page.keywords=预览资源,androidm,测试,权限
+
+@jd:body
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#runtime-permissions">测试权限</a></li>
+ <li><a href="#doze-standby">测试瞌睡模式和应用待机模式</a></li>
+ <li><a href="#ids">自动备份和设备标识符</a></li>
+ </ol>
+ </div>
+</div>
+
+<p>
+ 利用 Android M 开发者预览版,您有机会确保应用可使用下一平台版本。
+如 <a href="{@docRoot}preview/api-overview.html">API 概览</a>和<a href="{@docRoot}preview/behavior-changes.html">行为变更</a>中所述,该预览版包括大量 API 和可能影响应用的行为变更。
+
+使用预览版测试应用时,您应重点关注一些特定的系统变更,确保用户拥有愉悦的体验。
+
+
+</p>
+
+<p>
+ 本指南介绍可使用您的应用测试预览版的哪些功能以及如何测试。您应确定优先测试以下特定预览版功能,因为它们可能会对应用行为产生较大影响。
+
+
+</p>
+
+<ul>
+ <li><a href="#runtime-permissions">权限</a>
+ </li>
+ <li><a href="#doze-standby">瞌睡模式和应用待机模式</a>
+ </li>
+ <li><a href="#ids">自动备份和设备标识符</a></li>
+</ul>
+
+<p>
+ 如需了解有关如何使用预览版系统映像设置设备或虚拟设备以进行测试的详细信息,请参阅<a href="{@docRoot}preview/setup-sdk.html">设置预览版 SDK</a>。
+
+</p>
+
+
+<h2 id="runtime-permissions">测试权限</h2>
+
+<p>
+ 新<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>模型改变了用户向您的应用分配权限的方式。
+您的应用必须在运行时要求用户提供各项权限,而不是在安装过程中要求授予所有权限。
+
+对于用户而言,此行为有助于他们更精细地控制每个应用的Activity,并更深入地了解应用为何请求提供特定权限的上下文信息。
+用户可以随时向应用授予某项权限或撤销其某项权限。
+预览版的这种功能最有可能会对应用行为产生影响,而且可能会阻止某些应用功能运行或只能在降级状态中运行。
+
+
+</p>
+
+<p class="caution">
+ 这一变更会影响在新平台上运行的所有应用,即便这些应用并非面向新平台版本开发亦是如此。
+该平台为旧版应用提供有限的兼容性行为,但您现在应当开始计划将应用迁移到新权限模型,以便在官方平台启动时发布更新的应用版本。
+
+
+</p>
+
+
+<h3 id="permission-test-tips">测试提示</h3>
+
+<p>
+ 使用以下测试提示有助于您计划并通过新权限行为执行应用测试。
+
+</p>
+
+<ul>
+ <li>识别应用的当前权限和相关的代码路径</li>
+ <li>跨受权限保护的服务和数据测试用户流程</li>
+ <li>使用授予/撤销权限的各种组合进行测试</li>
+ <li>使用 {@code adb} 工具从命令行管理权限:
+ <ul>
+ <li>按组列出权限和状态:
+ <pre>adb shell pm list permissions -d -g</pre>
+ </li>
+ <li>使用以下语法授予或撤销一项或多项权限:<br>
+ <pre>adb shell pm [grant|revoke] &lt;permission.name&gt; ...</pre>
+ </li>
+ </ul>
+ </li>
+ <li>针对使用权限的服务对应用进行分析</li>
+</ul>
+
+<h3 id="permission-test-strategy">测试策略</h3>
+
+<p>
+ 权限更改会影响应用的结构和设计,以及您为用户提供的用户体验和流程。
+您应评估应用的当前权限使用情况并开始计划要提供的新流程。
+平台的正式版本提供兼容性行为,但您应计划更新应用,而不是依赖于这些行为。
+
+
+</p>
+
+<p>
+ 确定应用实际需要和使用的权限,然后找出各种使用受权限保护的服务的代码路径。
+您可通过结合使用新平台测试和代码分析完成此操作。
+在测试中,您应通过将应用的 {@code targetSdkVersion} 更改为预览版,重点关注选择运行时权限。
+如需了解详细信息,请参阅<a href="{@docRoot}preview/setup-sdk.html#">设置预览版 SDK</a>。
+
+</p>
+
+<p>
+ 使用已撤销和已添加权限的各种组合进行测试,突出显示依赖于权限的用户流程。
+如果依赖关系不明显或不符合逻辑,则您应考虑重构或划分该流程,以消除依赖关系或阐明需要权限的原因。
+
+
+</p>
+
+<p>
+ 如需了解有关运行时权限行为、测试和最佳做法的详细信息,请参阅<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>开发者预览版页面。
+
+
+</p>
+
+
+<h2 id="doze-standby">测试瞌睡模式和应用待机模式</h2>
+
+<p>
+ 当设备处于空闲状态或应用未聚焦时,瞌睡模式和应用待机模式的节能功能将限制应用可执行的后台处理工作量。
+系统可对应用实施的限制包括:限制或禁止访问网络、暂停后台任务、暂停通知、忽略唤醒请求和闹铃。
+
+要确保应用在完成这些节能优化后正常运行,您应通过模拟这些低功耗状态对应用进行测试。
+
+
+</p>
+
+<h4 id="doze">在瞌睡模式下测试您的应用</h4>
+
+<p>要在瞌睡模式下测试您的应用,请执行以下操作:</p>
+
+<ol>
+<li>使用 M 预览版系统映像配置硬件设备或虚拟设备</li>
+<li>将设备连接到开发计算机并安装应用</li>
+<li>运行应用并使其保持活动状态</li>
+<li>通过运行以下命令,模拟进入瞌睡模式的设备:
+
+<pre>
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+
+ </li>
+ <li>观察重新激活设备时的应用行为。确保应用在设备退出瞌睡模式时正常恢复
+</li>
+</ol>
+
+
+<h4 id="standby">在应用待机模式下测试您的应用</h4>
+
+<p>要在应用待机模式下测试您的应用,请执行以下操作:</p>
+
+<ol>
+ <li>使用 M 预览版系统映像配置硬件设备或虚拟设备</li>
+ <li>将设备连接到开发计算机并安装应用</li>
+ <li>运行应用并使其保持活动状态</li>
+ <li>通过运行以下命令,模拟进入待机模式的应用:
+
+<pre>
+$ adb shell am broadcast -a android.os.action.DISCHARGING
+$ adb shell am set-idle &lt;packageName&gt; true
+</pre>
+
+ </li>
+ <li>使用以下命令模拟如何唤醒应用:
+ <pre>$ adb shell am set-idle &lt;packageName&gt; false</pre>
+ </li>
+ <li>观察唤醒后的应用行为。确保应用从待机模式中正常恢复。
+特别地,您应检查应用的通知和后台作业是否按预期继续运行
+</li>
+</ol>
+
+<h2 id="ids">自动备份应用和设备特定的标识符</h2>
+
+<p>如果应用坚持在内部存储中使用任何设备特定的标识符,如 Google 云消息传递注册 ID,请确保遵循最佳做法将存储位置从自动备份中排除,如<a href="{@docRoot}preview/backup/index.html">自动备份应用</a>中所述。
+
+
+
+ </p>
diff --git a/docs/html-intl/intl/zh-cn/preview/testing/performance.jd b/docs/html-intl/intl/zh-cn/preview/testing/performance.jd
new file mode 100644
index 0000000..1f88854
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/testing/performance.jd
@@ -0,0 +1,656 @@
+page.title=测试显示性能
+page.image=images/cards/card-test-performance_2x.png
+page.keywords=性能, fps, 工具
+
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#measure">测量 UI 性能</a>
+ <ul>
+ <li><a href="#aggregate">聚合帧统计信息</a></li>
+ <li><a href="#timing-info">精确的帧时间信息</a></li>
+ <li><a href="#timing-dump">简单的帧时间转储</a></li>
+ <li><a href="#collection-window">控制统计信息收集的时段</a></li>
+ <li><a href="#diagnose">诊断性能回归</a></li>
+ <li><a href="#resources">其他资源</a></li>
+ </ul>
+ </li>
+ <li><a href="#automate">自动化 UI 性能测试</a>
+ <ul>
+ <li><a href="#ui-tests">设置 UI 测试</a></li>
+ <li><a href="#automated-tests">设置自动化 UI 测试</a></li>
+ <li><a href="#triage">分类并解决观察到的问题</a></li>
+ </ul>
+ </li>
+ </ol>
+ </div>
+</div>
+
+
+<p>
+ 用户界面 (UI) 性能测试可确保您的应用不仅满足其功能要求,同时确保用户与应用之间的交互顺畅无比,能够以每秒连续 60 帧(<a href="https://www.youtube.com/watch?v=CaMTIgxCSqU&amp;index=25&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">为什么选择 60fps?</a>)的帧速运行,而不会出现任何帧丢失或延迟的现象,也就是我们通常所说的“卡顿”。<em></em>
+
+
+本文档介绍可用于测量 UI 性能的工具并提出一种将 UI 性能测量集成到测试实践中的方法。
+
+
+</p>
+
+
+<h2 id="measure">测量 UI 性能</h2>
+
+<p>
+ 为了改善性能,您首先必须能够测量系统性能,然后诊断并识别可能来自管道各个部分的问题。
+
+
+</p>
+
+<p>
+ <a href="https://source.android.com/devices/tech/debug/dumpsys.html">dumpsys</a> 是一种在设备上运行并转储感兴趣的系统服务状态信息的 Android 工具。<em></em>
+
+通过向 dumpsys 传递“gfxinfo”命令,可以提供 logcat 格式的输出,其中包含有关与录制阶段期间发生的动画帧相关的性能信息。
+
+<em></em>
+</p>
+
+<pre>
+&gt; adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt;
+</pre>
+
+<p>
+ 此命令可以生成多个不同表达形式的帧时间数据。
+</p>
+
+<h3 id="aggregate">聚合帧统计信息</h3>
+
+<p>
+ 借助 M 预览版,该命令可将在整个进程生命周期中收集的帧数据的聚合分析打印输出到 logcat。
+例如:
+</p>
+
+<pre class="noprettyprint">
+Stats since: 752958278148ns
+Total frames rendered: 82189
+Janky frames: 35335 (42.99%)
+90th percentile: 34ms
+95th percentile: 42ms
+99th percentile: 69ms
+Number Missed Vsync: 4706
+Number High input latency: 142
+Number Slow UI thread: 17270
+Number Slow bitmap uploads: 1542
+Number Slow draw: 23342
+</pre>
+
+<p>
+ 这些高级统计信息可以较高水平地传达应用的呈现性能及其在多个帧之间的稳定性。
+
+</p>
+
+
+<h3 id="timing-info">精确的帧时间信息</h3>
+
+<p>
+ M 预览版附带提供了一个适用于 gfxinfo 的新命令,即:framestats,该命令根据最近的帧提供非常详细的帧时间信息,让您能够更准确地查出并调试问题。<em></em>
+
+
+</p>
+
+<pre>
+&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; framestats
+</pre>
+
+<p>
+ 此命令根据应用生成的最后 120 帧,打印输出带有纳秒时间戳的帧时间信息。以下是来自 adb dumpsys gfxinfo &lt;软件包名称&gt; framestats 的原始输出示例:
+
+
+</p>
+
+<pre class="noprettyprint">
+0,49762224585003,49762241251670,9223372036854775807,0,49762257627204,49762257646058,49762257969704,49762258002100,49762265541631,49762273951162,49762300914808,49762303675954,
+0,49762445152142,49762445152142,9223372036854775807,0,49762446678818,49762446705589,49762447268818,49762447388037,49762453551527,49762457134131,49762474889027,49762476150120,
+0,49762462118845,49762462118845,9223372036854775807,0,49762462595381,49762462619287,49762462919964,49762462968454,49762476194547,49762476483454,49762480214964,49762480911527,
+0,49762479085548,49762479085548,9223372036854775807,0,49762480066370,49762480099339,49762481013089,49762481085850,49762482232152,49762482478350,49762485657620,49762486116683,
+</pre>
+
+<p>
+ 每行输出均代表应用生成的一帧。每行都有固定的列数,用于描述帧生成管道的每个阶段所花的时间。
+下文将详细描述此格式,包括每列代表的具体内容。
+
+</p>
+
+
+<h4 id="fs-data-format">Framestats 数据格式</h4>
+
+<p>
+ 由于数据块是 CSV 格式的输出,因此将其粘贴到所选的电子表格工具或使用脚本进行收集和解析非常简单。
+下表解释了输出数据列的格式。
+所有时间戳均以纳秒计。
+</p>
+
+<ul>
+ <li>标志
+ <ul>
+ <li>“标志”列带有“0”的行可以通过从 FRAME_COMPLETED 列中减去 INTENDED_VSYNC 列计算得出总帧时间。
+
+ </li>
+
+ <li>该列为非零值的行将被忽略,因为其对应的帧已被确定为偏离正常性能,其布局和绘制时间预计超过 16 毫秒。
+
+可能出现这种情况有如下几个原因:
+ <ul>
+ <li>窗口布局发生变化(例如,应用的第一帧或在旋转后)
+
+ </li>
+
+ <li>此外,如果帧的某些值包含无意义的时间戳,则也可能跳过该帧。
+例如,如果帧的运行速度超过 60fps,或者如果屏幕上的所有内容最终都准确无误,则可能跳过该帧,这不一定表示应用中存在问题。
+
+
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </li>
+
+ <li>INTENDED_VSYNC
+ <ul>
+ <li>帧的预期起点。如果此值不同于 VSYNC,则表示 UI 线程中发生的工作使其无法及时响应垂直同步信号。
+
+
+ </li>
+ </ul>
+ </li>
+
+ <li>VSYNC
+ <ul>
+ <li>所有垂直同步侦听器中使用的时间值和帧绘图(Choreographer 帧回调、动画、View.getDrawingTime() 等等)
+
+ </li>
+
+ <li>如需进一步了解 VSYNC 及其对应用产生的影响,请观看<a href="https://www.youtube.com/watch?v=1iaHxmfZGGc&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=23">了解 VSYNC</a> 视频。
+
+
+ </li>
+ </ul>
+ </li>
+
+ <li>OLDEST_INPUT_EVENT
+ <ul>
+ <li>输入队列中最早输入事件的时间戳或 Long.MAX_VALUE(如果帧没有输入事件)。
+
+ </li>
+
+ <li>此值主要用于平台工作,对应用开发者的作用有限。
+
+ </li>
+ </ul>
+ </li>
+
+ <li>NEWEST_INPUT_EVENT
+ <ul>
+ <li>输入队列中最新输入事件的时间戳或 0(如果帧没有输入事件)。
+
+ </li>
+
+ <li>此值主要用于平台工作,对应用开发者的作用有限。
+
+ </li>
+
+ <li>但是,可以通过查看 (FRAME_COMPLETED - NEWEST_INPUT_EVENT) 大致了解应用增加的延迟时间。
+
+ </li>
+ </ul>
+ </li>
+
+ <li>HANDLE_INPUT_START
+ <ul>
+ <li>将输入事件分派给应用的时间戳。
+ </li>
+
+ <li>通过观察此时间戳与 ANIMATION_START 之间的时差,可以测量应用处理输入事件所花的时间。
+
+ </li>
+
+ <li>如果这个数字较高(&gt; 2 毫秒),则表明应用处理 View.onTouchEvent() 等输入事件所花的时间太长,这意味着此工作需要进行优化或转交给其他线程。
+
+请注意,有些情况下(例如,启动新Activity或类似活动的点击事件),这个数字较大是预料之中并且可以接受的。
+
+
+ </li>
+ </ul>
+ </li>
+
+ <li>ANIMATION_START
+ <ul>
+ <li>在 Choreographer 中注册的动画运行的时间戳。
+ </li>
+
+ <li>通过观察此时间戳与 PERFORM_TRANVERSALS_START 之间的时差,可以确定评估正在运行的所有动画(ObjectAnimator、ViewPropertyAnimator 和通用转换)所需的时间。
+
+
+ </li>
+
+ <li>如果这个数字较高(&gt; 2 毫秒),请检查您的应用是否编写了任何自定义动画,或检查 ObjectAnimator 在对哪些字段设置动画并确保它们适用于动画。
+
+
+ </li>
+
+ <li>如需了解有关 Choreographer 的更多信息,请观看<a href="https://developers.google.com/events/io/sessions/325418001">利弊</a>视频。
+
+ </li>
+ </ul>
+ </li>
+
+ <li>PERFORM_TRAVERSALS_START
+ <ul>
+ <li>如果您从此值中扣除 DRAW_START,则可推断出完成布局和测量阶段所需的时间(请注意,在滚动或动画期间,您会希望此时间接近于零)。
+
+
+ </li>
+
+ <li>如需了解有关呈现管道的测量和布局阶段的更多信息,请观看<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">失效、布局和性能</a>视频。
+
+
+ </li>
+ </ul>
+ </li>
+
+ <li>DRAW_START
+ <ul>
+ <li>performTraversals 绘制阶段的开始时间。这是记录任何失效视图的显示列表的起点。
+
+ </li>
+
+ <li>此时间与 SYNC_START 之间的时差就是对树中的所有失效视图调用 View.draw() 所需的时间。
+
+ </li>
+
+ <li>如需了解有关绘图模型的详细信息,请参阅<a href="{@docRoot}guide/topics/graphics/hardware-accel.html#hardware-model">硬件加速</a>或<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu&amp;index=27">失效、布局和性能</a>视频。
+
+
+ </li>
+ </ul>
+ </li>
+
+ <li>SYNC_START
+ <ul>
+ <li>绘制同步阶段的开始时间。
+ </li>
+
+ <li>如果此时间与 ISSUE_DRAW_COMMANDS_START 之间的时差较大(约 &gt; 0.4 毫秒),则通常表示绘制了大量必须上传到 GPU 的新位图。
+
+
+ </li>
+
+ <li>如需进一步了解同步阶段,请观看 <a href="https://www.youtube.com/watch?v=VzYkVL1n4M8&amp;index=24&amp;list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu">GPU 呈现模式分析</a>视频。
+
+ </li>
+ </ul>
+ </li>
+
+ <li>ISSUE_DRAW_COMMANDS_START
+ <ul>
+ <li>硬件呈现器开始向 GPU 发出绘图命令的时间。
+ </li>
+
+ <li>此时间与 FRAME_COMPLETED 之间的时差让您可以大致了解应用生成的 GPU 工作量。
+绘制过度或呈现效果不佳等问题都会在此显示出来。
+
+ </li>
+ </ul>
+ </li>
+
+ <li>SWAP_BUFFERS
+ <ul>
+ <li>调用 eglSwapBuffers 的时间,此调用不属于平台工作,相对乏味。
+
+ </li>
+ </ul>
+ </li>
+
+ <li>FRAME_COMPLETED
+ <ul>
+ <li>全部完成!处理此帧所花的总时间可以通过执行 FRAME_COMPLETED - INTENDED_VSYNC 计算得出。
+
+ </li>
+ </ul>
+ </li>
+
+</ul>
+
+<p>
+ 您可以通过不同的方法使用此数据。一种简单却有用的可视化方式就是在不同的延迟时段中显示帧时间 (FRAME_COMPLETED - INTENDED_VSYNC) 分布的直方图(参见下图)。
+
+此图直观地表明,大部分帧非常有效,截止时间远低于 16 毫秒(显示为红色),但是少数帧明显超出了截止时间。
+
+我们可以观察此直方图中的变化趋势,了解所产生的整体变化或新异常值。
+此外,您还可以根据数据中的多个时间戳绘制表示输入延迟、布局所用时间或其他类似关注指标的图形。
+
+
+</p>
+
+<img src="{@docRoot}preview/images/perf-test-framestats.png">
+
+
+<h3 id="timing-dump">简单的帧时间转储</h3>
+
+<p>
+ 如果在“开发者选项”中将 <strong>GPU 呈现模式分析</strong>设置为<strong>在 adb shell dumpsys gfxinfo 中</strong>,则 <code>adb shell dumpsys gfxinfo</code> 命令会打印输出最近 120 帧的时间信息,这些信息分为几个不同的类别,其相应的值以制表符分隔。
+
+
+这些数据可以用于大致表明绘图管道的哪些部分可能速度较慢。
+
+</p>
+
+<p>
+ 与上述 <a href="#fs-data-format">framestats</a> 类似,将其粘贴到所选的电子表格工具或使用脚本进行收集和解析同样非常简单。
+
+下图详细显示了应用生成的许多帧的具体时间分布。
+
+</p>
+
+<img src="{@docRoot}preview/images/perf-test-frame-latency.png">
+
+<p>
+ 运行 gfxinfo、复制输出、将其粘贴到电子表格应用并将数据绘制成堆积条形图的结果。
+
+</p>
+
+<p>
+ 每个垂直条均代表一个动画帧;其高度代表计算该动画帧所需的毫秒数。
+垂直条的每个彩色分段均代表呈现管道的一个不同阶段,因此您可以看到应用的哪些部分可能会出现瓶颈。
+
+如需了解有关呈现管道的详细信息,请参阅<a href="https://www.youtube.com/watch?v=we6poP0kw6E&amp;index=27&amp;list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE">失效、布局和性能</a>视频。
+
+
+</p>
+
+
+<h3 id="collection-window">控制统计信息收集的时段</h3>
+
+<p>
+ Framestats 和简单的帧计时均可在极短的时间内(相当于约呈现 2 秒)收集数据。
+要精确控制此时间范围(例如,将数据限制于特定动画),您可以重置所有计数器并汇总收集的统计信息。
+
+
+</p>
+
+<pre>
+&gt;adb shell dumpsys gfxinfo &lt;PACKAGE_NAME&gt; reset
+</pre>
+
+<p>
+ 这也可以与转储命令结合使用来定期进行收集和重置,从而持续捕获时间范围不到 2 秒的帧。
+
+
+</p>
+
+
+<h3 id="diagnose">诊断性能回归</h3>
+
+<p>
+ 要查出问题并保持应用运行状况良好,第一步最好是识别回归。
+但是,dumpsys 仅确定是否存在问题及其相对严重性。
+您仍需诊断性能问题的具体原因并找到适当的解决方法。
+为此,我们强烈建议您使用 <a href="{@docRoot}tools/help/systrace.html">systrace</a> 工具。
+
+</p>
+
+
+<h3 id="resources">其他资源</h3>
+
+<p>
+ 如需了解有关 Android 呈现管道的工作原理、可能存在的常见问题以及如何解决这些问题的详细信息,以下其他资源可能对您有所帮助:
+
+
+</p>
+
+<ul>
+ <li>呈现性能 101
+ </li>
+ <li>为什么选择 60fps?
+ </li>
+ <li>Android UI 和 GPU
+ </li>
+ <li>失效、布局和性能
+ </li>
+ <li>使用 Systrace 分析 UI 性能
+ </li>
+</ul>
+
+
+<h2 id="automate">自动化 UI 性能测试</h2>
+
+<p>
+ UI 性能测试方法之一是让测试人员对目标应用执行一系列用户操作,并目视检查是否存在卡顿现象,或花费大量时间使用工具驱动型方法来查明是否存在卡顿现象。
+
+但是,这种人工方法充满风险:人为感知帧率变化的能力参差不齐,并且此过程又费时、繁琐且易于出错。
+
+
+</p>
+
+<p>
+ 更为有效的方法是记录并分析自动化 UI 测试中的关键性能指标。
+Android M 开发者预览版包括新的日志记录功能。利用这些功能,您可以轻松确定应用动画中的卡顿数量和严重性,您还可以使用这些功能构建严格的流程,用于确定当前性能并跟踪未来的性能目标。
+
+
+
+</p>
+
+<p>
+ 本文将向您介绍一种使用这些数据自动化性能测试的推荐方法。
+
+</p>
+
+<p>
+ 此方法主要分为两个关键操作。首先,确定测试对象和测试方法;其次,设置和维护自动化测试环境。
+
+
+</p>
+
+
+<h3 id="ui-tests">设置 UI 测试</h3>
+
+<p>
+ 在开始进行自动化测试之前,您必须做出一些较高层次的决策,以便准确了解测试空间和可能存在的需求。
+
+</p>
+
+<h4>
+ 识别要测试的关键动画/流程
+</h4>
+
+<p>
+ 请记住,流畅的动画中断时,用户对低劣性能的感触最深。
+因此,在识别要测试的 UI 操作类型时,集中精力处理用户最常见或对用户体验最为重要的关键动画非常有用。
+
+例如,以下是对识别有所帮助的一些常见场景:
+</p>
+
+<ul>
+ <li>滚动主要的 ListView 或 RecyclerView
+ </li>
+
+ <li>异步等待周期内的动画
+ </li>
+
+ <li>可能涉及位图加载/操纵的所有操作
+ </li>
+
+ <li>包括 Alpha 值混合处理在内的动画
+ </li>
+
+ <li>使用画布绘制的自定义视图
+ </li>
+</ul>
+
+<p>
+ 与团队中的工程师、设计师和产品经理开展合作,优先处理测试覆盖范围内的这些关键产品动画。
+
+</p>
+
+<h4>
+ 定义未来的目标并予以跟踪
+</h4>
+
+<p>
+ 从较高层面来看,确定具体的性能目标、专注于编写测试并收集相关数据至关重要。
+例如:
+</p>
+
+<ul>
+ <li>您是否只是首次想要开始跟踪 UI 性能以了解详情?
+ </li>
+
+ <li>您是否想要防止未来可能引入的性能回归?
+ </li>
+
+ <li>您当前是否有 90% 的帧运行顺畅且希望在本季度达到 98%?
+ </li>
+
+ <li>您是否有 98% 的帧运行顺畅且不希望出现性能回归?
+ </li>
+
+ <li>提高低端设备上的性能是否为您的目标?
+ </li>
+</ul>
+
+<p>
+ 在所有这些情况下,您都将需要进行历史跟踪,以显示多个应用版本中的性能。
+
+</p>
+
+<h4>
+ 识别用于测试的设备
+</h4>
+
+<p>
+ 应用性能因其所在设备而异。某些设备的内存可能更少,GPU 功能略弱或 CPU 芯片速度较慢。
+这意味着动画在一套硬件上表现良好,但在其他硬件上可能并非如此,而且可能因为其他管道部分中出现的瓶颈表现更为糟糕。
+
+因此,考虑到用户可能会看到的这种变化,请选取各种设备(包括当前的高端设备、低端设备、平板电脑等)来执行测试。
+
+找出 CPU 性能、RAM、屏幕密度、尺寸等方面的变化。
+在高端设备上顺利通过的测试在低端设备上可能会失败。
+
+</p>
+
+<h4>
+ 基本的 UI 测试框架
+</h4>
+
+<p>
+ <a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a> 和 <a href="{@docRoot}training/testing/ui-testing/espresso-testing.html">Espresso</a> 等测试套件是为了帮助自动化用户使用应用过程中的操作而构建。
+
+这些套件是模拟用户与您的设备进行交互的简单框架。
+要使用这些框架,您需要有效创建通过一组用户操作运行的独特脚本,并在设备中演示这些脚本。
+
+
+</p>
+
+<p>
+ 通过结合这些自动化测试以及 <code>dumpsys gfxinfo</code>,您可以快速创建可再生成的系统,然后您可使用此系统执行测试并测量特定条件的性能信息。
+
+
+</p>
+
+
+<h3 id="automated-tests">设置自动化 UI 测试</h3>
+
+<p>
+ 您能够执行 UI 测试并拥有从单一测试收集数据的管道后,下一个重要步骤就是采用可以在多种设备上多次执行该测试的框架,并汇总生成的性能数据,以供开发团队做进一步分析。
+
+
+
+</p>
+
+<h4>
+ 测试自动化框架
+</h4>
+
+<p>
+ 有一点值得注意,UI 测试框架(例如,<a href="{@docRoot}training/testing/ui-testing/uiautomator-testing.html">UI Automator</a>)直接在目标设备/模拟器上运行,
+而性能信息收集则是由主机通过 ADB 发送命令来驱动 dumpsys gfxinfo 完成的。<em></em>
+为帮助桥接这些单独实体的自动化,我们开发了 <a href="{@docRoot}tools/help/monkeyrunner_concepts.html">MonkeyRunner</a> 框架;这是一款在主机上运行的脚本编写系统,可以向一组连接设备发出命令并从中接收数据。
+
+
+
+</p>
+
+<p>
+ 为正确自动化 UI 性能测试而构建一套脚本时,至少应当能够利用 monkeyRunner 完成以下任务:
+
+</p>
+
+<ul>
+ <li>向一个或多个目标设备或模拟器加载并启动所需的 APK。
+ </li>
+
+ <li>启动 UI Automator 的 UI 测试并允许执行该测试
+ </li>
+
+ <li>通过 dumpsys gfxinfo 收集性能信息。<em></em><em></em>
+ </li>
+
+ <li>汇总信息并以有效的方式重新向开发者显示。
+ </li>
+</ul>
+
+
+<h3 id="triage">分类并解决观察到的问题</h3>
+
+<p>
+ 一旦确定问题模式或回归,下一步就是识别和应用修复。
+如果自动化测试框架保持帧的精确时间分解,则可帮助您审查最近的可疑代码/布局更改(出现回归时),或在切换到人工调查时缩小分析的系统范围。
+
+
+对于人工调查,<a href="{@docRoot}tools/help/systrace.html">systrace</a> 是一个很好的着手点,它可显示有关呈现管道的每个阶段、系统中的每个线程和核心以及您定义的任何自定义事件标记的精确时间信息。
+
+
+</p>
+
+<h4>
+ 准确分析时间
+</h4>
+
+<p>
+ 需要注意的是,获取和测量呈现性能所需的时间并非易事。
+就其本质而言,这些数字不具有确定性,往往会随系统状态、可用内存量、热节流以及太阳耀斑到达地面的最后时间而波动。
+
+问题在于,尽管同一测试可以运行两次,但获得的结果可能略有不同,它们彼此接近,却并不完全相同。
+
+
+</p>
+
+<p>
+ 以这种方式准确收集和分析数据意味着多次运行同一测试,且以平均值或中值的形式累积结果(为了简单起见,我们将其称为“批处理”)。这可为您提供测试性能的粗略近似值,而无需确切的时间。
+
+
+
+</p>
+
+<p>
+ 您可对代码更改前和更改后的应用均使用批处理,了解这些更改对性能产生的相对影响。
+如果更改前批处理的平均帧率大于更改后批处理的平均帧率,则此特定更改通常可为您带来全面的性能优势。
+
+
+</p>
+
+<p>
+ 这意味着您执行的任何自动化 UI 测试均应考虑这一概念以及测试期间可能出现的任何异常。
+例如,如果应用性能因某些设备问题(不是由应用引起)骤降,则您可能需要重新运行批处理以便获得更精确的时间。
+
+
+
+</p>
+
+<p>
+ 那么,在获得更有意义的测量结果之前,您应运行多少次测试?至少应运行 10 次,次数越多(例如 50 或 100 次)获得的结果更精确(当然,您现在是牺牲时间换取精确度)
+
+
+</p>