summaryrefslogtreecommitdiff
path: root/docs/html-intl/intl/zh-cn/preview
diff options
context:
space:
mode:
authorTrevor Johns <trevorjohns@google.com>2016-04-05 19:43:35 -0700
committerTrevor Johns <trevorjohns@google.com>2016-04-05 20:32:07 -0700
commita5060ee80dbb48bd7fc545d2aeeeb657b79893ea (patch)
tree842bb82e198dccade4bfb3ceafcc01f96083cd34 /docs/html-intl/intl/zh-cn/preview
parentebf3261aa6d80ad4ca1df0fd0509961ff7a1914e (diff)
parent9577d31b10aa654d3ba63947e7733945a358395e (diff)
Merge branch 'mnc-mr-docs' into mnc-ub-dev
Large merge to reconnect automerger for docs branch to mainline. Conflicts: docs/html-intl/intl/es/index.jd docs/html-intl/intl/es/preview/download.jd docs/html-intl/intl/es/preview/index.jd docs/html-intl/intl/ja/index.jd docs/html-intl/intl/ja/preview/download.jd docs/html-intl/intl/ja/preview/index.jd docs/html-intl/intl/ko/index.jd docs/html-intl/intl/ko/preview/download.jd docs/html-intl/intl/ko/preview/index.jd docs/html-intl/intl/pt-br/index.jd docs/html-intl/intl/pt-br/preview/download.jd docs/html-intl/intl/pt-br/preview/index.jd docs/html-intl/intl/ru/index.jd docs/html-intl/intl/ru/preview/download.jd docs/html-intl/intl/ru/preview/index.jd docs/html-intl/intl/zh-cn/index.jd docs/html-intl/intl/zh-cn/preview/download.jd docs/html-intl/intl/zh-cn/preview/index.jd docs/html-intl/intl/zh-tw/index.jd docs/html-intl/intl/zh-tw/preview/download.jd docs/html-intl/intl/zh-tw/preview/index.jd docs/html/guide/topics/manifest/compatible-screens-element.jd docs/html/guide/topics/manifest/uses-feature-element.jd docs/html/preview/download.jd docs/html/preview/features/runtime-permissions.jd docs/html/sdk/index.jd docs/html/tools/revisions/studio.jd docs/html/tools/sdk/eclipse-adt.jd docs/html/tools/support-library/features.jd telephony/java/android/telephony/TelephonyManager.java Bug: 28000173 Change-Id: Iacab0481175f1b32e0ac3bab98cde9e994100e94
Diffstat (limited to 'docs/html-intl/intl/zh-cn/preview')
-rw-r--r--docs/html-intl/intl/zh-cn/preview/api-overview.jd521
-rw-r--r--docs/html-intl/intl/zh-cn/preview/backup/index.jd327
-rw-r--r--docs/html-intl/intl/zh-cn/preview/behavior-changes.jd402
-rw-r--r--docs/html-intl/intl/zh-cn/preview/download.jd360
-rw-r--r--docs/html-intl/intl/zh-cn/preview/features/app-linking.jd123
-rw-r--r--docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd794
-rw-r--r--docs/html-intl/intl/zh-cn/preview/index.jd70
-rw-r--r--docs/html-intl/intl/zh-cn/preview/license.jd143
-rw-r--r--docs/html-intl/intl/zh-cn/preview/overview.jd389
-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/testing/guide.jd187
-rw-r--r--docs/html-intl/intl/zh-cn/preview/testing/performance.jd656
13 files changed, 0 insertions, 4249 deletions
diff --git a/docs/html-intl/intl/zh-cn/preview/api-overview.jd b/docs/html-intl/intl/zh-cn/preview/api-overview.jd
deleted file mode 100644
index c64a38e403a0..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/api-overview.jd
+++ /dev/null
@@ -1,521 +0,0 @@
-page.title=API 概览
-page.keywords=预览版,sdk,兼容性
-page.tags=previewresources, androidm
-sdk.platform.apiLevel=22-mnc
-page.image=images/cards/card-api-overview_16-9_2x.png
-@jd:body
-
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<h2>本文内容
-<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
- <span class="more">显示详细信息</span>
- <span class="less" style="display:none">显示精简信息</span></a></h2>
-
-<ol id="toc44" class="hide-nested">
- <li><a href="#app-linking">应用链接</a></li>
- <li><a href="#backup">自动备份应用</a></li>
- <li><a href="#authentication">身份验证</a>
- <ol>
- <li><a href="#fingerprint-authentication">指纹身份验证</a></li>
- <li><a href="#confirm-credential">确认凭据</a></li>
- </ol>
- </li>
- <li><a href="#direct-share">直接共享</a></li>
- <li><a href="#voice-interactions">语音交互</a></li>
- <li><a href="#assist">助手 API</a></li>
- <li><a href="#notifications">通知</a></li>
- <li><a href="#bluetooth-stylus">蓝牙触控笔支持</a></li>
- <li><a href="#ble-scanning">改进的蓝牙低功耗扫描</a></li>
- <li><a href="#hotspot">Hotspot 2.0 第 1 版支持</a></li>
- <li><a href="#4K-display">4K 显示模式</a></li>
- <li><a href="#behavior-themeable-colorstatelists">主题化 ColorStateList</a></li>
- <li><a href="#audio">音频功能</a></li>
- <li><a href="#video">视频功能</a></li>
- <li><a href="#camera">相机功能</a>
- <ol>
- <li><a href="#flashlight">闪光灯 API</a></li>
- <li><a href="#reprocessing">相机再处理</a></li>
- </ol>
- </li>
- <li><a href="#afw">Android for Work 功能</a></li>
-</ol>
-
-<h2>API 差异</h2>
-<ol>
-<li><a href="{@docRoot}preview/download.html">API 级别 22 至 M 预览版&raquo;</a> </li>
-</ol>
-
-</div>
-</div>
-
-<p>M 开发者预览版可让您预览即将推出的 Android 平台版本为用户和应用开发者提供的新功能。
-
-本文旨在介绍其中最值得关注的 API。</p>
-
-<p>M 开发者预览版的适用对象是<strong>喜欢尝鲜的开发者</strong>和<strong>测试人员</strong>。
-如果您有兴趣影响 Android 框架的发展方向,<a href="{@docRoot}preview/setup-sdk.html">欢迎试用 M 开发者预览版</a>并向我们提供反馈!
-
-
-</p>
-
-<p class="caution"><strong>注意</strong>:请不要在 Google Play 商店中发布基于 M 开发者预览版的应用。
-</p>
-
-<p class="note"><strong>注:</strong>本文经常提及的一些类和方法在 <a href="{@docRoot}">developer.android.com</a> 上尚未提供相关参考资料。
-这些 API 元素在本文中设置为 {@code code style} 格式(不带超链接)。
-如需查看这些元素的初步 API 文档,请下载<a href="{@docRoot}preview/download.html#docs">预览版参考资料</a>。
-</p>
-
-<h3>重要的行为变更</h3>
-
-<p>如果您之前发布过 Android 应用,请注意您的应用可能受到平台变化的影响。
-</p>
-
-<p>如需了解完整信息,请参阅<a href="behavior-changes.html">行为变更</a>。</p>
-
-<h2 id="app-linking">应用链接</h2>
-<p>此预览版通过提供功能更强大的应用链接,增强了 Android 的意向系统。您可以利用此功能将应用与您拥有的某个 Web 域关联。
-平台可以根据此关联确定在处理特定 Web 链接时默认使用的应用,跳过提示用户选择应用的步骤。如需了解如何实现此功能,请参阅<a href="{@docRoot}preview/features/app-linking.html">应用链接</a>。
-
-
-
-
-<h2 id="backup">自动备份应用</h2>
-<p>现在,系统可以自动为应用执行完整数据备份和恢复。对于以 M 预览版为目标平台的应用,系统会默认启用此行为,您无需额外添加任何代码。
-如果用户删除其 Google 帐户,其备份数据也会被删除。
-如需了解该功能的工作方式以及配置文件系统备份内容的方法,请参阅<a href="{@docRoot}preview/backup/index.html">自动备份应用</a>。
-
-</p>
-
-<h2 id="authentication">身份验证</h2>
-<p>本预览版提供一些新的 API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,还可检查系统最后一次使用设备解锁机制(如锁屏密码)对用户进行身份验证是发生在多久之前。
-
-这些 API 可与 <a href="{@docRoot}training/articles/keystore.html">Android 密钥库系统</a>结合使用。
-</p>
-
-<h3 id="fingerprint-authentication">指纹身份验证</h3>
-
-<p>如需通过指纹扫描验证用户身份,请获取新增
-{@code android.hardware.fingerprint.FingerprintManager} 类的实例,并调用
-{@code FingerprintManager.authenticate()} 方法。您的应用必须运行在带有指纹传感器的兼容设备上。
-您必须在应用中实现指纹身份验证流的用户界面,并在 UI 中使用标准 Android 指纹图标。<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">示例应用</a>中包含有 Android 指纹图标 ({@code c_fp_40px.png})。请注意,如果您要开发多个使用指纹身份验证的应用,每个应用必须独立验证用户的指纹。
-
-
-
-
-</p>
-
-<p>如需在您的应用中使用此功能,请先在清单文件中添加 {@code USE_FINGERPRINT} 权限。
-</p>
-
-<pre>
-&lt;uses-permission
- android:name="android.permission.USE_FINGERPRINT" /&gt;
-</pre>
-
-<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
-
-<p>如需查看指纹身份验证的应用实现,请参阅<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">指纹对话框示例</a>。
-
-</p>
-
-<p>如果您要测试此功能,请执行以下步骤:</p>
-<ol>
-<li>如果您尚未安装 Android SDK 工具 24.3 修订版,请执行此操作。</li>
-<li>转到<strong>设置 &gt; 安全 &gt; 指纹</strong>,然后按照登记说明在模拟器中登记新指纹。
-</li>
-<li>使用模拟器通过以下命令模拟指纹触摸事件。
-使用同一命令模拟锁屏上或应用中的指纹触摸事件。
-
-<pre class="no-prettyprint">
-adb -e emu finger touch &lt;finger_id&gt;
-</pre>
-<p>在 Windows 上,您可能需要运行带有
-{@code finger touch &lt;finger_id&gt;} 参数的 {@code telnet 127.0.0.1 &lt;emulator-id&gt;} 命令。
-</p>
-</li>
-</ol>
-
-<h3 id="confirm-credential">确认凭据</h3>
-<p>您的应用可以根据用户在多久之前最后一次解锁设备来验证其身份。此功能让用户不必费心记忆应用特定密码,您也无需实现自己的身份验证用户界面。
-
-您的应用应当利用此功能并结合实现公钥或私钥,以进行用户身份验证。
-</p>
-
-<p>如需设置成功验证用户身份后可再次使用同一密钥的超时持续时间,请在设置 {@link javax.crypto.KeyGenerator} 或
-{@link java.security.KeyPairGenerator} 时调用新增的
-{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
- 方法。
-此功能目前适用于对称加密操作。
-</p>
-
-<p>避免过多显示重新验证对话框 -- 您的应用应尝试先使用加密对象,如果超时到期,请使用
-{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()} 方法在您的应用内重新验证用户身份。
-
-
-</p>
-
-<p>如需查看此功能的应用实现,请参阅<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">确认凭据示例</a>。
-
-</p>
-
-<h2 id="direct-share">直接共享</h2>
-
-<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
-
-<p>本预览版为您提供的 API 可让用户直观、快捷地进行共享。现在,您可以定义可在您的应用内启动特定活动的<em>直接共享目标</em>。这些直接共享目标通过“共享”<em></em>菜单公开给用户。
-
-此功能让用户可以向其他应用内的目标(如联系人)共享内容。
-例如,直接共享目标可以启动另一社交网络应用中的某个活动,让用户可以直接向该应用中的某位朋友或某个社区共享内容。
-
-</p>
-
-<p>如需启用直接共享目标,您必须定义一个类,用于扩展
-{@code android.service.} <br>
-{@code chooser.ChooserTargetService} 类。在清单文件中声明您的
-{@code ChooserTargetService}。在该声明内,指定
-{@code BIND_CHOOSER_TARGET_SERVICE} 权限和一个带有
-{@code SERVICE_INTERFACE} 操作的意向过滤器。</p>
-<p>以下示例展示了如何在清单文件中声明 {@code ChooserTargetService}。
-</p>
-<pre>
-&lt;service android:name=".ChooserTargetService"
- android:label="&#64;string/service_name"
- android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"&gt;
- &lt;intent-filter&gt;
- &lt;action android:name="android.service.chooser.ChooserTargetService" /&gt;
- &lt;/intent-filter&gt;
-&lt;/service&gt;
-</pre>
-
-<p>对于您想要向 {@code ChooserTargetService} 公开的每个活动,请在您的应用清单文件中为其添加一个名为
-{@code "android.service.chooser.chooser_target_service"} 的
-{@code &lt;meta-data&gt;} 元素。
-</p>
-
-<pre>
-&lt;activity android:name=".MyShareActivity”
- android:label="&#64;string/share_activity_label"&gt;
- &lt;intent-filter>
- &lt;action android:name="android.intent.action.SEND" /&gt;
- &lt;/intent-filter>
-&lt;meta-data
- android:name="android.service.chooser.chooser_target_service"
- android:value=".ChooserTargetService" /&gt;
-&lt;/activity>
-</pre>
-
-<h2 id="voice-interactions">语音交互</h2>
-<p>
-本预览版提供了一个新的语音交互 API,与
-<a href="https://developers.google.com/voice-actions/" class="external-link">语音操作</a>一起使用时,可让您为应用内建对话式语音体验。
-调用
-{@code android.app.Activity.isVoiceInteraction()} 方法可确定您的活动是否为响应语音操作而启动。
-如果是这样,则您的应用可以使用
-{@code android.app.VoiceInteractor} 类请求用户进行语音确认、从选项列表中进行选择以及执行其他操作。
-如需了解有关实现语音操作的更多信息,请参阅
-<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">语音操作开发者网站</a>。
-</p>
-
-<h2 id="assist">助手 API</h2>
-<p>
-本预览版提供了一种让用户通过助手程序与应用进行互动的新方式。如需使用此功能,用户必须启用助手以使用当前上下文。
-启用后,用户可通过长按<strong>主页</strong>按钮在任何应用内召唤助手。
-</p>
-<p>您的应用可通过设置
-{@link android.view.WindowManager.LayoutParams#FLAG_SECURE} 标志选择不与助手共享当前上下文。除了平台传递给助手的一组标准信息外,您的应用还可利用新增的 {@code android.app.Activity.AssistContent} 类共享其他信息。
-
-</p>
-
-<p>如需为助手提供您的应用内的其他上下文,请执行以下步骤:</p>
-
-<ol>
-<li>实现 {@link android.app.Application.OnProvideAssistDataListener} 接口。</li>
-<li>利用
-{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()} 注册此侦听器。</li>
-<li>如需提供特定于活动的上下文信息,请替代
-{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()}
- 回调和新增的 {@code Activity.onProvideAssistContent()} 回调(可选操作)。
-</ol>
-
-<h2 id="notifications">通知</h2>
-<p>本预览版针对通知功能引入了下列 API 变更:</p>
-<ul>
- <li>新增了 {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} 过滤级别,它对应于新增的“仅闹铃”<em></em>免打扰模式。
-</li>
- <li>新增了 {@code Notification.CATEGORY_REMINDER} 类别值,用于区分用户安排的提醒与其他事件 ({@link android.app.Notification#CATEGORY_EVENT}) 和闹铃 ({@link android.app.Notification#CATEGORY_ALARM})。
-
-
-</li>
- <li>新增了 {@code android.graphics.drawable.Icon} 类,可通过 {@code Notification.Builder.setSmallIcon(Icon)} 方法和
-{@code Notification.Builder.setLargeIcon(Icon)} 方法附加到通知上。
-</li>
- <li>新增了 {@code NotificationManager.getActiveNotifications()} 方法,让您的应用能够了解哪些通知目前处于活动状态。
-如需查看使用此功能的应用实现,请参阅<a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">活动通知示例</a>。
-</li>
-</ul>
-
-<h2 id="bluetooth-stylus">蓝牙触控笔支持</h2>
-<p>本预览版改善了对用户使用蓝牙触控笔进行输入的支持。用户可将兼容的蓝牙触控笔与其手机或平板电脑配对并建立连接。
-连接后,来自触摸屏的位置信息将与来自触控笔的压力和按键信息融合,从而实现比单纯使用触摸屏更丰富的表达。
-
-您的应用可以通过在活动中注册新增的
-{@code View.onStylusButtonPressListener} 回调和 {@code GestureDetector.OnStylusButtonPressListener}
- 回调侦听触控笔按键动作并执行辅助操作。
-</p>
-
-<p>可使用 {@link android.view.MotionEvent} 方法和常量来检测触控笔按键交互:
-</p>
-<ul>
-<li>如果用户使用带按键的触控笔触按应用屏幕,
-{@link android.view.MotionEvent#getToolType(int) getTooltype()} 方法会返回
-{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}。</li>
-<li>对于以 M 预览版为目标平台的应用,当用户按触控笔的主按键时,
-{@link android.view.MotionEvent#getButtonState() getButtonState()}
- 方法会返回 {@code MotionEvent.STYLUS_BUTTON_PRIMARY}。
-如果触控笔有辅助按键,当用户按下它时,同一方法会返回
-{@code MotionEvent.STYLUS_BUTTON_SECONDARY}。如果用户同时按下两个按键,该方法会同时返回通过 OR 运算符连接起来的两个值 ({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY})。
-
-</li>
-<li>
-对于以较低平台版本为目标的应用,
-{@link android.view.MotionEvent#getButtonState() getButtonState()} 方法返回
-{@link android.view.MotionEvent#BUTTON_SECONDARY}(按下触控笔主按键时)、
-{@link android.view.MotionEvent#BUTTON_TERTIARY}(按下触控笔辅助按键时)之一或同时返回这两者。
-</li>
-</ul>
-
-<h2 id="ble-scanning">改进的蓝牙低功耗扫描</h2>
-<p>
-如果您的应用执行蓝牙低功耗扫描,可以使用新增的
-{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} 方法指定您只希望在下列条件下通知回调:首次找到与设置的
-{@link android.bluetooth.le.ScanFilter} 匹配的播发数据包并且该数据包已有一段时间没有出现。
-
-这种扫描方法与旧平台版本中提供的方法相比更加节能。
-
-</p>
-
-<h2 id="hotspot">Hotspot 2.0 第 1 版支持</h2>
-<p>
-本预览版在 Nexus 6 和 Nexus 9 设备上添加了对 Hotspot 2.0 第 1 版规范的支持。如需在您的应用中设置 Hotspot 2.0 凭据,请使用新增的
-{@link android.net.wifi.WifiEnterpriseConfig} 类方法,如 {@code setPlmn()} 方法和
-{@code setRealm()} 方法。
-在 {@link android.net.wifi.WifiConfiguration} 对象中,您可以设置
-{@link android.net.wifi.WifiConfiguration#FQDN} 字段和 {@code providerFriendlyName} 字段。
-新增的 {@code ScanResult.PasspointNetwork} 属性可指示检测到的网络是否为 Hotspot 2.0 接入点。
-
-</p>
-
-<h2 id="4K-display">4K 显示模式</h2>
-<p>现在,平台允许应用在兼容硬件上请求将显示分辨率升级到 4K 渲染。
-如需查询当前物理分辨率,请使用新增的
-{@code android.view.Display.Mode} API。请注意,如果 UI 是以较低逻辑分辨率绘制并通过放大达到更高的物理分辨率,则
-{@code Display.Mode.getPhysicalWidth()} 方法返回的物理分辨率可能不同于 {@link android.view.Display#getSize(android.graphics.Point) getSize()} 所报告的逻辑分辨率。
-
-</p>
-
-<p>您可以通过设置应用窗口的 {@code WindowManager.LayoutParams.preferredDisplayModeId} 属性请求系统更改应用运行时的物理分辨率。
-如果您想切换到 4K 显示分辨率,此功能会很有帮助。
-在 4K 显示模式下,UI 仍然以原始分辨率(如 1080p)渲染,通过放大达到 4K,但
-{@link android.view.SurfaceView} 对象可能会以原生分辨率显示内容。
-</p>
-
-<h2 id="behavior-themeable-colorstatelists">主题化 ColorStateList</h2>
-<p>对于运行 M 预览版的设备,现在支持在
-{@link android.content.res.ColorStateList} 中使用主题属性。
-{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} 方法和
-{@link android.content.res.Resources#getColor(int) getColor()} 方法已弃用。如果您要调用这些 API,请改为调用新增的 {@code Context.getColorStateList()} 方法或
-{@code Context.getColor()} 方法。
-还可在 v4 appcompat 库中通过 {@link android.support.v4.content.ContextCompat} 使用这些方法。
-</p>
-
-<h2 id="audio">音频功能</h2>
-
-<p>本预览版增强了 Android 上的音频处理功能,包括: </p>
-<ul>
- <li>通过新增的 {@code android.media.midi} API 提供了对 <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
- 协议的支持。使用这些 API 可发送和接收 MIDI 事件。
-</li>
- <li>新增了 {@code android.media.AudioRecord.Builder} 类和 {@code android.media.AudioTrack.Builder}
- 类,分别用于创建数字音频采集和回放对象,还可用于配置音频源和接收器属性来替代系统默认值。
-</li>
- <li>用于关联音频和输入设备的 API 钩子。如果您的应用允许用户通过与 Android TV 相连的游戏控制器或遥控器启动语音搜索,此功能尤为有用。系统会在用户启动搜索时调用新增的 {@code android.app.Activity.onSearchRequested()} 回调。
-
-
-如需确定用户的输入设备是否内置麦克风,请从该回调检索 {@link android.view.InputDevice} 对象,然后调用新增的
-{@code InputDevice.hasMic()} 方法。
-</li>
- <li>新增了 {@code android.media.AudioDevicesManager} 类,让您可以检索连接的所有源设备和接收器音频设备列表。
-如果您想让应用在音频设备连接或断开时收到通知,还可以指定一个
-{@code android.media.OnAudioDeviceConnectionListener} 对象。
-</li>
-</ul>
-
-<h2 id="video">视频功能</h2>
-<p>本预览版为视频处理 API 添加了新功能,包括:</p>
-<ul>
-<li>新增了 {@code android.media.MediaSync} 类,可帮助应用同步渲染音频流和视频流。
-音频缓冲区以非锁定方式提交,并通过回调返回。
-此外,它还支持动态回放速率。
-</li>
-<li>新增了 {@code MediaDrm.EVENT_SESSION_RECLAIMED} 事件,它表示应用打开的会话已被资源管理器收回。
-如果您的应用使用 DRM 会话,则应处理此事件,并确保不使用收回的会话。
-
-</li>
-<li>新增了 {@code MediaCodec.CodecException.ERROR_RECLAIMED} 错误代码,它表示资源管理器收回了编解码器使用的媒体资源。
-出现此异常时,必须释放编解码器,因为它已转入终止状态。
-
-</li>
-<li>新增了 {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} 接口,用于获取有关支持的编解码器实例最大并发数量的提示。
-
-</li>
-<li>新增了 {@code MediaPlayer.setPlaybackParams()} 方法,用于设置快动作回放或慢动作回放的媒体回放速率。
-此外,它还会随视频一起自动拉长或加速音频回放。
-</li>
-</ul>
-
-<h2 id="camera">相机功能</h2>
-<p>本预览版提供了下列用于访问相机闪光灯和相机图像再处理的新 API:
-</p>
-
-<h3 id="flashlight">闪光灯 API</h3>
-<p>如果相机设备带有闪光灯,您可以通过调用 {@code CameraManager.setTorchMode()}
- 方法,在不打开相机设备的情况下打开或关闭闪光灯的火炬模式。应用对闪光灯或相机设备不享有独占所有权。
-每当相机设备不可用,或者开启火炬的其他相机资源不可用时,火炬模式即会被关闭并变为不可用状态。
-
-其他应用也可调用 {@code setTorchMode()} 来关闭火炬模式。
-当最后一个开启火炬模式的应用关闭时,火炬模式就会被关闭。
-</p>
-
-<p>您可以注册一个回调,通过调用
-{@code CameraManager.registerTorchCallback()} 方法接收有关火炬模式状态的通知。第一次注册回调时,系统会立即调用它,并返回所有当前已知配备闪光灯的相机设备的火炬模式状态。
-
-如果成功开启或关闭火炬模式,系统会调用
-{@code CameraManager.TorchCallback.onTorchModeChanged()} 方法。</p>
-
-<h3 id="reprocessing">再处理 API</h3>
-<p>{@link android.hardware.camera2 Camera2} API 进行了扩展,以支持 YUV 和专用不透明格式图像再处理。
-您的应用通过 {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES} 确定再处理功能是否可用。
-如果设备支持再处理,您可以通过调用
-{@code CameraDevice.createReprocessableCaptureSession()} 创建一个可再处理的相机捕获会话并创建输入缓冲区再处理请求。
-
-</p>
-
-<p>使用 {@code ImageWriter} 类可将输入缓冲区流与相机再处理输入相连。
-如需获得空白缓冲区,请遵循以下编程模型:</p>
-
-<ol>
-<li>调用 {@code ImageWriter.dequeueInputImage()} 方法。</li>
-<li>在输入缓冲区中填充数据。</li>
-<li>通过调用 {@code ImageWriter.queueInputImage()} 方法将缓冲区发送至相机。</li>
-</ol>
-
-<p>如果您将 {@code ImageWriter} 对象与
-{@code android.graphics.ImageFormat.PRIVATE} 图像一起使用,您的应用并不能直接访问图像数据。
-请改为调用 {@code ImageWriter.queueInputImage()} 方法,将 {@code ImageFormat.PRIVATE} 图像直接传递给
-{@code ImageWriter},而无需进行任何缓冲区复制。
-</p>
-
-<p>{@code ImageReader} 类现在支持 {@code android.graphics.ImageFormat.PRIVATE} 格式图像流。
-凭借此支持特性,您的应用可使
-{@code ImageReader} 输出图像保持为循环图像队列,还可选择一个或多个图像并将其发送给
-{@code ImageWriter} 进行相机再处理。</p>
-
-<h2 id="afw">Android for Work 功能</h2>
-<p>本预览版提供了下列用于 Android for Work 的新 API:</p>
-<ul>
- <li><strong>用于企业所有、单一用途设备的增强型控件</strong>:现在,设备所有者可以通过控制以下设置来改善企业所有、单一用途 (COSU) 设备的管理:
-
-
- <ul>
- <li>通过
-{@code DevicePolicyManager.setKeyguardEnabledState()} 方法禁用或重新启用键盘锁。</li>
- <li>通过
-{@code DevicePolicyManager.setStatusBarEnabledState()} 方法禁用或重新启用状态栏(包括快速设置、通知以及启动 Google Now 的向上划动手势)。
-</li>
- <li>通过 {@link android.os.UserManager} 常量
-{@code DISALLOW_SAFE_BOOT} 禁用或重新启用安全启动</li>
- <li>通过
-{@link android.provider.Settings.Global} 常量 {@code STAY_ON_WHILE_PLUGGED_IN} 防止屏幕在插入电源的情况下关闭。</li>
- </ul>
- </li>
- <li><strong>设备所有者静默式安装和卸载应用</strong>:现在,设备所有者可使用 {@link android.content.pm.PackageInstaller}
- API 在不依赖 Google Play for Work 的情况下静默式安装和卸载应用。
-现在,您可以通过设备所有者配置设备,从而无需用户干预即可获取并安装应用。
-此功能可用于在不激活 Google 帐户的情况下实现信息亭或其他此类设备的一键式配置。
-</li>
-<li><strong>静默式企业证书访问</strong>:现在,当应用调用
-{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()} 时,配置文件所有者或设备所有者可以在系统提示用户选择证书前调用 {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} 方法,静默式向发出请求的应用提供别名。
-
-
-此功能让您可以在无需用户干预的情况下授予托管应用访问证书的权限。
-</li>
-<li><strong>自动接受系统更新</strong>。现在,设备所有者可以通过
-{@code DevicePolicyManager.setSystemUpdatePolicy()} 设置一个系统更新政策来自动接受系统更新(例如对于信息亭设备),或者推迟更新并在至多 30 天的时间内防止用户获取更新。
-
-此外,管理员还可设置每日必须获取更新的时间窗口,例如在信息亭设备无人使用的时段。
-有可用的系统更新时,系统会检查工作政策控制器应用是否设置了系统更新政策,并相应地执行操作。
-
-
-</li>
-<li>
-<strong>授权证书安装</strong>:配置文件所有者或设备所有者现在可以授权第三方应用调用以下 {@link android.app.admin.DevicePolicyManager} 证书管理 API:
-
-
-<ul>
- <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
-getInstalledCaCerts()}</li>
- <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
-hasCaCertInstalled()}</li>
- <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
-installCaCert()}</li>
- <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
-uninstallCaCert()}</li>
- <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
-uninstallAllUserCaCerts()}</li>
- <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
-installKeyPair()}</li>
-</ul>
-</li>
-<li><strong>企业恢复出厂设置保护</strong>:现在,配置设备所有者时,您可以通过设置
-{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} 捆绑包配置参数来解锁恢复出厂设置保护 (FRP)。
-在重置设备以解锁 FRP 和配置设备之后,NFC 编程器应用可提供这些参数,而无需事先配置 Google 帐户。
-
-如果您不修改这些参数,FRP 仍然发挥作用,必须使用之前激活的 Google 凭据方可激活设备。
-
-
-<p>此外,通过对 Google Play 服务设置应用限制,设备所有者可以指定用于 FRP 解锁的备用 Google 帐户,以替代在设备上激活的 Google 帐户。
-</p>
-</li>
-<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
-<li><strong>数据使用情况跟踪</strong>。现在,配置文件所有者或设备所有者可以利用新增的
-{@code android.app.usage.NetworkStatsManager} 方法查询<strong>设置 &gt; 数据使用情况</strong>中显示的数据使用情况统计信息。
-配置文件所有者会被自动授予查询其管理的配置文件相关数据的权限,而设备所有者则被授予对其管理的主要用户使用情况数据的访问权。
-
-</li>
-<li><strong>运行时权限管理</strong>:
-<p>配置文件所有者或设备所有者可以利用
-{@code DevicePolicyManager.setPermissionPolicy()} 设置适用于所有应用全部运行时请求的权限政策,以提示用户照常授予权限,或自动以静默方式授予或拒绝权限。
-
-如果设置后一种政策,则用户将无法修改配置文件所有者或设备所有者在应用权限屏幕的<strong>设置</strong>内所做的选择。
-
-</p></li>
-<li><strong>“设置”中的 VPN</strong>:现在,<strong>设置 &gt; 更多 &gt; VPN</strong> 中会显示 VPN 应用。此外,现在,关于 VPN 使用情况的通知取决于该 VPN 的配置方式。
-
-
-对于配置文件所有者,通知取决于该 VPN 是针对托管配置文件、个人配置文件还是同时针对这两者进行配置。
-对于设备所有者,通知取决于 VPN 是否针对整个设备进行配置。
-</li>
-<li><strong>工作状态通知</strong>:现在,每当来自托管配置文件的应用具有前台活动时,状态栏就会出现一个公文包图标。
-此外,如果设备直接解锁到托管配置文件中某个应用的活动,则会显示一个 Toast,通知用户他们位于托管配置文件内。
-
-
-</li>
-</ul>
-
-<p class="note">
- 如需详细了解 M 开发者预览版中的所有 API 变更,请参阅 <a href="{@docRoot}preview/download.html">API 差异报告</a>。
-</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/backup/index.jd b/docs/html-intl/intl/zh-cn/preview/backup/index.jd
deleted file mode 100644
index 39786a3a270b..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/backup/index.jd
+++ /dev/null
@@ -1,327 +0,0 @@
-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/behavior-changes.jd b/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd
deleted file mode 100644
index 39494b9041f9..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd
+++ /dev/null
@@ -1,402 +0,0 @@
-page.title=行为变更
-page.keywords=预览版,sdk,兼容性
-sdk.platform.apiLevel=MNC
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<h2>本文内容</h2>
-
-<ol id="toc44" class="hide-nested">
- <li><a href="#behavior-runtime-permissions">运行时权限</a></li>
- <li><a href="#behavior-power">节能优化</a>
- <ol>
- <li><a href="#behavior-doze">打盹</a></li>
- <li><a href="#behavior-app-standby">应用待机</a></li>
- </ol>
- </li>
- <li><a href="#behavior-adoptable-storage">可采用的存储设备</a></li>
- <li><a href="#behavior-apache-http-client">取消支持 Apache HTTP 客户端</a></li>
- <li><a href="#behavior-audiomanager-Changes">音频管理器变更</a></li>
- <li><a href="#behavior-test-selection">文本选择</a></li>
- <li><a href="#behavior-keystore">Android 密钥库变更</a></li>
- <li><a href="#behavior-network">Wi-Fi 和网络连接变更</a></li>
- <li><a href="#behavior-camera">相机服务变更</a></li>
- <li><a href="#behavior-art-runtime">ART 运行时</a></li>
- <li><a href="#behavior-apk-validation">APK 验证</a></li>
- <li><a href="#behavior-afw">Android for Work 变更</a></li>
-</ol>
-
-<h2>API 差异</h2>
-<ol>
-<li><a href="{@docRoot}preview/download.html">API 级别 22 至 M 预览版&raquo;</a> </li>
-</ol>
-
-
-<h2>另请参阅</h2>
-<ol>
-<li><a href="{@docRoot}preview/api-overview.html">M 开发者预览版 API 概览</a> </li>
-</ol>
-
-</div>
-</div>
-
-<p>M 开发者预览版除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。
-本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。
-</p>
-
-<p>如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。
-</p>
-
-<h2 id="behavior-runtime-permissions">运行时权限</h1>
-<p>本预览版引入了一种新的权限模型,如今,用户可直接在运行时管理应用权限。
-这种模型让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
-
- </p>
-
-<p>对于面向 M 预览版开发的应用,请务必在运行时检查和请求权限。
-如需确定您的应用是否已被授予权限,请调用新增的 {@code Context.checkSelfPermission()} 方法。
-如需请求权限,请调用新增的
-{@code Activity.requestPermission()} 方法。即使您的应用不是针对 M 开发的,您也应该在新权限模型下测试您的应用。
-</p>
-
-<p>如需了解有关在您的应用中支持新权限模型的详细信息,请参阅开发者预览版的<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>页面。
-
-如需了解如何评估新模型对应用的影响,请参阅<a href="{@docRoot}preview/testing/guide.html#runtime-permissions">测试指南</a>。
-</p>
-
-<h2 id="behavior-power">节能优化</h2>
-<p>本预览版引入了针对空闲设备和应用的最新节能优化技术。</p>
-
-<h3 id="behavior-doze">打盹</h3>
-<p>如果设备未插入电源,并在屏幕关闭后的一段时间内保持不活动状态,则会进入<em>打盹</em>模式,在该模式下设备会尝试让系统保持休眠状态。
-在该模式下,设备会定期短时间恢复正常工作,以便进行应用同步,还可让系统执行任何挂起的操作。
-
-</p>
-
-<p>在打盹模式下,您的应用会受到以下限制:</p>
-<ul>
-<li>网络访问被禁用,除非您的应用获得高优先级 Google Cloud Messaging 操作消息 (tickle)。
-</li>
-<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">唤醒锁</a>会被忽略。</li>
-<li>通过 {@link android.app.AlarmManager} 类设置的闹铃会被禁用,但通过 {@link android.app.AlarmManager#setAlarmClock setAlarmClock()} 方法和 {@code AlarmManager.setAndAllowWhileIdle()} 方法设置的闹铃除外。
-
-</li>
-<li>不执行 WiFi 扫描</li>
-<li>不允许运行同步适配器和 {@link android.app.job.JobScheduler} 的同步和作业。
-</li>
-</ul>
-</p>
-<p>当设备退出打盹模式时,它会执行任何挂起的作业和同步。</p>
-<p>您可以通过将运行 M 预览版的设备与您的开发计算机相连,并调用以下命令来测试此功能:
-
-</p>
-<pre class="no-prettyprint">
-$ adb shell dumpsys battery unplug
-$ adb shell dumpsys deviceidle step
-$ adb shell dumpsys deviceidle -h
-</pre>
-<p class="note"><strong>注</strong>:即将推出的
-<a href="https://developers.google.com/cloud-messaging/" class="external-link">
- Google Cloud Messaging</a> 版本允许您指定高优先级消息。
-如果您的应用收到高优先级 GCM 消息,即使设备处于打盹模式,系统也会向其授予短时间的网络访问权限。
-
-</p>
-
-<p>如需了解在您的应用中测试打盹模式的技巧,请参阅
-<a href="{@docRoot}preview/testing/guide.html#doze-standby">测试指南</a>。
- </p>
-
-<h3 id="behavior-app-standby">应用待机</h3>
-<p>使用本预览版时,系统会在应用未被主动使用时确定其处于空闲状态。
-除非系统检测到以下信号之一,否则将在一段时间后将您的应用视为处于空闲状态:
-</p>
-
-<ul>
-<li>用户显式启动应用。</li>
-<li>应用当前有一个进程位于前台(表现为活动或前台服务形式,或被另一活动或前台服务占用)。
-</li>
-<li>应用生成用户可在锁屏或通知托盘中看到的通知。
-</li>
-<li>用户通过<strong>设置</strong>显式请求不对应用进行优化。
-</li>
-</ul>
-
-<p>如果设备未插入电源,系统会将被视为处于空闲状态的应用的网络访问禁用,并暂停其同步和作业。
-当设备插入电源时,系统将允许这些应用访问网络并执行任何挂起的作业和同步。
-如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲状态的应用访问网络。
-</p>
-
-<p>您可以通过将运行 M 预览版的设备与您的开发计算机相连,并调用以下命令来测试此功能:
-
-</p>
-<pre class="no-prettyprint">
-$ adb shell dumpsys battery unplug
-$ adb shell am set-idle &lt;packageName&gt; true
-$ adb shell am set-idle &lt;packageName&gt; false
-$ adb shell am get-idle &lt;packageName&gt;
-</pre>
-
-<p class="note"><strong>注</strong>:即将推出的
-<a href="https://developers.google.com/cloud-messaging/" class="external-link">
- Google Cloud Messaging</a> (GCM) 版本允许您指定高优先级消息。
-如果您的应用收到高优先级 GCM 消息,即使其处于空闲状态,也会被授予短时间的网络访问权限。
-
-</p>
-
-<p>如需了解在您的应用中测试应用待机的技巧,请参阅
-<a href="{@docRoot}preview/testing/guide.html#doze-standby">测试指南</a>。
- </p>
-
-<h2 id="behavior-adoptable-storage">可采用的存储设备</h2>
-<p>
-使用本预览版时,用户可以<em>采用</em> SD 卡等外部存储设备。采用外部存储设备可加密和格式化设备,使其具有类似内部存储设备的行为。
-用户可以利用此特性在存储设备之间移动应用及其私有数据。
-移动应用时,系统会遵守清单文件中的
-<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a>
- 首选项。
-</p>
-
-<p>请注意,在内部存储设备与外部存储设备之间移动应用时,如果您的应用访问以下 API 或字段,它们返回的文件路径将会动态变化。郑重建议:在生成文件路径时,请始终动态调用这些 API。请勿使用硬编码文件路径或之前生成的永久性完全限定文件路径。
-
-
-</p>
-
-<ul>
-<li>{@link android.content.Context} 方法:
- <ul>
- <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
- <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
- <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
- <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
- <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
- <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
- <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
- <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
- <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
- </ul>
-</li>
-<li>{@link android.content.pm.ApplicationInfo} 字段:
- <ul>
- <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
- <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
- <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
- <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
- <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
- <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
- </ul>
-</li>
-</ul>
-
-<p>如需在开发者预览版中调试此功能,您可以将一个 USB 驱动器通过一根 USB On-The-Go (OTG) 电缆连接到 Android 设备并运行以下命令启用对该 USB 驱动器的采用:
-</p>
-
-<pre class="no-prettyprint">
-$ adb shell sm set-force-adoptable true
-</pre>
-
-<h2 id="behavior-apache-http-client">取消支持 Apache HTTP 客户端</h2>
-<p>本预览版取消了对 Apache HTTP 客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,请改用 {@link java.net.HttpURLConnection} 类。
-
-此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。
-如需继续使用 Apache HTTP API,您必须先在 {@code build.gradle} 文件中声明以下编译时依赖项:
-
-</p>
-<pre>
-android {
- useLibrary 'org.apache.http.legacy'
-}
-</pre>
-<p>Android 正在从使用 OpenSSL 库转向使用
-<a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a>
- 库。如果您要在应用中使用 Android NDK,请勿链接到并非 NDK API 组成部分的加密库,如 {@code libcrypto.so} 和 {@code libssl.so}。
-这些库并非公共 API,可能会在不同版本和设备上毫无征兆地发生变化或出现故障。此外,您还可能让自己暴露在安全漏洞的风险之下。
-
-请改为修改原生代码,以通过 JNI 调用 Java 加密 API,或静态链接到您选择的加密库。
-
-</p>
-
-<h2 id="behavior-audiomanager-Changes">音频管理器变更</h2>
-<p>不再支持通过 {@link android.media.AudioManager}
- 类直接设置音量或将特定音频流静音。{@link android.media.AudioManager#setStreamSolo(int,boolean)
-setStreamSolo()} 方法已弃用,您应该改为调用
-{@code AudioManager.requestAudioFocus()} 方法。类似地,
-{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} 方法也已弃用,请改为调用 {@code AudioManager.adjustStreamVolume()} 方法并传入方向值 {@code ADJUST_MUTE} 或 {@code ADJUST_UNMUTE}。
-
-</p>
-
-<h2 id="behavior-test-selection">文本选择</h2>
-
-<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
-
-<p>现在,当用户在您的应用中选择文本时,您可以在一个<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">浮动工具栏</a>中显示“剪切”<em></em>、“复制”<em></em>和“粘贴”<em></em>等文本选择操作。
-
-其在用户交互实现上与<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">为单个视图启用上下文操作模式</a>中所述的上下文操作栏类似。
-
-
-</p>
-
-<p>如需实现可用于文本选择的浮动工具栏,请在您的现有应用中做出以下更改:
-</p>
-<ol>
-<li>在 {@link android.view.View} 对象或 {@link android.app.Activity} 对象中,将
-{@link android.view.ActionMode} 调用从
-{@code startActionMode(Callback)} 更改为 {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}。</li>
-<li>改为使用 {@code ActionMode.Callback} 的现有实现扩展
-{@code ActionMode.Callback2}。</li>
-<li>替代 {@code Callback2.onGetContentRect()} 方法,用于提供 {@link android.graphics.Rect} 内容对象(如文本选择矩形)在视图中的坐标。
-</li>
-<li>如果矩形的定位不再有效,并且这是唯一需要声明为无效的元素,请调用 {@code ActionMode.invalidateContentRect()} 方法。
-</li>
-</ol>
-
-<p>请注意,如果您使用 <a href="{@docRoot}tools/support-library/index.html">
- Android Support Library</a> 22.2 修订版,浮动工具栏不向后兼容,默认情况下 appcompat 会获得对 {@link android.view.ActionMode} 对象的控制权。
-
-这会禁止显示浮动工具栏。如需在
-{@link android.support.v7.app.AppCompatActivity} 中启用
-{@link android.view.ActionMode} 支持,请调用
-{@code android.support.v7.app.AppCompatActivity.getDelegate()},然后对返回的
-{@link android.support.v7.app.AppCompatDelegate} 调用
-{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()},并将输入参数设置为 {@code false}。
-此调用会将 {@link android.view.ActionMode} 对象的控制权交还给框架。
-在运行 M 预览版的设备上,框架可以支持
-{@link android.support.v7.app.ActionBar} 模式或浮动工具栏模式;而在运行 M 预览版之前版本的设备上,框架仅支持 {@link android.support.v7.app.ActionBar} 模式。
-</p>
-
-<h2 id="behavior-keystore">Android 密钥库变更</h2>
-<p>使用本预览版时,
-<a href="{@docRoot}training/articles/keystore.html">Android 密钥库提供程序</a>不再支持 DSA,
-但仍支持 ECDSA。</p>
-
-<p>禁用或重置安全锁屏时(例如,由用户或设备管理员执行此类操作时),系统将不再删除需要闲时加密的密钥,
-但在上述事件期间会删除需要闲时加密的密钥。
-</p>
-
-<h2 id="behavior-network">Wi-Fi 和网络连接变更</h2>
-
-<p>本预览版对 Wi-Fi 和网络连接 API 引入了以下行为变更。</p>
-<ul>
-<li>现在,您的应用只能更改由您创建的 {@link android.net.wifi.WifiConfiguration} 对象的状态。
-系统不允许您修改或删除由用户或其他应用创建的
-{@link android.net.wifi.WifiConfiguration} 对象;
-</li>
-<li>
-在之前的版本中,如果应用利用带有
-{@code disableAllOthers=true} 设置的
-{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} 强制设备连接特定 Wi-Fi 网络,设备将会断开与蜂窝数据网络等其他网络的连接。
-在本预览版中,设备不再断开与上述其他网络的连接。如果您的应用的 {@code targetSdkVersion} 为 {@code “20”} 或更低,则会固定连接所选 Wi-Fi 网络。
-
-如果您的应用的 {@code targetSdkVersion} 为 {@code “21”} 或更高,请使用多网络 API(如
-{@link android.net.Network#openConnection(java.net.URL) openConnection()} 、
-{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} 和新增的
-{@code ConnectivityManager.bindProcessToNetwork()} 方法)来确保通过所选网络传送网络流量。
-
-</li>
-</ul>
-
-<h2 id="behavior-camera">相机服务变更</h2>
-<p>在本预览版中,相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。
-
-对服务行为的变更包括:</p>
-<ul>
-<li>根据客户端应用进程的“优先级”授予对相机子系统资源的访问权,包括打开和配置相机设备。
-带有对用户可见活动或前台活动的应用进程一般会被授予较高的优先级,从而使相机资源的获取和使用更加可靠;
-
-</li>
-<li>当高优先级的应用尝试使用相机时,系统可能会“驱逐”正在使用相机客户端的低优先级应用。
-在已弃用的 {@link android.hardware.Camera} API 中,这会导致系统为被驱逐的客户端调用
-{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()}。
-
-在 {@link android.hardware.camera2 Camera2} API 中,这会导致系统为被驱逐的客户端调用
-{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()};
-</li>
-<li>在配备相应相机硬件的设备上,不同的应用进程可同时独立打开和使用不同的相机设备。
-但现在,如果在多进程用例中同时访问相机会造成任何打开的相机设备的性能或能力严重下降,相机服务会检测到这种情况并禁止同时访问。
-
-即使并没有其他应用直接尝试访问同一相机设备,此变更也可能导致低优先级客户端被“驱逐”。
-
-
-</li>
-<li>
-更改当前用户会导致之前用户帐户拥有的应用内活动相机客户端被驱逐。
-对相机的访问仅限于访问当前设备用户拥有的用户个人资料。举例来说,这意味着,当用户切换到其他帐户后,“来宾”帐户实际上无法让使用相机子系统的进程保持运行状态。
-
-
-</li>
-</ul>
-
-<h2 id="behavior-art-runtime">ART 运行时</h2>
-<p>ART 运行时现在可正确实现
-{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法的访问规则。此变更修正了之前版本中 Dalvik 无法正确检查访问规则的问题。如果您的应用使用
-{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法,并且您想替代访问检查,请调用
-{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 方法(将输入参数设置为 {@code true})。
-
-
-
-如果您的应用使用
-<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 appcompat 库</a>或
-<a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 recyclerview 库</a>,则您必须更新应用以使用这些库的最新版本。
-否则,请务必更新从 XML 引用的任何自定义类,以便能够访问它们的类构造函数。
-</p>
-
-<p>本预览版更新了动态链接程序的行为。动态链接程序现在可以识别库的 {@code soname} 与其路径之间的差异(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">
-公开 bug 6670</a>),并且现在已实现了按 {@code soname} 搜索。
-
-
-之前包含错误的 {@code DT_NEEDED} 条目(通常是开发计算机文件系统上的绝对路径)却仍工作正常的应用,如今可能会出现加载失败。
-</p>
-
-<p>现已正确实现 {@code dlopen(3) RTLD_LOCAL} 标志。请注意,
-{@code RTLD_LOCAL} 是默认值,因此不显式使用
-{@code RTLD_LOCAL} 的 {@code dlopen(3)} 调用将受到影响(除非您的应用显式使用 {@code RTLD_GLOBAL})。使用
-{@code RTLD_LOCAL} 时,在随后通过调用
-{@code dlopen(3)} 加载的库中并不能使用这些符号(这与由 {@code DT_NEEDED} 条目引用的情况截然不同)。</p>
-</p>
-
-<h2 id="behavior-apk-validation">APK 验证</h2>
-<p>该平台现在执行的 APK 验证更为严格。如果在清单文件中声明的文件在 APK 中并不存在,该 APK 将被视为已损坏。
-移除任何内容后必须重新签署 APK。
-</p>
-
-<h2 id="behavior-afw">Android for Work 变更</h2>
-<p>本预览版包含下列针对 Android for Work 的行为变更:</p>
-<ul>
-<li><strong>个人上下文中的工作联系人。</strong>Google Dialer Call Log 现在会在用户查看通话记录时显示工作联系人。将 {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} 设置为 {@code true} 可在 Google Dialer Call Log 中隐藏托管配置文件联系人。
-
-
-仅当您将 {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} 设置为 {@code false} 时,才可以通过蓝牙将工作联系人随个人联系人一起显示给设备。
-
-默认情况下,它设置为 {@code true}。
-
-</li>
-<li><strong>WiFi 配置移除</strong>:现在,当删除某个托管配置文件时,将会移除由配置文件所有者添加的 WiFi 配置(例如,通过调用
-{@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
-addNetwork()} 方法添加的配置);
-</li>
-<li><strong>WiFi 配置锁定</strong>:用户无法再修改或删除任何由活动设备所有者创建的 WiFi 配置。
-用户仍可创建和修改其自己的 WiFi 配置,前提是尚未针对该用户设置 {@link android.os.UserManager} 常量
-{@link android.os.UserManager#DISALLOW_CONFIG_WIFI}。
-</li>
-<li><strong>通过添加 Google 帐户下载工作策略控制器</strong>向托管环境以外的设备添加需要通过工作策略控制器 (WPC) 管理的 Google 帐户时,帐户添加流程现在会提示用户安装相应的 WPC。在设备初始设置向导中通过<strong>设置 &gt; 帐户</strong>添加帐户时,也会出现此行为。
-
-
-
-</li>
-<li><strong>对特定 DevicePolicyManager API 行为的变更</strong>:调用 {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()} 方法只会影响调用该方法的用户的相机;从托管配置文件调用它不会影响主用户运行的相机应用。
-
-
-此外,
-{@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()} 方法现在除了可供设备所有者使用外,还可供配置文件所有者使用。
-配置文件所有者可设置以下键盘锁限制:
-
-<ul>
-<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} 和
-{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT},它们影响配置文件上级用户的键盘锁设置。
-</li>
-<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS},它只影响应用在托管配置文件中生成的通知。
-</li>
-</ul>
-</li>
-</ul>
diff --git a/docs/html-intl/intl/zh-cn/preview/download.jd b/docs/html-intl/intl/zh-cn/preview/download.jd
deleted file mode 100644
index c7ba9df279e7..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/download.jd
+++ /dev/null
@@ -1,360 +0,0 @@
-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">Android 6.0 SDK</a></li>
- <li><a href="#docs">开发者文档</a></li>
- <li><a href="#images">硬件系统映像</a></li>
- </ol>
- <h2>Legacy downloads</h2>
- <ol>
- <li><a href="{@docRoot}preview/download_mp1.html">Developer Preview 1</a></li>
- <li><a href="{@docRoot}preview/download_mp2.html">Developer Preview 2</a></li>
- </ol>
- </div>
-</div>
-
-
-<p>
- Android M 预览版 SDK 包括开发工具、Android 系统文件和库文件,旨在帮助您在下一版本的平台中测试您的应用以及该平台提供的新 API。
-本文旨在介绍如何获得“预览版”的可下载组件,以便测试您的应用。
-
-</p>
-
-
-<h2 id="sdk">Android 6.0 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">Description</th>
- <th scope="col">Download / Checksums</th>
- </tr>
- <tr id="docs-dl">
- <td>Android M Preview 3<br>Developer Docs</td>
- <td><a href="#top" onclick="onDownload(this)"
- >m-preview-3-developer-docs.zip</a><br>
- MD5: d99b14b0c06d31c8dfecb25072654ca3<br>
- SHA-1: 9cefeeda07676130da606a1796e1c00fffc667c1
- </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">Device</th>
- <th scope="col">Download / Checksums</th>
- </tr>
- <tr id="hammerhead">
- <td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
- <td><a href="#top" onclick="onDownload(this)"
- >hammerhead-MPA44I-preview-2ebbc049.tgz</a><br>
- MD5: 91a924fb0c9f8e716e3b4c9954fd0dbb<br>
- SHA-1: 2ebbc049b68c4da8baeee3e42bb94d7a965ba4a3
- </td>
- </tr>
- <tr id="shamu">
- <td>Nexus 6 <br>"shamu"</td>
- <td><a href="#top" onclick="onDownload(this)"
- >shamu-MPA44I-preview-62b9c486.tgz</a><br>
- MD5: ac6e58da86125073d9c395257fd42664<br>
- SHA-1: 62b9c486fd7a5020e228d53ca5acd5c1857e48ff
- </td>
- </tr>
- <tr id="volantis">
- <td>Nexus 9 <br>"volantis"</td>
- <td><a href="#top" onclick="onDownload(this)"
- >volantis-MPA44I-preview-5c30a6e2.tgz</a><br>
- MD5: 7f83768757913d3fea945a661020d185<br>
- SHA-1: 5c30a6e2acd11a81f4105b12d23ff654f534f699
- </td>
- </tr>
-
- <tr id="fugu">
- <td>Nexus Player <br>"fugu"</td>
- <td><a href="#top" onclick="onDownload(this)"
- >fugu-MPA44I-preview-2860040a.tgz</a><br>
- MD5: 438da8d37da9e341a69cfb16a4001ac5<br>
- SHA-1: 2860040a326582f1ff5f702bf9a1ef002717fc98
- </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
deleted file mode 100644
index 77a532f7cde1..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/features/app-linking.jd
+++ /dev/null
@@ -1,123 +0,0 @@
-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/features/runtime-permissions.jd b/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd
deleted file mode 100644
index 8e361fb6c9b1..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd
+++ /dev/null
@@ -1,794 +0,0 @@
-page.title=权限
-page.tags=previewresources, androidm
-page.keywords=permissions, runtime, preview
-page.image={@docRoot}preview/features/images/permissions_check.png
-@jd:body
-
-
-<div id="qv-wrapper">
- <div id="qv">
- <h2>内容快览</h2>
- <ul>
- <li>如果您的应用主要面向 M 预览版 SDK,则会在运行时(而非安装时)提示用户授予权限。
-</li>
- <li>用户可以随时从应用“设置”屏幕撤销权限。
-</li>
- <li>每次运行时,应用均需检查自身是否具备所需的权限。
-</li>
- </ul>
-
- <h2>本文内容</h2>
- <ol>
- <li><a href="#overview">概览</a></li>
- <li><a href="#coding">为运行时权限编码</a></li>
- <li><a href="#testing">测试运行时权限</a></li>
- <li><a href="#best-practices">最佳做法</a></li>
- </ol>
-
-<!--
- <h2>Related Samples</h2>
- <ol>
- <li></li>
- </ol>
--->
-
-<!--
- <h2>See also</h2>
- <ol>
- <li></li>
- </ol>
--->
- </div> <!-- qv -->
-</div> <!-- qv-wrapper -->
-
-
-<p>
- M 开发者预览版引入了一种新的应用权限模型,旨在简化用户安装和升级应用的过程。
-如果在 M 预览版上运行的应用支持新权限模型,则用户无需在安装或升级应用时授予任何权限。相反,应用会根据需要请求权限,且系统将向用户显示一个请求权限的对话框。
-
-
-
-
-</p>
-
-<p>
- 如果应用支持新权限模型,则仍可在运行旧版 Android 的设备上使用旧权限模型安装并运行此应用。
-
-
-</p>
-
-<h2 id="overview">
- 概览
-</h2>
-
-<p>
- 通过 M 开发者预览版,该平台引入了新的应用权限模型。
-以下概述了此新模型的主要组件:
-</p>
-
-<ul>
- <li>
- <strong>声明权限:</strong>应用使用清单文件声明其所需的所有权限,就像在早期的 Android 平台中一样。
-
- </li>
-
- <li>
- <strong>权限组:</strong>权限根据相应的功能分为若干
-<em>权限组</em>。例如,
-<code>CONTACTS</code> 权限组包含读取和写入用户联系人和个人资料信息的权限。
-
- </li>
-
- <li>
- <p><strong>安装时授予的有限权限:</strong>当用户安装或更新应用时,系统将授予应用所请求的属于 {@link
- android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} 的所有权限。
-
-
- 例如,闹铃和 Internet 权限属于 {@link
- android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL},因此系统将在安装应用时自动授予这些权限。
-
- </p>
-
- <p>此外,系统还可以授予应用签名和系统权限,如<a href="#system-apps">系统应用和签名权限</a>中所述。
-
-系统不会在安装应用时提示用户授予任何权限。<em></em>
-</p>
- </li>
-
- <li>
- <strong>用户在运行时授予权限:</strong>当应用请求权限时,系统将向用户显示一个对话框,然后调用应用的回调函数来通知它是否已授予权限。
-
-如果用户授予某项权限,则应用将获得应用清单文件中声明的、该权限功能区域中的所有权限。
-
-
- </li>
-
-</ul>
-
-<p>
- 对于需要权限的功能,此权限模型将改变应用的行为方式。
-以下概述了您调整此模型时所应遵循的开发实践:
-
-</p>
-
-<ul>
-
- <li>
- <strong>始终检查权限:</strong>当应用必须执行任何需要权限的操作时,应先检查它是否已具备该权限。
-
-如果没有,则请求授予该权限。
-
- </li>
-
- <li>
- <strong>妥善处理权限不足的情况:</strong>如果应用未被授予适当的权限,则应正常处理失败情况。
-
- 例如,如果只有新增的功能需要该权限,则应用可以禁用该功能。
-如果该权限对于应用正常运行至关重要,则应用可能会禁用其所有功能,并通知用户需要授予该权限。
-
-
- </li>
-
- <div class="figure" style="width:220px" id="fig-perms-screen">
- <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
- <p class="img-caption">
- <strong>图 1.</strong>应用“设置”中的“权限”屏幕。
- </p>
- </div>
-
- <li>
- <strong>权限可撤销:</strong>用户可以随时撤销应用的权限。
-即使用户禁用应用的权限,应用也不会收到通知。<em></em>
-再次强调:您的应用应在执行任何受限操作之前验证是否具备所需的权限。
-
- </li>
-</ul>
-
-<p class="note">
- <strong>注:</strong>如果应用主要面向 M 开发者预览版,则必须使用新权限模型。
-<em></em>
-</p>
-
-<p>
- 截至 M 开发者预览版发布,并非所有 Google 应用均已完全实现新权限模型。
-Google 会在 M 开发者预览版运行期间更新这些应用,以便严格遵守权限切换设置。
-
-
-</p>
-
-<p class="note">
- <strong>注:</strong>如果您的应用拥有自己的 API 接口,请先确保调用方具备访问该数据所需的必要权限,然后再代理权限。
-
-
-</p>
-
-<h3 id="system-apps">
- 系统应用和签名权限
-</h3>
-
-<p>
- 通常,当用户安装应用时,系统仅授予应用
- {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
- PROTECTION_NORMAL}。但在某些情况下,系统将授予应用更多权限:
-
-</p>
-
-<ul>
- <li>如果应用是系统映像的一部分,则系统会自动授予该应用清单文件中列出的所有权限。
-
- </li>
-
- <li>如果应用请求提供清单文件中属于 {@link
- android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} 的权限,且该应用已使用与声明这些权限的应用相同的证书进行签名,则系统将在安装请求权限的应用时向其授予这些权限。
-
-
-
- </li>
-</ul>
-
-<p>
- 在这两种情况下,用户仍可随时撤销权限,具体方法是:转到系统的<strong>设置</strong>屏幕,然后选择<strong>应用 &gt;</strong>
-
- <i>应用名称</i> <strong>&gt; 权限</strong>。应用应在运行时继续检查权限,并根据需要请求权限。
-
-
-</p>
-
-<h3 id="compatibility">
- 前后兼容性
-</h3>
-
-<p>
- 如果应用并非面向 M 开发者预览版,则即使是在 M 预览版设备上,该应用也会继续使用旧权限模型。
-当用户安装应用时,系统将要求用户授予应用清单文件中列出的所有权限。
-
-
-</p>
-
-<p class="note">
- <strong>注:</strong>在运行 M 开发者预览版的设备上,用户可以从应用的“设置”屏幕禁用任何应用(包括旧版应用)的权限。
-
-如果用户禁用某旧版应用的权限,则系统将以静默方式禁用相应的功能。
-当应用尝试执行需要该权限的操作时,该操作不一定会导致出现异常。
-
-相反,它可能会返回空数据集、报告错误或以其他方式表现出异常行为。
-例如,如果您未经许可查询日历,则该方法会返回空数据集。
-
-</p>
-
-<p>
- 如果您在未运行 M 预览版的设备上使用新权限模型安装应用,则系统将采用与其他任何应用相同的方式处理:系统会在安装应用时要求用户授予声明的所有权限。
-
-
-
-</p>
-
-<p class="note">
- <strong>注:</strong>对于预览版本,您必须将最低 SDK 版本设置为 M 预览版 SDK,才可使用预览版 SDK 进行编译。
-这意味着在开发者预览版运行期间,您无法在旧版平台上测试此类应用。
-
-
-</p>
-
-<h3 id="perms-vs-intents">权限与意向的比较</h3>
-
-<p>
- 许多情况下,您可以使用以下两种方式之一来让您的应用执行某项任务。
-您可以将应用设置为请求执行操作本身所需的权限。
-或者,您可以将应用设置为通过传送意向,让其他应用来执行任务。
-
-</p>
-
-<p>
- 例如,假设应用需要能够使用设备相机拍摄照片。
-应用可以请求
-<code>android.permission.CAMERA</code> 权限,以便允许其直接访问相机。
-然后,应用将使用 Camera API 控制相机并拍摄照片。
-利用此方法,您的应用能够完全控制摄影过程,并支持您将相机 UI 合并至应用中。
-
-
-</p>
-
-<p>
- 但是,如果您无需此类控制,则可仅使用 {@link
- android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} 意向来请求图像。
-启动该意向时,系统会提示用户选择相机应用(如果没有默认相机应用),然后该应用将拍摄照片。
-
-该相机应用会将照片返回给应用的 {@link
- android.app.Activity#onActivityResult onActivityResult()} 方法。
-</p>
-
-<p>
- 同样,如果您需要打电话、访问用户的联系人或要执行其他操作,则可通过创建适当的意向来完成,或者您可以请求相应的权限并直接访问相应的对象。
-
-每种方法各有优缺点。
-
-</p>
-
-<p>
- 如果使用权限:
-</p>
-
-<ul>
- <li>应用可在您执行操作时完全控制用户体验。
-但是,如此广泛的控制会增加任务的复杂性,因为您需要设计适当的 UI。
-
- </li>
-
- <li>当您首次执行操作时,系统会显示一次让用户授予权限的提示。
-之后,应用即可执行操作,不再需要用户进行其他交互。
-但是,如果用户不授予权限(或稍后撤销权限),则应用根本无法执行操作。
-
-
- </li>
-</ul>
-
-<p>
- 如果使用意向:
-</p>
-
-<ul>
- <li>您无需为操作设计 UI。处理意向的应用将提供 UI。不过这意味着您无法控制用户体验。
-
-用户可以与您从未见过的应用进行交互。
-
- </li>
-
- <li>如果用户没有适用于操作的默认应用,则系统会提示用户选择应用。如果用户未指定默认处理程序,则必须在每次执行此操作时额外处理一个对话框。
-
-
-
- </li>
-</ul>
-
-<h2 id="coding">为运行时权限编码</h2>
-
-<p>
- 如果应用主要面向新的 M 开发者预览版,则您必须使用新权限模型。
-这意味着除了通过清单文件声明所需的权限以外,您还必须检查应用运行时是否已有相应的权限,如果没有,则需要请求权限。
-
-
-
-</p>
-
-<h3 id="enabling">
- 启用新权限模型
-</h3>
-
-<p>
- 要启用新的 M 开发者预览版权限模型,请将应用的
-<code>targetSdkVersion</code> 属性设置为 <code>"MNC"</code>,并将
-<code>compileSdkVersion</code> 设置为 <code>"android-MNC"</code>。这样可启用所有新的权限功能。
-
-</p>
-
-<p>
- 对于预览版本,您必须将 <code>minSdkVersion</code> 设置为
-<code>"MNC"</code>,才能使用预览版 SDK 进行编译。
-</p>
-
-<h3 id="m-only-perm">
- 指定仅用于 M 预览版的权限
-</h3>
-
-<p>
- 您可以使用应用清单文件中的新 <code>&lt;uses-permission-sdk-m&gt;</code> 元素指明仅在 M 开发者预览版中需要某权限。
-如果您以这种方式声明权限,则每当在旧版设备上安装应用时,系统都不会提示用户或向应用授予权限。通过使用 <code>&lt;uses-permission-sdk-m&gt;</code>
- 元素,您可以将新权限添加到更新后的应用版本,而不必强制用户在安装更新时授予权限。
-
-
-
-
-
-</p>
-
-<p>
- 如果应用在已安装 M 开发者预览版的设备上运行,则
-<code>&lt;uses-permission-sdk-m&gt;</code> 的行为与
-<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></code> 相同。
- 系统不会在安装应用时提示用户授予任何权限,且应用将根据需要请求权限。
-
-</p>
-
-<h3 id="prompting">
- 提示授予权限
-</h3>
-
-<p>
- 如果应用使用新的 M 开发者预览版权限模型,则在运行 M 预览版的设备上首次启动应用时,系统不会要求用户授予所有权限。
-
-相反,应用将根据需要请求权限。
-当应用请求某权限时,系统会向用户显示一个对话框。
-
-</p>
-
-<p>
- 如果应用在已安装 SDK 22 或更低版本的设备上运行,则应用将使用旧权限模型。
-当用户安装应用时,系统将提示他们授予应用在清单文件中请求的所有权限,但那些带有 <code>&lt;uses-permission-sdk-m&gt;</code> 标记的权限除外。
-
-
-</p>
-
-<h4 id="check-platform">检查运行应用的平台</h4>
-
-<p>
- 只有运行 M 开发者预览版的设备支持此权限模型。
-在调用其中任何方法之前,应用均应通过检查 {@link android.os.Build.VERSION#CODENAME
- Build.VERSION.CODENAME} 的值来验证运行应用的平台。
-
-如果设备正在运行 M 开发者预览版,则
-{@link android.os.Build.VERSION#CODENAME CODENAME} 为 <code>"MNC"</code>。
-</p>
-
-<h4 id="check-for-permission">检查应用是否具备所需的权限</h4>
-
-<p>当用户尝试执行需要权限的操作时,应用将检查目前是否具备执行此操作所需的权限。
-为此,应用将调用
-<code>Context.checkSelfPermission(
-<i>permission_name</i>)</code>。即便知道用户已授予该权限,应用也应执行此检查,因为用户可以随时撤销应用的权限。
-
-
-例如,如果用户需要使用应用拍摄照片,则应用将调用
-<code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>。
-</p>
-
-<p class="table-caption" id="permission-groups">
- <strong>表 1.</strong>权限和权限组。</p>
-<table>
- <tr>
- <th scope="col">权限组</th>
- <th scope="col">权限</th>
- </tr>
-
- <tr>
- <td><code>android.permission-group.CALENDAR</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.READ_CALENDAR</code>
- </li>
- </ul>
- <ul>
- <li>
- <code>android.permission.WRITE_CALENDAR</code>
- </li>
- </ul>
- </td>
- </tr>
-
- <tr>
- <td><code>android.permission-group.CAMERA</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.CAMERA</code>
- </li>
- </ul>
- </td>
- </tr>
-
- <tr>
- <td><code>android.permission-group.CONTACTS</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.READ_CONTACTS</code>
- </li>
- <li>
- <code>android.permission.WRITE_CONTACTS</code>
- </li>
- <li>
- <code>android.permission.READ_PROFILE</code>
- </li>
- <li>
- <code>android.permission.WRITE_PROFILE</code>
- </li>
- </ul>
- </td>
- </tr>
-
- <tr>
- <td><code>android.permission-group.LOCATION</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.ACCESS_FINE_LOCATION</code>
- </li>
- <li>
- <code>android.permission.ACCESS_COARSE_LOCATION</code>
- </li>
- </ul>
- </td>
- </tr>
-
- <tr>
- <td><code>android.permission-group.MICROPHONE</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.RECORD_AUDIO</code>
- </li>
- </ul>
- </td>
- </tr>
-
- <tr>
- <td><code>android.permission-group.PHONE</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.READ_PHONE_STATE</code>
- </li>
- <li>
- <code>android.permission.CALL_PHONE</code>
- </li>
- <li>
- <code>android.permission.READ_CALL_LOG</code>
- </li>
- <li>
- <code>android.permission.WRITE_CALL_LOG</code>
- </li>
- <li>
- <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
- </li>
- <li>
- <code>android.permission.USE_SIP</code>
- </li>
- <li>
- <code>android.permission.PROCESS_OUTGOING_CALLS</code>
- </li>
- </ul>
- </td>
- </tr>
-
- <tr>
- <td><code>android.permission-group.SENSORS</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.BODY_SENSORS</code>
- </li>
- </ul>
- <ul>
- <li>
- <code>android.permission.USE_FINGERPRINT</code>
- </li>
- </ul>
- </td>
- </tr>
-
- <tr>
- <td><code>android.permission-group.SMS</code></td>
- <td>
- <ul>
- <li>
- <code>android.permission.SEND_SMS</code>
- </li>
- <li>
- <code>android.permission.RECEIVE_SMS</code>
- </li>
- <li>
- <code>android.permission.READ_SMS</code>
- </li>
- <li>
- <code>android.permission.RECEIVE_WAP_PUSH</code>
- </li>
- <li>
- <code>android.permission.RECEIVE_MMS</code>
- </li>
- <li>
- <code>android.permission.READ_CELL_BROADCASTS</code>
- </li>
- </ul>
- </td>
- </tr>
-
-</table>
-
-<h4 id="request-permissions">根据需要请求权限</h4>
-
-<p>如果应用尚无所需的权限,则应用将调用
-<code>Activity.requestPermissions(String[], int)</code> 方法,请求提供一项或多项适当的权限。
-应用将传递所需的一项或多项权限,以及整数“请求代码”。
-
- 此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同“请求代码”传递到 <code>requestPermissions()</code>。
-
-
-</p>
-
- <p>以下代码检查应用是否具备读取用户联系人所需的权限,并根据需要请求该权限:
-</p>
-
-<pre>
-if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
- != PackageManager.PERMISSION_GRANTED) {
- requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
- MY_PERMISSIONS_REQUEST_READ_CONTACTS);
-
- // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
- // app-defined int constant
-
- return;
-}
-</pre>
-
-<h4 id="handle-response">处理权限请求响应</h4>
-
-<p>
- 当应用请求权限时,系统将向用户显示一个对话框。
-当用户响应时,系统将调用应用的
-<code>Activity.onRequestPermissionsResult(int, String[], int[])</code>
-,向其传递用户响应。应用需要替代该方法。回调会将您传递的相同请求代码传递给
-<code>requestPermissions()</code>。
-例如,如果应用请求
-<code>READ_CONTACTS</code> 访问权限,则可能采用以下回调方法:
-
-</p>
-
-<pre>
-&#64;Override
-public void onRequestPermissionsResult(int requestCode,
- String permissions[], int[] grantResults) {
- switch (requestCode) {
- case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-
- // permission was granted, yay! do the
- // calendar task you need to do.
-
- } else {
-
- // permission denied, boo! Disable the
- // functionality that depends on this permission.
- }
- return;
- }
-
- // other 'switch' lines to check for other
- // permissions this app might request
- }
-}
-</pre>
-
- <p>如果用户授予权限,则系统会为应用授予应用清单文件为该功能区域列出的所有权限。
-如果用户拒绝请求,则您应采取适当的操作。
-例如,您可以禁用任何取决于此权限的菜单操作。
-
- </li>
-</p>
-
-<p>
- 当系统要求用户授予权限时,用户可以选择指示系统不再要求提供该权限。
-在这种情况下,当应用使用 <code>requestPermissions()</code> 请求该权限时,系统会立即拒绝此请求。
-
-在这种情况下,如果用户已再次明确拒绝您的请求,则系统会以同样的方式调用您的 <code>onRequestPermissionsResult()</code>。
-
-因此,您的应用不能假设用户采取了任何直接交互行为。
-
-</p>
-
-<h2 id="testing">测试运行时权限</h2>
-
-
-<p>
- 如果应用主要面向 M 开发者预览版,则您必须测试它是否正确处理权限。
-您不能假设应用在运行时具备任何特定的权限。
-应用首次启动时,它可能没有任何权限,且用户可以随时撤销或恢复权限。
-
-
-</p>
-
-<p>
- 您应测试应用,确保它在所有权限情况下均可正常运行。
-通过 M 预览版 SDK,我们提供了新的
-<a href="{@docRoot}tools/help/adb.html">Android
- Debug Bridge (adb)</a> 命令,支持您使用需要尝试的任何权限设置测试应用。
-
-</p>
-
-<h3>
- 新 adb 命令和选项
-</h3>
-
-<p>
- M 预览版 SDK 平台工具提供了多个新命令,支持您测试应用处理权限的方式。
-
-</p>
-
-<h4>
- 使用权限安装
-</h4>
-
-<p>
- 您可以使用 <a href="{@docRoot}tools/help/adb.html#move"><code>adb
- install</code></a> 命令的新 <code>-g</code> 选项,该选项将安装应用并授予其清单文件中列出的所有权限:
-
-</p>
-
-<pre class="no-pretty-print">
-$ adb install -g &lt;path_to_apk&gt;
-</pre>
-
-<h4>
- 授予和撤销权限
-</h4>
-
-<p>
- 您可以使用新的 ADB <a href="{@docRoot}tools/help/adb.html#pm">软件包管理器 (pm)</a> 命令向已安装的应用授予权限和撤销其权限。此功能对于自动化测试非常有用。
-
-
-</p>
-
-<p>
- 要授予权限,请使用软件包管理器的 <code>grant</code> 命令:
-</p>
-
-<pre class="no-pretty-print">
-$ adb pm grant &lt;package_name&gt; &lt;permission_name&gt;
-</pre>
-
-<p>
- 例如,要向录音​​授予 com.example.myapp 软件包权限,请使用以下命令:
-
-</p>
-
-<pre class="no-pretty-print">
-$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
-</pre>
-
-<p>
- 要撤销权限,请使用软件包管理器的 <code>revoke</code> 命令:
-</p>
-
-<pre class="no-pretty-print">
-$ adb pm revoke &lt;package_name&gt; &lt;permission_name&gt;
-</pre>
-
-<h2 id="best-practices">最佳做法</h2>
-
-<p>
- 新权限模型为用户带来更流畅的体验,让他们能够更轻松地安装应用,并得心应手地使用应用的各项功能。
-
-为了充分利用该新模型,我们建议采用下列最佳做法。
-
-</p>
-
-
-<h3 id="bp-what-you-need">仅请求自己所需的权限</h3>
-
-<p>
- 每次您请求权限时,实际上是在强迫用户作出决定。
- 如果用户拒绝请求,则会减少应用的功能。
- 您应尽量减少提出这些请求的次数。
-</p>
-
-<p>
- 例如,应用往往可以通过使用
-<a href="{@docRoot}guide/components/intents-filters.html">意向</a>(而不是请求权限)获得所需的功能。
-如果应用需要使用手机的相机拍摄照片,则可使用
- {@link
- android.provider.MediaStore#ACTION_IMAGE_CAPTURE
- MediaStore.ACTION_IMAGE_CAPTURE} 意向。当应用执行该意向时,系统会提示用户选择已安装的相机应用拍摄照片。
-
-
-</p>
-
-<h3 id="bp-dont-overwhelm">
- 不要让用户感到无所适从
-</h3>
-
-<p>
- 如果您让用户一次面对大量权限请求,用户可能会感到无所适从并因此退出应用。替代做法是,您应根据需要请求权限。
-
-
-</p>
-
-<p>
- 某些情况下,您的应用可能绝对需要一项或多项权限。在这种情况下,合理的做法是,在应用启动之后立即请求所有权限。
-
-例如,如果您运行摄影应用,则该应用需要访问设备的相机。
-当用户首次启动该应用时,不会对请求使用相机所需的权限感到惊讶。
-
-但是,如果同一应用还具备与用户联系人共享照片的功能,则您不应在首次启动时请求用户提供该权限,<em></em>
-
-而是等到用户尝试使用“共享”功能之后,再请求该权限。
-
-</p>
-
-<p>
- 如果应用提供了教程,则合理的做法是,在教程结束时请求提供应用的必要权限。
-
-</p>
-
-<h3 id="bp-explain">
- 解释需要权限的原因
-</h3>
-
-<p>
- 系统在您调用
-<code>requestPermissions()</code> 时显示的权限对话框将说明应用所需的权限,但不会解释为何需要这些权限。
-在某些情况下,用户可能会感到困惑。
- 最好在调用 <code>requestPermissions()</code> 之前向用户解释应用需要权限的原因。
-
-</p>
-
-<p>
- 例如,摄影应用可能需要使用位置服务,以便能够为照片添加地理标签。
-通常,用户可能不了解照片能够包含位置信息,并且对摄影应用想要了解具体位置感到不解。
-
-因此在这种情况下,应用最好在调用
-<code>requestPermissions()</code> 之前告知此功能的相关信息。<em></em>
-
-</p>
-
-<p>
- 其中一种办法是将这些请求纳入应用教程。这样,教程可以依次显示应用的每项功能,并在显示每项功能时解释需要哪些相应的权限。
-
-例如,摄影应用的教程可以演示其“与您的联系人共享照片”功能,然后告知用户需要为应用授予权限以便其查看用户的联系人。
-
-
-然后,应用可以调用 <code>requestPermissions()</code>,要求用户提供该访问权限。
-当然,并非所有用户都会按照教程操作,因此您仍需在应用的正常操作期间检查和请求权限。
-
-
-</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/index.jd b/docs/html-intl/intl/zh-cn/preview/index.jd
deleted file mode 100644
index caed4cb117a9..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/index.jd
+++ /dev/null
@@ -1,70 +0,0 @@
-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>
- <a class="dac-hero-cta" href="{@docRoot}preview/support.html">
- <span class="dac-sprite dac-auto-chevron"></span>
- Developer Preview 3 (final SDK)</a>
- </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
deleted file mode 100644
index 31363bec4e3b..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/license.jd
+++ /dev/null
@@ -1,143 +0,0 @@
-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/overview.jd b/docs/html-intl/intl/zh-cn/preview/overview.jd
deleted file mode 100644
index d931db0a678a..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/overview.jd
+++ /dev/null
@@ -1,389 +0,0 @@
-page.title=计划概览
-page.metaDescription=欢迎参加 Android M 开发者预览版计划。此计划将为您提供针对 Android 的下一版本测试和优化应用所需的所有功能。
-page.image=images/cards/card-preview_16-9_2x.png
-page.tags="preview", "developer", "android"
-
-@jd:body
-
-<div class="cols" style=
-"background-color:#ffebc3; padding: 5px 0;margin-bottom:1em; text-align:center;">
-<h3>
- Developer Preview 2 is now available
- </h3>
-
- <ul class="dac-section-links">
- <li class="dac-section-link">
- <a href="{@docRoot}preview/support.html#preview2-notes">
- <span class="dac-sprite dac-auto-chevron"></span>
- Read the Notes</a>
- </li>
-
- <li class="dac-section-link">
- <a href="{@docRoot}preview/support.html#preview2-get">
- <span class="dac-sprite dac-auto-chevron"></span>
- Get the Update</a>
- </li>
-
- <li class="dac-section-link">
- <a href="https://code.google.com/p/android-developer-preview/">
- <span class="dac-sprite dac-auto-chevron"></span>
- Report Issues</a>
- </li>
- </ul>
-</div>
-
-<p>
- 欢迎使用 <strong>Android M 开发者预览版</strong>计划。此计划将为您提供针对 Android 的下一版本测试和优化应用所需的所有功能。
-
-它是一款免费软件。您仅需下载 M 开发者预览版工具即可立即使用。
-
-</p>
-
-<div style="background-color:#eceff1;padding:1em;">
-<div class="wrap">
- <div class="cols">
- <div class="col-4of12">
- <h5>
- 硬件和模拟器系统映像
- </h5>
-
- <p>
- 在 Nexus 5、6、9 和 Player(适用于电视)以及模拟器中运行并测试应用。
-
- </p>
- </div>
-
- <div class="col-4of12">
- <h5>
- 最新的平台代码
- </h5>
-
- <p>
- 我们将在预览版期间提供多次更新,因此您将可以针对最新的平台变更测试您的应用。
-
- </p>
- </div>
-
- <div class="col-4of12">
- <h5>
- 通过 OTA(空中下载技术)更新
- </h5>
-
- <p>
- 在向设备刷入初始预览版后,即可通过 OTA 技术获取更新。
-
- </p>
- </div>
- </div>
-
- <div class="cols">
-
-
- <div class="col-4of12">
- <h5>
- 新行为和新功能
- </h5>
-
- <p>
- 尽早做好支持新平台行为(例如新运行时权限模型和省电功能)的准备工作。
-
- </p>
- </div>
-
- <div class="col-4of12">
- <h5>
- 为处理开发者反馈问题而设的优先窗口
- </h5>
-
- <p>
- 在最初的几周里,我们将优先处理开发者报告的问题,以便尽快测试并提供反馈。
-
- </p>
- </div>
-
- <div class="col-4of12">
- <h5>
- 反馈和支持
- </h5>
-
- <p>
- 使用<a href="https://code.google.com/p/android-developer-preview/">问题跟踪器</a>向我们报告问题并提供反馈。
- 与 <a href="http://g.co/dev/AndroidMDevPreview">M&nbsp;开发者社区</a>中的其他开发者建立联系。
-
- </p>
- </div>
- </div>
-</div>
-</div>
-
-<!--
-<p>
- With the M Developer Preview, you'll get an early start on testing your apps,
- with enough time to make adjustments before the public platform release later
- in the year. We'll provide several updates to the Preview tools in the weeks
- ahead, so you can keep in sync with the latest changes as the platform moves
- toward launch.
-</p>
-<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
-"Preview program timeline" id="timeline">
-<p>
- You can help us improve the platform by <a href=
- "https://code.google.com/p/android-developer-preview/">reporting issues</a>
- through our feedback channels. This is especially
- critical in the first month of the preview, when we’ll be giving priority to
- developer-reported issues and feedback.
-</p> -->
-
-
-<h2 id="timeline">
- 时间表和更新
-</h2>
-<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
-<p>
- M 开发者预览版从 5 月 28 日开始一直运行到最终 Android M SDK 发布为止。最终的 Android M SDK 将于 2015 年第三季度公众版发布之前不久发布。
-
-
-</p>
-
-<p>
- 在开发阶段的各个里程碑,我们将为您的测试设备提供预览版更新。
- 暂定的里程碑包括
-</p>
-
-<ul>
- <li>
- <strong>预览版&nbsp;1</strong>(5 月底发布初始预览版);
- </li>
-
- <li>
- <strong>预览版&nbsp;2</strong>(6 月底/7 月初);
- </li>
-
- <li>
- <strong>预览版&nbsp;3</strong>(7 月底发布近乎最终版本)
- </li>
-</ul>
-
-<p>
- 这些更新将促进形成<strong>最终版本的 SDK</strong>(第三季度末),为 Android 新版本以及最终的系统行为和功能交付官方 API。
-
-
-</p>
-
-<p>
- 如果您在 Android M 中进行测试和开发,我们郑重建议您随着预览版更新的发布,<strong>将开发环境保持为相应的最新版本</strong>。
-
- 为了简化这一过程,我们将为已刷入预览版内部版本的设备提供<strong>空中下载 (OTA) 更新</strong>功能,并提供可供您手动下载并刷入的系统映像。
-
-
-</p>
-<p class="note">
- <strong>注:</strong>最终的 SDK 和系统映像无法通过 OTA 交付,而是需要<strong>手动刷入</strong>到测试设备中。</strong>
-
-
-</p>
-
-<p>
- 当有预览版更新可用时,我们将通过 <a href="http://android-developers.blogspot.com/">Android 开发者博客</a>、此站点以及 <a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>通知您。
-
-
-</p>
-
-<h2 id="preview_tools">
- 预览版具有哪些功能?
-</h2>
-
-<p>
- M 开发者预览版包括您在各种使用不同屏幕尺寸、网络技术、CPU/GPU 芯片和硬件架构的设备中测试现有应用所需的所有功能。
-
-
-</p>
-
-<h4>
- SDK 工具
-</h4>
-
-<p>
- 您可通过 <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a> 中的 SDK 管理器下载这些组件:
-</p>
-
-<ul>
- <li>M 开发者预览版 <strong>SDK 工具</strong>
- </li>
-
- <li>M 开发者预览版<strong>模拟器系统映像</strong>(32 位和 64 位)
-
- </li>
-
- <li>适用于 Android TV 的 M 开发者预览版<strong>模拟器系统映像</strong>(32 位)
-
- </li>
-</ul>
-
-<h4>
- 硬件系统映像
-</h4>
-
-<p>
- 您可从<a href="download.html">“下载”页面</a>中下载这些供 Nexus 设备使用的硬件系统映像:
-
-</p>
-
-<ul>
- <li>
- <strong>Nexus 5</strong> (GSM/LTE) “hammerhead” 设备系统映像
- </li>
-
- <li>
- <strong>Nexus 6</strong> “shamu” 设备系统映像
- </li>
-
- <li>
- <strong>Nexus 9</strong> (Wi-Fi) “volantis” 设备系统映像
- </li>
-
- <li>
- <strong>Nexus Player</strong> (Android TV) “fugu” 设备系统映像
- </li>
-</ul>
-
-<h4>
- 文档和示例代码
-</h4>
-
-<p>
- 以下文档资源有助于您了解预览版:
-</p>
-
-<ul>
- <li>
- <a href="setup-sdk.html">设置 SDK</a>,提供入门指南的分步说明。
-
- </li>
-
- <li>
- <a href="{@docRoot}preview/testing/guide.html">测试指南</a>和<a href="behavior-changes.html">行为变更</a>,带您了解主要测试领域。
- </li>
-
- <li>新 API 文档,包括 <a href="api-overview.html">API 概览</a>、可下载的 <a href="{@docRoot}preview/download.html#docs">API 参考资料</a>以及有关<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>、<a href="{@docRoot}preview/backup/index.html">应用备份</a>等主要功能的详细开发者指南。
-
-
-
-
- </li>
-
- <li>
- <a href="{@docRoot}preview/samples.html">示例代码</a>,演示如何支持权限和其他新功能。
-
- </li>
-
- <li>
- M 开发者预览版当前版本的<a href="{@docRoot}preview/support.html#release-notes">版本说明</a>,包括变更说明和差异报告。
-
- </li>
-</ul>
-
-<h4>
- 支持资源
-</h4>
-
-<p>
- 在 M 开发者预览版中测试和开发时,您可使用以下支持资源:
-
-</p>
-
-<ul>
- <li><a href="https://code.google.com/p/android-developer-preview/">M 开发者预览版问题跟踪器</a>是您的<strong>主要反馈渠道。</strong>
-
-您可通过问题跟踪器报告错误、性能问题和一般反馈。
-您还可检查<a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">已知问题</a>并找出解决方法步骤。
-
- </li>
-
- <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>是一家 Google+ 社区。在此社区中,您可<strong>与其他使用 Android M 的开发者建立联系</strong>。您可以共享观察结果或想法,或查找 Android M 问题的解决方法。
-
-
-
- </li>
-</ul>
-
-
-<h2 id="preview_apis_and_publishing">
- 锁定目标、预览版 API 和发布
-</h2>
-
-<p>
- Android M 开发者预览版是仅面向开发的版本,
-<strong>并不具有标准的 API 级别</strong>。如果您想选择拒绝通过兼容性行为测试您的应用(强烈推荐),则可将应用的 <code><a href=
- "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code>
- 设置为 <code>“MNC”</code>,从而锁定 M 开发者预览版。
-
-
-</p>
-
-<p>
- Android M 开发者预览版提供<strong>预览 API</strong> 功能
-&mdash; 在最终的 SDK 发布之前,这些 API 都不是正式的 API。目前,最终的 SDK 计划于 2015 年第三季度发布。
-这意味着一段时期内,特别是该计划的最初几周内,
-<strong>API 可能会出现细微变化</strong>。
-我们会通过 Android M 开发者预览版的每次更新,为您提供一份变更摘要。
-
-</p>
-
-<p class="note">
- 请注意,尽管预览版 API 可能会更改,但运行时权限和省电功能等基本系统行为仍保持稳定,可以立即用于测试。
-
-
-</p>
-
-<p>
- 关于发布,Google Play 会<strong>禁止发布面向 M 开发者预览版的应用</strong>。
-当 Android M 最终版本 SDK 可用时,您可以锁定官方 Android M API 级别,并将应用发布至 Google Play。
-
-与此同时,如果您需要将针对 Android M 的应用分发给测试者,则可通过电子邮件或从您的站点直接下载实现这一点。
-
-
-</p>
-
-<h2 id="get_started">
- 如何开始
-</h2>
-
-<p>
- 要开始测试应用,请执行以下操作:
-</p>
-
-<ol>
- <li>查看 <a href="{@docRoot}preview/api-overview.html">API 概览</a>和<a href="{@docRoot}preview/behavior-changes.html">行为变更</a>,大致了解新功能及其如何影响您的应用。
-
-特别地,您需要了解新的<a href="{@docRoot}preview/features/runtime-permissions.html">运行时权限</a>模型、省电功能和自动备份。
-
-
- </li>
-
- <li>遵循有关<a href="{@docRoot}preview/setup-sdk.html">设置预览版 SDK</a> 和配置测试设备的说明,来设置您的环境。
-
-
- </li>
-
- <li>遵循<a href="https://developers.google.com/android/nexus/images">刷入说明</a>,刷入 Nexus 5、6、9 和 Player 的最新 M 开发者预览版系统映像。
-
-为开发设备刷入系统映像后,预览版更新将通过无线 (OTA) 更新进行交付。</a>
-
- </li>
-
- <li>下载 <a href="{@docRoot}preview/download.html#docs">M 预览版 API 参考资料</a>和 <a href="{@docRoot}preview/samples.html">M 预览版示例</a>,更深入地了解新 API 功能以及如何在应用中使用这些功能。
-
-
-
- </li>
-
- <li>加入 <a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>,获取最新资讯并与使用新平台的其他开发者建立联系。
-
-
- </li>
-</ol>
-
-<p>
- 感谢您参加 Android M 开发者预览版计划!
-</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/samples.jd b/docs/html-intl/intl/zh-cn/preview/samples.jd
deleted file mode 100644
index 9f1631900b94..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/samples.jd
+++ /dev/null
@@ -1,70 +0,0 @@
-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
deleted file mode 100644
index e9910b4b44dc..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/setup-sdk.jd
+++ /dev/null
@@ -1,207 +0,0 @@
-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/testing/guide.jd b/docs/html-intl/intl/zh-cn/preview/testing/guide.jd
deleted file mode 100644
index 256d5bbef0ee..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/testing/guide.jd
+++ /dev/null
@@ -1,187 +0,0 @@
-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
deleted file mode 100644
index 1f88854b3e5c..000000000000
--- a/docs/html-intl/intl/zh-cn/preview/testing/performance.jd
+++ /dev/null
@@ -1,656 +0,0 @@
-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>