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/

时间: 2024-09-23 16:43:31

Android 应用性能测试方案一之 log 分析的相关文章

干货满满,Android热修复方案介绍

摘要:在技术直播中,阿里云客户端工程师李亚洲(毕言)从技术原理层面解析和比较了业界几大热修复方案,揭开了Qxxx方案.Instant Run以及阿里Sophix等热修复方案的神秘面纱,帮助大家更加深刻地理解了代码插桩.全量dex替换.资源修复等常见场景解决方案,本文干货满满,精彩不容错过. 以下内容根据演讲视频以及PPT整理而成. 视频分享链接,点击这里! 在传统的修复模式下,如果线上的App出现Bug之后进行修复所需要的时间成本非常高,这是因为往往需要发布一个新的版本,然后将其发布到对应的应用

一种粗暴快速的Android全屏幕适配方案

本文讲的是一种粗暴快速的Android全屏幕适配方案,由于Android碎片化严重,屏幕适配一直是开发中较为头疼的问题.面对市面上五花八门的屏幕大小与分辨率,Android基于dp与res目录名称来适配的方案已无法满足一次编写全屏幕适配的需求,为了达到最优的视觉效果,开发过程中总是需要花费较多资源进行适配.也有开发者给出了一些自己的解决方案.首先来分析一下一些常见的解决方案的现状: 1. 官方适配方案 – dp.dp是Android开发中特有的一个单位.与px不同,dp是基于屏幕像素密度的一种单

实用Android 屏幕适配方案分享

转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案,已用在一款成熟互联网应用中,效果还不错. 说起android开发,UI界面的多机型适配,一向是个很重要的问题. 网上这方面的文章很多,面试的时候也经常会问到,大部分的内容都很类似,无外乎用dp,sp 不要用px之类老生常谈的问题. 但是会说的居多,实际可以执行的可行方案,很少有人会.

关于系统性能测试的步骤总结和分析

关于系统性能测试的步骤总结和分析 近期接触的项目,进行了比较多的性能测试,就性能测试的步骤做一下总结和分析,也希望对以后的工作有益. 性能测试,是一种"正常"的测试,主要是测试正常使用时,系统及时性(响应时间.吞吐率)是否满足要求,同时可能为了保留系统的扩展空间进行一些稍稍超出"正常"范围的测试. 常用软件:HP  LoadRunner 系统性能测试中的几大步骤: 1.明确测试目标:了解性能测试需求: 2.编写性能测试计划: 3.分析性能测试需求: 4.编写性能测试

Android中InCallUI显示太慢问题分析

完整分析流程和详细内容也可以下载PDF文档: InCallUI_issue_analysis_report 一.问题现象 当手机有来电时,先听到铃声,过了比较长的一段时间(3-4s)屏幕才点亮并显示来电界面. Platform:MT6581 Android版本:4.4KK BuildType:userdebug 系统软件版本:SWC1E+UP 系统RAM:512M 二.Android4.4来电及IncallUI显示的流程 整个流程主要分为3个部分: 1.framework部分,其主要通过RIL与

Android Force Close 出现的异常原因分析及解决方法_Android

一.原因: forceclose,意为强行关闭,当前应用程序发生了冲突. NullPointExection(空指针),IndexOutOfBoundsException(下标越界),就连Android API使用的顺序错误也可能导致(比如setContentView()之前进行了findViewById()操作)等等一系列未捕获异常 二.如何避免 如何避免弹出Force Close窗口 ,可以实现Thread.UncaughtExceptionHandler接口的uncaughtExcepti

思博伦与octoScope:技术性能测试方案

巴塞罗那 - 2016年2月22日 – 思博伦通信今天宣布了一项提供完整Spirent Landslide?Wi-Fi和octoScope系统的协议,该系统将在octoBox测试平台上为真正的接入点和真正的客户端设备提供支持.octoBox测试平台支持多种无线技术的共存,例如LTE和包括MU-MIMO 在内的802.11ac Wave-2,同时还提供一个可控的真实RF环境.octoBox测试平台可实现常用无线测试的自动化,例如吞吐量与距离,以及受控条件下完全隔离环境中漫游和共存,其中还包含干扰.

Apache 服务器Log分析应用实例

apache|服务器|应用实例 Apache 服务器Log分析应用实例 rhinux 发表于: 2004-11-28 22:11 互联网的飞速发展,无论是传统企业的网站,还是互联网企业,为了了解自己的客户来源,点击率等资料,对网站日志的分析尤为重要,以下就本人所做的日志分析系统与大家分享,希望能对大家有所帮助. 欢迎大家复制,但请大家保留本文的完整,谢谢!! 一,所用软件及工具 1,Apache服务器 官方网址:http://www.apache.org 2,awstats 日志分析软件 官方网

教你使用PHP-FPM的slow log分析网站

最近从GOOGLE ananlytics 发现网站速度变慢了很多,于是想到了PHP中的FPM慢日志功能. 好在 PHP-FPM 提供了慢执行日志,可以将执行比较慢的脚本的调用过程 dump 到日志中. Shell代码 cd /etc/php5/fpm/pool.d/ vi www.conf 修改配置 Java代码 ; The timeout for serving a single request after which a PHP backtrace will be ; dumped to t