android测量网页加载时间

如果被测浏览器用的是webkit内核,或者是自己写的程序,总之就是如果可以获取对应的webview对象:可以通过重写webviewclient来获取加载时间。webviewclient中的onPageStarted和onPageFinished函数,可以用来精确的测量网页加载时间。 
  
如果被测浏览器用的是自定义内核:这个比较麻烦。网上的解决方案大概有以下几种, 
  1. 针对网站的网页加载时间测试。即提供网站性能测试的服务,从远程访问你的网站并返回网页加载时间。这个显然不合我们的要求。
  2. 针对PC浏览器的网页加载时间测试。工具非常多,但可惜难以适应android平台。雅虎倒是提供了移动端的YSlow,但亲测并不好用。
  3. 针对特定内核的移动端浏览器网页加载时间测试。与我们的要求比较相符,但只支持几个主流的浏览器内核,如chrome、firefox等
  4. 针对移动端浏览器的性能测试。工具不少,但几乎都没有提供网页加载时间的测试,测试偏显示效果方面。我很奇怪网页加载时间难倒不是一个浏览器的重要性能指标吗?不知道为什么这些工具都不提供这项服务。
看来要测网页加载时间只能转变思路。《Android手机自动化性能测试工具的研究与开发》这篇论文里提到,测量网页加载时间可以通过高速摄像机持续拍摄手机屏幕和后期图像处理来完成。提供了一种很好的思路,就是当网页作为一个图像内容不再发生变化时,就可以判定为加载完成了。 

接下来的问题就是怎样获取当前界面的图像了。最先想到的肯定是屏幕截图,但截图往往是非常耗时的操作。可以再往前一步想,屏幕的图像是怎样绘制出来的? 

Android屏幕绘制基本与linux相同,都是使用Framebuffer机制来绘制屏幕。FrameBuffer提供接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,应用程序可以简单地通过改变这段内存的值来改变屏幕上某一点的颜色。例如如果你想把一张bitmap图片显示到屏幕上去,你只要解析bitmap之后把数据bit copy进framebuffer,屏幕就会立刻显示出来。一般Linux的framebuffer 对应/dev/fb0这个字符设备文件。 Android稍微改了改,放在/dev/graphics/fb0下。 (本段文字部分摘自互联网,侵删)

这样我们就可以通过读取fb0来获取屏幕信息了。不过新的问题又出现了。现在的智能机一般屏幕较大并且分辨率也很高,比如一个720*1280的屏幕,每个像素点为32位色,那么Framebuffer的大小就为(720*1280*32/8) byte,约3.5MB。读取这样一个文件是很耗时的,即时是配置很高的手机,读fb0的时间也达到了100ms以上,而我们判断网页加载完成是需要不断的读取和比较fb0的,这样就造成了很高的误差,并且也给手机带来很大负担。 

其实判断网页加载完成,一个最直观的标志就是网页加载的进度条。而fb0既然是屏幕的映像,那么我们就可以找到进度条所在的区域,只判断这块区域的变化,来判定网页加载是否完成。方法也很明了, 一个720*1280的屏幕总共720*1280个像素点,每个像素点占4byte,将fb0读到byte流中通过合适的偏移量可以访问到任意范围的像素集合。通过比较byte数据,即可判定两次之间该区域是否又变化。 

新的问题又出现了。 网页加载时偶尔会出现卡顿现象,此时屏幕图像也是静止的。怎样将这种情况与网页加载完成区分开来,而又不影响最终结果的精度呢? 

这个问题比上面的问题都好解决多了。 当网页第一次静止时,记录下时间(因为它可能是真正的加载完成),然后继续执行图像对比操作,连续一定次数都不再有变化时,才判定网页加载完成,并取第一次的时间为加载完成时间。

你可能感兴趣的:(android测试)