机智的防爬虫标识
原创博客地址:http://www.cnblogs.com/alexkn/p/7095855.html
博客求关注: http://www.cnblogs.com/alexkn

1.启动时间测试常用方案介绍

如何精确测试启动时间,其实这个问题可大可小,主要需要看团队对启动时间的测试精度要求,当启动时间测试误差需要精确到小几十毫秒时,很多问题都会暴露,因为其实目前很难有一种方式去评估数据的有效性。当前设备状态,CPU温度,内存,系统GC,研发人员的代码以及线程模式等,都有可能导致启动时间波动增大。目前已知的启动时间测试方案有几种,可以例举一下:

  • 插桩法:通过在整个启动的生命周期打日志,然后通过解析日志来得到本次启动时间
  • 录屏分帧:包括高速摄像头或者其他客户端录屏/截图,通过录制启动时间的整个过程,通过做分帧处理,来得到起始结束位置

但其实这些方法都有各自的问题,插桩引入的测试误差本身很小,但因为系统误差的关系,会导致本身波动会很大,而录屏分帧,虽然可以用于竞品分析,但测试误差会比较大,目前工业级的摄像头,也只能到8ms/帧率,一般高速摄像头的也会引入33ms的系统误差,此外,如果在android端录屏,可能会导致启动时间波动更加增大,因此如果单纯从测试方法上来改善启动时间测试,效果肯定不会好。因为我们需要明白,系统随机误差的引入,所以启动时间的测试数据是一个概率问题,而不是一个可以100%一定出现在某个区域的问题(有时间写一篇统计学跟误差分析的文章)。
其实自然而然这就引申出两个问题:

  • 问题定位方法的改进
  • 误差需要用科学的方法去做估算

当然这篇文章只讲第一个问题,也就是怎么去定位启动时间问题,下面进入正题。

2.启动时间问题定位方案

在这里要推荐的是TraceviewTraceview的介绍可以看这篇文章:https://testerhome.com/topics/5049

因为系统随机误差比较大,因此单独看某一个生命周期中的耗时,并不能帮助定位问题,而Traceview可以帮我们查看到每一个线程的调用栈以及方法的CPU时间或者堆栈累加时间。往往可以通过Traceview来做问题定位,但目前有一些限制:

  • 操作不超过5s
  • 在IDE上查看才比较方便
  • 大部分方法都混淆了,很难有效定位到对应的方法

其实这些问题都不是问题

  • Traceview可以通过android.os.Debug.startMethodTracing();android.os.Debug.stopMethodTracing();来打点,生成这段启动周期的Trace数据
  • google提供了一个半成品dmtracedump,可以解析Traceview文件,当然也只是半成品,但我们可以自己解析,但是是有办法突破IDE限制的
  • 混淆问题其实不算问题,一般都有自己的mapping文件去解混淆

3.方案应用

我们在版本迭代中,每一个小版本演进时,其实变动的方法并不会太多,那么,Traceview既然能看到进程,方法占用的CPU时间片,那我可以把所有的方法耗时做统计并做耗时排序,过滤掉系统线程以及不需要关注的线程,着重对比新增的方法以及改动的方法,然后我们逐一去过滤top异常的方法就行了。

实际应用上可以发现,用反混淆后的包去做对比测试,是可以很明显看到一些异常的耗时方法的。

4.思路拓展

这块其实还可以继续拓展一下,但我这块没有实践,可以把我的想法抛出来给大家。

  • 反混淆操作
  • 通过对比两个版本的Traceview方法,可以过滤出top方法
  • 拿到两个revision间的svnlog,过滤出改动的方法
  • 对比svnlogtop异常方法,自动将可疑方法邮件发给研发,实现监控问题到定位问题的闭环。

5.开源一个工具

目前工具已开源出来,地址为:https://github.com/alexknight/TraceAnalysis 
代码是一年半前写的,原来也只是边探索边验证效果,后面没有做重构,所以代码质量并不高。最近仅仅只是把功能抽了出来,如果能够帮到你,随手star让我更有动力输出一些有用的东西。
目前工具实现的功能包括

    • 支持反混淆
    • 支持获取Traceview文件的解析结果,json对象返回
    • 提供默认模板,支持Traceview两两对比,生成csv的结果文件

