root
前言:
使用虚拟机 VMOS Pro,可以拥有大多应用权限,不必刷机。不同手机不同操作,刷机有变砖风险!
步骤:
- 解bl锁
各品牌手机解锁有所不同,三星、小米、一加、Google pixel等部分厂商官方给解锁。
解锁困难的华为旧机:我用的是github的potatoNV短接解锁,如果其中没有你的手机,直接淘宝不要浪费时间。作者在youtube有教程,照做就好了(视频简介的USB com 1.0连接教程也要看,他的点击DriverSetup操作很快,不要漏了),短接点可以参考这里。获得解锁码搜华为工具箱即可解锁。
- 刷入 TWRP (recovery)、刷rom(系统)
建议不要刷机软件一键刷机,都是一堆广告的系统。
- 手机品牌官网下载对应机型的驱动,并在windows设备管理器确认连接。
- twrp官网下载TWRP。(TWRP 类似于 windows PE,是修改系统的程序。也可以去https://unofficialtwrp.com下载,收录了全面的非官方TWRP,如果有广告拦截检测可以安装ublock插件。)
- 下载刷机软件和rom:
三星为例: 进入刷机模式,下载三星手机刷机的软件Odin和 tar格式的TWRP,然后用Odin(选择AP)刷进手机。可参考youtube视频。
卡刷:在https://samfw.com/下载,放入手机存储,双清后安装即可。
线刷:在https://samfirmtool.com/下载三星手机官方系统下载器SamFirm,然后使用Odin。
SamFirm使用方法:
小米为例: 在https://xiaomirom.com/下载刷机工具,下载酷安大神(例如:乌堆小透明)的ROM,或者欧版eu社区版ROM。然后按照此教程操作,安装选择默认即可,开机后卸载重装magisk。
华为旧机为例: 在https://m.huaweirom.com/rom/找到对应机型的rom,我当时看到网站干净无广告就刷了,是可以用的。Fastboot模式运行run脚本就行了。
- root
github下载magisk放进手机储存卡(有人建议低版安卓用20.4版本),进入TWRP recovery安装,开机后安装magisk manager app即可。
自动化
工具
识别方式 控件查找:可兼容所有机型,但是不能定位非原生安卓的对象(如 Unity3D 的游戏),或随机变化的控件(如安全键盘)。显然图像识别时必备的
图像识别:可查找所有显示内容,且难以被检测。但可能有识别慢、识别结果不准确、多分辨率不兼容的问题,不过使用airtest可以缓解
自动化工具有
- Yyds.Auto:使用root深度掌控,内置yolo等ai模型,堪称最强方案,但部分app可能会对root设备监控
- airtest:基于图像识别
- appium:图像识别需自己实现
- EasyClick:支持打包apk,收费
- AutoX.js:支持打包apk,图像识别需自己实现
- Hamibot:支持打包apk,可以浏览器远程控制
- AiBote:办公自动化
- Tasker、MacroDroid:单独app即可简单使用,收费
airtest(使用PC)
可支持自动化测试Android/Windows/iOS,详见官网及官方教程
优点:图像识别+控件识别满足绝大部分自动化任务
缺点:windows运行手机模拟器略卡,再映射到airtest IDE中更卡
算法
- 模板匹配
- 速度快
- 无法跨分辨率识别
- 屏幕没有结果也会匹配出不准确的结果
- 特征点匹配
- 跨分辨率识别(可跨设备)
- 不能识别纯文字、空白截图
技巧
- 截有特征的小图(多截空白背景图会使准确度下降)
- 有相同按钮时,把按钮全部截图再定位
基础
- mumu模拟器连接示例
- 文件–>新建脚本–>.py纯Python(高级用户)
- Save Path: 文件保存路径
- Log Directory: log保存路径
- Devices:使用当前已连接的手机设备进行初始化
- Project Root: 项目的父目录
- 坐标
- 绝对坐标:打开IDE的选项–>设置–>Device,勾选实时坐标显示显示鼠标在手机中的坐标
- 相对坐标:勾选实时坐标选项,再勾选相对坐标,显示鼠标在手机中的相对坐标(可跨分辨率),相对坐标*电脑分辨率=绝对坐标,点击鼠标右键可复制坐标信息
# 获取横屏电脑分辨率
height = G.DEVICE.display_info['width']
width = G.DEVICE.display_info['height']
# 已知相对坐标[0.3,0.55],转换成绝对坐标
x2 = 0.3*width
y2 = 0.55*height
# 已知绝对坐标[311,1065],转换成相对坐标
x1 = 311/width
y1 = 1065/height
- 图像识别
touch(Template(r"tpl1598948415043.png", target_pos=6))
# 参数
filename:截图路径
threshold:可信度,默认0.7
target_pos:点击位置,默认5(图像中心),1(左上角)~9(右下角)
rgb:使用彩色识别
- 局部截图
from airtest.aircv import *
screen = G.DEVICE.snapshot()
# 局部截图,左上(0,160)右下(1067,551)
part_screen = aircv.crop_image(screen,(0,160,1067,551))
# 保存局部截图到log文件夹中
try_log_screen(part_screen)
- API
- 点击:
touch
- 滑动:
swipe
- 等待截图出现:
wait
- 存在某个截图:
exists
- 文本输入:
text
- 关键词操作:
keyevent
- 截图:
snapshot
- 等待:
sleep
- 断言:
assert_exists
、assert_not_exists
、assert_equal
、assert_not_equal
- 点击:
- 文字识别
# 建议尝试Poco控件识别,小概率识别不准,就会影响程序运行
# 实际使用中,单纯文字识别准确率尚可,数字/符号识别不准(使用相应匹配规则也不行,需借助另外专业的库)
import pytesseract
from PIL import Image
# 打开图片
image = Image.open(r'D:/test/score0.png')
# 识别
text = pytesseract.image_to_string(image)
# 识别中文
text3 = pytesseract.image_to_string(image3,lang='chi_sim')
# 点击ocr文字
def touch_ocr(target_text):
# 已知相对坐标[0.13,0.01][0.27,0.04],局部截图
x1 = 0.13*height
y1 = 0.01*width
x2 = 0.27*height
y2 = 0.04*width
part_screen = aircv.crop_image(screen,(x1,y1,x2,y2))
# try_log_screen(part_screen)
# 识别
text = pytesseract.image_to_string(part_screen,lang='chi_sim')
# print(text)
if target_text == text:
x_center=(x1+x2)//2
y_center=(y1+y2)//2
touch(x_center,y_center)
Tasker(使用andriod)
优点:性能好,无需电脑
缺点:需root,只能处理简单任务
基础
Tasker终身许可$3.49,可app单独使用,需root才顺畅使用,否则锁屏都不能解决
设置:
- 防止系统清理:进入系统最近任务界面,点击应用旁边的小锁,锁定应用不被系统清理
- 忽略电池优化:依次打开系统设置,应用和通知,应用管理,设置,特殊访问权限,忽略电池优化(直接在设置搜索栏搜索电池也能找到),允许忽略应用
- 设置启动管理:依次打开系统设置,电池,启动管理,关闭应用自动管理后弹出的对话框中选中:允许自启动,允许关联启动,允许后台活动
- 权限全部打开
shell
shell命令很方便定义操作(点击的坐标可以在手机开发者选项中打开指针位置)。shell命令摘录网站
#按键事件
input text <string> #输入文本
input keyevent 20 #向下
input keyevent 4 #返回
input keyevent 3 #Home
input keyevent 6 #挂机
input keyevent 84 #搜索
input keyevent 26 #电源,息屏
input keyevent 24 #音量+
input keyevent 25 #音量-
#模拟点击
input tap 100 100
#滑动
input swipe x1 y1 x2 y2 ms
input swipe 100 100 400 100 300 #左往右
input swipe 400 100 100 100 300 #右往左
input swipe 100 100 100 400 300 #上往下
input swipe 100 400 100 100 300 #下往上
input swipe 100 100 400 400 300 #上往下斜
input swipe 400 400 100 100 300 #下往上斜
#长按
input swipe 100 100 100 100 1000 //在 100 100 位置长按 1000毫秒