应用性能监控:使用Android Profiler和友盟+U-APM解决Android卡顿问题

本文涉及的产品
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
简介: 作为⼀款倒计时⽇历 APP, 我们需要对每个⽇期实时显示倒计时并精确到秒。但是我们的 app 在滑动刷新数据时,会出现卡顿。卡顿在很⼤程度上取决于设备的 CPU 和其他消耗 CPU 时间的进程。于是我们尝试使⽤了友盟 + U-APM 内存分析对 APP 进⾏分析。

「2021友盟+动应⽤性能挑战赛中的参赛作品,该⽂章表述了作者如何借友盟+U-APM进⾏了性能化。

为⼀款倒计时⽇历APP需要个⽇实时显示倒计时并精确到秒。但是我app在滑刷新在很程度上取设备CPU和其他消耗CPU时间程。于是我们尝试使友盟+U-APM存分析APP进⾏分析:

1.jpg

过观存的分布, 部分程序的运⾏于可预测的范围内, 我需要更加粒度地进⾏测

启动AndroidProfilerToolWindow,CPUProfiler并选择正确的时间线接我测试设备并再次进⾏刷新,可以看到Profile线程被添加到应⽤进消耗了外的CPU时间看看Logcat

I/Choreographer: Skipped 147 frames! The application may be doing too much

CPUProfiler时间线

2.jpg

表上⼀个视图表示⽤户与应⽤程序的交互。所有⽤户输⼊事件在此处显⾊圆圈。可以看到⼀个圆圈,代表我们为刷新⽽执⾏的滑动。在事件下,有⼀个 CPU 时间线示了CPU 总时间应⽤程序和 其他程的CPU 使率。可以应⽤程序正在使线

底部可以看到应⽤进程的线程活动时间线个线于由颜⾊指示的三种状态绿⾊、等待⻩⾊或睡眠(灰

在列表部, 可以找到应⽤程序的主线程。在我的设备 (Nexus 5X) 上,使CPU 时间⼤ 5秒。我可以记录⼀个⽅法跟踪来查看。

在滑之前单击记录以刷新操作据刷新完成后即停⽌记录

3.jpg

们将从⼀个选项卡中示的始分析。横轴代表时间的流逝。

调⽤者及其被调⽤上到下)  示在垂直上。调⽤也通过颜⾊区分,具体取于是API、第三API是我本地函。每个⽅调⽤总时间时间及其被时间和:

4.jpg

从这张图表中,可以推出性能问题出在generateItems部。证实的推们⼜使友盟+U-APM进⾏线测试测试结果和前相同,下友盟+ U-APM的卡分析测试中展示了主要是法造成了CPU致了卡发⽣

5.jpg

揭示了法占宝贵CPU时间聚合了相同的调⽤

6.jpg

发现两个可疑的地getRemainingTime个⽅执⾏时间达2秒以上,LocalDateTime.formatCPU时间1秒以上:

7.jpg

