实战 | 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,
目录
打赏
0
0
0
0
5
分享
相关文章
软件测试的艺术:确保质量的实战策略
在软件开发的舞台上,测试是那把确保每个功能如交响乐般和谐奏响的指挥棒。本文将深入探讨软件测试的重要性、基本类型以及如何设计高效的测试策略。我们将通过一个实际的代码示例,展示如何运用这些策略来提升软件质量和用户体验。
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
71 19
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
55 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
从Postman到Apipost:我的动态参数测试实战踩坑记
作为一名全栈开发工程师,在开发用户中心模块时,我遇到了复杂参数API测试的挑战。最初使用Postman时,发现其在生成动态参数(如邮箱、手机号和日期)时存在诸多问题,导致测试效率低下甚至出错。例如,随机生成的邮箱格式无效等 后来,CTO推荐了Apipost,它提供了更智能的参数生成方式:支持真实邮箱、符合规范的手机号以及合法日期范围,极大提升了测试效率和准确性。通过对比,Apipost在处理复杂动态参数方面明显优于Postman,减少了维护成本并提高了团队协作效率。现在,我们已全面切换到Apipost,并利用其「参数组合测试」功能发现了多个边界条件bug。
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
203 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。
基于 DIFY 的自动化数据分析实战
本文介绍如何使用DIFY搭建数据分析自动化流程,实现从输入需求到查询数据库、LLM分析再到可视化输出的全流程。基于经典的employees数据集和DIFY云端环境,通过LLM-SQL解析、SQL执行、LLM数据分析及ECharts可视化等模块,高效完成数据分析任务。此方案适用于人力资源分析、薪酬管理等数据密集型业务,显著提升效率并降低成本。
2851 8
一个测试工程师的实战笔记:我是如何在Postman和Apipost之间做出选择的?
优秀的API测试工具应该具备: 分层设计:既有可视化操作,也开放代码层深度定制 场景感知:自动识别加密需求推荐处理方案 协议包容:不强迫开发者为了不同协议切换工具 数据主权:允许自主选择数据存储位置
55 7
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
55 8
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
47 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈

热门文章

最新文章