我的编程空间,编程开发者的网络收藏夹
学习永远不晚

检测和解决Android应用的性能问题

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

检测和解决Android应用的性能问题

  前言   无论你的应用多么有创新性、有用,如果它卡得要命,或者非常消耗内存,那么每人将会愿意使用它。   因此,性能变得尤为重要。当你忙碌于构建精美的用户界面或者完成新的特性时,你可能容易忘却掉一些性能相关的事情。   这也是为什么有Google Play的应用审核机制的原因之一。   这篇文章中,你会看到每个Android工程师需要了解的一些性能问题。你将会学会使用Android SDK提供的、已安装在你的设备中的工具来测试这些问题是否发生在你自己的应用中。   如果在你的应用中发现了一个性能问题,你肯定会想修复它。我们还会看一看如何使用Android SDK 工具来获取更多关于那些没有覆盖到的性能问题的相关信息。一旦你有了这些信息,你将会对如何提升应用性能有一个更深刻的理解,并且能够构建出让用户喜爱的App。   过度绘制   步骤1 : 问题描述   你应用的用户界面是连接用户的纽带,但是创建漂亮的界面只是挑战的其中一面,你还需要确保用户界面流畅的运行。   一个常见的问题是用户界面卡顿,出现这种情况的原因可能是overdraw。Overdraw是屏幕上的某个像素在同一帧的时间内被绘制了多次。   例如,想象一下一个有蓝色的背景文本,Android不仅会绘制对用户可见的蓝色区域,而是会绘制整个蓝色的背景以及上面的文本。这意味着一些像素会被两次绘制,这是过度绘制。   一些如上述例子所说的过度绘制示例是不可避免的。然而,过多的多度绘制会引发明显的性能问题,因此你必须将过度绘制的可能性降到小。   检测应用中的过度绘制相对来说比较简单。大量的过度绘制会引出其他用户界面相关问题,例如视图层级过于复杂等。基于这些原因,当你测试你的App的性能问题时,从过度绘制开始是一个明智的选择。   步骤2 : 检测过度绘制   好消息是你的Android设备上已经内置了检测过度绘制的工具。   因此你需要做的第一步是安装你要测试的App到你的设备中。然后打开设置页面,选择开发选项(Developer Options)->调试GPU 过度绘制(Debug GPU Overdraw),然后选择“显示过度绘制区域(Show overdraw area)”。如下图所示。

  这个工具使用色块来代表不同数量的过度绘制。剩下的事情是启动你要测试的应用,然后观察它的过度绘制情况。

  没颜色 : 没有过度绘制,也是说一个像素只被绘制了一次。   蓝色 : 过度绘制了一次,也是一个像素点被绘制了两次。   绿色 : 过度绘制了2次. 也是一个像素点被绘制了三次,通常,你需要集中精力优化过度绘制次数大于等于2次的情况。   浅红色 : 过度绘制3次。这取决于你的应用,小范围的3次过度绘制可能是不可避免的,但是如果你看到了中等或者大量的红色区域那么你需要查找出现这个问题的原因了。   深红色 : 过度绘制4次,像素点被绘制了5次,甚至更多次。出现这种问题你绝逼要找到原因,并且解决它。

  步骤3 : 小化过度绘制   一旦你发现了某个区域有严重的过度绘制,简单的方法是打开你应用的xml文件找到过度重叠的区域,特别是那些不可见的drawable对象和被绘制在其他控件上的背景,以此来降低这些地方的过度绘制。   你也应该查找那些背景属性设置为白色,并且它的父视图背景也设置为白色的区域。所有这些都会引起严重的过度绘制。   Android系统能自动的降低一些简单的过度绘制,但是这些对于复杂的自定义View并没有什么价值,因为Android不会知道你如何绘制你的内容。   如果你在App中使用了复杂的自定义View,你可以为使用clipRect函数为你的视图定义可绘制区域的边界。更新相关信息可以参考official Android documentation.   ## 2. Android 图形渲染   步骤1 : 问题描述   另一个常见的性能问题是应用的视图层级。为了渲染每个视图,Android都会经历这三个阶段 :   测量   布局   绘制   花在这三个阶段的时间与View层级中的View的数量成正比,这意味着降低App渲染时间的简单的方法是识别和移除那些并没有什么卵用的UI元素。   即使在你的视图层级上的所有View都是必须的,不同的布局方式也可能对测量过程产生重要的影响。通常来说,你的视图层级越深,花在测量视图的时间越长。   在视图渲染期间,每个View都要向它的父View提供它自己的尺寸。如果父view发现了任意一个尺寸问题,那么它会强制要求所有的子视图重新测量。   即使没有错误发生,重新测量也可能出现。例如,为了正确的进行布局RelativeLayout通常会对它们的子视图进行两次测量。子视图使用了layout_weight属性的LinearLayout也会对它的子视图进行两次测量。   这些都取决于你的布局方式,测量和重新测量的代价非常昂贵,它会严重影响你的渲染速度。   确保你的用户界面渲染流畅的关键是移除任何非必须的View以及减少你的View层级。   Hierarchy Viewer是一个能够将你完整的View层级可视化的工具,这个工具能够帮助你发现冗余的View以及嵌套的布局。   步骤2:使用 Hierarchy Viewer   在我们进一步了解Hierarchy Viewer之前,你需要知道它的一些规则。首先Hierarchy Viewer只能与正在运行的App进行交互,而不是你的源代码。这是说你需要将App安装到你的设备或者模拟器上。   还有一个重要的问题,是默认情况下Hierarchy Viewer只能与运行开发版Android系统的设备进行交互(译者注: 一般来说,使用模拟器即可)。如果你没有开发设备,那你需要添加ViewServeclass到你的应用中。   了解这些之后让我们打开Android Studio,并且选择”tools” -> “Android” -> “Android Device Monitor”,如图所示。

  然后点击Hierarchy View按钮,如下图所示。

