没有合适的资源?快使用搜索试试~ 我知道了~
首页移动App性能优化实战:内存管理与效率提升
移动App性能优化实战:内存管理与效率提升
需积分: 0 5 下载量 114 浏览量
更新于2024-07-01
收藏 15.63MB PDF 举报
"《移动App性能评测与优化实战1》是一本由TMQ专项测试团队编著的专业书籍,针对当前移动设备广泛应用的背景下,移动应用程序性能优化的重要性和挑战进行深入探讨。作者在书中详细解析了移动App在实际使用中可能出现的问题,如内存占用过高导致的卡顿和发热,以及影响用户体验的流畅度问题。 首章关注的是降低待机内存,章节分为新手入门和逐步深入部分。作者介绍了规范的测试流程,包括 DalvikHeap 测试的常见问题和解决方案,如内存碎片管理和理解Dalvik内存的工作机制。此外,还通过案例研究了优化Dex文件对内存的影响,强调了理解class对象和内存消耗的重要性。 第二章聚焦手机发热问题,提供了电量测试的硬件和软件方法,并讲解了四种电量优化策略:CPU时间片管理、wakelock优化、传感器管理以及云省电技术。这些方法旨在帮助开发者降低应用程序的功耗,提升设备续航。 第三章探讨了流畅度评测,阐述了评测方法,指出仅依赖SM工具可能不够全面。书中提供了流畅度优化的案例,涉及UI层、代码审查、逻辑层和IO层的优化,分享了实际优化的经验。 第四章则着重于导航评测,讨论了路线规划评测的不同方法,如人工、路测和自动化测试,以及如何识别和处理badcase,给出了适用于不同情况的自动化评测方案,旨在确保地图导航功能的准确性和稳定性。 《移动App性能评测与优化实战1》提供了一套实用的方法论和策略,帮助移动应用开发者解决性能瓶颈,提升用户满意度,是移动开发人员提升技能和应对市场竞争不可或缺的参考书。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86278139/bg10.jpg)
图1-3 典型的内存泄漏
发现了内存泄漏,通常就可以交给开发去处理了。但我们并不只是给开发人员丢一个问题描述和复现路径过去,而是利用手头的工具,获得一些更详细的数据,能够使大家更快地定位和解决问
题,并对内存进行分析。这样分析内存获得详细数据的首选工具就是Eclipse Memory Analyzer Tool(MAT)。
MAT是使用非常广泛的Java内存分析工具,功能强大。已经有很多关于它的详细教程,在本书中就不再细述用法。本节主要介绍使用MAT在分析Android应用时的一些常用技巧。
通常我们用MAT打开hprof文件后,能够在首页看到Top Consumers和Component Report等功能,使用这些功能能够快速定位一些大块的内存消耗。但对于Android应用的hprof文件,我们在使用了Top
Consumers统计使用情况后,往往只能看到如图1-4所示的情况。
图1-4 使用MAT分析内存构成
系统的资源类占据了很大一部分的内存,而其余的前几名也往往是系统类。这是由于从虚拟机角度不会区分系统框架和应用自身的对象,后面的1.4.3节会详细说明出现这种现象的原因。
为了去除这部分对分析的干扰,我们在用AndroidSDK提供的hprof-conv转换时需要增加一个参数:
hprof-conv [-z] <infile><outfile>
-z: exclude non-app heaps, such as Zygote
另一种可替代的方法是使用OQL。如果hprof文件是已经转换过的,可以在数据中寻找应用的Application类对象,将对象地址转换为十进制后输入以下查询语句:
select * from instanceof java.lang.Object s where s.@objectAddress > 1107296256
使用-z参数转换或OQL查询后得到的对象集合就只包含应用代码分配的部分了。在此基础上使用MAT提供的Top Consumers和Component Report等功能就能够得到比较准确的结果,如图1-5所示,没
有了系统类所占内存的干扰,只有应用自身代码创建的对象,对于发现内存问题比较有帮助。
![](https://csdnimg.cn/release/download_crawler_static/86278139/bg11.jpg)
图1-5 分离之后再次分析内存构成
对于一般的内存泄漏类问题,使用以上方法后通过MAT提供的分析报告就很容易识别出来。在我们以往的测试经历中,用这种方法发现了上百次的内存问题。这些内存往往是加载后忘了释放的
Bitmap,临时生成的byte数组和文件缓冲区,包含Handler的Activity,等等。
接下来我们看一个真实的应用测试案例。在这个案例里,有些位图在使用完之后由于种种原因,一直没有销毁而存在于ImageLoader里,使用一段时间后ImageLoader会变得越来越庞大。使用上面
介绍的方法去除了系统的影响后,MAT的泄漏报告给出了结果,如图1-6所示,ImageLoader消耗了接近1/3的内存。
有了这样的数据,接下来就可以结合图片追踪代码,看引用到ImageLoader的代码部分哪里有问题,从而快速修复问题。
![](https://csdnimg.cn/release/download_crawler_static/86278139/bg12.jpg)
图1-6 MAT识别出来的问题
![](https://csdnimg.cn/release/download_crawler_static/86278139/bg13.jpg)
1.2 规范测试流程及常见等问题
最开始进行内存测试时,我们可能还有些摸不着头脑,试着找了些工具,看了看教程就开始动手了。有时候因为问题比较明
显,就真的发现了问题。再之后遇到类似的测试需求,我们就会按上次的经验去做。有时候可能发现问题,也可能发现不了,还
有些时候甚至是在白费工夫。因为随着明显的问题逐渐被找出来,剩下的都是更加复杂而不太明显的问题了,甚至有些问题更是
可以归属到优化范畴或者产品策略之内,而不再是简单的内存问题。
随着经验的逐渐增加,我们逐渐意识到,以前的很多测试方法都属于随机乱测。对于较为成熟的软件,这类方法的测试有效
性往往比较低,运气好了才会遇到问题。如果是较深层次的问题,要么遇不到,要么遇到了也找不出原因。因此,有必要总结出
一套成熟的流程方法,能够考虑到各个方面,才能提高测试的有效性。
![](https://csdnimg.cn/release/download_crawler_static/86278139/bg14.jpg)
1.2.1 测试流程
由于内存测试属于性能测试,Android系统又和Linux有很多相通之处,因此我们可以参考常见的Linux性能测试方法和指标,
来制定客户端性能测试方案。常见的测试方法包括Monkey/UIAutomator类的常规压力测试、大数据/操作的峰值压力测试、长时间
运行的稳定性测试等。这些方法都可以叠加在内存测试的方案中,观察这类场景下的应用内存情况,经常能够发现类似内存泄漏
或OOM的问题。
参考了常见性能测试的方案,以及总结了以往对内存性能测试的经验后,我们总结出了一套进行内存测试的经验性流程,下
面介绍这个流程中的要点。
1.代码
通常用来进行内存测试的版本是纯净版本,不应该附加多余的Log和调试用组件。例如有些情况下,为了测试界面延迟/函数
执行时间等性能,会加入一些桩点代码。在内存测试中这些代码是不必要的,它们可能会分配临时内存,引起更多的GC,导致
应用出现运行缓慢、卡顿等现象。
2.测试场景
测试场景通常有两类。一类是当前有新开发或改动的某项功能,需要对该功能进行性能测试。因此测试场景主要针对该功能
组织,包括功能的开启前、运行、结束后等测试点。另一类是整体性能,考察应用的常见场景,在综合使用情况下的性能指标。
测试场景应当包括启动后待机,切换到后台,执行主要功能,以及反复执行各功能后。
在各类场景中,经常作为测试重点的有:
·包含了图片显示的界面。
·网络传输大量数据。
·需要缓存数据的场景。
3.场景转换成用例
选取了测试场景后,用例设计也要考虑内存测试的特点。一些常见的方法是:
·结合场景比较操作前后或不同版本的内存变化。
·显示多张图片的前台进程。
·多个场景来回切换。
·长时间运行进程的内存增长。
4.执行
由于GC和广播机制的存在,应用内存通常都在不停地波动,幅度可能会达到几百KB,因此执行时需要考虑这种情况。在采
集数据时,需要多次采集并计算平均值。
执行完成,我们就可以根据数据进行比较初步的分析以确定方向。一方面是我们熟悉的Dalvik Heap部分,即由Java代码直接
分配的内存,可以通过IDE直接观察到使用情况,也可以使用MAT进行细致的分析。
剩余201页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)