手机录屏+OCR识别手机屏幕的文字-
做一个自动点广告播放领金币的脚本app(中)
--ADB连接专 题
-
上一篇:ADB点击实战-做一个自动点广告播放领金币的脚本app
下一篇:ADB点击实战-做一个自动点广告播放领金币的脚本app(下)
-
一、前 言
我们团队其实一直在通信领域深耕,力图用创新和智慧,让科技走进千家万户,让生活变得更美好。然而,事实上,普罗大众的绝大多数人根本对你的技术不感兴趣,我们都只关心"这个东西"能做什么,能为自己带来什么价值和用处?
从前面我们分享的一系列文章的访问量也可以很容易看出:访问量最多的居然是我们几个月前发布的《ADB点击实战-做一个自动点广告播放领金币的脚本app》,真踏马的神奇!然后一堆私信问我说,用什么技术、怎么做的?哪里可以下载来体验效果?
本文就从技术路线的角度,讲述了【自动点广告播放领金币的脚本app】的技术选型过程,对制作类似APP的读者朋友,应该具有一定的参考作用。
体验和下载地址:
智能拨号器App: http://120.78.211.195:8060/Dialer.apk
(示例APP的使用方式,可查看我下一篇章的《ADB点击实战-做一个自动点广告播放领金币的脚本app(下)》)