屏幕左边的Windows标签下列出了所有Android设备和模拟器。选择你的设备后,你会看到你设备上运行的所有进程。选中你要检测的进程,然后你会看到三个自动更新的视图层级区域。   这三个窗口提供了视图层级的三个不同可视化展示。   Tree View: **** 视图层级窗口,每个节点代表了一个View;   Tree Overview: 整个视图层级的缩略布局;   Layout View: 当前视图层级的轮廓.   Hierarchy View中有三个窗口。如果你在一个窗口中选择了一个View,那么它会在另外两个中高亮显示。你能同时使用这三个窗口查找View层级中的冗余视图。

  如果你不确定一个View是否是UI界面中的必须元素,简单的方法是到Tree View窗口点击这个节点。你将会看到该View是如何显示在屏幕的预览,此时你可以确切地知道该View是否是必须的。   但是即使一个View对终的渲染效果有贡献也并不意味着它不会引起严重的性能问题。你已经看到了如何通过Hierarchy Viewer来找到明显的嵌套布局,但是如果这引起的性能问题并不那么明显呢?或者还有其他的原因使得该视图渲染得非常慢?   好消息是你还可以通过Hierarchy Viewer来剖析每个View在不同的渲染阶段的耗时。当性能问题的原因不那么明显时,这是你发现问题的另一途径。   下个章节我将为你展示如何通过Hierarchy Viewer来剖析每个View的渲染时间来找到潜伏在问题表面的性能问题。   步骤3 : 节点的性能分析   定位你的用户界面瓶颈的简单方法是收集每个View分别完成测量、布局、绘制的时间。   你不仅可以通过Hierarchy Viewer收集这些信息,Hierarchy Viewer还可以通俗易懂地向你展示这些数据,因此你可以通过这种形式来找到性能问题。   Hierarchy Viewer默认并不会显示渲染时间。你需要到Tree View窗口添加这个信息,然后选择你想要测试的根节点。下一步,在Hierarchy Viewer上点击由绿、红、紫的三个圆形色块组成的按钮,如图所示。

  三个圆点色块会显示在每个节点上,从左到右,这些圆点分别代表 :   用于测量的时间   用于布局的时间   用于绘制的时间   每个圆点都有颜色 :   绿色 代表该View的渲染速度至少要快于一半以上的其他参与测试的节点。例如,一个在布局位置上的绿色的圆点代表它的布局速度要快于50%以上的其他节点;   黄色 代表该View慢于50%以上的其他节点;   红色 代表该View的渲染速度比其他所有参与测试的节点都慢。

  当收集了这些数据之后,你不仅知道哪些View需要优化,你还会确切地知道是在渲染的哪个阶段导致的问题。   哪些黄色、红色的地方是你需要开始优化的地方,这些性能指标与该视图层级下的其他剖析节点也有关系。换句话说,你肯定会有一些视图渲染得比其他的慢。   在开始改良你的View相关的代码之前,摸着你的良心问一句该View渲染得比其他视图慢是否有一个合理的原因,如果答案是否定的,那么开始你的View优化之旅吧。   3. Memory Leaks 内存泄漏   步骤1:问题描述   Android是一个自动管理内存的开发环境,不要让这个句话蒙蔽了,因为内存泄漏依旧是可能发生的。这是因为垃圾回收器只会移除那些不可达的对象。如果它不是一个不可达的对象,那么该对象不会被释放掉。   这些不可达的对象阴魂不散,聚集在你的堆内存中,占用App的内存控件。如果你继续泄漏对象,那么可用的内存空间将会越来越小,GC操作会频繁触发。   有两个原因表明这是一个坏消息。首先,GC操作通常不会明显地影响你的App性能,但是当内存控件较小时大量的GC操作会使你的App变慢,此时UI不会那么流畅了。第二问题是移动设备的内存空间相对来说较小,因此内存泄漏会快速地升级为内存溢出,导致应用Crash。   内存泄漏难以被检测出。可能只有当用户开始抱怨你的应用时你才能发觉内存泄漏问题。幸运地是,Android SDK提供了一些有用的工具来让你找到这些问题。(译者注 : Square的开源库LeakCanary是查找内存泄漏的工具,强烈建议大家使用)。   步骤2 : 内存监视器 (Memory Monitor)   Memory Monitor是一个能够实时获取应用内存使用情况的工具。需要注意的是这个工具只能作用于正在运行的应用,因此确保你的要测试的应用已经安装到你的设备中,并且你的设备已经连接到你的电脑上。   Memory Monitor已经内置在Android Studio中,因此你可以点击Android Studio的底部的”Memory”这个tab来切换到内存监视页面。当你切换到该页面的时候,Memory Monitor开始记录你的内存使用情况了。

  如果Memory Monitor没有开始记录,那么确保你的设备是已经被选中的状态。   如果Memory Monitor提示No debuggable applications,那么你可以打开Android Studio的”Tools”菜单,选择”Android”,然后确保选中了Enable adb integration。这个功能还不是很稳定,所以有时候你需要手动切换它的状态。你也可以断开设备与电脑的连接,然后再重连,这样可能OK了。   一旦Memory Monitor检测到正在运行的应用,它会显示这个应用的内存使用情况。已使用的内存会被表示为深蓝色,未分配的内存则会变为浅蓝色。   花一些时间与你的设备交互,并且关注你的内存使用情况。终已分配的内存会增长,直到没有内存可用。此时,系统会释放触发GC释放内存,当你看到已分配的内存明显的下降时代表GC操作被触发了。   GC通常情况下会将无用的内存释放掉,但是当你看到App在短时间内快速增长或者GC变得非常频繁,此时你需要倍加小心了,这是发生内存泄漏的信号!   如果你通过Memory Monitor来追踪一个可疑的内存泄漏问题,你可能会看到Android系统会为你的App增大可用内存,TODO : 。   终,你可能会看到你的App消耗了非常多的内存以至于系统无法再给你的应用更多的可用内存。如果你看到这种场景,那么说明你在内存使用上犯了很严重的错误。   步骤3 : Android Device Monitor   另一个能够帮助你收集更新关于内存泄漏信息和其他内存相关问题的工具是Android Device Monitor的DDMMS工具下的Heap。   Heap工具能够通过显示系统为你分配了多少内存来帮助你诊断内存泄漏问题。正如上面提到的,如果已分配的内存不断地增长,那么这是发生内存泄漏的明显信号。   但是这个工具还提供了许多关于你的应用堆内存使用情况的数据,包含你的App内分配的各种对象、分配的对象数量以及这些对象占用了多少空间。这些额外的信息对于你追踪内存泄漏极为有用。   你可以在Android Device Monitor工具中选择DDMS,在Devices中选择你要检测的App。然后选择Heap标签,如图所示。然后花一些时间与你的App进行交互以收集内存信息。

  heap输出信息会在GC事件之后,因为你可以手动点击Cause GC来触发GC,使得Heap内存数据尽快地显示出来。   一旦GC事件被触发了,heap标签下会更新App的堆内存使用信息,这些信息会在每次GC时更新。   ## 总结   在这篇文章中,我们学习了一些开发中常见的性能问题,过度绘制、内存泄漏、缓慢的UI渲染。   相信你已经掌握了如何使用工具来检查这些问题,以及如何获取更新的信息来判断你的应用中是否出现了这些性能问题。你有越多的信息,越容易追踪到问题的原因并且修复它。   Android SDK有很多工具可以供你诊断和定位性能问题。如果你想学习更多这方面的知识,你可以访问u这两篇官方文档 Traceview and dmtracedump和 Allocation Tracker.


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