时间还包括线程未于活动状态时间段。另外,可以切要在线时间示的计时信息。最后⼀个选项卡中的示按CPU时间消耗降序排列的调⽤列表。该图表提供详细信息(以微秒为单

8.jpg

从图表中取消耗CPU时间法的计时信息。将它们与调⽤中的两个⽅法相关联

class  method total time (in ms) percentage of recorded duration

Sample1Activity refreshData 3027   89.28

Sample1Activity generateItems  3025   89.22

Sample1Activity getRemainingTime   1723   50.83

LocalDateTime  format 1003   29.59


可以看到getRemainingTimeLocalDateTime.format消耗了超80%时间了解顿问题需要从这⾥⼊⼿么该怎么办明的者可能已提出了⼏种决⽅案。 由于我们执⾏算, 所以我数当示和准备显示的项⽬调⽤getRemainingTimeLocalDateTime.format⽅法。

实现它需要更新Item性,保存必要的据以便稍后执⾏格式化:

data class Item(val now: LocalDateTime, val offset: Int)

 需要在generateItemsbindItem应⽤以下更改:

private fun generateItems(): List<Item> {

val now = LocalDateTime.now()

return List(1_000) { Item(now, it + 1) }

}

private fun bindItem(holder: ViewHolderBinder<Item>, item: Item) = with(

valdate=item.now.plusDays(item.offset.toLong()).toLocalDate().atS

val remainingTime =getRemainingTime(item.now,date)

9.jpg

们内联createItem 在所有函都在 bindItem 部。在我的代修改效之后, 重新启动 CPU Profiler 并记录⽅法的运⾏

检查化是否成功,需要CallChart

10.jpg

将⿏标移到generateItems上,会发现现在耗时约为0.3秒。⽐优化前少了13倍以上的CPU时间了确保我的更改不会对bindItem法的耗造成负⾯增益,我图标来检查bindItem时。如图所示,最多消耗0.1秒:

11.jpg

此外,可以进⾏滚动测试以确保我的代码优化不整体应⽤程序的性能,且在动过程中加以记录测试发现滚动之后不再出和掉的情了。成功!优化!AndroidProfiler友盟+U-APM都是很好的测试⼯具。如果我追求流⽤户使⽤这秀的debug具是分必要的。在本中, 我主要注性能调优

但是,中未涵盖的AndroidProfilerMemoryProfilerNetworkProfiler友盟+U-APM存分析、OOF常和存占也同样值究。记录内存分配对查存泄漏有很助,例如代中有有回收bitmap⽆论如何, 使的分析具可以带来项优化成果, 期待⾃⾏探索。

 

作者:查宇

相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
相关文章
|
4天前
|
搜索推荐 Java Android开发
打造个性化安卓应用:从设计到发布的全程指南
【9月更文挑战第15天】本篇文章将带领读者踏上一段激动人心的旅程,从构思一个独特的安卓应用想法开始,直至将其变为现实并成功发布。我们将一起探索如何捕捉灵感、设计界面、编写代码以及最终将应用推向市场。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供宝贵的洞见和实用的技巧,让你的应用在竞争激烈的市场中脱颖而出。
35 17
|
1天前
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
18 3
|
1天前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
12 2
|
9天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
23 5
|
7天前
|
Android开发 开发者 Kotlin
告别AsyncTask:一招教你用Kotlin协程重构Android应用,流畅度飙升的秘密武器
【9月更文挑战第13天】随着Android应用复杂度的增加,有效管理异步任务成为关键。Kotlin协程提供了一种优雅的并发操作处理方式,使异步编程更简单直观。本文通过具体示例介绍如何使用Kotlin协程优化Android应用性能,包括网络数据加载和UI更新。首先需在`build.gradle`中添加coroutines依赖。接着,通过定义挂起函数执行网络请求,并在`ViewModel`中使用`viewModelScope`启动协程,结合`Dispatchers.Main`更新UI,避免内存泄漏。使用协程不仅简化代码,还提升了程序健壮性。
20 1
|
15天前
|
XML Java Android开发
探索Android开发之旅:打造你的第一个应用
【9月更文挑战第4天】在这篇专为初学者设计的文章中,我们将一起踏上激动人心的Android开发之旅。从设置开发环境到实现一个简单的“Hello World”应用,每一步都充满了发现和学习。文章将引导你理解Android开发的基础知识,并鼓励你动手实践。让我们开始吧,创造你的第一款Android应用,开启技术世界的新篇章!
|
17天前
|
存储 缓存 搜索推荐
打造个性化天气应用:Android 平台上的天气预报小助手
【9月更文挑战第2天】在这篇文章中,我们将一起探索如何从零开始构建一个简单却功能强大的天气应用。通过这个指南,你将学会如何在 Android 平台上使用 Java 编程语言和相关 API 来创建你自己的天气预报小助手。文章不仅提供了代码示例,还深入讨论了设计思路、用户界面优化以及数据管理等关键方面,旨在帮助初学者理解并实现一个完整的应用项目。
|
20天前
|
搜索推荐 IDE 开发工具
打造个性化安卓应用:从零开始的Flutter之旅
在数字时代的浪潮中,拥有一款个性化且高效的移动应用已成为许多创业者和企业的梦想。本文将引导你使用Flutter框架,从零基础开始构建一个安卓应用,不仅涉及界面设计、功能实现,还包括性能优化的关键技巧。通过简洁易懂的语言和实用的代码示例,我们将一起探索如何让你的应用在众多竞争者中脱颖而出。 【8月更文挑战第31天】
|
20天前
|
存储 开发工具 Android开发
打造你的专属安卓应用:从零开始的Flutter之旅
【8月更文挑战第31天】在数字时代的浪潮中,拥有一款属于自己的应用不仅是梦想的启航,也是技术实力的展现。本文将引导你使用Flutter框架,轻松步入安卓应用的开发世界。无论你是编程新手还是希望拓展技能边界的开发者,跟随这篇指南,你将学会如何搭建开发环境、设计用户界面,并实现基本功能。让我们一起探索代码的力量,开启一段创造之旅吧!