利用 Traceview 精准定位启动时间测试的异常方法 (工具开源)的更多相关文章

  1. 如何实现室内Wi-Fi无线终端的精准定位

    如何实现室内Wi-Fi无线终端的精准定位 如何实现室内Wi-Fi无线终端的精准定位 随着商圈020的兴起,室内定位技术的也如百花争艳般不断涌现.但随着室内Wi-Fi网的架设普及,基于Wi-Fi定位技术 ...

  2. 如何利用Pre.im分发iOS测试包

    大众创新万众创业,在移动互联网的风口,移动APP开发与测试发展方兴未艾,受到了越来越多的重视.相较 iOS,Android 的开发环境更加开放.Android 开发者要测试应用时,只需发个 APK 安 ...

  3. Loadrunner 脚本开发-利用Loadrunner生成Web service测试脚本

    脚本开发-利用Loadrunner生成Web service测试脚本 1.选择协议--Web Service,如下图 2.导入服务 入口1:点击Manage Services ->弹出窗中选择“ ...

  4. unit测试出现异常:Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util

    在进行单元测试时,测试出现异常 Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform ...

  5. listctrl查找定位 使用测试过还很好用

    35.listctrl查找定位  使用测试过还很好用 // 简单的查找函数// FindString(CListCtrl& , 查找内容 , 开始位置 , 到达底部时是否从头查找) int F ...

  6. 【SoloPi】SoloPi使用3-性能测试-启动时间测试

    响应耗时计算工具Soloπ响应耗时计算工具,通过录屏分帧的方式自动识别起始点和结束点,精确计算耗时. 特性模拟用户视觉,计算结果更贴近用户体验自动记录点击起始点,自动识别屏幕变化结束点通过OpenCV ...

  7. vue开发东京买菜,全栈项目,前端django,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等

    因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...

  8. django开发东京买菜,全栈项目,前端vue,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等

    因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...

  9. Android自动化压力测试图解教程——Monkey工具

    [置顶] Android自动化压力测试图解教程--Monkey工具 标签: 测试androidprofiling工具测试工具文档 2012-04-01 10:16 38185人阅读 评论(10) 收藏 ...

随机推荐

  1. hdu4283 You Are the One 区间DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283 自己想了很久还是不会,参考了别人的思路才写的,区间DP还是很弱,继续努力!! 思路: 转载: 题 ...

  2. Java 通过先序后序序列生成二叉树

    题目 二叉树的前序以及后续序列,以空格间隔每个元素,重构二叉树,最后输出二叉树的三种遍历方式的序列以验证. 输入: 1 2 3 4 5 6 7 8 9 10 3 2 5 4 1 7 8 6 10 9 ...

  3. Java学习笔记——I/O流

    朝辞白帝彩云间,千里江陵一日还.两岸猿声啼不尽,轻舟已过万重山. --早发白帝城 我们老师写代码有个特点,就是简洁.每一句的意图都十分明确.所以他讲课的速度也比较快. 跑题了,说说I/O流: 1.字节 ...

  4. 深入理解IOC

    1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...

  5. TCP三次握手(建立连接)/四次挥手(关闭连接)

    TCP数据包格式 顺序号(32位):用来标识从TCP源端向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号.如果将字节流看作在两个应用程序间的单向流动,则TCP用顺序号对每个 ...

  6. WPF 杂谈——自定义控件

    如果只是使用现有的WPF控件的话,是很难满足当前社会多复杂的业务.所以用户自己订制一系列控件也是一种不可避免的情势.WPF在控制方面分为俩种:用户控件和自定义控件.相信看过前面章节的就明白他们俩者之间 ...

  7. js中的sort方法

    js中原生的sort()采用快排和插入排序算法,根据比较器对数组排序. 默认是将数组元素转为字符串,然后根据Unicode字符集编号的大小排序. charCodeAt(index) 返回指定位置字符的 ...

  8. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  9. springboot 中使用websocket简单例子

    gradle 中添加依赖,引入websocket支持 compile("org.springframework.boot:spring-boot-starter-websocket:${sp ...

  10. LINQ基础(三)

    一.并行LINQ System.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上. 尽管Enumerable类给IEnumerable<T& ...