检测和解决Android应用的性能问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

检测和解决Android应用的性能问题

前言无论你的应用多么有创新性、有用,如果它卡得要命,或者非常消耗内存,那么每人将会愿意使用它。因此,性能变得尤为重要。当你忙碌于构建精美的用户界面或者完成新的特性时,你可能容易忘却掉一些性能相关的事情。这也是为什么有Google Play的
2022-06-06

MongoDB怎么检测和解决死锁问题

在MongoDB中,死锁问题通常是由于并发操作导致的,解决死锁问题通常需要对数据库的设计和应用程序的并发控制进行优化。以下是一些检测和解决MongoDB死锁问题的一般步骤:监控数据库性能:使用MongoDB的性能监控工具,如mongost
MongoDB怎么检测和解决死锁问题
2024-04-19

Linux中怎样检测和解决网络问题

在Linux中检测和解决网络问题通常需要使用一些命令行工具和技巧。以下是一些常用的方法:使用ping命令来测试网络连接是否正常,例如ping google.com可以检测您的计算机是否能够与Google的服务器通信。使用tracerout
Linux中怎样检测和解决网络问题
2024-03-13

PHP 应用程序性能优化的关键问题和解决方法

php 应用程序性能优化的关键问题包括:慢速数据库查询:使用索引、优化查询和缓存查询结果。内存限制:使用内存分析工具、增加内存分配和优化代码。慢速网络请求:使用缓存、优化并行请求和启用 http 压缩。i/o 操作:优化文件 i/o、使用异
PHP 应用程序性能优化的关键问题和解决方法
2024-04-30

