Start here

Yyds.Auto 文档

在手机上跑 Python。新手先走第一次运行;要用 Cursor / Codex 说话控设备,去 AI 开发。

快速入门

Yyds.Auto 是一个基于 ROOT/SHELL 权限的 Python 安卓自动化框架。脚本在设备端独立运行,通过 from yyds_auto import * 导入所有 API。支持英文和中文两套函数名,按键精灵用户也能轻松上手。

最小示例(英文 API)

1from yyds_auto import *
2 
3# 获取屏幕尺寸
4w, h = device_get_screen_size()
5print(f"屏幕: {w}x{h}")
6 
7# 点击屏幕中心
8click(w // 2, h // 2)
9 
10# OCR 识别屏幕文字
11results = ocr()
12for r in results:
13 print(r.text, r.x, r.y)

最小示例(中文 API)

1from yyds_auto import *
2 
3# 获取屏幕尺寸
4宽, 高 = 屏幕尺寸()
5print(f"屏幕: {宽}x{高}")
6 
7# 点击屏幕中心
8点击(宽 // 2, 高 // 2)
9 
10# OCR 识别屏幕文字
11结果 = 文字识别()
12for r in 结果:
13 print(r.text, r.x, r.y)

项目结构

最少两个文件即可运行。完整说明见左侧「工程创建」。

1my_project/
2├── main.py # 脚本入口(必需)
3├── project.config # 工程配置(必需)
4├── ui.yml # App 配置界面(推荐)
5├── requirements.txt # pip 依赖(可选)
6└── res/ # 找图/模型资源(可选)

开发流程

第一次只走这三步。打包 APK 是之后分发用的,不是入门步骤。

1

激活引擎

手机安装 App,用 ROOT 或 ADB 拉起引擎,确认 61140 可访问。细节见「第一次运行」。

2

加载示例并推送

桌面点「加载示例工程」,再点「推送并运行」。不要从打包 APK 开始。

3

看日志并停止

日志在设备悬浮窗和 IDE 底部。停止用 IDE 或 App 的停止按钮。

工程创建

工程是一组推到手机上运行的脚本文件。最少只要 main.py + project.config。推送后位于设备 /storage/emulated/0/Yyds.Py/工程名/。

如何创建工程

桌面(YY畅控)

打开「脚本项目」,选一个空目录新建,或点「加载示例工程」。会生成 main.py 与 project.config。

手机 App

在 Yyds.Auto 首页的工程列表里新建。工程直接落在设备 /storage/emulated/0/Yyds.Py/。

网页控制台

打开开发助手,选中在线设备后点「新建项目」。名称仅支持字母、数字、下划线、中划线。

工程目录结构

运行必需的是 main.py 与 project.config;其余为推荐或 IDE 辅助文件。

my_project/
main.py# 脚本入口(必需)
project.config# 工程配置(必需)
ui.yml# App 配置界面(推荐)
requirements.txt# pip 依赖(可选)
res/button.png# 找图/模型资源(可选)
工程目录一览。标了入口与配置的文件是运行必需。
1my_project/
2├── main.py # 脚本入口(必需)
3├── project.config # 工程配置(必需)
4├── ui.yml # App 配置界面(推荐)
5├── requirements.txt # pip 依赖(可选)
6└── res/ # 找图/模型资源(可选)
7 └── button.png
文件是否必需作用
main.py必需入口脚本。推送并运行时执行这个文件。
project.config必需INI 配置:工程名、版本、调试设备 IP。
ui.yml推荐App 内展示的开关/输入框。脚本用 读取配置("check-enable") 读取。
requirements.txt可选pip 依赖列表,推送到设备后可在 Pip 面板安装。
res/可选找图模板等资源,路径相对工程目录。

project.config

INI 格式,# 开头为注释。PROJECT_NAME 与 PROJECT_VERSION 必填。PC 调试填 DEBUG_DEVICE_IP;USB 可先 adb forward tcp:61140 tcp:61140 再填 127.0.0.1。

1[default]
2PROJECT_NAME=my_project
3PROJECT_VERSION=1.0
4# USB: adb forward tcp:61140 tcp:61140 then 127.0.0.1
5DEBUG_DEVICE_IP=
6PACK_KEY_WITH_VERSION=false

ui.yml

没有 ui.yml 也能运行。有则在 App「工程配置」页显示表单。脚本用 读取配置("check-enable") 读取。电脑运行读 ui.yml 默认值。完整说明见「工程配置」。

1text-notice:
2 value: "示例工程"
3 color: "#008305"
4 size: 16
5 
6check-enable:
7 title: "启用功能"
8 value: true
9 
10select-mode:
11 title: "运行模式"
12 value: ["快速演示", "完整流程"]
13 
14edit-user:
15 title: "账号"
16 value: "demo"

设备上的位置

推送到手机后目录为 /storage/emulated/0/Yyds.Py/<工程名>/。开机自启应等 61140 起来后请求 GET http://127.0.0.1:61140/project/start?name=工程名。

第一次运行

脚本在手机上跑,不在电脑上跑。先让引擎起来,再用桌面加载示例并推送并运行。设备脚本一律 from yyds_auto import *。

激活引擎

安装 Yyds.Auto App。有 ROOT 时 App 会拉起 yyds.keep → yyds.auto 与 yyds.py(端口 61140)。无 ROOT 时用 ADB/SHELL 激活。引擎没起来时,任何 click / ocr 都会失败。

App
Yyds.Auto
yyds.keep
守护
yyds.auto
:49009
yyds.py
:61140
脚本
main.py
设备上的进程:App 拉起 yyds.keep,再派生自动化引擎与 Python 引擎。脚本跑在 :61140。

手机本机访问 http://127.0.0.1:61140/project/list 有 JSON 即表示 61140 已起来。

1# on the phone (or adb shell)
2wget -qO- http://127.0.0.1:61140/project/list
3 
4# USB from the PC
5adb forward tcp:61140 tcp:61140
6wget -qO- http://127.0.0.1:61140/project/list
USB
电脑127.0.0.1:61140 手机

adb forward tcp:61140 tcp:61140

WiFi
电脑DEBUG_DEVICE_IP 手机

同一网段,填 App / 桌面列表里的手机 IP

USB 走本机端口转发;WiFi 填手机局域网 IP。两种不要混用。

USB:电脑执行 adb forward tcp:61140 tcp:61140,DEBUG_DEVICE_IP 填 127.0.0.1。不要填局域网 IP。

WiFi:电脑与手机同一网段,DEBUG_DEVICE_IP 填手机 IP(App 或桌面设备列表可见)。

推荐路径(第一次只用这个)

桌面 YY畅控 → 加载示例工程 → 选中设备 → 推送并运行。网页控制台等会了再换。

1

加载示例工程

桌面「脚本项目」里点加载示例,得到带 main.py 的入门工程。

2

推送并运行

把工程推到手机 /storage/emulated/0/Yyds.Py/ 并启动。设备上应弹出 toast。

3

看日志

print 出现在设备悬浮窗,也出现在桌面 IDE 底部日志。

停止:桌面或 App 点停止。不要用杀进程当日常手段。打包独立 APK 是分发步骤,不是第一次运行。

两套 API 不要混

设备脚本用 from yyds_auto import *(click / 点击)。d = yyds_auto.connect(); d.click() 是 PC 端 OOP SDK,不能当设备裸函数抄。

坐标从哪来

截图
540,1200
控件树
OCR 框
设置
WLAN
蓝牙
三种取点方式:截图像素、控件树节点、OCR 文字框。
  • 截图:桌面开发助手截图,在图上读像素。不同分辨率用 scale_pos / click_scaled。
  • 控件树:dump UI,按 text / id 取节点中心,比手写坐标稳。
  • OCR:ocr() 返回文字块带 x/y;或 wait_and_click_text / 等待并点击文字。

第一个任务:打开设置并点文字

引擎起来后把这段放进 main.py 再推送。找不到字就改超时或换更短的词。息屏时先点不了。

12:00
设置
WLAN
蓝牙

open_app 打开设置后,wait_and_click_text 点高亮这一行。

第一个任务要点到的就是「设置」这一行。
1from yyds_auto import *
2 
3open_app("com.android.settings")
4if wait_and_click_text("设置", timeout=10):
5 toast("clicked")
6else:
7 toast("text not found")

排障

  • 引擎没起来:App 里看引擎状态;本机 wget -qO- http://127.0.0.1:61140/project/list 失败就先激活,不要改脚本。
  • import yyds_auto 失败:脚本必须推到设备跑。电脑上要装 yyds-auto 或配置 shims extraPaths,那是 PC 调试,不是设备运行时。
  • 点击没反应:坐标是否相对当前分辨率;是否息屏/锁屏;ROOT 下可 ensure_kernel_click。
  • OCR 空结果:画面是否有字、是否被悬浮窗挡住;先 screenshot 再 ocr。要用电脑 Umi-OCR:开发配置填地址/端口,日志出现 [OCR] Umi-OCR 即成功。
  • USB 却填了局域网 IP:USB 必须 adb forward tcp:61140 tcp:61140 且 IP 为 127.0.0.1。

中文 API

所有英文 API 都有对应的中文别名,from yyds_auto import * 后即可直接使用。中文和英文函数完全等价,参数和返回值一致,可以混合使用。

常用中文 API 速查

分类中文英文
触摸点击 / 双击 / 长按 / 滑动click / click_double / long_press / swipe
按键返回键 / 主页键 / 确认键key_back / key_home / key_confirm
OCR截图 / 文字识别 / 屏幕找字screenshot / ocr / screen_ocr_x
找图找图 / 屏幕找图 / 找图点击screen_find_image / screen_find_image_x / find_image_click
大漠锁图 / 区域找图 / 找色 RRGGBBlock_screen / find_pic region / find_color hex
找色找色 / 取色 / 多点取色find_color / get_color / get_multi_color
界面节点控件匹配 / 控件存在ui_match / ui_exist
工程配置读取配置 / 写入配置 / 重载配置read_config / write_config
对话框确认 / 询问 / 提示confirm / ask / toast
等待等待文字 / 等待控件 / 等待图片wait_for_text / wait_for_ui / wait_for_image
应用打开应用 / 关闭应用 / 是否在应用内open_app / stop_app / is_in_app
输入输入文字 / 智能输入 / 复制到剪贴板input_text / x_input_text / set_clipboard
设备屏幕尺寸 / 设备型号 / 前台包名device_get_screen_size / device_model / device_foreground_package
系统执行命令 / 提示 / 等待shell / toast / sleep
网络网页GET / 网页POST / WebSocket连接http_get / http_post / websocket_connect

中文脚本完整示例

1from yyds_auto import *
2 
3# 打开微信
4打开应用(常用应用["微信"])
5睡眠(3)
6 
7# 等待首页加载
8等待文字("微信", "通讯录", timeout=15)
9 
10# 点击发现
11文字点击("发现")
12睡眠(1)
13 
14# 滑动查找朋友圈
15滑动找字并点击("朋友圈")
16 
17# 截图保存
18截图("/sdcard/朋友圈.png")
19提示("操作完成!")

大漠对照

用过大漠插件的人可以直接按 FindPic / FindColor / LockDisplay 的习惯写。锁一帧再连找,比每次截屏快。找不到时 if r: 为假。透明 PNG、设计稿缩放继续能用。

大漠Yyds.Auto
LockDisplay / UnLockDisplay锁图() / 解锁图()
FindPic(x1,y1,x2,y2,"a.bmp|b.bmp",sim)找图(x1,y1,x2,y2,"img/a.png|img/b.png", 相似度=0.9)
FindColor(..., "ff0000-101010")找色(x1,y1,x2,y2,"ff0000-101010")
Ocr文字识别()
LeftClick / KeyPress / Delay点击 / 按键 / 睡眠
dm.FindPic / dm.FindColor / dm.LockDisplayfrom yyds_auto import dm

点中心用 点击目标(r);点左上角用 点击(r.x, r.y),和 FindPic 的 intX/intY 一样。

1from yyds_auto import *
2 
3锁图()
4r = 找图(0, 0, 1080, 2400, "img/开始.png|img/开始.jpg", 相似度=0.9)
5if r:
6 点击目标(r)
7c = 找色(0, 0, 200, 80, "ff0000-101010")
8if c:
9 点击(c.x, c.y)
10解锁图()
11 
12from yyds_auto import dm
13dm.LockDisplay()
14idx, x, y = dm.FindPic(0, 0, 1080, 2400, "img/开始.png", "000000", 0.9, 0)
15if idx >= 0:
16 dm.MoveTo(x, y)
17 dm.LeftClick()
18dm.UnLockDisplay()

函数参考

下面每一条的名字、中文别名和签名都从设备运行时生成。手机上直接调用函数。电脑上若标了 d.名字,就是同一个英文方法。改 API 只改 python-shims,然后运行 python tools/sync_script_api.py。

👆 触摸点击

点击clickd.点击点屏幕上的一个位置

展开后加载参数说明和使用案例。

双击click_doubled.双击连点两下

展开后加载参数说明和使用案例。

随机点击random_clickd.随机点击在一块区域里随便点一下

展开后加载参数说明和使用案例。

长按long_pressd.长按按住不放

展开后加载参数说明和使用案例。

按下touch_downd.按下按住不放

展开后加载参数说明和使用案例。

移动touch_moved.移动按住时拖到这里

展开后加载参数说明和使用案例。

抬起touch_upd.抬起松开手指。不写坐标就在上次按下/移动的位置抬起

展开后加载参数说明和使用案例。

点击目标点击识别结果d.点击目标点击找字/找图/控件或列表第一项

展开后加载参数说明和使用案例。

长按目标long_press_target长按查找结果中心

展开后加载参数说明和使用案例。

按设计稿点击缩放点击d.按设计稿点击按 1080×2400 设计稿上的坐标来点,自动适配本机分辨率

展开后加载参数说明和使用案例。

👋 滑动手势

滑动swiped.滑动从一点滑到另一点,duration 是毫秒

展开后加载参数说明和使用案例。

拟人滑动human_swipe带弧线和变速的一次滑动

展开后加载参数说明和使用案例。

上滑swipe_upd.上滑从下往上滑(翻看下面的内容)

展开后加载参数说明和使用案例。

下滑swipe_downd.下滑从上往下滑

展开后加载参数说明和使用案例。

左滑swipe_leftd.左滑从右往左滑

展开后加载参数说明和使用案例。

右滑swipe_rightd.右滑从左往右滑

展开后加载参数说明和使用案例。

滑动目标swipe_target从查找结果中心按方向滑

展开后加载参数说明和使用案例。

滚轮wheel滚列表

展开后加载参数说明和使用案例。

手势gestured.手势沿一串坐标滑过去

展开后加载参数说明和使用案例。

双指缩小pinch_in两指向内捏(缩小画面)

展开后加载参数说明和使用案例。

双指放大pinch_out两指向外撑(放大画面)

展开后加载参数说明和使用案例。

⏳ 等待操作

等待文字wait_for_textd.等待文字等到屏幕上出现这些字

展开后加载参数说明和使用案例。

等待文字消失wait_for_text_gone等待屏幕上的指定文字消失

展开后加载参数说明和使用案例。

等待控件wait_for_uid.等待控件等到这个控件出现

展开后加载参数说明和使用案例。

等待控件消失wait_for_ui_gone等待指定 UI 控件消失

展开后加载参数说明和使用案例。

等待图片wait_for_imaged.等待图片等待屏幕出现指定图片

展开后加载参数说明和使用案例。

等待页面wait_for_activity等待进入指定 Activity 界面

展开后加载参数说明和使用案例。

等待应用wait_for_package等待进入指定应用

展开后加载参数说明和使用案例。

等待并点击文字wait_and_click_text等到字出现就点

展开后加载参数说明和使用案例。

等待并点击控件wait_and_click_ui等到控件出现就点

展开后加载参数说明和使用案例。

等待并点击图片wait_and_click_image等到图出现就点

展开后加载参数说明和使用案例。

等待画面变化wait_screen_changed.等待画面变化等待屏幕发生变化 (页面跳转、加载完成等)

展开后加载参数说明和使用案例。

等待画面稳定wait_screen_stabled.等待画面稳定等待屏幕稳定 (不再变化), 常用于等待页面加载完成

展开后加载参数说明和使用案例。

滑动找字swipe_to_find_text反复滑动直到找到指定文字

展开后加载参数说明和使用案例。

滑动找控件swipe_to_find_ui反复滑动直到找到指定 UI 控件

展开后加载参数说明和使用案例。

滑动找图swipe_to_find_image反复滑动直到找到指定图片

展开后加载参数说明和使用案例。

🔍 文字识别 OCR

文字识别识别文字d.文字识别读出当前屏幕上的字

展开后加载参数说明和使用案例。

屏幕找字screen_ocr_xd.屏幕找字在屏幕上找这些字

展开后加载参数说明和使用案例。

屏幕找字_首个screen_ocr_first_xd.屏幕找字_首个OCR 识别, 只获取第一个返回结果

展开后加载参数说明和使用案例。

文字点击ocr_click_if_foundd.文字点击屏幕上看到这些字就点

展开后加载参数说明和使用案例。

文字点击任一ocr_click_any这些字里出现任意一个就点

展开后加载参数说明和使用案例。

文字全部存在ocr_exists_alld.文字全部存在这些字是不是都在屏幕上

展开后加载参数说明和使用案例。

文字任一存在ocr_exists_any这些字里有没有任意一个在屏幕上

展开后加载参数说明和使用案例。

设置字库set_dict加载字库。文件夹里每张图一个字(0.png、1.png),或大漠点阵 txt。

展开后加载参数说明和使用案例。

选用字库use_dict切换当前字库编号 0–9。

展开后加载参数说明和使用案例。

找字find_str用当前字库找一段字。

展开后加载参数说明和使用案例。

读字read_str用当前字库读区域内的字(血量、金币)。

展开后加载参数说明和使用案例。

🖼️ 图片匹配

找图screen_find_image在屏幕上找这些图片。

展开后加载参数说明和使用案例。

找图Exfind_pic_ex找出这张图在屏幕上的全部位置。

展开后加载参数说明和使用案例。

轮廓找图find_contour按轮廓在屏幕上找已提取的轮廓图

展开后加载参数说明和使用案例。

轮廓找图Exfind_contour_ex找出这张轮廓图在屏幕上的全部位置

展开后加载参数说明和使用案例。

屏幕找图screen_find_image_x在当前屏幕上找模板图

展开后加载参数说明和使用案例。

屏幕找图_首个screen_find_image_first_x屏幕查找图片, 仅返回第一张查找结果

展开后加载参数说明和使用案例。

模板匹配match_images对图片在指定范围内进行多次匹配。透明 PNG 模板忽略 alpha < 128 的像素。

展开后加载参数说明和使用案例。

找图点击find_image_click找到这些图就点最后一张

展开后加载参数说明和使用案例。

找图点击_最高匹配find_image_click_max_probfind_image_click的增强版本

展开后加载参数说明和使用案例。

找图点击任一find_image_click_any当前屏多张图里按传入顺序点第一张出现的

展开后加载参数说明和使用案例。

图片相似度image_similarity计算两张图片相似度

展开后加载参数说明和使用案例。

预载图load_pic把找图模板先读进内存,循环找图不再每次解码。

展开后加载参数说明和使用案例。

释放图free_pic释放预载的模板。不传参数则全部释放

展开后加载参数说明和使用案例。

🎨 截图找色

截图screenshotd.截图拍一张当前屏幕

展开后加载参数说明和使用案例。

区域截图capture_region截屏幕一块存文件。

展开后加载参数说明和使用案例。

锁图lock_screen截一帧并锁定。之后找图/找色/取色/文字识别都吃这一帧,直到 解锁图()。

展开后加载参数说明和使用案例。

解锁图unlock_screen解除 锁图()。之后找图会重新截屏

展开后加载参数说明和使用案例。

找色find_colord.找色单(多)点找色。

展开后加载参数说明和使用案例。

多点找色find_multi_color按颜色特征串在屏幕上找锚点

展开后加载参数说明和使用案例。

多点比色compare_multi_color比对固定像素是否仍是这些颜色

展开后加载参数说明和使用案例。

多组比色compare_color_groups多组特征串里返回第一组命中的下标,都未命中返回 -1

展开后加载参数说明和使用案例。

取色get_color获取图片指定坐标的颜色

展开后加载参数说明和使用案例。

多点取色get_multi_color获取图片多个坐标的颜色

展开后加载参数说明和使用案例。

🪟 界面控件

Node控件元素

展开后加载参数说明和使用案例。

控件匹配ui_matchd.控件匹配在控件树里找

展开后加载参数说明和使用案例。

控件存在ui_existd.控件存在屏幕上有没有这个控件

展开后加载参数说明和使用案例。

控件点击若找到控件则点击d.控件点击看到这个控件就点一下

展开后加载参数说明和使用案例。

控件点击任一click_node_anyd.控件点击任一依次尝试多组控件条件, 命中第一组就点击, 全部未找到返回 False

展开后加载参数说明和使用案例。

控件父级ui_parent这个控件的上一层

展开后加载参数说明和使用案例。

控件子级ui_child这个控件里面的子控件

展开后加载参数说明和使用案例。

控件兄弟ui_sib和这个控件同一层的其他控件

展开后加载参数说明和使用案例。

控件偏移ui_sib_offset获取指定偏移量的兄弟节点

展开后加载参数说明和使用案例。

控件树ui_dump_xml把当前界面的控件树存成 xml

展开后加载参数说明和使用案例。

⌨️ 按键输入

返回键key_backd.返回键按系统返回键

展开后加载参数说明和使用案例。

主页键key_homed.主页键按 Home 键回到桌面(脚本不停)

展开后加载参数说明和使用案例。

菜单键key_menud.菜单键按菜单键

展开后加载参数说明和使用案例。

确认键key_confirmd.确认键按确认/搜索键,多用于输入框提交

展开后加载参数说明和使用案例。

按键key_coded.按键按指定键值。4 是返回键,3 是 Home

展开后加载参数说明和使用案例。

输入文字input_text往当前输入框打字。中文也能用

展开后加载参数说明和使用案例。

智能输入x_input_text用 YY 输入法打字(含中文)

展开后加载参数说明和使用案例。

清空输入x_input_clear清空当前输入框

展开后加载参数说明和使用案例。

设置文本填入输入框清空当前输入框再填入文字

展开后加载参数说明和使用案例。

复制到剪贴板set_clipboardd.复制到剪贴板复制文本到粘贴板

展开后加载参数说明和使用案例。

获取剪贴板get_clipboard获取粘贴板文本

展开后加载参数说明和使用案例。

📱 设备信息

屏幕尺寸device_get_screen_size当前屏幕宽和高(像素)

展开后加载参数说明和使用案例。

前台应用device_foreground现在屏幕上是哪个 App

展开后加载参数说明和使用案例。

前台Activitydevice_foreground_activity当前界面的 Activity 名

展开后加载参数说明和使用案例。

前台包名device_foreground_package当前屏幕 App 的包名

展开后加载参数说明和使用案例。

设备编号device_code这台手机的设备编号

展开后加载参数说明和使用案例。

设备型号device_model这台手机的型号

展开后加载参数说明和使用案例。

应用包名resolve_app_package把「微信」转成包名; 已经是包名则原样返回。

展开后加载参数说明和使用案例。

网络是否在线is_net_onlined.网络是否在线手机现在有没有网

展开后加载参数说明和使用案例。

应用是否运行is_app_running这个 App 现在有没有在跑(前台或后台)

展开后加载参数说明和使用案例。

是否在应用内is_in_app当前屏幕是不是这个 App

展开后加载参数说明和使用案例。

获取电池信息get_battery_info获取电池信息

展开后加载参数说明和使用案例。

获取WiFi信息get_wifi_info获取当前 WiFi 连接信息

展开后加载参数说明和使用案例。

设置WiFi开关set_wifi_enabled开关 WiFi

展开后加载参数说明和使用案例。

设置飞行模式set_airplane_mode开关飞行模式

展开后加载参数说明和使用案例。

获取屏幕方向get_screen_orientation获取当前屏幕旋转方向

展开后加载参数说明和使用案例。

设置屏幕亮度set_screen_brightness设置屏幕亮度

展开后加载参数说明和使用案例。

获取通知get_notifications读取当前通知栏内容 (需要 ROOT/SHELL 权限)

展开后加载参数说明和使用案例。

📦 应用管理

打开应用open_appd.打开应用打开一个 App

展开后加载参数说明和使用案例。

关闭应用stop_appd.关闭应用强制关掉一个 App

展开后加载参数说明和使用案例。

打开网址open_urld.打开网址用系统浏览器打开链接

展开后加载参数说明和使用案例。

切到前台应用置顶把已打开的 App 拉回前台

展开后加载参数说明和使用案例。

应用是否运行is_app_running这个 App 现在有没有在跑(前台或后台)

展开后加载参数说明和使用案例。

是否在应用内is_in_app当前屏幕是不是这个 App

展开后加载参数说明和使用案例。

从桌面打开应用open_app_from_desktop该函数模拟手动从手机桌面点开应用, 也可以使用open_app函数

展开后加载参数说明和使用案例。

回桌面并结束exit_go_home按 Home 回到桌面,并结束当前脚本。只要回桌面、脚本继续跑,请用 回桌面() / 回到桌面()。

展开后加载参数说明和使用案例。

卸载应用app_uninstalld.卸载应用卸载应用

展开后加载参数说明和使用案例。

清除应用数据app_clear_data清除应用数据 (相当于 "清除存储")

展开后加载参数说明和使用案例。

授予权限grant_permission授予应用权限

展开后加载参数说明和使用案例。

撤销权限revoke_permission撤销应用权限

展开后加载参数说明和使用案例。

应用数据备份app_data_backup备份应用数据

展开后加载参数说明和使用案例。

应用数据恢复app_data_recovery还原应用数据

展开后加载参数说明和使用案例。

应用安装包备份app_apk_backup提取备份应用安装包(apk), 保存到设备指定位置

展开后加载参数说明和使用案例。

安装应用app_apk_install进行 apk 安装

展开后加载参数说明和使用案例。

📝 日志提示

提示toastd.提示手机弹出一句提示

展开后加载参数说明和使用案例。

确认confirm弹出确认框,点确定返回 True,取消或超时返回 False

展开后加载参数说明和使用案例。

询问ask弹出输入框,确定返回文字,取消或超时返回 None

展开后加载参数说明和使用案例。

提示并打印提示打印d.提示并打印弹出提示,同时写到下方日志

展开后加载参数说明和使用案例。

log_d打印日志在 IDE 下方打一行普通日志

展开后加载参数说明和使用案例。

log_e打印错误在 IDE 下方打一行错误日志

展开后加载参数说明和使用案例。

🔧 工具函数

睡眠sleep停几秒再继续

展开后加载参数说明和使用案例。

等待并返回假假等待睡一会儿并返回 False。常写在 or 右边。

展开后加载参数说明和使用案例。

随机睡眠随机等待d.随机睡眠随机睡 a~b 秒

展开后加载参数说明和使用案例。

执行命令shelld.执行命令在手机上执行一条命令

展开后加载参数说明和使用案例。

下载文件download从网址下载文件到手机

展开后加载参数说明和使用案例。

复制文件拉取文件d.复制文件在手机上把一个文件复制到另一个路径。两个路径都在手机里。

展开后加载参数说明和使用案例。

复制到目录推送文件d.复制到目录在手机上把文件复制进一个目录,文件名不变。

展开后加载参数说明和使用案例。

md5_file文件MD5计算文件MD5

展开后加载参数说明和使用案例。

md5_str字符串MD5计算文本MD5

展开后加载参数说明和使用案例。

换算坐标坐标缩放把设计稿上的坐标换算到这台手机。默认按 1080×2400

展开后加载参数说明和使用案例。

engine_set_debug项目级别的调试标志

展开后加载参数说明和使用案例。

💻 电脑传文件

从设备下载到电脑下载到电脑d.从设备下载到电脑从手机把文件下载到电脑。只在电脑脚本里用。

展开后加载参数说明和使用案例。

从电脑上传到设备上传到设备d.从电脑上传到设备从电脑把文件上传到手机。只在电脑脚本里用。

展开后加载参数说明和使用案例。

从设备下载目录下载目录到电脑d.从设备下载目录从手机把一个目录下载到电脑。只在电脑脚本里用。

展开后加载参数说明和使用案例。

从电脑上传目录上传目录到设备d.从电脑上传目录从电脑把一个目录上传到手机。只在电脑脚本里用。

展开后加载参数说明和使用案例。

🌐 网络请求

网页GET访问网页d.网页GETGET 访问网址

展开后加载参数说明和使用案例。

网页POSTPOST访问POST 提交

展开后加载参数说明和使用案例。

网页POSTJSONPOSTJSONPOST JSON

展开后加载参数说明和使用案例。

网页请求http_request发一次 HTTP 请求

展开后加载参数说明和使用案例。

取网页源码http_get_textGET 并直接返回网页正文(失败返回空字符串)

展开后加载参数说明和使用案例。

解析JSONJSON解码把 JSON 文本变成 dict/list

展开后加载参数说明和使用案例。

编码JSONJSON编码把 dict/list 变成 JSON 文本

展开后加载参数说明和使用案例。

WebSocket连接WS连接连上 WebSocket

展开后加载参数说明和使用案例。

WebSocket发送WS发送往已连接的 WebSocket 发一条

展开后加载参数说明和使用案例。

WebSocket接收WS接收从已连接的 WebSocket 收一条。超时返回 None

展开后加载参数说明和使用案例。

WebSocket关闭WS关闭断开 WebSocket

展开后加载参数说明和使用案例。

🎮 大漠插件

FindPic区域找图。返回 (序号, x, y),找不到 (-1, -1, -1)。同 dm.FindPic。

展开后加载参数说明和使用案例。

FindPicEx区域内全部命中。返回 ``id,x,y|id,x,y``,没有则空串。同 dm.FindPicEx。

展开后加载参数说明和使用案例。

FindColor区域找色。返回 (x, y),找不到 (-1, -1)。同 dm.FindColor。

展开后加载参数说明和使用案例。

LockDisplay锁住当前这一帧。之后 FindPic / FindColor / Ocr 都吃这一帧。同 dm.LockDisplay。

展开后加载参数说明和使用案例。

UnLockDisplay解开锁图,重新吃直播画面。同 dm.UnLockDisplay。

展开后加载参数说明和使用案例。

GetColor取色,返回大写 ``RRGGBB``。同 dm.GetColor。

展开后加载参数说明和使用案例。

MoveTo记下坐标。已经按下时会拖过去。同 dm.MoveTo。

展开后加载参数说明和使用案例。

LeftClick在上次 MoveTo 的位置点击。同 dm.LeftClick。

展开后加载参数说明和使用案例。

KeyPress按键。13=回车、8=退格、27=ESC;也可直接传 Android keycode。同 dm.KeyPress。

展开后加载参数说明和使用案例。

Delay延时,单位毫秒。同 dm.Delay。

展开后加载参数说明和使用案例。

Capture截屏幕一块保存到 file。同 dm.Capture。

展开后加载参数说明和使用案例。

BindWindow安卓脚本已在设备内运行,无需绑窗口。同 dm.BindWindow。

展开后加载参数说明和使用案例。

SetPath图在工程 img/ 下,相对路径即可。同 dm.SetPath。

展开后加载参数说明和使用案例。

LoadPic预载模板到内存。之后 FindPic 不再每次解码。同 dm.LoadPic。

展开后加载参数说明和使用案例。

FreePic释放预载模板。空串清全部。同 dm.FreePic。

展开后加载参数说明和使用案例。

SetDict加载字库。文件夹(0.png…)或大漠点阵 txt。同 dm.SetDict。

展开后加载参数说明和使用案例。

UseDict选用 0–9 号字库。同 dm.UseDict。

展开后加载参数说明和使用案例。

FindStr字库找字。返回 (序号, x, y),找不到 (-1, -1, -1)。同 dm.FindStr。

展开后加载参数说明和使用案例。

FindStrEx字库找字全部命中 ``id,x,y|...``。同 dm.FindStrEx。

展开后加载参数说明和使用案例。

LeftDown在上次 MoveTo 的位置按下。同 dm.LeftDown。

展开后加载参数说明和使用案例。

LeftUp抬起。同 dm.LeftUp。

展开后加载参数说明和使用案例。

MoveToExMoveTo 加随机偏移。同 dm.MoveToEx。

展开后加载参数说明和使用案例。

MoveR相对上次 MoveTo 的位置再移动。同 dm.MoveR。

展开后加载参数说明和使用案例。

WheelDown滚轮向下,看下面的内容。同 dm.WheelDown。

展开后加载参数说明和使用案例。

WheelUp滚轮向上,看上面的内容。同 dm.WheelUp。

展开后加载参数说明和使用案例。

🧩 场景模板

启动并等待打开 App 并等到首页出来

展开后加载参数说明和使用案例。

关闭并重启强制关闭应用后重新打开, 并等待加载完成

展开后加载参数说明和使用案例。

滑动找字并点击反复滑动屏幕直到找到指定文字, 然后点击它

展开后加载参数说明和使用案例。

滑动找控件并点击反复滑动直到找到控件, 然后点击它。

展开后加载参数说明和使用案例。

滑动找图并点击反复滑动直到找到图片, 然后点击它。

展开后加载参数说明和使用案例。

重复点击直到反复点击某个坐标, 直到屏幕出现/消失指定内容

展开后加载参数说明和使用案例。

重复点击文字直到反复点击某段文字, 直到屏幕出现/消失指定内容。不必先量坐标。

展开后加载参数说明和使用案例。

输入中文往输入框打中文

展开后加载参数说明和使用案例。

条件等待循环通用条件等待 — 反复执行检查函数直到返回 True 或超时

展开后加载参数说明和使用案例。

安全点击文字安全地等待并点击屏幕上的文字, 找不到不会报错

展开后加载参数说明和使用案例。

安全点击控件等待控件出现再点击; 找不到默认跳过, 不抛错。

展开后加载参数说明和使用案例。

按顺序点击文字批量点击文字按顺序等到每个字出现再点

展开后加载参数说明和使用案例。

按顺序点击图片click_images_in_order按顺序等到每张图出现再点

展开后加载参数说明和使用案例。

按顺序点击控件click_nodes_in_order按顺序等到每个控件出现再点

展开后加载参数说明和使用案例。

回桌面回到桌面按 Home 回到系统桌面,脚本继续往下跑。

展开后加载参数说明和使用案例。

结束脚本主动结束当前脚本。

展开后加载参数说明和使用案例。

点击屏幕中心点击当前屏幕正中间。

展开后加载参数说明和使用案例。

点击百分比按屏幕比例点击。x/y 为 0~1, 大于 1 时按 0~100 百分比理解。

展开后加载参数说明和使用案例。

关闭常见弹窗点掉同意/允许/确定/知道了 一类弹窗。额外文字可继续往后加。

展开后加载参数说明和使用案例。

⚙️ 工程配置

读取配置read_config从工程配置 ui.yml 读一项。键是「类型-名称」。

展开后加载参数说明和使用案例。

写入配置write_config把一项配置写回

展开后加载参数说明和使用案例。

重载配置reload_config重新从磁盘加载工程配置

展开后加载参数说明和使用案例。

📋 类与对象

DeviceScreenDeviceScreen

展开后加载参数说明和使用案例。

Config可视作一个小型的配置存储类, 并与设备的ui的配置共享同一个存储位置

展开后加载参数说明和使用案例。

Point坐标

展开后加载参数说明和使用案例。

ColorRGB颜色

展开后加载参数说明和使用案例。

ProjectEnvironment当前工程的运行环境, 工程级的全局变量

展开后加载参数说明和使用案例。

HttpResultHTTP 访问结果

展开后加载参数说明和使用案例。

YydsWebSocketWebSocket 连接

展开后加载参数说明和使用案例。

Dm大漠插件同款入口。脚本里用 ``dm.FindPic`` / ``dm.FindColor`` / ``dm.LockDisplay``。

展开后加载参数说明和使用案例。

✨ 装饰器

write_rgba_pngwrite_rgba_png

展开后加载参数说明和使用案例。

click_texts_in_order按顺序点击文字按顺序等到每个字出现再点

展开后加载参数说明和使用案例。

click_images_in_order按顺序点击图片按顺序等到每张图出现再点

展开后加载参数说明和使用案例。

click_nodes_in_order按顺序点击控件按顺序等到每个控件出现再点

展开后加载参数说明和使用案例。

run立即运行装饰器 直接运行定义的函数

展开后加载参数说明和使用案例。

run_no_hurt安全运行装饰器 直接运行定义的函数, 并捕抓其运行异常

展开后加载参数说明和使用案例。

retry_until_true重试直到成功装饰器 循环运行定义的函数, 最大尝试`retry_time`次, 间隔`interval`秒,

展开后加载参数说明和使用案例。

register_task注册任务把一个函数当作一个任务

展开后加载参数说明和使用案例。

run_activity_handler注册界面处理器判断当前设备活动名是否为注册的活动名, 如果是, 则执行任务, 如果不是, 则打印日志

展开后加载参数说明和使用案例。

📎 其他

YydsParamErrorSDK 参数校验错误 — 提供友好的中文提示

展开后加载参数说明和使用案例。

format_time格式化时间现在几点

展开后加载参数说明和使用案例。

ResFindImage自动化引擎 封装高级查找图片(模版匹配算法)请求参数

展开后加载参数说明和使用案例。

ResOcr自动化引擎 封装OCR识别返回结果

展开后加载参数说明和使用案例。

DeviceForegroundResponse设备前台运行的应用信息

展开后加载参数说明和使用案例。

RequestFindImage引擎查找图片请求参数

展开后加载参数说明和使用案例。

MatchImageResult引擎匹配图片返回结果

展开后加载参数说明和使用案例。

EngineResultParser引擎颜色字符串转化解析

展开后加载参数说明和使用案例。

EngineDebugEngineDebug

展开后加载参数说明和使用案例。

engine_project_nameengine_project_name

展开后加载参数说明和使用案例。

engine_project_dirDevice path the engine JNI can open. Never a Windows path.

展开后加载参数说明和使用案例。

engine_template_pathTemplate path for /match_image. Relative → /sdcard/Yyds.Py/<工程>/…

展开后加载参数说明和使用案例。

engine_http_originReturn (host, port) for the yyds.py engine.

展开后加载参数说明和使用案例。

engine_base_urlengine_base_url

展开后加载参数说明和使用案例。

engine_api_url脚本调用自动化接口的地址。

展开后加载参数说明和使用案例。

engine_api自动化引擎底层 HTTP 调用。

展开后加载参数说明和使用案例。

engine_call调用引擎接口并自动解析JSON返回值。

展开后加载参数说明和使用案例。

update_language设置系统语言d.update_language设置安卓系统语言

展开后加载参数说明和使用案例。

media_scan_file扫描媒体文件d.media_scan_file安卓系统媒体文件扫描

展开后加载参数说明和使用案例。

wake_up亮屏点亮屏幕。用唤醒键,不会把已经亮着的屏幕关掉

展开后加载参数说明和使用案例。

set_touch_mode设置触控模式d.set_touch_mode设置触控模式

展开后加载参数说明和使用案例。

get_touch_mode获取触控模式d.get_touch_mode获取当前触控模式

展开后加载参数说明和使用案例。

ensure_kernel_click设置引擎使用内核点击 (等同于 set_touch_mode("kernel"))

展开后加载参数说明和使用案例。

cancel_kernel_click取消内核点击, 使用Java层点击 (等同于 set_touch_mode("java"))

展开后加载参数说明和使用案例。

parse_resolve_activity_componentLast `pkg/.Activity` line from `cmd package resolve-activity --brief`.

展开后加载参数说明和使用案例。

model_ocr_reload重载OCR模型自定义pp ocr模型

展开后加载参数说明和使用案例。

set_yy_input_enable启用YY输入法启用或禁用YY输入法

展开后加载参数说明和使用案例。

set_image_base设置找图设计稿声明模板是在哪档**设备**分辨率下裁的(不是开发助手 JPEG 的宽)。

展开后加载参数说明和使用案例。

detect_scene识别场景用每组模板判断当前是哪一屏。返回命中最多、最高分最大的场景名;都未达阈值返回 None。

展开后加载参数说明和使用案例。

GlyphGlyph

展开后加载参数说明和使用案例。

hex_to_bits大漠点阵:十六进制按行、宽向上取整到 4。

展开后加载参数说明和使用案例。

parse_dict_line颜色行 ``字$#RRGGBB-0x偏色|色数|宽|高|点阵``,或旧大漠行。

展开后加载参数说明和使用案例。

parse_dm_dict_line``hex$字$偏移$宽,高`` → (char, bits, w, h) 或 None。

展开后加载参数说明和使用案例。

bits_to_pngbits_to_png

展开后加载参数说明和使用案例。

find_str_all找字全部找字的全部命中(不重叠),从左到右、从上到下。

展开后加载参数说明和使用案例。

stitch_read_hits同一行按 x 从左到右拼。先按 y 分行,再按 x 排,重叠才比分数。

展开后加载参数说明和使用案例。

split_map_coord把逐位数字串按间距拆成地图坐标。

展开后加载参数说明和使用案例。

parse_map_coord拆游标``拆游标("314330", [x0,x1,...]) -> {地图x, 地图y, 切开位置, 原文}``。

展开后加载参数说明和使用案例。

find_digit_string找数字串在 ROI 内逐位找数字并右移,返回整串与各位坐标(视频主流程)。

展开后加载参数说明和使用案例。

step步骤在日志和手机顶部标出当前做到哪一步

展开后加载参数说明和使用案例。

SeqClickResult按顺序点击的结果。if r 为真表示没有失败停下; print(r) 看 ✓/✗。

展开后加载参数说明和使用案例。

scal_pos_1080_2400按 1080x2400 基准进行分辨率适配 (推荐使用 scale_pos 替代)

展开后加载参数说明和使用案例。

WrapRecord界面与TASK的注册记录, 两个字典, 记录着名称与对应的函数, 需要的时候跳过去执行

展开后加载参数说明和使用案例。

try_run安全执行运行func函数, 并捕抓其运行异常

展开后加载参数说明和使用案例。

handle_task执行任务执行处理`register_task`注册的任务

展开后加载参数说明和使用案例。

get_activity_handler把每一个界面当作一个任务

展开后加载参数说明和使用案例。

do循环执行高级函数 循环并且间隔n秒执行一箩筐的函数, 或许能够显得代码工整点吧~

展开后加载参数说明和使用案例。

loop_activity_handle循环处理界面把脚本主循环交给界面处理器, 当手机在不同的界面时, 会执行不同的函数

展开后加载参数说明和使用案例。

run_until_true重复直到成功最大尝试max_times次运行func, 如果结果为真, 则立马返回

展开后加载参数说明和使用案例。

Console悬浮日志控制台对象

展开后加载参数说明和使用案例。

常用应用常用应用包名速查字典, 用法: 打开应用(常用应用["微信"])

展开后加载参数说明和使用案例。

Umi-OCR 电脑识别

文字识别() 默认走手机 PP-OCR。电脑开着 Umi-OCR 时,可以把截图送到电脑识别(更快)。截图仍在手机上取,只是识别在电脑上算。本机 Python 和设备 Python 都能接;Umi 没开则回退手机 OCR。

准备 Umi-OCR

  1. 安装并打开 Umi-OCR(已在 v2.1.5 Paddle 包上验证)。
  2. 全局设置 → 服务:勾选 允许 HTTP 服务,端口默认 1224。
  3. 只在电脑上跑脚本:主机保持 仅本地 (127.0.0.1)。
  4. 手机也要走 Umi:主机改成 任何可用地址 (0.0.0.0),放行 Windows 防火墙入站 TCP 1224。电脑和手机同一局域网。

YY畅控开发配置

脚本 IDE 页头 开发配置 → Umi-OCR(电脑识别)。失焦即保存到工程 project.config 和设备 /sdcard/Yyds.Py/umi_ocr.json。

谁在跑脚本地址端口
本机 Python127.0.0.11224
设备 Python电脑局域网 IP1224

怎么确认走了电脑

跑文字识别时日志应出现:

[OCR] Umi-OCR http://127.0.0.1:1224 21 块

若写成「Umi-OCR 不可用,回退设备 OCR」,检查 Umi 是否在跑、主机是否允许局域网、IP/端口是否填对。也可用环境变量 YYDS_UMI_OCR=http://主机:端口,或 YYDS_UMI_OCR=0 关掉。

工程配置

API 不变:结果 = 文字识别(),可选 x,y,w,h 做区域识别。打包 APK 会带上 project.config 里的地址。

1[default]
2PROJECT_NAME=demo
3UMI_OCR_HOST=192.168.1.8
4UMI_OCR_PORT=1224

网络请求

拉远程配置、卡密、公告、上报、云控指令。返回 HttpResult:r.状态码 / r.文本 / r.取JSON();if r: 表示 2xx。失败不抛异常。

App 已内置 requests 与 websocket,脚本也可直接 import requests / import websocket。

工程配置

工程配置是跑之前给操作员填的表单,不是找别人 App 里的按钮(那是「界面节点」)。在 Script IDE 打开 ui.yml 用设计器画组件,推到手机后出现在 App「工程配置」。脚本用 读取配置("check-enable") 读取。

怎么用

  1. IDE 打开 ui.yml,点组件库加开关 / 输入 / 下拉。选中后可把 读取配置() 插入 main.py。
  2. 推送到手机。操作员在 App 工程配置页改值并保存。
  3. 脚本 读取配置("check-enable")。开关返回 True/False,输入和下拉返回字符串。

组件

  • 开关 check-名称 — 布尔。读取配置("check-enable")
  • 输入框 edit-名称 — 字符串,可设密码/数字/多行。读取配置("edit-user")
  • 下拉 select-名称 — 选项列表,保存的是选中的那一项字符串。
  • 文本 text-名称 — 标题说明,脚本一般不用读。
  • 分隔线 div-名称
  • 空白 space-名称 — 间距

电脑「运行文件」读工程目录里 ui.yml 的默认值。手机运行优先用 App 已保存的 JSON。

在 main.py 里输入 读取配置(" 会补全当前工程的键。命令盘可「插入全部 读取配置()」。示例工程还有 确认.py / 询问.py。

对话框

对话框在运行中问用户一句,出现在手机悬浮层上。和工程配置表单不是一回事。

提示() 闪一下就继续。确认() 等到点确定/取消才往下走。询问() 等到输入或取消。

部分机型需打开「悬浮窗」权限。加载示例工程后可单独运行 确认.py / 询问.py。

悬浮控制台

Yyds.Auto App 内置悬浮控制台,脚本运行时可在屏幕上显示日志、提供停止按钮。脚本中使用 <code>print()</code> 输出的内容会自动显示在悬浮窗中。

1# print 输出会显示在悬浮控制台
2print("当前步骤: 打开微信")
3 
4# toast 会同时显示系统提示
5toast("操作完成!")
6 
7# toast_print 同时输出到控制台和系统提示
8toast_print("找到目标,准备点击")

架构说明

Yyds.Auto 采用设备端独立运行架构,Python 脚本直接在 Android 设备上执行,无需 PC 连接。

电脑
YY畅控
手机
yyds.py :61140
自动化引擎
yyds.auto :49009

PC 控制台 ↔ 设备:ADB 端口转发

电脑只负责编辑和推送;点击/OCR 发生在手机上的两个引擎。

核心组件

  • CPython 3.x 解释器(设备端)
  • PaddleOCR 文字识别引擎
  • OpenCV 图像处理
  • UiAutomator 控件操作

通信方式

  • 脚本 ↔ 引擎:本地 WebSocket
  • PC 控制台 ↔ 设备:ADB 端口转发
  • 引擎 ↔ 系统:ROOT Shell / Accessibility

开机自启

设备重启后要自动跑脚本,必须先拉起引擎,再启动工程。官方 Magisk 模块只做第一层;指定工程需要自己写一个很小的模块(或 service.d 脚本)。同一套 zip 可用于 Magisk / KernelSU / APatch。

两层自启

① 引擎自启

App 首页「开机自启动」安装官方模块 yyds_autostart。开机执行 service.sh,拉起 yyds.keep,再派生 yyds.auto(端口 49009)和 yyds.py(端口 61140)。

② 工程自启

等 61140 开始监听后,请求 GET http://127.0.0.1:61140/project/start?name=工程名。工程目录位于 /storage/emulated/0/Yyds.Py/工程名/。

官方模块:只拉起引擎

打开 Yyds.Auto App → 首页「开机自启动」卡片 → 安装。兼容 Magisk / KernelSU / APatch,重启后生效。日志:/data/local/tmp/yyds_autostart.log。官方模块不会自动运行任何工程。

编写模块:开机启动指定工程

用 service.sh(late_start,非阻塞),不要用 post-fs-data.sh。后者会卡住开机,且此时 zygote / PackageManager / 用户数据都还没好。脚本里用 MODDIR=${0%/*} 取模块目录,换行必须是 UNIX LF(Windows 记事本的 CRLF 会直接跑失败)。

1. 模块目录

1my_project_autostart/
2├── module.prop
3└── service.sh

2. module.prop

1id=yyds_my_project_autostart
2name=Yyds.Auto 开机启动 my_project
3version=v1.0
4versionCode=1
5author=you
6description=开机等待引擎就绪后启动工程 my_project

3. service.sh

把 PROJECT= 改成设备上的工程目录名。Magisk 模块脚本跑在 BusyBox ash standalone,自带 wget。

1#!/system/bin/sh
2# Magisk / KernelSU / APatch late_start service.sh
3# 等 yyds.py:61140 就绪后启动指定工程
4MODDIR=${0%/*}
5LOG=/data/local/tmp/yyds_project_autostart.log
6PROJECT=my_project
7API=http://127.0.0.1:61140
8 
9log() {
10 echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG"
11}
12 
13port_listening() {
14 PORT_HEX=$(printf '%04X' "$1" 2>/dev/null)
15 [ -n "$PORT_HEX" ] || return 1
16 grep -E -q "^[[:space:]]*[0-9]+:[[:space:]]+[0-9A-Fa-f]+:$PORT_HEX[[:space:]]" /proc/net/tcp /proc/net/tcp6 2>/dev/null
17}
18 
19log "=== 工程自启触发 project=$PROJECT ==="
20 
21WAIT=0
22while [ "$(getprop sys.boot_completed)" != "1" ] && [ $WAIT -lt 120 ]; do
23 sleep 2
24 WAIT=$((WAIT + 2))
25done
26 
27# FBE: 用户数据解密前 /sdcard 不可用
28WAIT=0
29while [ ! -d /sdcard/Android ] && [ $WAIT -lt 60 ]; do
30 sleep 2
31 WAIT=$((WAIT + 2))
32done
33log "boot_completed=1"
34 
35WAIT=0
36while ! port_listening 61140 && [ $WAIT -lt 180 ]; do
37 sleep 2
38 WAIT=$((WAIT + 2))
39done
40if ! port_listening 61140; then
41 log "错误: 61140 未就绪。请先在 App 首页安装开机自启动官方模块"
42 exit 1
43fi
44 
45# 可选:唤醒屏幕(脚本要点击 UI 时再打开)
46# input keyevent 224
47# svc power stayon true
48 
49log "引擎就绪,启动工程 $PROJECT"
50wget -qO- -T 8 "$API/project/start?name=$PROJECT" >> "$LOG" 2>&1
51log "=== 完成 ==="

4. 打包并安装

zip 根目录必须直接是 module.prop 和 service.sh,不要再套一层文件夹。用 Magisk / KernelSU / APatch App 从本地安装即可,不需要 META-INF。

1# 1. 在电脑上、模块目录内打包(zip 根必须直接是这两个文件)
2zip -r yyds_my_project_autostart.zip module.prop service.sh
3 
4# 2. 推到手机后安装,或在 Magisk/KSU/APatch App 里「从本地安装」
5# magisk --install-module /sdcard/Download/yyds_my_project_autostart.zip
6# /data/adb/ksu/bin/ksud module install /sdcard/Download/yyds_my_project_autostart.zip
7# /data/adb/apd module install /sdcard/Download/yyds_my_project_autostart.zip

更简方式:service.d

不想打 zip 的话,把同样的脚本放到 /data/adb/service.d/yyds_my_project.sh,然后 chmod 755。下次开机同样会跑。做成模块的好处是能在 Magisk 里一键开关(模块目录放空文件 disable 即停用)。

1cp service.sh /data/adb/service.d/yyds_my_project.sh
2chmod 755 /data/adb/service.d/yyds_my_project.sh

排查

  • 先看官方引擎日志 /data/local/tmp/yyds_autostart.log,再看工程自启日志 /data/local/tmp/yyds_project_autostart.log
  • 确认模块已启用:/data/adb/modules/yyds_my_project_autostart/ 下没有 disable 文件
  • 确认工程目录存在:ls /sdcard/Yyds.Py/,工程名必须和目录名一致。中文名需要 URL 编码
  • 手动探测引擎:wget -qO- http://127.0.0.1:61140/project/list
  • 脚本需要点屏幕时,开机后可能仍息屏/锁屏。启动工程前可加 input keyevent 224(唤醒)或 svc power stayon true
  • id 必须匹配 ^[a-zA-Z][a-zA-Z0-9._-]+$,例如 yyds_my_project_autostart,不能有空格、不能以数字开头