腾讯优测是专业的移动云测试平台,为应用、游戏、H5混合应用的研发团队提供产品质量检测与问题解决服务。不仅在线上平台提供app自动化测试、云真机远程操控与调试、私有自动化测试等多种质量检测工具,更为VIP客户配备了专家团队提供定制化综合测试解决方案。
-----------------------------------------------------------------------------------------------
在进行Android内存泄漏分析时,面对成千上万个对象,你是否蓝瘦,香菇?作为测试人员你在进行内存泄漏测试之后,是否有勇气告诉开发同事程序已经没有内存泄漏,可以放心发布了?
众所周知,内存泄漏测试难点在于准确的定 位出泄漏的对象。现在小哥有种方法通过一条命令就全面的得到Android程序内存泄漏对象,让你不再蓝瘦,香菇!
一、Android内存泄漏自动化分析方法
目前我知道的几种常用的Android内存泄漏方案主要有MAT、腾讯内部开发的Finder、LeakCanary以及浏览器目前使用的QB方案。
几种方法,我们通过以下的几个纬度进行对比。
原始的Java内存泄漏分析方式,是通过MAT将测试操作前后的Hprof文件进行对比,然后根据对比结果来尝试识别出泄漏对象,这种方法效率比较低。
如果使用腾讯的Finder工具来进行泄漏分析,效率将会提高很多,但还是手动执行,也存在时间浪费的问题。
也可以使用LeakCanary或者腾讯自研的LeakInspector来测试,由于这两个工具是自动分析,效率会更加。但需要修改代码,把工具的SDK引入到工程中。此外针对不退出Activity的测试场景,不能很好的处理。
而我们的分析方法,一条命令就可以完成分析,并输出详细的泄漏对象,以及调用关系。
从前面的表中可以看LeakCanary各方面都挺,但是我们为什么没有使用它呢?这是因为Q Q浏览器很多场景都是在MainActivity中进行的,比如打开网页,此时MainActivity并不会Destroy,直接使用LeakCanary无法进行泄漏分析,因此我们才考虑自己实现一个分析工具。
在Q Q浏览器项目中,使用的分析工具叫做HprofComparator,这是我们自己开发的一个Eclipse Application,其原理与Finder的对比原理一致,但是加入了泄漏分析的策略,可以通过命令行直接运行,更加的。
二、浏览器内存泄漏测试方案实施
1. 测试场景选择
做内存泄漏测试一定要全面的测试才敢通知项目组放心发布,目前Q Q浏览器选择对所有的画面进行泄漏排查。
内存出现泄漏的前提条件一定是有新的内存分配,所以测试场景会选择有新对象创建的场景,并结合用户的使用场景和频率来确定优先级。测试场景主要有以下三种情况:
新画面打开
由于新的画面打开,就会创建新的Activity,并有许多其他对象被创建。
画面旋转
当屏幕旋转时,Orientation设置发生了改变,当前显示的Activity会被重新创建。
滑动屏幕
滑动屏幕会使屏幕中显示的对象(比如浏览器小说阅读内容)创建。
2. 内存泄漏分析
测试方法就是重复运行以上选择的场景,将整个测试过程分几个阶段获取到Hprof文件并保存。这个过程不详细阐述,下一部分会阐述我们的自动化方案。我们先看下拿到Hprof文件后人工分析的过程。
浏览器的内存分析工具运行的方法如下图所示:
首先从图中可以看出 NewActivity 的对象泄漏了,该对象在操作过程中新创建出5个对象,内存增长了93696字节,内存中该对象的总数量为13个。
接着从图中的调用关系可以分析出,TextManager有一个listeners的数组持有了 NewActivity 的对象。
后对比源代码查看输出结果可以一目了然的看出TextManager是一个单例的对象,而泄漏对象应该是注册了TextManager 的 ITextChangeListener,没有取消注册引起的泄漏。
我相信当测试人员把泄漏对象的根因连同Bug一起提交给开发时,开发同事们一定会觉得你很牛X。
此外泄漏分析过程中还有一种常见情况,就是很多对象泄漏是因为同一个原因,如下图是通过Finder对比得到的结果
如上图所示,B和C都为泄漏嫌疑,从B和C的Callstack可以看出B是C的父对象(B引用C),因此只要B释放了,C也会释放。这种情况时我们就会将C 合并到B,终结果输出B。如前面的 suspicion 文件内容中显示,有92个对象被duplicate到了 NewActivity 上。这样做之后输出结果会被大量的精简,需要分析原因的对象数量将会大大减少,节省了许多的时间。
3. 关键字驱动的自动化方案
在Q Q浏览器项目中一开始还是人工获取Hprof文件,这样做的测试效率比较低。为了提高测试效率我们也引入了自动化测试,但如何才能让自动化测试投入产出比比较高呢?
在分析了我们的测试场景和测试执行过程后,我发现内存泄漏测试基本上可以分为做操作和获取Hprof文件,而操作又分为点击、滑动、旋转屏幕、等待和输入文字等。整个测试过程中除了需要确保操作是正确的外,并不需要功能的验证。
基于这些特点,我选择关键字驱动的自动化方案,就是为了以简便的方式来实现自动化,减少开发和维护成本。
如下图所示,在测试打开小说书城的场景,需要启动程序,然后点击小说入口,然后返回,需要重复打开小说的过程。在脚本中直接省略了打开应用程序的操作,repeat关键字说明后续的步骤是需要重复操作的,而点击小说入口则仅以“小说”替代。这样就使测试脚本足够简单,任何刚入门的测试人员都可以完成。
三、后续思考
由于浏览器的内存泄漏分析方法与被测试的应用无关,后续将考虑实现泄漏分析平台化,这样可以让更多的项目快速的应用起来。
目前在浏览器项目使用了一种的基于模型的用例生成方法,但模型需要人工创建,以后可以尝试对任意的应用程序自动生成模型并自动创建用例。
安卓测试:https://utest.21ku***
安卓测试简述Android程序内存泄漏问题
大连网站/软件服务相关信息
2023-10-18
2023-09-15
2023-09-14
2023-09-13
2023-09-12
2023-09-09
2023-09-08
2023-09-07
2023-09-06
2023-09-04