dailo-devtools 0.1.0__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,114 @@
1
+ Metadata-Version: 2.4
2
+ Name: dailo-devtools
3
+ Version: 0.1.1
4
+ Summary: 通过代劳 DevTools 调试单台 Android 设备的 Python API 与 CLI
5
+ License-Expression: MIT
6
+ Project-URL: Script SDK, https://pypi.org/project/dailo-sdk/
7
+ Keywords: android,automation,dailo,devtools,cli
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Programming Language :: Python :: 3 :: Only
11
+ Classifier: Framework :: AsyncIO
12
+ Classifier: Typing :: Typed
13
+ Requires-Python: >=3.11
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: playwright<2,>=1.58
17
+ Requires-Dist: aiohttp<4,>=3.14
18
+ Dynamic: license-file
19
+
20
+ # Dailo DevTools
21
+
22
+ 在电脑上运行和调试代劳 Android 自动化脚本。提供 `dailo-dev` 命令行工具和异步 Python 客户端,可执行脚本、读取文字与控件、保存截图和查看日志。
23
+
24
+ - 命令行执行 Python 文件或短代码。
25
+ - Python API 支持连接设备、截图、观察和停止运行。
26
+ - 自动携带脚本目录中的 Python 模块与 `assets/`。
27
+ - 图文日志保存到电脑,可离线查看。
28
+
29
+ ## 安装
30
+
31
+ 需要 Python 3.11 或更新版本,以及已安装代劳 App、开启 DevTools 的 Android 设备。
32
+
33
+ ```sh
34
+ python -m pip install dailo-devtools
35
+ dailo-dev install
36
+ ```
37
+
38
+ `dailo-dev install` 安装后台连接所需的 Chromium 运行时,只需执行一次。
39
+
40
+ ## 连接设备
41
+
42
+ 从代劳 App 的 DevTools 入口复制连接链接,保存为 `connection.json`:
43
+
44
+ ```json
45
+ {
46
+ "url": "<从代劳 App 复制的 DevTools 链接>"
47
+ }
48
+ ```
49
+
50
+ 启动连接服务:
51
+
52
+ ```sh
53
+ dailo-dev serve --connection connection.json
54
+ ```
55
+
56
+ 保持服务运行,在另一个终端执行后续命令。连接文件包含访问设备的凭据,请保存在本机;链接过期或重新连接时,从 App 获取新链接。
57
+
58
+ ## 运行脚本
59
+
60
+ 执行一段代码:
61
+
62
+ ```sh
63
+ dailo-dev exec --code "from dailo import text; print(text())"
64
+ ```
65
+
66
+ 执行 Python 文件并传入任务设置:
67
+
68
+ ```sh
69
+ dailo-dev exec --file main.py --config settings.json
70
+ ```
71
+
72
+ 脚本可使用 [dailo-sdk](https://pypi.org/project/dailo-sdk/) 的文字、控件和图片定位 API。文件模式会自动上传脚本目录中的 Python 模块和 `assets/`;`--timeout` 设置执行时限,单位为秒,默认 300。
73
+
74
+ ## 常用命令
75
+
76
+ | 命令 | 用途 |
77
+ | --- | --- |
78
+ | `dailo-dev status` | 查看连接和运行状态 |
79
+ | `dailo-dev inspect` | 读取设备画面的文字与控件 |
80
+ | `dailo-dev screenshot screen.png` | 保存设备截图 |
81
+ | `dailo-dev cancel` | 停止当前脚本 |
82
+ | `dailo-dev reconnect` | 使用持久连接配置重新连接设备 |
83
+ | `dailo-dev logs <日志目录>` | 离线查看图文日志 |
84
+
85
+ 运行 `dailo-dev --help` 或 `dailo-dev exec --help` 查看完整选项。
86
+
87
+ ## Python API
88
+
89
+ ```python
90
+ import asyncio
91
+ import json
92
+ from pathlib import Path
93
+
94
+ from dailo_devtools import Device, read_logs
95
+
96
+
97
+ async def main():
98
+ connection = json.loads(Path("connection.json").read_text(encoding="utf-8"))
99
+
100
+ async with Device(connection) as device:
101
+ result = await device.execute("from dailo import text; print(text())")
102
+ await device.screenshot("screen.png")
103
+ print(result)
104
+ print(read_logs(result["logDirectory"]))
105
+
106
+
107
+ asyncio.run(main())
108
+ ```
109
+
110
+ `Device` 还提供 `run_file(path, config=...)`、`inspect()` 和 `cancel()`。使用 Python 客户端时无需启动 `dailo-dev serve`;异步上下文管理器负责建立和关闭连接。
111
+
112
+ ## 许可
113
+
114
+ MIT。
@@ -0,0 +1,95 @@
1
+ # Dailo DevTools
2
+
3
+ 在电脑上运行和调试代劳 Android 自动化脚本。提供 `dailo-dev` 命令行工具和异步 Python 客户端,可执行脚本、读取文字与控件、保存截图和查看日志。
4
+
5
+ - 命令行执行 Python 文件或短代码。
6
+ - Python API 支持连接设备、截图、观察和停止运行。
7
+ - 自动携带脚本目录中的 Python 模块与 `assets/`。
8
+ - 图文日志保存到电脑,可离线查看。
9
+
10
+ ## 安装
11
+
12
+ 需要 Python 3.11 或更新版本,以及已安装代劳 App、开启 DevTools 的 Android 设备。
13
+
14
+ ```sh
15
+ python -m pip install dailo-devtools
16
+ dailo-dev install
17
+ ```
18
+
19
+ `dailo-dev install` 安装后台连接所需的 Chromium 运行时,只需执行一次。
20
+
21
+ ## 连接设备
22
+
23
+ 从代劳 App 的 DevTools 入口复制连接链接,保存为 `connection.json`:
24
+
25
+ ```json
26
+ {
27
+ "url": "<从代劳 App 复制的 DevTools 链接>"
28
+ }
29
+ ```
30
+
31
+ 启动连接服务:
32
+
33
+ ```sh
34
+ dailo-dev serve --connection connection.json
35
+ ```
36
+
37
+ 保持服务运行,在另一个终端执行后续命令。连接文件包含访问设备的凭据,请保存在本机;链接过期或重新连接时,从 App 获取新链接。
38
+
39
+ ## 运行脚本
40
+
41
+ 执行一段代码:
42
+
43
+ ```sh
44
+ dailo-dev exec --code "from dailo import text; print(text())"
45
+ ```
46
+
47
+ 执行 Python 文件并传入任务设置:
48
+
49
+ ```sh
50
+ dailo-dev exec --file main.py --config settings.json
51
+ ```
52
+
53
+ 脚本可使用 [dailo-sdk](https://pypi.org/project/dailo-sdk/) 的文字、控件和图片定位 API。文件模式会自动上传脚本目录中的 Python 模块和 `assets/`;`--timeout` 设置执行时限,单位为秒,默认 300。
54
+
55
+ ## 常用命令
56
+
57
+ | 命令 | 用途 |
58
+ | --- | --- |
59
+ | `dailo-dev status` | 查看连接和运行状态 |
60
+ | `dailo-dev inspect` | 读取设备画面的文字与控件 |
61
+ | `dailo-dev screenshot screen.png` | 保存设备截图 |
62
+ | `dailo-dev cancel` | 停止当前脚本 |
63
+ | `dailo-dev reconnect` | 使用持久连接配置重新连接设备 |
64
+ | `dailo-dev logs <日志目录>` | 离线查看图文日志 |
65
+
66
+ 运行 `dailo-dev --help` 或 `dailo-dev exec --help` 查看完整选项。
67
+
68
+ ## Python API
69
+
70
+ ```python
71
+ import asyncio
72
+ import json
73
+ from pathlib import Path
74
+
75
+ from dailo_devtools import Device, read_logs
76
+
77
+
78
+ async def main():
79
+ connection = json.loads(Path("connection.json").read_text(encoding="utf-8"))
80
+
81
+ async with Device(connection) as device:
82
+ result = await device.execute("from dailo import text; print(text())")
83
+ await device.screenshot("screen.png")
84
+ print(result)
85
+ print(read_logs(result["logDirectory"]))
86
+
87
+
88
+ asyncio.run(main())
89
+ ```
90
+
91
+ `Device` 还提供 `run_file(path, config=...)`、`inspect()` 和 `cancel()`。使用 Python 客户端时无需启动 `dailo-dev serve`;异步上下文管理器负责建立和关闭连接。
92
+
93
+ ## 许可
94
+
95
+ MIT。
@@ -4,13 +4,24 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dailo-devtools"
7
- version = "0.1.0"
7
+ version = "0.1.1"
8
8
  description = "通过代劳 DevTools 调试单台 Android 设备的 Python API 与 CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
11
11
  license = "MIT"
12
+ keywords = ["android", "automation", "dailo", "devtools", "cli"]
13
+ classifiers = [
14
+ "Development Status :: 3 - Alpha",
15
+ "Intended Audience :: Developers",
16
+ "Programming Language :: Python :: 3 :: Only",
17
+ "Framework :: AsyncIO",
18
+ "Typing :: Typed",
19
+ ]
12
20
  dependencies = ["playwright>=1.58,<2", "aiohttp>=3.14,<4"]
13
21
 
22
+ [project.urls]
23
+ "Script SDK" = "https://pypi.org/project/dailo-sdk/"
24
+
14
25
  [project.scripts]
15
26
  dailo-dev = "dailo_devtools.cli:main"
16
27
 
@@ -1,4 +1,4 @@
1
- """独立 DevTools 客户端;不依赖代劳私有项目,使用后台 Chromium。"""
1
+ """用于连接代劳 Android 设备的 Python 调试客户端。"""
2
2
  from typing import TYPE_CHECKING
3
3
 
4
4
  if TYPE_CHECKING:
@@ -0,0 +1,114 @@
1
+ Metadata-Version: 2.4
2
+ Name: dailo-devtools
3
+ Version: 0.1.1
4
+ Summary: 通过代劳 DevTools 调试单台 Android 设备的 Python API 与 CLI
5
+ License-Expression: MIT
6
+ Project-URL: Script SDK, https://pypi.org/project/dailo-sdk/
7
+ Keywords: android,automation,dailo,devtools,cli
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: Programming Language :: Python :: 3 :: Only
11
+ Classifier: Framework :: AsyncIO
12
+ Classifier: Typing :: Typed
13
+ Requires-Python: >=3.11
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: playwright<2,>=1.58
17
+ Requires-Dist: aiohttp<4,>=3.14
18
+ Dynamic: license-file
19
+
20
+ # Dailo DevTools
21
+
22
+ 在电脑上运行和调试代劳 Android 自动化脚本。提供 `dailo-dev` 命令行工具和异步 Python 客户端,可执行脚本、读取文字与控件、保存截图和查看日志。
23
+
24
+ - 命令行执行 Python 文件或短代码。
25
+ - Python API 支持连接设备、截图、观察和停止运行。
26
+ - 自动携带脚本目录中的 Python 模块与 `assets/`。
27
+ - 图文日志保存到电脑,可离线查看。
28
+
29
+ ## 安装
30
+
31
+ 需要 Python 3.11 或更新版本,以及已安装代劳 App、开启 DevTools 的 Android 设备。
32
+
33
+ ```sh
34
+ python -m pip install dailo-devtools
35
+ dailo-dev install
36
+ ```
37
+
38
+ `dailo-dev install` 安装后台连接所需的 Chromium 运行时,只需执行一次。
39
+
40
+ ## 连接设备
41
+
42
+ 从代劳 App 的 DevTools 入口复制连接链接,保存为 `connection.json`:
43
+
44
+ ```json
45
+ {
46
+ "url": "<从代劳 App 复制的 DevTools 链接>"
47
+ }
48
+ ```
49
+
50
+ 启动连接服务:
51
+
52
+ ```sh
53
+ dailo-dev serve --connection connection.json
54
+ ```
55
+
56
+ 保持服务运行,在另一个终端执行后续命令。连接文件包含访问设备的凭据,请保存在本机;链接过期或重新连接时,从 App 获取新链接。
57
+
58
+ ## 运行脚本
59
+
60
+ 执行一段代码:
61
+
62
+ ```sh
63
+ dailo-dev exec --code "from dailo import text; print(text())"
64
+ ```
65
+
66
+ 执行 Python 文件并传入任务设置:
67
+
68
+ ```sh
69
+ dailo-dev exec --file main.py --config settings.json
70
+ ```
71
+
72
+ 脚本可使用 [dailo-sdk](https://pypi.org/project/dailo-sdk/) 的文字、控件和图片定位 API。文件模式会自动上传脚本目录中的 Python 模块和 `assets/`;`--timeout` 设置执行时限,单位为秒,默认 300。
73
+
74
+ ## 常用命令
75
+
76
+ | 命令 | 用途 |
77
+ | --- | --- |
78
+ | `dailo-dev status` | 查看连接和运行状态 |
79
+ | `dailo-dev inspect` | 读取设备画面的文字与控件 |
80
+ | `dailo-dev screenshot screen.png` | 保存设备截图 |
81
+ | `dailo-dev cancel` | 停止当前脚本 |
82
+ | `dailo-dev reconnect` | 使用持久连接配置重新连接设备 |
83
+ | `dailo-dev logs <日志目录>` | 离线查看图文日志 |
84
+
85
+ 运行 `dailo-dev --help` 或 `dailo-dev exec --help` 查看完整选项。
86
+
87
+ ## Python API
88
+
89
+ ```python
90
+ import asyncio
91
+ import json
92
+ from pathlib import Path
93
+
94
+ from dailo_devtools import Device, read_logs
95
+
96
+
97
+ async def main():
98
+ connection = json.loads(Path("connection.json").read_text(encoding="utf-8"))
99
+
100
+ async with Device(connection) as device:
101
+ result = await device.execute("from dailo import text; print(text())")
102
+ await device.screenshot("screen.png")
103
+ print(result)
104
+ print(read_logs(result["logDirectory"]))
105
+
106
+
107
+ asyncio.run(main())
108
+ ```
109
+
110
+ `Device` 还提供 `run_file(path, config=...)`、`inspect()` 和 `cancel()`。使用 Python 客户端时无需启动 `dailo-dev serve`;异步上下文管理器负责建立和关闭连接。
111
+
112
+ ## 许可
113
+
114
+ MIT。
@@ -1,45 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: dailo-devtools
3
- Version: 0.1.0
4
- Summary: 通过代劳 DevTools 调试单台 Android 设备的 Python API 与 CLI
5
- License-Expression: MIT
6
- Requires-Python: >=3.11
7
- Description-Content-Type: text/markdown
8
- License-File: LICENSE
9
- Requires-Dist: playwright<2,>=1.58
10
- Requires-Dist: aiohttp<4,>=3.14
11
- Dynamic: license-file
12
-
13
- # DevTools
14
-
15
- ```sh
16
- pip install dailo-devtools
17
- dailo-dev install
18
- dailo-dev serve --connection connection.json
19
- dailo-dev exec --code "from dailo import text; print(text())"
20
- dailo-dev exec --file main.py --config account.json
21
- ```
22
-
23
- 服务复用一条 WebRTC 连接,仅使用 DataChannel,截图按需获取,不持续传输视频。连接文件从设备开发入口取得,勿提交 Git。也可使用 `async with dailo_devtools.Device(connection)` 调用 `execute`、`run_file`、`inspect`、`screenshot`、`cancel`。默认会话30分钟;持久凭据在Python运行前时间不足时重新准入,授权覆盖本次执行、30秒停止收尾和10秒传输,合计最多7天。正式任务使用自己的执行期限。持久凭据支持断线后自动重新准入,中断操作不重放;`dailo-dev reconnect` / `Device.reconnect()` 可主动重连。
24
-
25
- `serve` 的 `status` / `cancel` 不触发重连;其他命令在连接失败时先自动重新准入。前检先请求设备状态,再读取服务状态和 `sessionId`,避免用重连前的 `closed` 快照判定当前连接;原设备线程是否退出仍以原生运行计数为准。
26
-
27
- 长期 `serve` 和长脚本使用持久连接凭据。已配对桌面设备配置为 `{"baseUrl":"实际平台地址","deviceId":"准入返回的公开设备ID","desktopControllerCapability":"控制端凭据"}`;地址与设备 ID 取正式 App 的准入结果,每次重连通过平台公开接口取得新会话。PC 本地控制端口与 `android-local-*` 列表 ID 不提供此准入合同,不能填入该配置。
28
-
29
- 连接文件也可写为 `{"url":"App 复制的 DevTools 链接"}`,仅用于一次建连。链接中的入场 capability 已消费后不能用于重连,URL 分支不使用 recoveryCapability;断线或到期需从 App 重新获取链接。入场有效期和已建立会话的有效期分别计算,不能把短入场期限当作会话期限。
30
-
31
- `log()` 按产生顺序实时保存到本机,每条文字及 PNG 落盘后才确认接收。连接文件可设 `"logDirectory":"D:/my-project/output/logs"` 指定根目录;默认位于用户缓存目录。Python 终态返回 `logDirectory`(请求目录)和 `logsPath`(该目录的 `logs.json`),不再返回 `logs` 数组。`exec` 和原始 Python `request` 使用同一流程;日志事件不会提前完成执行请求。
32
-
33
- `from dailo_devtools import read_logs; entries = read_logs(result['logDirectory'])` 读取图文清单;每项保留完整文字,`image.path` 指向原 PNG。也可用 `dailo-dev logs D:/output/logs/请求ID` 离线查看,无需启动服务或重新连接设备。自然结束、脚本失败和取消回执均保存 `execution.json`(stdout、stderr、错误栈及日志路径)。日志清单与 PNG 不依赖终态回执;断线的 `interruption.json` 同样给出路径,仅标记结果未确认。只保证已经落盘的图文,连接失效时未交付的帧不能补造。
34
-
35
- Python执行超时后发送停止请求,保留原响应并最多等待30秒完成清理;返回的stdout、stderr、错误栈与图文保存到该请求目录的`execution.json`。停止未响应时关闭旧通道,下一次重新连接;不能把发送停止当作运行已退出。
36
-
37
- CLI外层HTTP预算为设备预算+30秒停止收尾+10秒传输余量。升级Playwright后重新运行`dailo-dev install`;安装和服务使用同一个`PLAYWRIGHT_BROWSERS_PATH`,可指定共享目录,避免Store内外缓存视图不同。
38
-
39
- `exec --code` 与 `exec --file` 均自动上传仓库 Python 模块和 `assets/`,可使用 `--config`、`--assets`。内联代码默认属于当前目录,也可用 `--directory` 指定。复用仓库的设备工作目录,下载和写入的文件会保留;每次运行刷新源码导入和字节码,停止后重跑也生效,并移除已删除的模块、资源。
40
-
41
- 请求按16KiB分片发送,缓冲超过64KiB时等待通道释放,避免多图或大资源堵满发送队列。发送超时或失败关闭旧通道,Python结果记为未确认;下一次调用重新准入,不重放请求。
42
-
43
- 相同资源不重写,更新资源先移除旧文件,避免破坏已加载原生库的内存映射。原生库内容更新后需重启设备上的 Dailo 应用再运行。
44
-
45
- 信令断开时立即关闭旧DataChannel,并保存请求目录的interruption.json,标记结果未确认。status的activeRun为空仅表示宿主已结束等待,不能作为原设备线程已退出或脚本成功的依据。
@@ -1,33 +0,0 @@
1
- # DevTools
2
-
3
- ```sh
4
- pip install dailo-devtools
5
- dailo-dev install
6
- dailo-dev serve --connection connection.json
7
- dailo-dev exec --code "from dailo import text; print(text())"
8
- dailo-dev exec --file main.py --config account.json
9
- ```
10
-
11
- 服务复用一条 WebRTC 连接,仅使用 DataChannel,截图按需获取,不持续传输视频。连接文件从设备开发入口取得,勿提交 Git。也可使用 `async with dailo_devtools.Device(connection)` 调用 `execute`、`run_file`、`inspect`、`screenshot`、`cancel`。默认会话30分钟;持久凭据在Python运行前时间不足时重新准入,授权覆盖本次执行、30秒停止收尾和10秒传输,合计最多7天。正式任务使用自己的执行期限。持久凭据支持断线后自动重新准入,中断操作不重放;`dailo-dev reconnect` / `Device.reconnect()` 可主动重连。
12
-
13
- `serve` 的 `status` / `cancel` 不触发重连;其他命令在连接失败时先自动重新准入。前检先请求设备状态,再读取服务状态和 `sessionId`,避免用重连前的 `closed` 快照判定当前连接;原设备线程是否退出仍以原生运行计数为准。
14
-
15
- 长期 `serve` 和长脚本使用持久连接凭据。已配对桌面设备配置为 `{"baseUrl":"实际平台地址","deviceId":"准入返回的公开设备ID","desktopControllerCapability":"控制端凭据"}`;地址与设备 ID 取正式 App 的准入结果,每次重连通过平台公开接口取得新会话。PC 本地控制端口与 `android-local-*` 列表 ID 不提供此准入合同,不能填入该配置。
16
-
17
- 连接文件也可写为 `{"url":"App 复制的 DevTools 链接"}`,仅用于一次建连。链接中的入场 capability 已消费后不能用于重连,URL 分支不使用 recoveryCapability;断线或到期需从 App 重新获取链接。入场有效期和已建立会话的有效期分别计算,不能把短入场期限当作会话期限。
18
-
19
- `log()` 按产生顺序实时保存到本机,每条文字及 PNG 落盘后才确认接收。连接文件可设 `"logDirectory":"D:/my-project/output/logs"` 指定根目录;默认位于用户缓存目录。Python 终态返回 `logDirectory`(请求目录)和 `logsPath`(该目录的 `logs.json`),不再返回 `logs` 数组。`exec` 和原始 Python `request` 使用同一流程;日志事件不会提前完成执行请求。
20
-
21
- `from dailo_devtools import read_logs; entries = read_logs(result['logDirectory'])` 读取图文清单;每项保留完整文字,`image.path` 指向原 PNG。也可用 `dailo-dev logs D:/output/logs/请求ID` 离线查看,无需启动服务或重新连接设备。自然结束、脚本失败和取消回执均保存 `execution.json`(stdout、stderr、错误栈及日志路径)。日志清单与 PNG 不依赖终态回执;断线的 `interruption.json` 同样给出路径,仅标记结果未确认。只保证已经落盘的图文,连接失效时未交付的帧不能补造。
22
-
23
- Python执行超时后发送停止请求,保留原响应并最多等待30秒完成清理;返回的stdout、stderr、错误栈与图文保存到该请求目录的`execution.json`。停止未响应时关闭旧通道,下一次重新连接;不能把发送停止当作运行已退出。
24
-
25
- CLI外层HTTP预算为设备预算+30秒停止收尾+10秒传输余量。升级Playwright后重新运行`dailo-dev install`;安装和服务使用同一个`PLAYWRIGHT_BROWSERS_PATH`,可指定共享目录,避免Store内外缓存视图不同。
26
-
27
- `exec --code` 与 `exec --file` 均自动上传仓库 Python 模块和 `assets/`,可使用 `--config`、`--assets`。内联代码默认属于当前目录,也可用 `--directory` 指定。复用仓库的设备工作目录,下载和写入的文件会保留;每次运行刷新源码导入和字节码,停止后重跑也生效,并移除已删除的模块、资源。
28
-
29
- 请求按16KiB分片发送,缓冲超过64KiB时等待通道释放,避免多图或大资源堵满发送队列。发送超时或失败关闭旧通道,Python结果记为未确认;下一次调用重新准入,不重放请求。
30
-
31
- 相同资源不重写,更新资源先移除旧文件,避免破坏已加载原生库的内存映射。原生库内容更新后需重启设备上的 Dailo 应用再运行。
32
-
33
- 信令断开时立即关闭旧DataChannel,并保存请求目录的interruption.json,标记结果未确认。status的activeRun为空仅表示宿主已结束等待,不能作为原设备线程已退出或脚本成功的依据。
@@ -1,45 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: dailo-devtools
3
- Version: 0.1.0
4
- Summary: 通过代劳 DevTools 调试单台 Android 设备的 Python API 与 CLI
5
- License-Expression: MIT
6
- Requires-Python: >=3.11
7
- Description-Content-Type: text/markdown
8
- License-File: LICENSE
9
- Requires-Dist: playwright<2,>=1.58
10
- Requires-Dist: aiohttp<4,>=3.14
11
- Dynamic: license-file
12
-
13
- # DevTools
14
-
15
- ```sh
16
- pip install dailo-devtools
17
- dailo-dev install
18
- dailo-dev serve --connection connection.json
19
- dailo-dev exec --code "from dailo import text; print(text())"
20
- dailo-dev exec --file main.py --config account.json
21
- ```
22
-
23
- 服务复用一条 WebRTC 连接,仅使用 DataChannel,截图按需获取,不持续传输视频。连接文件从设备开发入口取得,勿提交 Git。也可使用 `async with dailo_devtools.Device(connection)` 调用 `execute`、`run_file`、`inspect`、`screenshot`、`cancel`。默认会话30分钟;持久凭据在Python运行前时间不足时重新准入,授权覆盖本次执行、30秒停止收尾和10秒传输,合计最多7天。正式任务使用自己的执行期限。持久凭据支持断线后自动重新准入,中断操作不重放;`dailo-dev reconnect` / `Device.reconnect()` 可主动重连。
24
-
25
- `serve` 的 `status` / `cancel` 不触发重连;其他命令在连接失败时先自动重新准入。前检先请求设备状态,再读取服务状态和 `sessionId`,避免用重连前的 `closed` 快照判定当前连接;原设备线程是否退出仍以原生运行计数为准。
26
-
27
- 长期 `serve` 和长脚本使用持久连接凭据。已配对桌面设备配置为 `{"baseUrl":"实际平台地址","deviceId":"准入返回的公开设备ID","desktopControllerCapability":"控制端凭据"}`;地址与设备 ID 取正式 App 的准入结果,每次重连通过平台公开接口取得新会话。PC 本地控制端口与 `android-local-*` 列表 ID 不提供此准入合同,不能填入该配置。
28
-
29
- 连接文件也可写为 `{"url":"App 复制的 DevTools 链接"}`,仅用于一次建连。链接中的入场 capability 已消费后不能用于重连,URL 分支不使用 recoveryCapability;断线或到期需从 App 重新获取链接。入场有效期和已建立会话的有效期分别计算,不能把短入场期限当作会话期限。
30
-
31
- `log()` 按产生顺序实时保存到本机,每条文字及 PNG 落盘后才确认接收。连接文件可设 `"logDirectory":"D:/my-project/output/logs"` 指定根目录;默认位于用户缓存目录。Python 终态返回 `logDirectory`(请求目录)和 `logsPath`(该目录的 `logs.json`),不再返回 `logs` 数组。`exec` 和原始 Python `request` 使用同一流程;日志事件不会提前完成执行请求。
32
-
33
- `from dailo_devtools import read_logs; entries = read_logs(result['logDirectory'])` 读取图文清单;每项保留完整文字,`image.path` 指向原 PNG。也可用 `dailo-dev logs D:/output/logs/请求ID` 离线查看,无需启动服务或重新连接设备。自然结束、脚本失败和取消回执均保存 `execution.json`(stdout、stderr、错误栈及日志路径)。日志清单与 PNG 不依赖终态回执;断线的 `interruption.json` 同样给出路径,仅标记结果未确认。只保证已经落盘的图文,连接失效时未交付的帧不能补造。
34
-
35
- Python执行超时后发送停止请求,保留原响应并最多等待30秒完成清理;返回的stdout、stderr、错误栈与图文保存到该请求目录的`execution.json`。停止未响应时关闭旧通道,下一次重新连接;不能把发送停止当作运行已退出。
36
-
37
- CLI外层HTTP预算为设备预算+30秒停止收尾+10秒传输余量。升级Playwright后重新运行`dailo-dev install`;安装和服务使用同一个`PLAYWRIGHT_BROWSERS_PATH`,可指定共享目录,避免Store内外缓存视图不同。
38
-
39
- `exec --code` 与 `exec --file` 均自动上传仓库 Python 模块和 `assets/`,可使用 `--config`、`--assets`。内联代码默认属于当前目录,也可用 `--directory` 指定。复用仓库的设备工作目录,下载和写入的文件会保留;每次运行刷新源码导入和字节码,停止后重跑也生效,并移除已删除的模块、资源。
40
-
41
- 请求按16KiB分片发送,缓冲超过64KiB时等待通道释放,避免多图或大资源堵满发送队列。发送超时或失败关闭旧通道,Python结果记为未确认;下一次调用重新准入,不重放请求。
42
-
43
- 相同资源不重写,更新资源先移除旧文件,避免破坏已加载原生库的内存映射。原生库内容更新后需重启设备上的 Dailo 应用再运行。
44
-
45
- 信令断开时立即关闭旧DataChannel,并保存请求目录的interruption.json,标记结果未确认。status的activeRun为空仅表示宿主已结束等待,不能作为原设备线程已退出或脚本成功的依据。
File without changes
File without changes