使用图色技术来实现自动化脚本

在移动端自动化开发领域,无障碍控件识别、OCR 文字识别、图色视觉识别是三大主流定位方案。其中无障碍识别依赖应用 UI 控件树,一旦目标应用加固、限制无障碍服务,脚本就会直接失效;OCR 仅能处理文字类界面元素;而图色识别基于屏幕像素图像分析,不依赖应用底层架构,是游戏界面、封闭工具类 App、无标准控件弹窗等场景下最稳定的兜底方案。本文从底层原理、API 分层使用、实战开发、性能优化、常见坑点五个维度完整讲解图色脚本开发思路。

一、图色脚本前置基础:截屏权限与生命周期管理

所有图色相关函数存在统一前置约束:调用任意取色、找色、找图接口前,必须完成截屏权限申请,这是安卓系统底层屏幕捕获机制的硬性限制,也是新手最容易踩坑的基础问题。

1. 权限申请核心函数 requestScreenShot

requestScreenShot是图色脚本的入口函数,建议放置在脚本main函数最顶部。该函数用于弹出系统截屏授权弹窗,支持自动点击确认按钮,适配不同手机系统弹窗文字差异。 函数核心参数包含三部分:

  • confirmPermissionTag:授权弹窗确认按钮文本,支持|分隔多组文字,自动匹配点击;
  • retryCount:自动点击重试次数,默认 5 次,适配弹窗延迟弹出场景;
  • usePreBitmap:缓存上一帧截图,屏幕无变化时复用位图,大幅降低重复截图性能损耗。

基础标准初始化代码如下:

