diff --git a/docs/html-intl/intl/zh-cn/preview/backup/index.jd b/docs/html-intl/intl/zh-cn/preview/backup/index.jd new file mode 100644 index 0000000000000..39786a3a270b1 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/backup/index.jd @@ -0,0 +1,327 @@ +page.title=自动备份应用 +page.tags=备份, 预览版资源, androidm +page.keywords=备份, 自动备份, 预览版 +page.image=images/cards/card-auto-backup_2x.png +@jd:body + +
+ ++ 通常,用户需要投入大量的时间和精力在应用内创建数据和设置首选项。 +如果用户更换破损设备或升级至新设备,则保留用户数据对于确保提供卓越的用户体验至关重要。 +在这些情况下,运行 Android M 预览版系统的设备可以通过将应用数据自动备份到 Google Drive,帮助确保提供卓越的用户体验。 + +这样,即使用户更换或升级设备,应用数据也可自动恢复。 + +
+ ++ 对于运行 Android M 预览版的设备中所有已安装的应用,均可启用自动备份。无需额外提供应用代码。 +该系统允许用户选择禁止自动数据备份。 +此外,您还可以选择限制要备份应用中的哪些数据。 +
+ ++ 本文介绍了新系统行为,阐述了如何指定要为应用备份哪些数据。 + +
+ ++ 自动备份功能可以通过将应用在用户设备中创建的数据上传到用户的 Google Drive 帐户并进行加密,来保留这些数据。 +您或用户无需为数据存储付费,且保存的数据不计入用户个人的 Drive 配额。 +在 M 预览版运行期间,用户可针对每个 Android 应用存储多达 25MB 的数据。 + +
+ ++ 当设备处于空闲、充电以及连接至 Wi-Fi 网络时,会每 24 小时自动备份一次数据。 +满足上述这些条件后,备份管理器服务会将所有可用的备份数据上传至云端。 +当用户改用新设备或卸载并重新安装备份的应用时,恢复操作会将备份的数据复制到新安装的应用的数据目录中。 + + +
+ ++ 注:如果应用使用旧版 Android 备份服务,则此新行为不适用,不过现有的备份行为会照常运行。 + + +
+ + ++ 并非所有应用数据均应备份,例如临时文件和缓存文件就无需备份,因此自动备份服务会默认排除如下一些特定的数据文件: + +
+ ++ 除了上一部分中列出的自动排除的文件外,凡 M 预览版设备中安装的任何应用所创建的数据均会备份。 +您可以使用应用清单文件中的设置,进一步限制和配置应用中的哪些数据需要备份。 + +
+ ++ 根据应用所需的数据及其保存方式,您可能需要针对包括或排除哪些特定的文件或目录设置具体的规则。 +自动备份服务支持使用 XML 配置文件和应用清单文件来设置这些备份规则。 + +您可以在应用清单文件中指定备份架构配置文件,如下例所示: + +
+ ++<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + package="com.my.appexample"> + <uses-sdk android:minSdkVersion="MNC"/> + <uses-sdk android:targetSdkVersion="MNC"/> + <app ... + android:fullBackupContent="@xml/mybackupscheme"> + </app> + ... +</manifest> ++ +
+ 在此示例代码中,android:fullBackupContent 属性指定了一个 XML 文件。该文件名为
+mybackupscheme.xml,位于应用开发项目的 res/xml/ 目录中。
+此配置文件包括关于要备份哪些文件的规则。
+下列示例代码显示了将某一特定文件排除在备份之外的配置文件:
+
+
+<?xml version="1.0" encoding="utf-8"?> +<full-backup-content> + <exclude domain="database" path="device_info.db"/> +</full-backup-content> ++ +
+ 此示例备份配置仅将一个特定数据库文件排除在备份之外。 + 所有其他文件均予以备份。 +
+ ++ 您可以通过备份服务配置指定备份中要包括或排除哪些文件。 +数据备份配置 xml 文件的语法如下: +
+ ++<full-backup-content> + <include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /> + <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /> +</full-backup-content> ++ +
+ 您可以使用下列元素和属性指定备份中要包括或排除哪些文件: + +
+ +<include>。如果您想指定一组要备份的资源,而不是默认由系统备份应用中的所有数据,请使用此元素。
+如果您指定了 <include> 标记,系统将仅备份使用此元素指定的资源。
+
+
+ <exclude>。使用此元素指定一组要排除在备份之外的资源。
+除了使用此元素指定的资源外,系统将备份应用中的所有数据。
+
+ domain. 您想要在备份中包括或排除的资源类型。您可为此属性指定的有效值包括:
+
+ root。指定资源处于应用的根目录中
+ file。与通过
+{@link android.content.Context#getFilesDir getFilesDir()} 方法返回的目录中的某个资源相对应
+ database。与通过
+{@link android.content.Context#getDatabasePath getDatabasePath()} 方法或使用
+{@link android.database.sqlite.SQLiteOpenHelper} 类返回的某个数据库相对应
+ sharedpref。与通过 {@link android.content.Context#getSharedPreferences getSharedPreferences()}
+ 方法返回的某个 {@link android.content.SharedPreferences} 对象相对应
+
+ external。指定资源位于外部存储中,且与通过
+{@link android.content.Context#getExternalFilesDir getExternalFilesDir()} 方法返回的目录中的某个文件相对应
+
+ path。您想要在备份中包括或排除的资源的文件路径
+
+
+ 通过在清单文件的应用元素中将
+android:allowBackup 属性设置为 false,您可选择阻止自动备份任何应用数据。
+此设置如下列示例代码所示:
+
+<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + package="com.my.appexample"> + <uses-sdk android:minSdkVersion="MNC"/> + <uses-sdk android:targetSdkVersion="MNC"/> + <app ... + android:allowBackup="false"> + </app> + ... +</manifest> ++ + +
+ 创建备份配置后,您应立即进行测试,确保应用能够保存数据,且数据能够正确恢复。 + +
+ + ++ 要帮助确定备份功能如何解析 XML 文件,请在执行测试备份之前启用日志记录功能: + +
+ ++$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE ++ +
要手动运行备份,您首先必须通过调用下列命令初始化备份管理器: + +
+ ++$ adb shell bmgr run ++ +
+ 然后,使用下列命令并以 <PACKAGE> 参数指定应用的软件包名称来手动备份应用:
+
+
+$ adb shell bmgr fullbackup <PACKAGE>+ + +
+ 要在备份应用数据后手动启动数据恢复,请调用下列命令,并以 <PACKAGE> 参数指定应用的软件包名称:
+
+
+$ adb shell bmgr restore <PACKAGE> ++ +
+ 警告:执行恢复操作之前,此操作将阻止您的应用运行并擦除其数据。 + +
+ ++ 您可以通过卸载并重新安装应用来启动数据恢复进程。应用安装完成后,系统会立即自动从云中恢复应用数据。 + +
+ + ++ 如果遇到问题,可通过在设置 > 备份中先关闭然后重新打开备份、将设备恢复出厂设置或者调用以下命令,来清除备份数据及关联的元数据: + + +
+ +$ adb shell bmgr wipe <TRANSPORT> <PACKAGE>+ +
+ <TRANSPORT> 值必须以 com.google.android.gms 为前缀。
+ 要获取传输列表,请调用下列命令:
+
$ adb shell bmgr list transports+ +
以下是自动备份服务的已知问题:
+ ++ Android M 预览版 SDK 包括开发工具、Android 系统文件和库文件,旨在帮助您在下一版本的平台中测试您的应用以及该平台提供的新 API。 +本文旨在介绍如何获得“预览版”的可下载组件,以便测试您的应用。 + +
+ + ++ 预览版 SDK 可通过 Android SDK 管理器下载。如需了解有关下载和配置预览版 SDK 的详细信息,请参阅设置预览版 SDK。 + +
+ + ++ 开发者文档下载软件包提供详细的 API 参考信息和“预览版”的 API 差异报告。 +
+ +| 描述 | +下载/校验和 | +
|---|---|
| Android M 预览版 开发者文档 |
+ m-preview-1-developer-docs.zip + MD5: b65201b0d35416f5a1b7a071b52854a7 + SHA-1: d47e856aa65e06897e6edd902ad8d2b1f05ac3ec + |
+
| 设备 | +下载/校验和 | +
|---|---|
| Nexus 5 (GSM/LTE) "hammerhead" |
+ hammerhead-MPZ44Q-preview-55d76d3a.tgz + MD5:9e2631b06c6525e401ceaae3677ff320 + SHA-1:55d76d3a379b18f3363f28d8a462c236ab96fc36 + |
+
| Nexus 6 "shamu" |
+ shamu-MPZ44Q-preview-c1d6506a.tgz + MD5:307cbf9dab0a38df4ab2639d02be12aa + SHA-1: c1d6506a74094bdb2f4b8677c7fe4967334f9ea8 + |
+
| Nexus 9 "volantis" |
+ volantis-MPZ44Q-preview-d15ad483.tgz + MD5: fae40377fd999d2b09128665c915264d + SHA-1:7ab05f96093b2cb370b226f65931202714cbc2ca + |
+
| Nexus Player "fugu" |
+ fugu-MPZ44Q-preview-2406ba05.tgz + MD5:815902141a85cc65e7725f005cad31d5 + SHA-1:2406ba0598dea1e69110497ac0bc8e16789bc8fb + |
+
+ 要使用设备映像进行测试,您必须将其安装到兼容设备上。请按照下面的说明安装系统映像: + +
+ ++ 注:为开发设备刷入预览版系统映像之后,它将通过无线 (OTA) 更新自动升级到下一个预览版本。 + +
+ ++ 如果您想要卸载预览版并将设备还原至出厂规格,请转到 +developers.google.com/android 并下载要为设备刷入的映像。 +按照该页面上的说明将映像刷入设备中。 + +
+ + + + + + + + diff --git a/docs/html-intl/intl/zh-cn/preview/features/app-linking.jd b/docs/html-intl/intl/zh-cn/preview/features/app-linking.jd new file mode 100644 index 0000000000000..77a532f7cde19 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/features/app-linking.jd @@ -0,0 +1,123 @@ +page.title=应用链接 +page.image=images/cards/card-app-linking_2x.png +page.keywords=应用链接, 深层链接, 意向 +@jd:body + + + ++ Android 意向系统是一种让应用能够处理内容和请求的灵活机制。 + 可能会有多个应用在其意向过滤器中声明一致的 URI 模式。如果用户点击的 Web 链接没有默认的启动处理程序,平台可能会显示一个对话框,让用户从一系列已声明一致意向过滤器的应用中进行选择。 + + +
+ ++ Android M 开发者预览版引入了对应用链接的支持,后者在现有链接处理方式基础上进行了改进,允许应用开发者将应用与他们拥有的 Web 域进行关联。 +当开发者创建此关联时,平台可以自动确定在处理特定 Web 链接时默认使用的应用,略过询问用户的步骤。 + + +
+ + ++ 网站所有者必须声明与应用的关联才能建立应用链接。网站所有者可以通过在域上众所周知的位置承载一个名为 {@code statements.json} 的 JSON 文件声明与应用的关系: + + +
+ +http://<domain>:<optional port>/.well-known/statements.json+ +
+ 注: + 在 M 开发者预览版运行期间,系统会通过 HTTP 协议对该 JSON 文件进行验证。当平台正式发布后,系统将通过 HTTPS 加密协议对该文件进行验证。 + +
+ ++ 该 JSON 文件指定应作为该域下 URL 默认处理程序使用的 Android 应用。 +它根据以下字段标识该应用: +
+ +keytool -list -v -keystore my-release-key.keystore+
+ 以下文件清单显示的是一个 +{@code statements.json} 文件的内容和格式示例: +
+ +
+[{
+ "relation": ["delegate_permission/common.handle_all_urls"],
+ "target": {
+ "namespace": "android_app",
+ "package_name": "<package name>",
+ "sha256_cert_fingerprints": ["6C:EC:C5:0E:34:AE....EB:0C:9B"]
+ }
+}]
+
+
+
++ 应用可以请求平台自动根据相应 Web 域上承载的 {@code statements.json} 文件验证由其意向过滤器数据元素内的主机名称定义的任何应用链接。 + +要请求应用链接验证,请按以下清单文件代码段中所示向清单文件中所需的每个意向过滤器添加一个 {@code android:autoVerify} + 属性: + +
+ ++<activity ...> + <intent-filter android:autoVerify="true"> + <action android:name="android.intent.action.VIEW" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.BROWSABLE" /> + <data android:scheme="http" android:host="www.android.com" /> + <data android:scheme="https" android:host="www.android.com" /> + </intent-filter> +</activity> ++ +
+ 如果应用清单文件中存在 {@code android:autoVerify} 属性,平台会在安装应用时尝试验证应用链接。 +如果平台无法成功验证应用链接,则不会将应用设置为处理 Web 链接的首选应用。 +用户下一次打开其中一个链接时,平台将退回原有模式,向用户显示一个对话框。 + + +
+ ++ 注:在测试时,如果验证失败,但用户已经使用系统的“设置”应用显式允许应用在不询问用户的情况下打开受支持的链接,则可能会出现误报。在这种情况下,不会显示对话框,链接会直接指向您的应用,不过这完全是由于用户设置的缘故,并不是因为验证成功。 + + + +
+ + ++ 用户可以更改应用链接设置,让系统按首选方式处理 URL。您可以在系统“设置”应用的设置 > 应用 > 应用信息 > 默认打开下查看和管理应用链接。 + + +
diff --git a/docs/html-intl/intl/zh-cn/preview/index.jd b/docs/html-intl/intl/zh-cn/preview/index.jd new file mode 100644 index 0000000000000..19b4b78af1b08 --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/index.jd @@ -0,0 +1,67 @@ +page.title=Android M 开发者预览版 +page.tags="preview", +meta.tags="preview, M preview", androidm +fullpage=true +section.landing=true +header.hide=1 +footer.hide=1 +@jd:body + + + ++在开始使用 Android SDK 预览版之前,您必须同意下列条款和条件。正如下文所述,请注意:这是 Android SDK 的预览版本,可能随时更改,恕不另行通知,您使用此版本的风险由您自行承担。 +Android SDK 预览版并非稳定版本,可能包含会对您的计算机系统、设备和数据造成损害的错误和缺陷。 +
+ ++本协议是 Android SDK 预览版许可协议(以下称为“许可协议”)。 +
++ 以下是 M 开发者预览版的代码示例。要在 Android Studio 中下载示例,请选择文件 > 导入示例菜单选项。 + +
+ ++ 注:这些可下载的项目设计用于与 Gradle 和 Android Studio 结合使用。 + +
+ + ++ Android M 改变了系统权限运行的方式。系统会在运行时(而不是安装期间)要求用户批准权限请求。 +此示例显示了如何请求这些权限。 + +
+ + + ++ 此示例演示了在您的应用中如何使用设备凭据作为身份验证方法。 +
+ + + ++ 此示例演示了在您的应用中如何识别已注册的指纹以验证用户的身份。 + +
+ + + ++ Android M 引入了自动备份应用设置功能。此示例演示如何向应用添加筛选规则,以管理设置备份。 + +
+ + + +
+ 演示如何使用 Camera2 API 捕获 RAW 相机缓冲区并将其另存为 DNG 文件。
+
+
+ 此示例演示 NotificationManager
+ 如何让您了解应用当前显示的通知数量。
+
+
M 开发者预览版 SDK 可通过 Android SDK 管理器获取。本文假定您熟悉 Android 应用开发的相关操作,例如:使用 Android SDK 管理器和创建项目。 + +如果您是首次使用 Android,请先参阅开发您的第一款应用培训课程。 + +
+ +开发者预览版与处于预览版状态的 Android Studio 1.3 结合使用时效果最佳。 +强烈建议您安装 Android Studio 1.3 的预览版本,以便与预览版 SDK 结合使用。 +
+ +注意:Android Studio 1.3 的 Canary 预览版仍处于活动的开发状态。 +如果您正使用主要开发机器测试开发者预览版,则可创建另一套 Android Studio 安装系统供测试使用。 + +
+ +要安装 Android Studio 1.3 预览版,请执行以下操作:
+ +在 OSX 中,您可在 Android Studio 的首选项窗口中找到外观和行为面板。 + +
+要将预览版 SDK 组件添加到开发环境,请执行以下操作:
+ +在 OSX 中,您可在 Android Studio 的首选项窗口中找到外观和行为面板。 + +
+完成上述步骤后,预览版组件即可用于您的开发环境。 +
+ + ++ 为使用预览版 API,您必须创建或更新一个使用预览版组件的开发项目。 + +
+ + ++ 建议使用 Android Studio 创建一个使用该预览版的项目。按照创建项目中所描述的步骤操作,直到转到项目向导中的“外形”屏幕为止。 + +然后执行下列步骤,创建为该预览版配置的项目。 + +
+ +
+ 对于现有项目,您必须修改项目配置以启用预览版 API。在开发环境中,打开模块的 build.gradle 文件,并按如下所示设置这些值:
+
+
+
compileSdkVersion 设置为 'android-MNC'minSdkVersion 设置为 'MNC'targetSdkVersion 设置为 'MNC'+ 要使用预览版测试应用,您必须拥有已配置平台预览版本的物理设备或虚拟设备。 +如果您拥有兼容设备,则可安装预览版平台进行测试。 +另外,您可以配置用于测试的虚拟设备。 +
+ ++ 如果您拥有 Nexus 5、Nexus 6、Nexus 9 或 Android TV,则可在这些设备中安装预览版系统映像,来测试您的应用。通过使用 Android 虚拟设备管理器工具,您可从 Android Studio 内设置带有平台预览版本的虚拟设备。 + + + +
+ ++ 重要说明:在设备中安装预览版映像会删除此设备中的所有数据,因此您应在安装预览版映像之前备份数据。 + +
+ ++ 通过使用 Android 虚拟设备管理器工具,您可从 Android Studio 内设置带有平台预览版本的虚拟设备。 + +
+ +要使用 AVD 管理器创建 AVD,请执行以下操作:
+ ++ 如需了解有关创建测试用虚拟设备的详细信息,请参阅管理虚拟设备。 +
diff --git a/docs/html-intl/intl/zh-cn/preview/support.jd b/docs/html-intl/intl/zh-cn/preview/support.jd new file mode 100644 index 0000000000000..a62417baa528a --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/support.jd @@ -0,0 +1,67 @@ +page.title=支持 +page.image=images/cards/card-support_16-9_2x.png + +@jd:body + ++ 如果您遇到错误或要提供有关 M 开发者预览版的反馈,请在我们的问题跟踪器上创建问题。 + + +
+ ++ 有关更多支持,请加入 M 开发者预览版 Google+ 社区,讨论您的开发体验。 + + +
+ +
+
M 开发者预览版,版本 1(2015 年 5 月)
+
+ 利用 Android M 开发者预览版,您有机会确保应用可使用下一平台版本。 +如 API 概览和行为变更中所述,该预览版包括大量 API 和可能影响应用的行为变更。 + +使用预览版测试应用时,您应重点关注一些特定的系统变更,确保用户拥有愉悦的体验。 + + +
+ ++ 本指南介绍可使用您的应用测试预览版的哪些功能以及如何测试。您应确定优先测试以下特定预览版功能,因为它们可能会对应用行为产生较大影响。 + + +
+ ++ 如需了解有关如何使用预览版系统映像设置设备或虚拟设备以进行测试的详细信息,请参阅设置预览版 SDK。 + +
+ + ++ 新权限模型改变了用户向您的应用分配权限的方式。 +您的应用必须在运行时要求用户提供各项权限,而不是在安装过程中要求授予所有权限。 + +对于用户而言,此行为有助于他们更精细地控制每个应用的Activity,并更深入地了解应用为何请求提供特定权限的上下文信息。 +用户可以随时向应用授予某项权限或撤销其某项权限。 +预览版的这种功能最有可能会对应用行为产生影响,而且可能会阻止某些应用功能运行或只能在降级状态中运行。 + + +
+ ++ 这一变更会影响在新平台上运行的所有应用,即便这些应用并非面向新平台版本开发亦是如此。 +该平台为旧版应用提供有限的兼容性行为,但您现在应当开始计划将应用迁移到新权限模型,以便在官方平台启动时发布更新的应用版本。 + + +
+ + ++ 使用以下测试提示有助于您计划并通过新权限行为执行应用测试。 + +
+ +adb shell pm list permissions -d -g+
adb shell pm [grant|revoke] <permission.name> ...+
+ 权限更改会影响应用的结构和设计,以及您为用户提供的用户体验和流程。 +您应评估应用的当前权限使用情况并开始计划要提供的新流程。 +平台的正式版本提供兼容性行为,但您应计划更新应用,而不是依赖于这些行为。 + + +
+ ++ 确定应用实际需要和使用的权限,然后找出各种使用受权限保护的服务的代码路径。 +您可通过结合使用新平台测试和代码分析完成此操作。 +在测试中,您应通过将应用的 {@code targetSdkVersion} 更改为预览版,重点关注选择运行时权限。 +如需了解详细信息,请参阅设置预览版 SDK。 + +
+ ++ 使用已撤销和已添加权限的各种组合进行测试,突出显示依赖于权限的用户流程。 +如果依赖关系不明显或不符合逻辑,则您应考虑重构或划分该流程,以消除依赖关系或阐明需要权限的原因。 + + +
+ ++ 如需了解有关运行时权限行为、测试和最佳做法的详细信息,请参阅权限开发者预览版页面。 + + +
+ + ++ 当设备处于空闲状态或应用未聚焦时,瞌睡模式和应用待机模式的节能功能将限制应用可执行的后台处理工作量。 +系统可对应用实施的限制包括:限制或禁止访问网络、暂停后台任务、暂停通知、忽略唤醒请求和闹铃。 + +要确保应用在完成这些节能优化后正常运行,您应通过模拟这些低功耗状态对应用进行测试。 + + +
+ +要在瞌睡模式下测试您的应用,请执行以下操作:
+ ++$ adb shell dumpsys battery unplug +$ adb shell dumpsys deviceidle step +$ adb shell dumpsys deviceidle -h ++ +
要在应用待机模式下测试您的应用,请执行以下操作:
+ ++$ adb shell am broadcast -a android.os.action.DISCHARGING +$ adb shell am set-idle <packageName> true ++ +
$ adb shell am set-idle <packageName> false+
如果应用坚持在内部存储中使用任何设备特定的标识符,如 Google 云消息传递注册 ID,请确保遵循最佳做法将存储位置从自动备份中排除,如自动备份应用中所述。 + + + +
diff --git a/docs/html-intl/intl/zh-cn/preview/testing/performance.jd b/docs/html-intl/intl/zh-cn/preview/testing/performance.jd new file mode 100644 index 0000000000000..1f88854b3e5cf --- /dev/null +++ b/docs/html-intl/intl/zh-cn/preview/testing/performance.jd @@ -0,0 +1,656 @@ +page.title=测试显示性能 +page.image=images/cards/card-test-performance_2x.png +page.keywords=性能, fps, 工具 + +@jd:body + + ++ 用户界面 (UI) 性能测试可确保您的应用不仅满足其功能要求,同时确保用户与应用之间的交互顺畅无比,能够以每秒连续 60 帧(为什么选择 60fps?)的帧速运行,而不会出现任何帧丢失或延迟的现象,也就是我们通常所说的“卡顿”。 + + +本文档介绍可用于测量 UI 性能的工具并提出一种将 UI 性能测量集成到测试实践中的方法。 + + +
+ + ++ 为了改善性能,您首先必须能够测量系统性能,然后诊断并识别可能来自管道各个部分的问题。 + + +
+ ++ dumpsys 是一种在设备上运行并转储感兴趣的系统服务状态信息的 Android 工具。 + +通过向 dumpsys 传递“gfxinfo”命令,可以提供 logcat 格式的输出,其中包含有关与录制阶段期间发生的动画帧相关的性能信息。 + + +
+ ++> adb shell dumpsys gfxinfo <PACKAGE_NAME> ++ +
+ 此命令可以生成多个不同表达形式的帧时间数据。 +
+ ++ 借助 M 预览版,该命令可将在整个进程生命周期中收集的帧数据的聚合分析打印输出到 logcat。 +例如: +
+ ++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 ++ +
+ 这些高级统计信息可以较高水平地传达应用的呈现性能及其在多个帧之间的稳定性。 + +
+ + ++ M 预览版附带提供了一个适用于 gfxinfo 的新命令,即:framestats,该命令根据最近的帧提供非常详细的帧时间信息,让您能够更准确地查出并调试问题。 + + +
+ ++>adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats ++ +
+ 此命令根据应用生成的最后 120 帧,打印输出带有纳秒时间戳的帧时间信息。以下是来自 adb dumpsys gfxinfo <软件包名称> framestats 的原始输出示例: + + +
+ ++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, ++ +
+ 每行输出均代表应用生成的一帧。每行都有固定的列数,用于描述帧生成管道的每个阶段所花的时间。 +下文将详细描述此格式,包括每列代表的具体内容。 + +
+ + ++ 由于数据块是 CSV 格式的输出,因此将其粘贴到所选的电子表格工具或使用脚本进行收集和解析非常简单。 +下表解释了输出数据列的格式。 +所有时间戳均以纳秒计。 +
+ ++ 您可以通过不同的方法使用此数据。一种简单却有用的可视化方式就是在不同的延迟时段中显示帧时间 (FRAME_COMPLETED - INTENDED_VSYNC) 分布的直方图(参见下图)。 + +此图直观地表明,大部分帧非常有效,截止时间远低于 16 毫秒(显示为红色),但是少数帧明显超出了截止时间。 + +我们可以观察此直方图中的变化趋势,了解所产生的整体变化或新异常值。 +此外,您还可以根据数据中的多个时间戳绘制表示输入延迟、布局所用时间或其他类似关注指标的图形。 + + +
+ +
+
+
+
+ 如果在“开发者选项”中将 GPU 呈现模式分析设置为在 adb shell dumpsys gfxinfo 中,则 adb shell dumpsys gfxinfo 命令会打印输出最近 120 帧的时间信息,这些信息分为几个不同的类别,其相应的值以制表符分隔。
+
+
+这些数据可以用于大致表明绘图管道的哪些部分可能速度较慢。
+
+
+ 与上述 framestats 类似,将其粘贴到所选的电子表格工具或使用脚本进行收集和解析同样非常简单。 + +下图详细显示了应用生成的许多帧的具体时间分布。 + +
+ +
+
++ 运行 gfxinfo、复制输出、将其粘贴到电子表格应用并将数据绘制成堆积条形图的结果。 + +
+ ++ 每个垂直条均代表一个动画帧;其高度代表计算该动画帧所需的毫秒数。 +垂直条的每个彩色分段均代表呈现管道的一个不同阶段,因此您可以看到应用的哪些部分可能会出现瓶颈。 + +如需了解有关呈现管道的详细信息,请参阅失效、布局和性能视频。 + + +
+ + ++ Framestats 和简单的帧计时均可在极短的时间内(相当于约呈现 2 秒)收集数据。 +要精确控制此时间范围(例如,将数据限制于特定动画),您可以重置所有计数器并汇总收集的统计信息。 + + +
+ ++>adb shell dumpsys gfxinfo <PACKAGE_NAME> reset ++ +
+ 这也可以与转储命令结合使用来定期进行收集和重置,从而持续捕获时间范围不到 2 秒的帧。 + + +
+ + ++ 要查出问题并保持应用运行状况良好,第一步最好是识别回归。 +但是,dumpsys 仅确定是否存在问题及其相对严重性。 +您仍需诊断性能问题的具体原因并找到适当的解决方法。 +为此,我们强烈建议您使用 systrace 工具。 + +
+ + ++ 如需了解有关 Android 呈现管道的工作原理、可能存在的常见问题以及如何解决这些问题的详细信息,以下其他资源可能对您有所帮助: + + +
+ ++ UI 性能测试方法之一是让测试人员对目标应用执行一系列用户操作,并目视检查是否存在卡顿现象,或花费大量时间使用工具驱动型方法来查明是否存在卡顿现象。 + +但是,这种人工方法充满风险:人为感知帧率变化的能力参差不齐,并且此过程又费时、繁琐且易于出错。 + + +
+ ++ 更为有效的方法是记录并分析自动化 UI 测试中的关键性能指标。 +Android M 开发者预览版包括新的日志记录功能。利用这些功能,您可以轻松确定应用动画中的卡顿数量和严重性,您还可以使用这些功能构建严格的流程,用于确定当前性能并跟踪未来的性能目标。 + + + +
+ ++ 本文将向您介绍一种使用这些数据自动化性能测试的推荐方法。 + +
+ ++ 此方法主要分为两个关键操作。首先,确定测试对象和测试方法;其次,设置和维护自动化测试环境。 + + +
+ + ++ 在开始进行自动化测试之前,您必须做出一些较高层次的决策,以便准确了解测试空间和可能存在的需求。 + +
+ ++ 请记住,流畅的动画中断时,用户对低劣性能的感触最深。 +因此,在识别要测试的 UI 操作类型时,集中精力处理用户最常见或对用户体验最为重要的关键动画非常有用。 + +例如,以下是对识别有所帮助的一些常见场景: +
+ ++ 与团队中的工程师、设计师和产品经理开展合作,优先处理测试覆盖范围内的这些关键产品动画。 + +
+ ++ 从较高层面来看,确定具体的性能目标、专注于编写测试并收集相关数据至关重要。 +例如: +
+ ++ 在所有这些情况下,您都将需要进行历史跟踪,以显示多个应用版本中的性能。 + +
+ ++ 应用性能因其所在设备而异。某些设备的内存可能更少,GPU 功能略弱或 CPU 芯片速度较慢。 +这意味着动画在一套硬件上表现良好,但在其他硬件上可能并非如此,而且可能因为其他管道部分中出现的瓶颈表现更为糟糕。 + +因此,考虑到用户可能会看到的这种变化,请选取各种设备(包括当前的高端设备、低端设备、平板电脑等)来执行测试。 + +找出 CPU 性能、RAM、屏幕密度、尺寸等方面的变化。 +在高端设备上顺利通过的测试在低端设备上可能会失败。 + +
+ ++ UI Automator 和 Espresso 等测试套件是为了帮助自动化用户使用应用过程中的操作而构建。 + +这些套件是模拟用户与您的设备进行交互的简单框架。 +要使用这些框架,您需要有效创建通过一组用户操作运行的独特脚本,并在设备中演示这些脚本。 + + +
+ +
+ 通过结合这些自动化测试以及 dumpsys gfxinfo,您可以快速创建可再生成的系统,然后您可使用此系统执行测试并测量特定条件的性能信息。
+
+
+
+ 您能够执行 UI 测试并拥有从单一测试收集数据的管道后,下一个重要步骤就是采用可以在多种设备上多次执行该测试的框架,并汇总生成的性能数据,以供开发团队做进一步分析。 + + + +
+ ++ 有一点值得注意,UI 测试框架(例如,UI Automator)直接在目标设备/模拟器上运行, +而性能信息收集则是由主机通过 ADB 发送命令来驱动 dumpsys gfxinfo 完成的。 +为帮助桥接这些单独实体的自动化,我们开发了 MonkeyRunner 框架;这是一款在主机上运行的脚本编写系统,可以向一组连接设备发出命令并从中接收数据。 + + + +
+ ++ 为正确自动化 UI 性能测试而构建一套脚本时,至少应当能够利用 monkeyRunner 完成以下任务: + +
+ ++ 一旦确定问题模式或回归,下一步就是识别和应用修复。 +如果自动化测试框架保持帧的精确时间分解,则可帮助您审查最近的可疑代码/布局更改(出现回归时),或在切换到人工调查时缩小分析的系统范围。 + + +对于人工调查,systrace 是一个很好的着手点,它可显示有关呈现管道的每个阶段、系统中的每个线程和核心以及您定义的任何自定义事件标记的精确时间信息。 + + +
+ ++ 需要注意的是,获取和测量呈现性能所需的时间并非易事。 +就其本质而言,这些数字不具有确定性,往往会随系统状态、可用内存量、热节流以及太阳耀斑到达地面的最后时间而波动。 + +问题在于,尽管同一测试可以运行两次,但获得的结果可能略有不同,它们彼此接近,却并不完全相同。 + + +
+ ++ 以这种方式准确收集和分析数据意味着多次运行同一测试,且以平均值或中值的形式累积结果(为了简单起见,我们将其称为“批处理”)。这可为您提供测试性能的粗略近似值,而无需确切的时间。 + + + +
+ ++ 您可对代码更改前和更改后的应用均使用批处理,了解这些更改对性能产生的相对影响。 +如果更改前批处理的平均帧率大于更改后批处理的平均帧率,则此特定更改通常可为您带来全面的性能优势。 + + +
+ ++ 这意味着您执行的任何自动化 UI 测试均应考虑这一概念以及测试期间可能出现的任何异常。 +例如,如果应用性能因某些设备问题(不是由应用引起)骤降,则您可能需要重新运行批处理以便获得更精确的时间。 + + + +
+ ++ 那么,在获得更有意义的测量结果之前,您应运行多少次测试?至少应运行 10 次,次数越多(例如 50 或 100 次)获得的结果更精确(当然,您现在是牺牲时间换取精确度) + + +