Android 应用性能测试方案一之 log 分析

简介:
今天我主要来说下过年时候自己做的一些 性能测试,由于时间紧迫,所以最终选择了全部从log方面入手,从而最终达到一气呵成的效果。
   分别有这样几个大项:
  1. Android应用启动消耗时间
  我们分别在Activity的生命周期方法内添加Log.e(tag,message),如下效果:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("AppStartTime","AppOnCreate");
...
}
@Override
protected void onResume() {
super.onResume();
Log.e("AppStartTime","AppOnResume");
...
}
  ,这里的tag我们使用AppStartTime,那么我们需要在应用启动之后在command内输入:
  adb logcat -v time -v threadtime *:E | grep ActivityStartTime>StartTimeFile.txt
   2. cpu和内存消耗
  在command中输入如下命令:
  adb  shell top -n 400 | grep <your package name>Cpu_MemoryFile.txt
   3. GC
  在command中输入如下命令:
  adb logcat -v time -v threadtime *:D | grep GC>GCFile.txt
  这里需要注意的是,GC分析的时候需要关注三个值。
  average_GC_Freed
  average_GC_per
  average_GC_time
   4. 网络流量
  在被测应用中增加一个获取所有应用的网络流量的service,添加一个getAppTrafficList( )方法,代码如下:
publicvoidgetAppTrafficList(){
PackageManagerpm=getPackageManager();
List<PackageInfo>pinfos=pm
.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES
|PackageManager.GET_PERMISSIONS);
for(PackageInfoinfo:pinfos){
String[]premissions=info.requestedPermissions;
if(premissions!=null&&premissions.length>0){
for(Stringpremission:premissions){
if("android.permission.INTERNET".equals(premission)){
intuId=info.applicationInfo.uid;
longrx=TrafficStats.getUidRxBytes(uId);
longtx=TrafficStats.getUidTxBytes(uId);
if(rx<0||tx<0){
continue;
}else{
Log.e("网络流量",info.applicationInfo.loadLabel(pm)+Formatter.formatFileSize(this,rx+tx)
}
}
}
}
}
}
 如果还要其他数据,那么全部可以按照以上的方法去获取。然后我们来看如何使用python一次性分析这些文件从而直接获取report。
  首先引入第三方绘制pdf的模块:
  # -*- coding: utf-8 -*-
  from reportlab.graphics.shapes import *
  from reportlab.graphics.charts.lineplots import LinePlot
  from reportlab.graphics.charts.textlabels import Label
  from reportlab.graphics import renderPDF
  然后我们需要一个读文件的方法:
  def FileRead(path):
  data_list = []
  number_list = []
  number = 0
  for line in open(path):
  data_list.append(line)
  number =number+1
  number_list.append(number)
  return data_list,number_list
  接着我们需要一个制作pdf的方法:
def MakePDF(times,list,reportname,pdfname):
drawing = Drawing(500,300)
lp = LinePlot()
lp.x = 50
lp.y = 50
lp.height = 125
lp.width = 300
lp.data = [zip(times, list)]
lp.lines[0].strokeColor = colors.blue
lp.lines[1].strokeColor = colors.red
lp.lines[2].strokeColor = colors.green
drawing.add(lp)
drawing.add(String(350,150, reportname,fontSize=14,fillColor=colors.red))
renderPDF.drawToFile(drawing,pdfname,reportname)
#这里的times和list两个参数都是list,是时间和监控获取的数据一一对应的关系
这些我们都有了之后,我们来看下分析AppStartTime的方法:
def analysisStartFile(list):
totalcount =0
totaltime =0
time_list =[]
totalcount_list = []
for i in range(len(list)):
if 'AppStartTime' in list[i]:
totalcount =totalcount+1
totalcount_list.append(totalcount)
if float(list[i+4].split(' ')[1][-6:])-float(list[i].split(' ')[1][-6:])>0:
totaltime=totaltime+float(list[i+4].split(' ')[1][-6:])-float(list[i].split(' ')[1][-6:])
time_list.append(float(list[i+4].split(' ')[1][-6:])-float(list[i].split(' ')[1][-6:]))
return totalcount_list,'%.2f'%float(totaltime/totalcount),time_list
  所有的分析数据的思维都是使用split()方法分隔空格之后做分析。因为读取文件之后是将所有的数据存在list中,但是当我们去用的时候由于空格在其中就变得非常的麻烦,那么我们可以先使用split将空格去掉,然后使用if key in list的方法进行过滤再做分析。
  最后在main()方法中基本就是如下的顺序执行方法:
  if __name__== '__main__':
  list1,list2 = FileRead(<your file path>)
  print list1,list2
  list_count,average_start_time,time_list = analysisStartFile(list1)
  MakePDF(list_count,time_list,'average time:'+str(average_start_time)+'s',"启动性能报告.pdf")
  最终我们就能够批量的生成如下图的报告了。
最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章
|
10月前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
1002 95
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
缓存 监控 算法
软件测试中的性能瓶颈分析与优化策略
【10月更文挑战第6天】 性能测试是确保软件系统在高负载条件下稳定运行的重要手段。本文将深入探讨性能测试的常见瓶颈,包括硬件资源、网络延迟和代码效率等问题。通过具体案例分析,我们将展示如何识别并解决这些问题,从而提升软件的整体性能。最后,文章还将分享一些实用的性能优化技巧,帮助读者在日常开发和测试中更好地应对性能挑战。
854 3
|
Java Shell
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
336 1
|
数据采集 JSON 网络安全
移动端数据抓取:Android App的TLS流量解密方案
本文介绍了一种通过TLS流量解密技术抓取知乎App热榜数据的方法。利用Charles Proxy解密HTTPS流量,分析App与服务器通信内容;结合Python Requests库模拟请求,配置特定请求头以绕过反爬机制。同时使用代理IP隐藏真实IP地址,确保抓取稳定。最终成功提取热榜标题、内容简介、链接等信息,为分析热点话题和用户趋势提供数据支持。此方法也可应用于其他Android App的数据采集,但需注意选择可靠的代理服务。
723 11
移动端数据抓取:Android App的TLS流量解密方案
|
自然语言处理 算法 数据可视化
文本聚类效果差?5种主流算法性能测试帮你找到最佳方案
本文探讨了自然语言处理中句子嵌入的聚类技术,使用Billingsmoore数据集(925个英语句子)进行实验。通过生成句子嵌入向量并可视化分析,对比了K-Means、DBSCAN、HDBSCAN、凝聚型层次聚类和谱聚类等算法的表现。结果表明,K-Means适合已知聚类数量的场景,DBSCAN和HDBSCAN适用于未知聚类数量且存在异常值的情况,而谱聚类在句子嵌入领域表现不佳。最终建议根据数据特征和计算资源选择合适的算法以实现高质量聚类。
973 0
文本聚类效果差?5种主流算法性能测试帮你找到最佳方案
|
机器学习/深度学习 人工智能 自然语言处理
MarS:微软开源金融市场模拟预测引擎,支持策略测试、风险管理和市场分析
MarS 是微软亚洲研究院推出的金融市场模拟预测引擎,基于生成型基础模型 LMM,支持无风险环境下的交易策略测试、风险管理和市场分析。
809 8
MarS:微软开源金融市场模拟预测引擎,支持策略测试、风险管理和市场分析
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
311 11
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
336 10
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
350 1
「测试线排查的一些经验-中篇」&& 调试日志实战