实战 | Android过度绘制自动化测试

简介: 应用可能会在单个帧内多次绘制同一个像素,这种情况称为“过度绘制”,过度绘制通常是不必要的,最好避免,它会浪费 GPU 时间来渲染与用户在屏幕上所见内容无关的像素,进而导致性能问题。

通过标准



背景颜色 表示的含义
无颜色 表示没有重绘,即一个像素点只被绘制了1次
蓝色 表示重绘了1次,即一个像素点被绘制了2次。屏幕上如果有大块的的蓝色区域是可以接受的,但如果整个屏幕都是蓝色的,那就需要优化了,可以去掉一层
绿色 表示重绘了2次,即一个像素点被绘制了3次。中等面积的绿色区域是可以接受的,不过最好引起警惕,去看一下能不能优化
淡红色 表示重绘了3次,即一个像素绘制了4次。很小的淡红色区域是可以接受的,其他情况就需要去优化
深红色 表示重绘了4次以上。这个不正确的,必须进行优化

手工测试方案


其实 Android 平台已经提供了工具来帮助我们确定过度绘制是否会影响应用的性能,如果是通过手工的方式,首先需要按照以下步骤打开显示过度绘制区域的选项:

设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示过度绘制区域

image.png

GPU 过度绘制调试工具使用颜色编码来显示应用在屏幕上绘制每个像素的次数,此计数越高,过度绘制影响应用性能的可能性越大。

image.png

开启调试开关后进入应用的所有页面进行检测是否有过度绘制的情况,现在的应用动辄都是上百个页面的,如果全手工来做,工作量和效率可想而知,所以接下来跟大家分享一下全自动化的方案。


自动化测试方案


Android 源码中有个叫 drawOverdrawCounter 的函数可以用来计算当前页面过度绘制的次数,所以我们可以通过Hook该函数来获得这个值,但是 drawOverdrawCounter 函数仅在Android 4.4.4源码中有实现,在Android 5.0之后就被去掉了,所以我们需要准备一台Android 4.4.4的模拟器或者真机,我用的是Genymotion的模拟器。


首先在模拟器中安装好Xposed框架,然后找到需要Hook的系统函数路径及参数,这里推荐大家一个可以快速检索Android各个版本系统源码的网站:

http://androidxref.com/

image.png

这样就找到了目标路径,点击进入查看详情:

image.png

会发现 drawOverdrawCounter 函数是在 android.view.HardwareRenderer 的内部类 GlRenderer 中,这样我们就可以通过Xposed来Hook获取过度绘制的值并将其实时写入到指定文件中。

下面是插件的具体实现方式:

package com.xposed.overdraw;
import android.annotation.SuppressLint;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class CheckOverdraw implements IXposedHookLoadPackage {
    private float overDrawCounter;

将插件编译成APK安装到模拟器中,这时候打开先前安装的Xposed框架,进入Modules

image.png

会看到自己刚刚装的插件,点击开启重启模拟器即可生效

image.png

通过下面的命令切换show和count模式:

adb shell setprop debug.hwui.overdraw count //显示过度绘制的次数
adb shell setprop debug.hwui.overdraw show //显示过度绘制的色块详
adb shell cat /sdcard/overDraw.txt //查看过度绘制的次数

插件准备好之后,接下来就是实现我们的自动化测试脚本了,这里我是基于Airtest实现的,由于比较简单我就讲一下大致思路:


  • 首先准备好需要验证的页面schema地址,循环遍历
  • 每次跳转schema前通过命令行切换到count模式
  • 读取count的值,判断是否大于3,如果是切换到show模式,再次跳转同一个schema,截图保存


Xposed插件的完整实现参考下面的地址,阅读原文可查看:

https://github.com/logan62334/overdraw-xposedmodule,
相关文章
|
14天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
38 4
|
14天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
49 3
|
19天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
35 1
|
1月前
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
1593 1
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
1月前
|
PyTorch 算法框架/工具 计算机视觉
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
本文介绍了使用YOLOv4-Tiny进行目标检测的完整流程,包括模型介绍、代码下载、数据集处理、网络训练、预测和评估。
121 2
目标检测实战(二):YoloV4-Tiny训练、测试、评估完整步骤
|
23天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
42 2
|
24天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
31 2
|
1月前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
1月前
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
19 3
|
1月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
下一篇
无影云桌面