手机管家(Android)UI过度渲染自动化测试方案

栏目: 编程工具 · 发布时间: 8年前

内容简介:手机管家(Android)UI过度渲染自动化测试方案

一、androidUI过度渲染概述

1、从android卡顿说起

通常我们可以从各种渠道听到用户反馈app卡顿,究竟是什么用户觉得卡顿呢?因为大多数手机的屏幕刷新频率是60hz,如果在1000/60=16.67ms内没有办法把这一帧的任务执行完毕,就会发生丢帧的现象。丢帧越多,用户感受到的卡顿情况就越严重。

手机管家(Android)UI过度渲染自动化测试方案

所以,可以看出更新每一帧耗时至关重要,说道每一帧图像的更新过程不得不提到GPU和CPU。CPU负责包括Measure,Layout,Record,Execute的计算操作,GPU负责Rasterization(栅格化)操作。例如显示图片的时候,需要先经过CPU的计算加载到内存中,然后传递给GPU进行渲染。一旦GPU或者CPU的工作超过了规定事件,就会出现app卡顿现象。比如:

(1)GPU耗时导致卡顿原因:通常与画面的渲染有关,比如界面存在严重的过度渲染,渲染高清大图等,与UI View的渲染方法如draw()、onDraw()、dispatchDraw()等关联。

(2)CPU的耗时导致卡顿原因:主要是由于UI线程有耗时较久的操作,比如处理大图片、进行耗时的IPC通信等,自然会拖长UI线程处理的时间。UI线程通常会运行以下方法: 渲染相关方法; UI布局相关方法:

onMeasure(),onLayout();

Handler: handleMessage();

post(Runnable);

Activity相关方法, 如:

onCreate(),onResume(),onStar(),onStop()等。

2、再谈过度渲染

Overdraw(过度渲染)是指的手机屏幕上的一个像素点在一帧更新时间内被绘制了多次,我们就认为试过绘制了。显然过渡绘制发生时,在UI层次中处于被遮挡的绘制是不可见的,也是对资源的浪费。用一个简单的例子,好比我们刷墙,刷了一层又一层,最终能看到的墙还是最后一次刷上去的样子。

手机管家(Android)UI过度渲染自动化测试方案

既然过度渲染问题严重,那么如何发现是否有过度渲染存在呢?google在安卓4.4系统中开发了查看过度渲染计数的入口,在开发者选项中,打开GPU调试,选择过度渲染计数,屏幕左下方可以看到当前窗口过度渲染计数。如手机管家7.0主页过度渲染计数。

手机管家(Android)UI过度渲染自动化测试方案

具体的数值代表的意义为:

蓝色:1倍过度绘制,1.X;

绿色:2倍过度绘制,2.X;

淡红色:3倍过度绘制,3.X;

红色:4倍或以上过度绘制, 4.X。

手机管家(Android)UI过度渲染自动化测试方案

二、自动化测试方案

既然能够通过系统设置知道过度渲染次数,测试时候就读取该值,填写报告就完了啊,为何要自动化呢?因为在对app进行系统的测试时,会发现页面非常多,如管家一二级页面就多大20多个,且集成包,灰度包,正式包,回归包都要进行一次测试,所以进行自动化过度渲染计数读取是有必要的。

1、获取页面过度渲染计数

(1)HOOK系统方法,读取过度渲染计数。

通过查看安卓4.4的源码,可以知道在Framework/base/core/Java/android/view/

HardwareRender.java中有一个叫做GLRenderer的内部类,该类还有一个方法如下:

手机管家(Android)UI过度渲染自动化测试方案

我们能够hook该方法,抓取入参overdraw并打印到日志,就是我们需要的过度渲染计数。

手机管家(Android)UI过度渲染自动化测试方案

【难点】

1)如何hook内部类的方法:在外部类和内部类之间添加 $符号定位内部类;

2)如何构造一个隐藏的参数类型,如上述HardWareCanvas:直接使用包名加类名定位该类型。

通过hook的方法输出的过度渲染计数来源于系统调用API,所以什么时候能拿到这个值不受人为控制,使用者只能等待系统日志输出,这也是hook技术的通病,为此我们引入第二种方法。

(2)反射系统过度渲染计数的类,输出过度渲染计数。

系统在屏幕中绘制过度渲染计数时,是通过drawText绘制到屏幕上(上述(1)方法的源码截图看出),所以找到调用绘制方法的类,就可以得到过度渲染计数,同样在HardwareRenderer.java代码中debugOverdraw调用了绘制的方法,该方法也是过度渲染计数获取的方法。

手机管家(Android)UI过度渲染自动化测试方案

注:以上方法都是通过系统函数获取过度渲染计数,所以测试时,必须打开设置中的过度渲染计数。

2、实现自动化测试

(1)在什么时候读取页面overdrawcounter值?

页面从创建到销毁,什么时候页面才是最绘制最稳定的时候呢?我们假设页面上有需要下载的资源,需要耗时才能获取的资源等,所以只有在页面消失前一刻,我们才认为此时页面相对绘制最完整。所以跟进安卓生命周期,我们在onPause()时来读取过度渲染计数。

手机管家(Android)UI过度渲染自动化测试方案

(2)如何实现自动化呢?

因为在调用onPause()时候会自动读取过度渲染值,所以我们要做的自动化仅仅是如何在被测页面之间切换,搜集各个页面的过度渲染值,输出报告,所以流程可以归纳为:

手机管家(Android)UI过度渲染自动化测试方案

三、测试收益

1、整个测试方案在手机管家7.0中运行起来,对集成包,灰度包,正式包的一二级页面进行了过度渲染测试,优化后管家正式包一二级页面平均过度渲染计数为2.4X,小于管家标准3.0X。

报告样例为:

手机管家(Android)UI过度渲染自动化测试方案

2、对手机管家22个基础页面监控,到正式版发布时全部页面过度渲染计数都小于3.0X。下图为管家部分页面优化前后对比。

管家主界面:

手机管家(Android)UI过度渲染自动化测试方案

手机管家(Android)UI过度渲染自动化测试方案

体检优化界面:

手机管家(Android)UI过度渲染自动化测试方案

手机管家(Android)UI过度渲染自动化测试方案

个人中心页面:

手机管家(Android)UI过度渲染自动化测试方案

手机管家(Android)UI过度渲染自动化测试方案

3、问题页面优化前后过度渲染计数对比

手机管家(Android)UI过度渲染自动化测试方案

版权所属,禁止转载


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Out of their Minds

Out of their Minds

Dennis Shasha、Cathy Lazere / Springer / 1998-07-02 / USD 16.00

This best-selling book is now available in an inexpensive softcover format. Imagine living during the Renaissance and being able to interview that eras greatest scientists about their inspirations, di......一起来看看 《Out of their Minds》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具