如何解决WEB性能测试中的验证码问题

如何解决WEB性能测试中的验证码问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。现在越来越多的网站为了安全性或是防止Spam的侵害,采用了验证码的校验技术。简单地说,验证
2023-06-04

Android的EditText字数检测和限制解决办法

Android的EditText字数检测和限制解决办法 控件EditText在Android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输入框中输入的内容。public clas
2022-06-06

Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

前言:最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来。所以决定抽空学习总结一下这方面的知识,以及
2022-06-06

MySQL中如何通过循环检测并解决数据完整性问题

在MySQL中,可以通过使用存储过程来循环检测并解决数据完整性问题。以下是一个简单的示例,演示了如何使用存储过程来检测并解决某个表中的数据完整性问题:假设有以下表结构:CREATE TABLE student (id INT PRIMA
MySQL中如何通过循环检测并解决数据完整性问题
2024-04-30

轻量应用服务器性能不好怎么解决问题

轻量应用服务器性能不好通常可以通过以下方法解决:优化应用程序代码:可以使用代码优化工具或脚本来修复应用程序代码中的问题。使用优化技术:可以使用缓存、优化的IO、高效的数据库、缓存一致性等技术来提高应用程序的性能。配置合理的应用程序参数:可以通过配置数据库、网络带宽、操作系统、应用程序版本等参数来提高应用程序的性能。使用多种技术:可以使用多种技术来提高应用程序的性能,如分块技术、内存回收
2023-10-26

PHP应用程序中的内存泄露:原因、检测和解决

php 内存泄露是指应用程序分配内存后未能释放,导致服务器可用内存减少和性能下降。原因包括循环引用、全局变量、静态变量和扩展。检测方法有 xdebug、valgrind 和 phpunit mock objects。解决步骤为:识别泄漏源、
PHP应用程序中的内存泄露:原因、检测和解决
2024-05-09

如何在Oracle中查找和解决性能问题

在Oracle中查找和解决性能问题通常涉及以下步骤:识别性能问题:首先要确定哪些查询或操作导致了性能问题。可以通过监视系统性能指标、查看数据库日志、使用性能监视工具等方法来识别性能问题。分析性能问题:一旦确定了导致性能问题的查询或操作,就需
如何在Oracle中查找和解决性能问题
2024-04-09

MySQL中如何解决慢查询和性能问题

解决MySQL中慢查询和性能问题的方法有很多,以下是一些常见的解决方案:使用合适的索引:索引能够加快数据的检索速度,提高查询性能。在使用索引时,需要根据查询条件和表结构来选择合适的索引类型,避免创建过多或不必要的索引。优化SQL查询语句:对
MySQL中如何解决慢查询和性能问题
2024-03-06

解决Android SDK Manager不能更新的问题

有几种可能的解决方法来解决Android SDK Manager无法更新的问题:1. 检查网络连接:首先确认你的网络连接是否正常。如果你的网络连接不稳定或速度较慢,可能会导致SDK Manager无法正常更新。尝试连接到一个稳定的网络并重试
2023-10-12

Android应用中clearFocus方法调用无效的问题解决

clearFocus 无效 EditText在focus与非focus的时候,显示效果是不同的:focus的时候光标是闪的,而且我们通常也会给它设置selector,focus的时候给它加上边框之类的. 通常当我们触摸EditText之外的
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录