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( )方法,代码如下:

    public void getAppTrafficList() {
        PackageManager pm = getPackageManager();
        List<PackageInfo> pinfos = pm
                .getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES
                        | PackageManager.GET_PERMISSIONS);
        for (PackageInfo info : pinfos) {
            String[] premissions = info.requestedPermissions;
            if (premissions != null && premissions.length > 0) {
                for (String premission : premissions) {
                    if ("android.permission.INTERNET".equals(premission)) {
                        int uId = info.applicationInfo.uid;
                        long rx = TrafficStats.getUidRxBytes(uId);
                        long tx = 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")

最终我们就能够批量的生成如下图的报告了。





adb logcat -v time -v threadtime *:E | grep ActivityStartTime>StartTimeFile.txt

这个 ActivityStartTime 是不是应该是 AppStartTime


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值