function main() { // 自动识别“允许/立即开始”弹窗,重试3次,开启截图缓存 requestScreenShot({confirmPermissionTag:"允许|立即开始", retryCount:3, usePreBitmap:true}); // 后续所有图色逻辑 }

文档明确标注关键注意事项:若冰狐 App 未处于前台,截屏会出现黑屏、授权失败;脚本运行结束、长时间暂停截图时,可调用stopScreenShot释放截屏服务资源;如需再次使用图色功能,必须重新执行requestScreenShot申请权限,无法直接复用缓存。

2. Bitmap 位图内存生命周期管理

冰狐所有截图、图像处理接口都会返回Bitmap位图对象,位图存储屏幕完整像素数据,1080P 屏幕单张位图内存占用可达 8MB 以上,频繁创建不释放会直接触发 OOM 内存溢出、脚本闪退。平台官方文档强制要求:所有手动获取的 Bitmap 使用完毕后必须调用.recycle()释放本地内存

两种典型位图释放场景:

  1. 直接截屏返回位图:
let bmp = screenShot(); // 无fileName参数,返回位图 // 图像处理逻辑 bmp.recycle(); // 用完立即释放
  1. 图像预处理生成新位图(灰度、二值化、裁剪):
let originBmp = screenShot(); let grayBmp = image2Gray(originBmp); // 生成灰度图 writeImage(grayBmp, "/sdcard/aznfz/gray.png"); // 双重释放原图与处理后位图 originBmp.recycle(); grayBmp.recycle();

很多新手会忽略裁剪、灰度转换生成的衍生位图,仅释放原始截图,长期循环运行脚本会持续堆积内存,出现卡顿、黑屏崩溃,这是图色脚本稳定性的核心优化点。

二、冰狐图色 API 分层拆解:从基础取色到图像匹配

平台图色接口按照使用场景分为四层:基础截图存储、单点像素取色、批量颜色检索、模板图像匹配,每一层接口对应不同业务场景,合理选择接口能大幅提升脚本运行效率。

(一)基础截图与文件操作:screenShot、writeImage、readImage

screenShot是截屏核心接口,分为两种工作模式:

  1. 传入fileName参数:直接将截图保存为图片文件,返回文件绝对路径,无需手动释放位图,适合留存日志截图;
  2. 不传入文件名:返回 Bitmap 对象,用于实时图像识别,必须手动回收内存。

接口支持区域截图、画质压缩、格式切换,region参数同时支持像素值与屏幕比例两种输入:[0,0,1,1]代表全屏,[0.2,0.3,0.6,0.5]代表截取屏幕横向 20%~60%、纵向 30%~50% 区域,完美适配多分辨率手机适配需求。

截图保存后若需要在手机相册查看,必须调用updatePhotoAlbum更新相册索引,否则系统相册无法识别新增图片文件,这是安卓媒体存储机制的通用限制。

(二)像素级取色:getScreenColor、compareColors

  1. getScreenColor:单点 / 多点实时取色,返回 ARGB 格式整型颜色值,黑色固定为0xFF000000,支持一次性批量获取多个坐标像素,适合状态判断场景。例如检测按钮是否点亮、弹窗是否消失,无需完整截图检索,性能损耗极低。
// 同时获取两个坐标颜色 let colors = getScreenColor([[500, 1200],[600,1200]]); console.log("像素颜色数组:", colors);
  1. compareColors:定点多颜色校验,传入一组坐标 + 目标颜色数组,全部匹配返回 true,任意一点颜色不符返回 false。该接口适合固定分辨率设备的精准校验,但兼容性较差 —— 更换不同尺寸手机后像素坐标偏移,匹配直接失效,官方文档明确区分:固定设备使用compareColors,多设备兼容场景优先使用findColor找色接口。

(三)批量颜色检索:findColor、findColors(脚本最常用接口)

找色是自动化脚本的核心定位手段,原理是在指定屏幕区域内遍历像素,匹配相似度范围内的目标色,返回全部匹配坐标,支持周边特征色校验,识别准确率远高于单纯单点对比。

核心优势:多分辨率自适应

region参数支持比例数值,无需修改坐标即可适配不同尺寸手机;similarity相似度参数 0~1 可调,0.9 为通用推荐值,应对屏幕色温、亮度差异导致的轻微色偏。

neighbor 相邻特征色参数(提升识别抗干扰能力)

单纯依靠单一颜色极易出现误识别,页面大量同色系像素会造成坐标错乱。neighbor参数可配置目标点周边偏移坐标的参考色,只有目标色 + 周边特征色同时匹配,才判定为有效目标,完美解决页面重复色块干扰问题。

findColors是多类别批量找色扩展接口,可一次性传入多组目标颜色,每组绑定自定义分类与数值,返回结果携带分类标识,适合一页内同时识别多种按钮、道具、弹窗,减少多次截屏检索的性能开销。

(四)模板图像匹配:findImage 图像找图

当目标元素无独特区分色(复杂图标、渐变按钮、游戏人物模型),颜色匹配失效时,使用findImage模板匹配。支持三种模板图片路径:本地绝对路径、相对存储目录、打包进 App 的 asset 资源文件。 关键优化参数scale开启缩放匹配,适配不同分辨率图标缩放差异;threshold匹配阈值 0.85 为默认值,图标边缘清晰可上调至 0.9,模糊渐变素材降低至 0.8。 文档补充说明:单张简单图标使用 findImage 即可,多图同时识别、高精度游戏画面识别,推荐平台内置 YoloV8 模型,识别速度与抗干扰能力更强。

(五)图像预处理工具链

平台配套灰度化image2Gray、二值化imageThreshold、位图裁剪bitmapClip、字节互转等底层图像处理接口,用于复杂场景预处理:

  1. 灰度化去除色彩干扰,降低图像数据量,提升找图匹配速度;
  2. 二值化分割文字与背景,配合自定义阈值过滤杂色;
  3. bitmapClip 裁剪目标区域位图,仅对局部图像检索,减少计算量。

三、完整实战脚本案例:弹窗自动关闭逻辑

结合全部基础 API,编写一套通用弹窗检测自动化脚本,覆盖权限初始化、区域找色、坐标点击、内存释放全流程,代码遵循官方规范,兼顾稳定性与性能:

function main() { // 1. 初始化截屏权限 requestScreenShot({confirmPermissionTag:"允许|立即开始", retryCount:3}); while(true) { // 2. 在屏幕上半区查找关闭按钮特征色,搭配周边校验色 let closePoints = findColor("#FF3333", { similarity:0.9, findAll:false, region:[0,0,1,0.5], // 仅检索屏幕上半部分,缩小检索范围 neighbor:[[5,0,"#FFFFFF"],[0,5,"#CCCCCC"]] }); if(closePoints.length > 0) { // 找到弹窗关闭按钮,执行点击 let target = closePoints[0]; click(target.x, target.y); sleep(800); // 模拟真人操作延迟,避免风控 } else { // 无弹窗,休眠后循环检测 sleep(1200); } } }

该脚本循环检索页面弹窗,通过限定检索区域减少图像计算量,搭配 neighbor 特征色避免误触其他红色图标,全程无需手动保存位图,由 findColor 内部自动管理截图缓存,长期运行内存占用稳定。

四、图色脚本性能与兼容性优化方案

1. 性能优化:减少图像计算开销

  1. 限定检索区域:所有findColorfindImage必须配置region参数,避免全屏遍历像素,检索速度提升 50% 以上;
  2. 复用截图缓存:requestScreenShot开启usePreBitmap:true,屏幕无变化时复用位图,避免重复截屏;
  3. 减少循环内频繁截屏:单次截图完成后统一处理所有找色逻辑,不要每一次找色都重新截屏;
  4. 及时释放 Bitmap:手动创建的位图必须执行recycle(),杜绝内存泄漏。

2. 多设备兼容性优化

  1. 颜色相似度适配:浅色屏幕、高亮度设备色偏明显,相似度建议设置 0.85~0.9,不要固定 1.0 完全匹配;
  2. 优先使用比例区域:region使用 0~1 比例数值,而非固定像素坐标,手机分辨率变更无需修改代码;
  3. 找色优先于定点比色:跨设备脚本禁用compareColors定点校验,统一使用findColor动态检索坐标;
  4. 模板图标精简裁剪:制作找图素材时,仅截取图标主体,减少多余背景,降低分辨率缩放带来的匹配误差。

3. 稳定性优化:规避系统限制

  1. 前台运行冰狐 App:后台休眠会导致截屏黑屏、权限丢失,长周期脚本保持应用前台;
  2. 合理添加操作延时:真人操作存在随机间隔,固定无延迟点击易被应用风控检测,每次操作增加 500~1500ms 随机休眠;
  3. 长时间闲置释放截屏:脚本暂停超过 3 分钟,调用stopScreenShot关闭截屏服务,降低系统资源占用。

五、开发高频问题与避坑总结

  1. 截屏黑屏、找色无返回结果排查顺序:是否在脚本顶部调用requestScreenShot→冰狐是否前台运行→系统截屏权限是否永久允许→关闭后台省电、内存清理策略。

  2. 脚本运行一段时间闪退、卡顿核心原因 Bitmap 未释放,所有 screenShot、image2Gray、bitmapClip 生成的位图必须执行recycle();循环脚本内不要持续创建无回收的位图对象。

  3. 同一脚本在 A 手机正常、B 手机找不到目标一是使用固定像素坐标,更换分辨率后偏移;二是相似度设置过高,屏幕色温差异导致颜色不匹配;三是模板截图包含大量背景,缩放后匹配度不足。

  4. 保存截图相册不显示screenShot写入图片后,调用updatePhotoAlbum(文件路径)刷新系统媒体库,或保存至 DCIM 标准相册目录。

  5. stopScreenShot 后找色失效停止截屏服务后,截屏缓存全部清空,再次使用图色功能必须重新执行requestScreenShot申请权限。

六、结语

图色自动化是移动端自动化不可替代的技术方案,尤其适配无控件、限制无障碍的封闭场景。冰狐智能辅助平台封装了成熟的底层图像算法,将复杂的像素匹配、位图处理封装为简易 JS 接口,降低了自动化开发门槛。但脚本稳定运行的核心不在于 API 调用,而在于权限生命周期管理、内存资源回收、检索范围与相似度参数精细化调优。在实际开发中,应当遵循 “无障碍优先、OCR 次之、图色兜底” 的分层定位思路,仅当前两种方案失效时使用图色识别;同时遵守设备使用规范,仅用于个人设备测试、办公辅助等合法场景。吃透平台官方图色接口的参数逻辑与底层约束,配合合理的代码优化习惯,即可写出长期稳定、跨设备兼容的图色自动化脚本。