0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Android Studio Chipmunk更新后的卡顿检测界面

谷歌开发者 来源:谷歌开发者 作者:谷歌开发者 2022-07-20 17:50 次阅读

Android 的用户界面渲染是从应用中 "生成" 一帧然后显示在屏幕上,为了确保用户能够获得顺畅的交互体验,您的应用需要根据设备的刷新率完成每一帧的 "生成"。例如,Pixel 6 设备支持每秒最多渲染 90 帧,这就意味着应用的每一帧任务都要在 1000/90 = 11ms 内完成,如果没有,Android 框架就会将这一帧的渲染跳过,用户就会从视觉上感受到界面运行缓慢,我们称这种情况为 "卡顿"。

出现卡顿的原因有很多种,例如,由应用导致的卡顿或由 SurfaceFlinger 导致的卡顿。本文重点关注由应用导致的卡顿,以及 Android Studio 提供的用于发现和消除这些卡顿的工具,方法是在应用交互的过程中检查记录的轨迹来解决应用的性能问题。

注意:本文所展示的是Android Studio Chipmunk 更新后的卡顿检测界面,使用 Android 12 (API 级别 31) 或更高版本的真机或模拟器。

从实时交互记录轨迹

以下示例使用 GitHub 性能示例仓库中的 JankStatsSample 应用来展示如何使用 CPU 性能分析器锁定卡顿的原因:

https://github.com/android/performance-samples/tree/main/JankStatsSample 1. 打开 JankStatsSample 并运行应用。 2. 打开 Android Studio 底部的 Profiler 标签页。 2c57d54a-0810-11ed-ba43-dac502259ad0.jpg

3. 点击 Profiler 左侧窗格中的 + 图标启动新的性能分析会话,然后选择要运行性能分析器的设备名称和应用进程。

2c64b422-0810-11ed-ba43-dac502259ad0.png

注意: 虽然可以分析 "可调试应用" (debuggable app),但推荐做法是分析 "可分析应用" (profileable app),因为分析 "可调试应用" 会导致性能开销显著增加。更多详细信息,请参阅关于可分析应用的文档:

https://developer.android.google.cn/studio/profile#profileable-apps

4. 点击 CPU 行。

5. 选择 System Trace Recording,点击 Record。

2c72f636-0810-11ed-ba43-dac502259ad0.png

6. 与应用互动以收集数据,然后点击 Stop 按钮。Android Studio 将显示 Display 窗格,其中可见卡顿帧,也可以选中 All Frames 复选框,让轨迹记录也显示非卡顿帧。

2c7deae6-0810-11ed-ba43-dac502259ad0.gif

将鼠标指针悬停在帧上或点击帧,即可查看详细的帧信息。如果选中 All Frames 复选框,将有三种类型的帧。

绿色帧 不卡顿的正常帧

2c8dfe5e-0810-11ed-ba43-dac502259ad0.png

红色帧 由于应用进程运行时间超出预期并且错过了预期帧时长的截止时间,被视为卡顿的帧。从应用开发者的角度来看,可操作帧通常是红色帧

2c971124-0810-11ed-ba43-dac502259ad0.png

黄色帧 被视为缓冲区填充的帧,这表示应用会在呈现前一帧之前不断将帧发送到系统。这通常是前一帧卡顿所致,应用开发者面对黄帧无能为力。

2ca1f1fc-0810-11ed-ba43-dac502259ad0.png

选中 Lifecycle 复选框,可以切换显示/隐藏四个附加轨迹。

2caad718-0810-11ed-ba43-dac502259ad0.png

四个轨迹:

Application

Wait for GPU

Composition

Frames on display

Android Studio Bumblebee (2021.1.1) 稳定版中已经加入了这些轨迹信息的显示。您可以在文档中查看每个轨迹的详细说明:

https://developer.android.google.cn/studio/profile/jank-detection#jank-detection-android-11

检查卡顿帧

接下来,我们来找出卡顿帧出现的原因。

1.在 Janky frames 轨迹中选择一个卡顿帧,Display 窗格将突出显示相应的生命周期数据,Threads 窗格将突出显示相应的线程数据。

2cb230b2-0810-11ed-ba43-dac502259ad0.png

虚线 Deadline 代表截止时间。当帧的时长超过该截止时间时,该帧即被视为卡顿。

您还可以在 Android Studio 的右侧窗格中查看详细分析。