下面笔者将逐个章节的阐述点广告功能涉及的详细技术路线和选型过程。
- 二、获取屏幕画面
【辅助-点广告的app】面临的第一个问题就是:如何获取当前手机屏幕的画面或者界面的元素?并且还要有时效性的要求,即至少保证要每秒获取一次屏幕的元素。
通常,手机在有ADB连接的权限的情况下,我们针对手机屏幕元素的获取,主要有以下两大技术路线:
1)直接获取屏幕元素的布局文件
此方法以前面ADB的几个篇章中uiautomator的技术为主,即
adb shell uiautomator dump /sdcard/window.xml
的指令,提取得到手机最上层界面的所有元素的内容快照。提取出的屏幕快照文件内容大致如下图所示:
由图中的元素和属性可知,快照包含各节点的名称、id、clickable、以及最关键的xy坐标和宽高度的像素值。
开发者可以直接使用uiautomator获取到的xml内容,使用resource-id或者干脆直接基于坐标位置做点击操作,即可正常的实现关闭广告的能力。
但是,uiautomator技术有个弊端:它的操作是以秒为单位的,即通常说的"秒级"操作。我们调用一次【adb shell uiautomator dump】指令,依照手机屏幕界面复杂度和手机CPU主频的性能,约2~5秒后才返回结果出来。
很明显,它不太适用于我们当前要做的这个【辅助-点广告的app】的应用场景。
2)直接获取手机屏幕的截图
Android手机获取屏幕截图的方法有很多,这里特意提示一下,【adb shell screencap】这个指令获取截图也是秒级的响应,垃圾的一匹,跟【adb shell uiautomator dump】有得一拼,首先被废弃了。
通常,最常用能快速响应的获取屏幕截图的方式,大致为以下几种:
|-------------------|------------------------------------|-------------------|------------------|
| | MediaProjection 方式 | minicap方式 | scrcpy方式 |
| 截图速度 | 30fps以内 | 120fps以内 | 60-120fps |
| CPU性能 | 高 | 高 | 高 |
| 依赖c++的so库 | 否 | 是 | 否 |
| 是否要弹窗授权 | APP运行时弹一次 | 否 | 否 |
| 是否依赖ADB连接 | 否 | 是 | 是 |
| 体积大小 | Android内置 | 约500Kb | 约90Kb |
我们当前的需求非常的简单:至少要保证每秒能输出1帧到2帧的画面,用这个画面的一部分来进行文字和图片识别,找到匹配的关键字和关闭按钮,获取到关闭按钮或继续按钮的坐标,对坐标进行点击。
这样,其实上述3种方法都是可以的。本文中,为了简化逻辑和操作复杂度,采用了Android内置的MediaProjection方式,进行手机屏幕画面的获取。此方法唯一的弊端就是每次重新运行app后,都要手动弹窗做一次【录制屏幕】的授权,不过操作频次很小,对功能效果影响不大。
- 三、识别屏幕文字和坐标位置
这一章是一个很严肃的课题。要不要这么做,要如何做,首先取决于上章的"获取屏幕元素"的方式。
很明显,由于上一章我们无法忍受"【adb shell uiautomator dump】指令约2~5秒后才返回结果"这种蜗牛一般的响应速度,APP获取到的将是手机屏幕画面的截图。
这样,我们根据"手机屏幕画面的截图"来提取出【匹配的关键字和关闭按钮】,这个功能,就属于OCR的范畴,这也是本文重点讲述的内容。
OCR,光学字符识别,顾名思义就是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。
在这个过程中,OCR程序负责将上一章节捕获的屏幕截图的图片,进行转义和解析,识别出对应的文字和颜色图案,供后续进行文字匹配和关闭按钮图标的查找。
【辅助-点广告的app】功能中,OCR识别的目标通常为"中文字符串",因此要在Android手机APP中选型和集成中文识别率高的、执行速度快的OCR模型和库,就至关重要了。
众所周知,一说到嵌入到Android应用进行本地OCR识别的模型,通常有以下3种:
|---------------|-----------------------|----------------------------------------|-------------------------------|
| | Tesseract OCR | Google ML Kit Text Recognition | 百度飞桨 OCR-Lite |
| 依赖项 | 纯java库 | 需安装Google Play | 依赖so库 |
| 体积 | 10Mb模型+700Kb库 | 23Mb模型,内置库 | 4Mb模型+3Mb库 |
| 中文识别率 | 垃圾 | 垃圾 | 好 |
| 识别速度 | 快 | 快 | 快 |
| 内存占用 | 低 | 低 | 低 |
笔者作为一个正常的人类,并不以支持国产为荣,一切都以项目需求为准。但是他娘的,给你机会你不中用啊。我就想说:一个中文识别率跟一坨屎一样的OCR库,它凭什么能在中国大陆生存?(这里仅仅讨论嵌入到Android独立识别的Lite版)
网络上溜了一圈,压根没发现有效果跟Paddle-Lite差不多的库,根本就没得选。幸运的是飞桨的OCR确实是做得好,点赞好评没得说,没有辜负我们的期望,不需要更换了。
在这里,特意感谢一下paddleocr4android开源库的作者,他的项目在选型的前期帮了我们很大的忙,缩短了OCR选型的时间,虽然我们后面是使用了PaddlePaddle官方最新的Lite库和模型自己转换,但仍然非常的感谢他。
项目链接:https://gitee.com/equation/paddleocr4android
后面要选型的读者或朋友,也可以参考他的项目来进行Paddle-OCR的验证。
写到这里有一个好消息:PaddleLite的OCR模型和库,在识别出文字内容的同时,同步返回文字所在位置相对于图片起始位置的xy坐标。开发者可以根据预定的文字和图片的特征,匹配到关键字和关闭按钮后,根据xy坐标的值,直接发送点击事件去点击屏幕的xy坐标位置即可实现辅助的点击操作。
至于【辅助-点广告的app】需要哪些关键字,以及它们的辅助和跳转特征是什么,我们在上一篇章《ADB点击实战-做一个自动点广告播放领金币的脚本app》中已经描述得很清楚了,此处不再赘述。感兴趣的朋友也可以自己提取和建立自己的特征,进行个性化的识别和匹配点击操作。
- 四、点击屏幕坐标或发送返回键
点击屏幕的做法,在本次《ADB连接专题》前面的几个篇章中,我们已经深入的进行了分析,此处也不再赘述(如《手机app如何跳过无障碍权限实现弹框自动点击-ADB连接专题》等文章已经阐述的很清楚了)。简单来说就是目前有两个主流的方向,都可以实现根据屏幕的xy坐标,对屏幕进行点击和发送返回键的操作,如下:
1)使用无障碍授权后实现弹框自动点击
无障碍也很好用,缺点就是每次重新打开手机APP的时候,都要做一次"无障碍"的授权弹框。
由于本文采用了Android内置的MediaProjection方式,进行手机屏幕画面的获取。也要每次运行的时候弹一次授权框,大哥不笑二哥,弹框的时候是要弹一个框,或者是连续弹出两个框,让用户进行确认授权而已。
2)建立ADB连接后发送ADB指令实现弹框自动点击
先对手机开启【开发者模式】,在手机设置的开发者选项中,开启【USB调试】,并将手机通过USB数据线插入电脑,运行【adb tcpip 5555】命令。这样,手机APP就可以通过ADB客户端主动连接到手机公开的5555的TCP端口,保持稳定的ADB连接。
它的优点是手机只需要操作一次,就能每次使用APP的时候都能自动建立稳定ADB连接。除非重启了手机,需要再次运行【adb tcpip 5555】命令。
建立ADB连接后采用【adb shell input tap x y】和【adb shell input keyevent 4】的命令,实现应用APP对手机屏幕做出按坐标位置点击和主动发送返回键,对屏幕的对应应用进行间接的辅助操作。从而实现我们预期的"自动播放和识别点击关闭广告领金币"的效果。
- 五、小结
ADB连接专题经过以上的一顿操作,精准的实现了识别屏幕、查找关键字、提取特征、自动点击的目标效果。结合具体目标的业务需求,解放了用户的双手,极大提升了手机翻阅广告的效率。