Android 性能测试实践(一)

简介:

前言:

前段时间花了两周的时间做了一个基于Android 客户端的性能测试现在分享给大家,希望对大家有所帮助!

Look-Look

1,既然是基于Android客户端的性能测试那就与后台的一些API、数据接口要区分开来~!
2,Android的性能测试能其实包括很多很多的测试项比如:资源消耗,内存泄露,电量功耗,启动耗时,渲染等等....

怎么去做?
1,采集数据 :采集的数据包括:内存、cpu、电量功耗、hprof(内存泄露分析文件)、响应时间等等。。。。
2,设计场景 :搞定数据的采集后配合一些固定的场景来收集一些数据(**最好**多取几次而且每次配合不同的设备看平均值)作为最后的对比分析
3,结果分析 :拿到数据后分析哪些模块的数据异常再去Check code定位问题的原因

好吧下面慢慢跟大家详细的说吧!

先写下内存篇

内存的采集:

Android的内存的采集这边介绍三种方式:

1,通过Dumpsys 来取值

adb shell dumpsys meminfo

这里可以看到当前所有进程的内存信息!

如果你要看详细的内存:

adb shell  dumpsys  meminfo  pakagename or Pid

看其中的Size 可以发现 Native Heap 和Dalvik Heap 占据了Heap Size
dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的。
对于内存的限制 这里纠正一下:是 dalvik heap不能超过最大限制,跟Native heap没有关系!
最大限制查看:

#查看单个应用程序最大内存限制adb shell getprop|grep heapgrowthlimit

得到结果:

|[dalvik.vm.heapgrowthlimit]:[96m]

这个96M是单个程序限制最大内存,而meminfo 里面的dalvik heap size 的最大值若果超出了96m 那就很可能会发生OOM
dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存限制,应用如果不想在dalvik heap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明android:largeHeap=“true”,声明后应用dalvik heap 达到heapsize的时候才会出现OOM!

注:设备的不一样 最大内存限制也可能不一样

现在大多数手机 的android程序内存一般限制在96M以上甚至更高,也可能更低。

3,用/system/xbin/procrank工具 来取值很直观

adb shell procrank

VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

USS 是针对某个进程开始有可疑内存泄露的情况, 是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放!

3,使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)(这个方法是写一个简单的app去监控的时候用到的,轻便简单)

privatevoidGetMemory(){finalActivityManageractivityManager=(ActivityManager)getSystemService(ACTIVITY_SERVICE);ActivityManager.MemoryInfoinfo=newActivityManager.MemoryInfo();activityManager.getMemoryInfo(info);Log.i(tag,"系统剩余内存:"+(info.availMem>>10)+"k");Log.i(tag,"系统是否处于低内存运行:"+info.lowMemory);Log.i(tag,"当系统剩余内存低于"+info.threshold+"时就看成低内存运行");}

availMem:表示系统剩余内存

lowMemory:它是boolean值,表示系统是否处于低内存运行

hreshold:它表示当系统剩余内存低于好多时就看成低内存运行

我用过以上三种最多,其实Top 也可以 还有很多方法都可以。

adb shell top

内存拿到后怎么去用呢?

这里我用的方法是用java封装Adb shell dumpsys meminfo再用字符串截取 打印的方式

publicstaticStringGetMemory(StringpackageName)throwsIOException,InterruptedException{Stringstr3=null;Runtimeruntime=Runtime.getRuntime();Processproc=runtime.exec("adb shell dumpsys meminfo "+packageName);try{if(proc.waitFor()!=0){System.err.println("exit value = "+proc.exitValue());}BufferedReaderin=newBufferedReader(newInputStreamReader(proc.getInputStream()));StringBufferstringBuffer=newStringBuffer();Stringline=null;while((line=in.readLine())!=null){stringBuffer.append(line+" ");}Stringstr1=stringBuffer.toString();Stringstr2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects"));str3=str2.substring(0,10);str3.trim();}catch(InterruptedExceptione){System.err.println(e);}finally{try{proc.destroy();}catch(Exceptione2){}}returnstr3;}}

截取好之后呢 可以跟 其他的一些系统资源值拼在一起打印出来:

拿到这些值之后可以配合手工或自动化来做数据收集,你会看到有些步骤内存占用很高或者Cpu消耗也会较高,这样你就可以去check一下 关于这个步骤相关 的Code

未完待续

相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 API
query改写:大模型应用测试离不开的实践
queryrewrite 是一个用于大模型应用测试的 Python 库,专注于查询(query)的改写与验证。它支持多种改写方法,包括大型语言模型(LLM)、词汇表替换和同义词替换,同时提供多种验证方法如 ROUGE-L、BLEU、帕累托最优和LLM语义相似度,以确保改写后的查询在语义上保持一致。该项目特别优化了对中文文本的处理,涵盖分词和相似度计算。用户可通过 pip 安装,并支持扩展不同的 LLM 模型,如 OpenAI、Ollama 等。
437 87
query改写:大模型应用测试离不开的实践
|
1月前
|
JSON 自然语言处理 算法
大模型应用测试必备技能:问题对生成实践
本文介绍了利用LangChain的QAGenerationChain从文本生成问题-答案对(QA pairs)的方法,旨在解决LLM应用开发中测试数据生成的格式不统一、库版本过时、模型输出异常及代码可维护性差等问题。文中提供了完整的代码实现,并对生成结果进行了有效性评估,包括语义相似度检查、关键词匹配和重复性检测,确保生成的QA对质量可靠,适用于知识库测试与评估。
270 86
|
9天前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
41 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
9天前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
41 6
|
9天前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。
|
18天前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
30天前
|
人工智能 资源调度 jenkins
精准化回归测试:大厂实践与技术落地解析
在高频迭代时代,全量回归测试成本高、效率低,常导致关键 bug 漏测。精准化测试通过代码变更影响分析,智能筛选高价值用例,显著提升测试效率与缺陷捕获率,实现降本增效。已被阿里、京东、腾讯等大厂成功落地,成为质量保障的新趋势。
|
1月前
|
搜索推荐 Devops 测试技术
避免无效回归!基于MCP协议的精准测试影响分析实践
本文揭示传统测试的"孤岛困境",提出MCP(Model Context Protocol)测试新范式,通过模型抽象业务、上下文感知环境和协议规范协作,实现从机械执行到智能测试的转变。剖析MCP如何颠覆测试流程,展示典型应用场景,并提供团队落地实践路径,助力测试工程师把握质量效率革命的新机遇。
|
1月前
|
人工智能 缓存 自然语言处理
大模型性能测试完全指南:从原理到实践
本文介绍了大模型性能测试的核心价值与方法,涵盖流式响应机制、PD分离架构、五大关键指标(如首Token延迟、吐字率等),并通过实战演示如何使用Locust进行压力测试。同时探讨了多模态测试的挑战与优化方向,帮助测试工程师成长为AI系统性能的“诊断专家”。
|
3月前
|
人工智能 Java 测试技术
SpringBoot 测试实践:单元测试与集成测试
在 Spring Boot 测试中,@MockBean 用于创建完全模拟的 Bean,替代真实对象行为;而 @SpyBean 则用于部分模拟,保留未指定方法的真实实现。两者结合 Mockito 可灵活控制依赖行为,提升测试覆盖率。合理使用 @ContextConfiguration 和避免滥用 @SpringBootTest 可优化测试上下文加载速度,提高测试效率。
252 6

热门文章

最新文章