2cbbe9fe-0810-11ed-ba43-dac502259ad0.png

2. 如果您看一下应用主线程相应的轨迹窗格,可以看到大量的时间花费在 "View#draw" 中。

2cc44702-0810-11ed-ba43-dac502259ad0.png

此外,如详细分析窗格中的主线程状态所示,大量线程所处的状态是正在休眠。

2ccf9468-0810-11ed-ba43-dac502259ad0.png

3. 我们看一下调用 View#draw 的代码。View#onDraw 在 JankyView 类中被复写:

https://github.com/android/performance-samples/blob/main/JankStatsSample/app/src/main/java/com/example/jankstats/JankyView.kt#L36

override fun onDraw(canvas: Canvas) {  simulateJank()  super.onDraw(canvas)}
从 onDraw 调用的 simulateJank 方法定义如下: https://github.com/android/performance-samples/blob/main/JankStatsSample/app/src/main/java/com/example/jankstats/tools/simulateJank.kt#L29

fun simulateJank(    jankProbability: Double = 0.3,    extremeJankProbability: Double = 0.02) {    val probability = nextFloat()
    if (probability > 1 - jankProbability) {        val delay = if (probability > 1 - extremeJankProbability) {            nextLong(500, 700)        } else {            nextLong(32, 82)        }
        try {            // 在分析器中通过轨迹使卡顿更易被锁定            trace("Jank Simulation") {                Thread.sleep(delay)            }        } catch (e: Exception) {        }    }}
然后,您可以发现在 simulateJank 方法中调用了 Thread.sleep。显然,这是因为 JankStatsSample 应用是为了模拟卡顿而特别创建的。但值得注意的是,从卡顿帧的概览再到更详细的分析,可以找出实际代码。 注意:虽然在这个示例中调用 Thread.sleep 明显有问题,但实际上,在优化实际应用代码时,您将面临更困难的决定。Microbenchmark 开发库有助于衡量所做的更改能否达成预期效果: https://developer.android.google.cn/topic/performance/benchmarking/microbenchmark-overview 注意: 系统轨迹显示的是由平台代码和属于应用的库捕获的多个部分,通常没有足够的信息。添加自定义轨迹能够改善这样的情况,添加的方法之一是使用 AndroidX Tracing 库中的 trace(“MySection”) { /* this will be in the trace */ }。

AndroidX Tracing
https://developer.android.google.cn/reference/androidx/tracing/Trace

例如,此示例中的 trace(“Jank Simulation”) { … } 显示在相应线程的轨迹部分中。 2cc44702-0810-11ed-ba43-dac502259ad0.png

如需了解关于读取轨迹和添加自定义轨迹的更多信息,请参阅系统轨迹概述:

https://developer.android.google.cn/topic/performance/tracing

4. 将代码更改为在 onDraw 中不去调用 simulateJank 方法,然后查看是否仍然存在卡顿帧。

override fun onDraw(canvas: Canvas) {  // simulateJank()   super.onDraw(canvas)}

这一次,重新运行系统轨迹录制时,您会发现与应用的交互不再有卡顿帧啦。

2ce97428-0810-11ed-ba43-dac502259ad0.png

加载保存的轨迹

您也可以遵循以下步骤,保存轨迹并后续再加载。保存并加载轨迹后,您可以比较不同版本的跟踪记录或者与他人共享。 注意:您还可以使用 Macrobenchmark 库获取系统轨迹: https://developer.android.google.cn/topic/performance/benchmarking/macrobenchmark-overview 1. 按照从第 1 步至第 6 步的相同步骤,通过实时交互操作录制轨迹。 2. 点击保存图标导出记录。

2cf6f364-0810-11ed-ba43-dac502259ad0.png

3. 然后,导航到 + -> Load from file… 加载已保存的系统轨迹录制,选择上一步中导出的已保存文件。

2d04caac-0810-11ed-ba43-dac502259ad0.png

2d144be4-0810-11ed-ba43-dac502259ad0.png

4. 选择要分析的进程。显示进程列表下拉菜单后,输入进程名称的一部分即可快速查找。

2d1deb90-0810-11ed-ba43-dac502259ad0.png

然后,您可以加载保存的轨迹,像从实时互动录制一样查看卡顿帧。

2d2ec866-0810-11ed-ba43-dac502259ad0.png

总结

本期内容就到这里了,从 Android Studio Chipmunk 开始,您能够看到更精准的性能分析数据,更快锁定应用卡顿。

请查看文档进一步了解 CPU 性能分析器的用法,也欢迎您前往 Android Studio 中的 "Help -> Submit Feedback" 帮助我们改进工具。

原文标题:在 Android Studio 中使用 CPU 性能分析器锁定界面卡顿

文章出处:【微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3850

    浏览量

    125627
  • 屏幕
    +关注

    关注

    6

    文章

    1161

    浏览量

    55347
  • 模拟器
    +关注

    关注

    2

    文章

    815

    浏览量

    42695

原文标题:在 Android Studio 中使用 CPU 性能分析器锁定界面卡顿

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    #Android开发 Android Studio使用及配置_2.4 Android Studio界面和功能

    Android开发
    电子知识科普
    发布于 :2022年12月08日 17:50:26

    Android Studio应用开发简介

    、串口、以太网、U盘。后续将进一步完善对CAN、SPI、I2C、WIFI、4G等接口的支持。  Google公司专门为开发Android应用程序提供了集成开发环境Android Studio,涵盖
    发表于 10-20 11:27

    Android Studio由于下载的SDK Tools版本造成无法更新SDK问题

    /mirrors.opencas.ac.cn) 端口:80 4、上海GDG镜像服务器 sdk.gdgshanghai.com 端口:8000 5、电子科技大学 mirrors.dormforce.net 端口:80 其中,强烈推荐电子科技大学的镜像源! 再次打开Android S
    发表于 09-26 18:12

    Linux下配置Android Studio与Eclipse

    Studio 下载完解压缩到想放入的文件夹,如/opt/androidstudio,然后打开进入/opt/androidstudio/bin下运行
    发表于 09-27 16:52

    迅为4412开发板安装Android Studio(一)

    所示, 我们将网址拷贝到浏览器打开, 打开界面然后点击 DOWNLOAD ANDROID STUDIO, 会下载最新版的 AndroidStudio。2 勾选我已阅读并同意上述条款及条
    发表于 05-27 11:33

    更新studio出现无法进入调试模式的问题怎么解决?

    大家好,我更新studio,就出现无法进入调试模式的问题。下载是正常的,但是调试进不去。请问该如何解决?
    发表于 05-17 11:08

    更新DevEco Studio2.2.0.200预览器消失了是为什么?

    更新 DevEco Studio 2.2.0.200 预览器
    发表于 05-19 15:12

    Apress_Learn_Android-Studio_Built

    Android-Studio
    发表于 01-22 21:19 0次下载

    Android 仿乐淘的应用界面源码

    Android 仿乐淘的应用界面源码
    发表于 03-19 11:23 0次下载

    虚拟机:Ubuntu配置Android Studio的步骤

    虚拟机:Ubuntu配置Android Studio的步骤
    的头像 发表于 06-22 09:43 2527次阅读

    Android Studio Bumblebee 稳定版亮点与新功能

    一些值得注意的新增功能包括: Android Studio 和您的持续集成 (CI) 服务器之间的统一测试作业 、便捷的配对流程 (通过 Wi-Fi 即可连接 ADB)、经过改进的性能剖析工具以帮助您识别和分析应用中的卡顿 ,以
    的头像 发表于 03-11 14:14 3031次阅读

    详解Android Studio Chipmunk新增功能

    我们非常激动地宣布推出 Android Studio Chipmunk 稳定版: 构建 Android 应用的官方 IDE!虽然此版本并未对功能做过多改动,但里面包含了最新的 Inte
    的头像 发表于 06-28 17:57 1326次阅读

    Android Studio Dolphin稳定版正式发布

    为了帮助开发者们更轻松地打造高质量应用,Android Studio 团队深入调研,为大家带来了最新稳定版 Android Studio Dolphin (2021.3.1 版)。该版
    的头像 发表于 10-12 19:37 2072次阅读

    Android Studio引入AI编程助手Studio Bot

    谷歌在昨晚的 Google I/O 2023 大会上发布了用于 Android Studio 的 AI 编程助手 Studio Bot—— 支持生成代码和修复错误。Studio Bot
    的头像 发表于 05-12 14:53 1251次阅读
    <b class='flag-5'>Android</b> <b class='flag-5'>Studio</b>引入AI编程助手<b class='flag-5'>Studio</b> Bot

    Android Studio从入门到精通

    Android Studio从入门到精通.pdf
    发表于 08-14 15:05 3次下载