adbproxy 0.1.0__py3-none-any.whl

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.
Files changed (49) hide show
  1. adbproxy/__init__.py +2 -0
  2. adbproxy/__main__.py +5 -0
  3. adbproxy/cli/__init__.py +1 -0
  4. adbproxy/cli/device.py +13 -0
  5. adbproxy/cli/main.py +60 -0
  6. adbproxy/cli/server.py +13 -0
  7. adbproxy/config.py +39 -0
  8. adbproxy/device/__init__.py +1 -0
  9. adbproxy/device/app.py +532 -0
  10. adbproxy/device/backend.py +242 -0
  11. adbproxy/device/banner.py +33 -0
  12. adbproxy/device/connection.py +505 -0
  13. adbproxy/device/session.py +304 -0
  14. adbproxy/device/stream_table.py +125 -0
  15. adbproxy/observers/__init__.py +1 -0
  16. adbproxy/observers/events.py +19 -0
  17. adbproxy/observers/install.py +126 -0
  18. adbproxy/observers/shell.py +371 -0
  19. adbproxy/observers/stream.py +94 -0
  20. adbproxy/observers/sync.py +550 -0
  21. adbproxy/protocols/__init__.py +1 -0
  22. adbproxy/protocols/adb.py +66 -0
  23. adbproxy/protocols/payload/__init__.py +17 -0
  24. adbproxy/protocols/payload/install.py +44 -0
  25. adbproxy/protocols/payload/shell_v2.py +28 -0
  26. adbproxy/protocols/payload/sync.py +180 -0
  27. adbproxy/protocols/smart_socket/__init__.py +33 -0
  28. adbproxy/protocols/smart_socket/classifier.py +78 -0
  29. adbproxy/protocols/smart_socket/conversation.py +335 -0
  30. adbproxy/protocols/smart_socket/handshake.py +75 -0
  31. adbproxy/protocols/smart_socket/wire.py +82 -0
  32. adbproxy/protocols/transport/__init__.py +52 -0
  33. adbproxy/protocols/transport/codec.py +90 -0
  34. adbproxy/protocols/transport/constants.py +21 -0
  35. adbproxy/protocols/transport/errors.py +5 -0
  36. adbproxy/runtime/__init__.py +1 -0
  37. adbproxy/runtime/adb_process.py +195 -0
  38. adbproxy/runtime/capture.py +41 -0
  39. adbproxy/runtime/logging.py +113 -0
  40. adbproxy/runtime/sockets.py +14 -0
  41. adbproxy/server/__init__.py +1 -0
  42. adbproxy/server/app.py +221 -0
  43. adbproxy/server/connection.py +378 -0
  44. adbproxy-0.1.0.dist-info/METADATA +254 -0
  45. adbproxy-0.1.0.dist-info/RECORD +49 -0
  46. adbproxy-0.1.0.dist-info/WHEEL +5 -0
  47. adbproxy-0.1.0.dist-info/entry_points.txt +4 -0
  48. adbproxy-0.1.0.dist-info/licenses/LICENSE +21 -0
  49. adbproxy-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,254 @@
1
+ Metadata-Version: 2.4
2
+ Name: adbproxy
3
+ Version: 0.1.0
4
+ Summary: ADB smart-socket and device transport proxies
5
+ Author: Forgo7ten
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/Forgo7ten/adbproxy
8
+ Project-URL: Repository, https://github.com/Forgo7ten/adbproxy
9
+ Project-URL: Issues, https://github.com/Forgo7ten/adbproxy/issues
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: zstandard>=0.25.0
14
+ Provides-Extra: lz4
15
+ Requires-Dist: lz4>=4.3.0; extra == "lz4"
16
+ Provides-Extra: brotli
17
+ Requires-Dist: brotli>=1.1.0; extra == "brotli"
18
+ Provides-Extra: decompress
19
+ Requires-Dist: adbproxy[brotli,lz4]; extra == "decompress"
20
+ Dynamic: license-file
21
+
22
+ # adbproxy
23
+
24
+ 在 ADB client 与 server / 设备之间插入透明代理,解析并记录 ADB 协议流量,同时保持原始字节原样转发。
25
+
26
+ 适用于调试 adb 命令、观察 shell / sync / install 等协议交互、抓取 push/pull 文件内容。
27
+
28
+ ## 功能
29
+
30
+ - **server-proxy**:MITM 本机 `adb client ↔ adb server` 的 smart-socket 链路(默认监听 `5037`,真实 server 挪到 `5038`)
31
+ - **device-proxy**:模拟网络 adbd,接受 transport 协议连接,再经系统 adb server 转发到真实设备
32
+ - 解析并记录 shell、sync、install、stream 等协议事件
33
+ - 可选落盘 sync / install 文件内容,以及 `--debug` 原始 hex
34
+ - 观察 / 解码 / 抓包失败时 fail-open,不中断透明转发
35
+
36
+ ## 架构
37
+
38
+ ```mermaid
39
+ flowchart LR
40
+ Client[adb client]
41
+ SP[server-proxy :5037]
42
+ Server[adb server :5038]
43
+ Dev[真实设备]
44
+
45
+ Client -->|smart socket| SP
46
+ SP -->|smart socket| Server
47
+ Server --> Dev
48
+
49
+ Client2[adb client]
50
+ ServerFront[adb server :5037]
51
+ DP[device-proxy :5566]
52
+ ServerBack[adb server :5037]
53
+ Dev2[真实设备]
54
+
55
+ Client2 -->|smart socket| ServerFront
56
+ ServerFront -->|transport| DP
57
+ DP -->|smart socket| ServerBack
58
+ ServerBack --> Dev2
59
+ ```
60
+
61
+ ## 环境要求
62
+
63
+ - Python ≥ 3.10
64
+ - [uv](https://docs.astral.sh/uv/)
65
+ - 系统 `adb`(Android platform-tools)
66
+
67
+ ## 安装
68
+
69
+ ```bash
70
+ git clone <repo-url>
71
+ cd adbproxy # 或你的本地目录名
72
+ uv sync
73
+ ```
74
+
75
+ 也可从 PyPI:
76
+
77
+ ```bash
78
+ pip install adbproxy
79
+ # 可选:sync 解压依赖
80
+ pip install "adbproxy[decompress]"
81
+
82
+ # 临时运行
83
+ uvx adbproxy server --help
84
+ uvx adbproxy device --help
85
+ ```
86
+
87
+ `uv sync` 会安装依赖,并根据 `pyproject.toml` 的 `[project.scripts]` 注册命令行入口:
88
+
89
+ | 命令 | 对应模块 | 作用 |
90
+ |------|----------|------|
91
+ | `adbproxy` | `adbproxy.cli.main:main` | **推荐**统一入口:`server` / `device` 子命令 |
92
+ | `adb-server-proxy` | `adbproxy.cli.server:main` | 兼容旧入口(等同 `adbproxy server`) |
93
+ | `adb-device-proxy` | `adbproxy.cli.device:main` | 兼容旧入口(等同 `adbproxy device`) |
94
+
95
+ 推荐启动方式:
96
+
97
+ ```bash
98
+ # 统一入口(推荐)
99
+ uv run adbproxy server --help
100
+ uv run adbproxy device --help
101
+ uv run python -m adbproxy server --help
102
+ uv run python -m adbproxy device --help
103
+
104
+ # 兼容旧 console script / 模块路径
105
+ uv run adb-server-proxy --help
106
+ uv run adb-device-proxy --help
107
+ uv run python -m adbproxy.cli.server --help
108
+ uv run python -m adbproxy.cli.device --help
109
+ ```
110
+
111
+ 下文示例统一使用 `adbproxy server` / `adbproxy device`。
112
+
113
+ ## 使用
114
+
115
+ ### 1. server-proxy(MITM 本机 5037)
116
+
117
+ 启动前确认本机 `5038` 未被占用。代理会接管默认 `5037`,把真实 adb server 挪到 `5038`;退出时按所有权恢复。
118
+
119
+ ```bash
120
+ uv run adbproxy server
121
+ # 等价:
122
+ # uv run python -m adbproxy server
123
+ # uv run adb-server-proxy
124
+
125
+ # 可选参数:
126
+ # --debug 将每段 recv 的原始 hex 落盘
127
+ # --no-capture 不落盘 sync/install 文件,仅打印摘要
128
+ ```
129
+
130
+ 另开终端正常使用 adb(默认走 5037,即经过代理):
131
+
132
+ ```bash
133
+ adb devices -l
134
+ adb shell echo hello
135
+ adb push local.apk /data/local/tmp/
136
+ adb install local.apk
137
+ ```
138
+
139
+ ### 2. device-proxy(模拟网络 adbd)
140
+
141
+ 默认监听 `5566`,后端复用系统 `5037` adb server,把请求转发到指定真实设备。
142
+
143
+ ```bash
144
+ uv run adbproxy device \
145
+ --listen 5566 \
146
+ --target serial:<设备序列号>
147
+
148
+ # 等价:
149
+ # uv run python -m adbproxy device \
150
+ # --listen 5566 \
151
+ # --target serial:<设备序列号>
152
+ # uv run adb-device-proxy \
153
+ # --listen 5566 \
154
+ # --target serial:<设备序列号>
155
+ ```
156
+
157
+ `--target` 支持:
158
+
159
+ | 值 | 含义 |
160
+ |----|------|
161
+ | `usb` | 自动选择首个 USB 且状态为 `device` 的设备(默认) |
162
+ | `serial:<s>` | 指定序列号 |
163
+ | `net:<ip>:<port>` | 先 `adb connect` 到该网络设备 |
164
+
165
+ 常用参数:
166
+
167
+ ```text
168
+ --listen PORT 监听端口,默认 5566
169
+ --adb-server-port PORT 后端 adb server 端口,默认 5037
170
+ --debug 原始 hex 落盘
171
+ --no-capture 禁用 sync/install 文件落盘
172
+ --banner-type TYPE CNXN banner 前缀,默认 device
173
+ ```
174
+
175
+ 另开终端连接并操作:
176
+
177
+ ```bash
178
+ adb connect 127.0.0.1:5566
179
+ adb -s 127.0.0.1:5566 get-state
180
+ adb -s 127.0.0.1:5566 shell echo hello
181
+ adb -s 127.0.0.1:5566 push local.apk /data/local/tmp/
182
+ adb disconnect 127.0.0.1:5566
183
+ ```
184
+
185
+ ## 输出目录
186
+
187
+ 运行时在项目根目录生成(可用 `ADB_PROXY_OUT_DIR` 覆盖):
188
+
189
+ | 路径 | 内容 |
190
+ |------|------|
191
+ | `out/logs/` | 事件日志;加 `--debug` 时另有 debug hex 日志 |
192
+ | `out/files/` | sync push/pull、install 流捕获(未加 `--no-capture` 时) |
193
+
194
+ ```bash
195
+ export ADB_PROXY_OUT_DIR=/tmp/adbproxy-out
196
+ # 写入 /tmp/adbproxy-out/logs 与 /tmp/adbproxy-out/files
197
+ ```
198
+
199
+ ## 测试
200
+
201
+ ### 准备
202
+
203
+ 真机动态矩阵(push / pull / install)依赖测试 APK。仓库不附带该文件,运行前请自行放置:
204
+
205
+ ```bash
206
+ # 任意可安装的 APK 即可
207
+ cp /path/to/your.apk tests/app.apk
208
+ ```
209
+
210
+ `tests/app.apk` 已在 `tests/.gitignore` 中忽略,不会被提交。
211
+
212
+ 无设备的单元 / 静态测试不需要该文件。
213
+
214
+ ### 环境变量
215
+
216
+ | 变量 | 说明 |
217
+ |------|------|
218
+ | `ADB_PROXY_REAL_DEVICE=1` | 启用真机动态用例;未设置时相关用例自动 skip |
219
+ | `ADB_SERIAL` | 指定真机序列号;省略时取首个 USB 且状态为 `device` 的设备 |
220
+ | `ADB_PROXY_OUT_DIR` | 覆盖运行产物根目录(日志 / 抓包),默认项目根 `out/` |
221
+
222
+ ### 全部测试
223
+
224
+ ```bash
225
+ # 无设备:单元 + 静态;动态用例自动 skip
226
+ uv run python -B -m unittest discover -s tests -v
227
+
228
+ # 含真实设备动态矩阵(需先放置 tests/app.apk)
229
+ export ADB_PROXY_REAL_DEVICE=1
230
+ export ADB_SERIAL=<可选,默认取首个 USB device>
231
+ uv run python -B -m unittest discover -s tests -v
232
+ ```
233
+
234
+ ### 按文件运行
235
+
236
+ ```bash
237
+ # 包布局与导入
238
+ uv run python -B -m unittest tests.test_imports -v
239
+
240
+ # 统一 CLI 分发
241
+ uv run python -B -m unittest tests.test_cli_main -v
242
+
243
+ # 协议 / lease / 观察逻辑单元测试
244
+ uv run python -B -m unittest tests.test_protocols -v
245
+
246
+ # 真机动态矩阵(server-proxy + device-proxy;需 tests/app.apk)
247
+ export ADB_PROXY_REAL_DEVICE=1
248
+ export ADB_SERIAL=<可选>
249
+ uv run python -B -m unittest tests.test_dynamic_commands -v
250
+ ```
251
+
252
+ ## 说明
253
+
254
+ - 代理是透明的:解析失败不会改写或阻断转发字节
@@ -0,0 +1,49 @@
1
+ adbproxy/__init__.py,sha256=SyvqKj-mQPl-eKJ7YUkOXFCaFmDwqU99-dFdP-BhIGQ,57
2
+ adbproxy/__main__.py,sha256=hWzaa5tcXvObGkgtL3sLK_8GTJ8QDV-MGIJUvlyYUfc,105
3
+ adbproxy/config.py,sha256=yxjdP5X4T0q-ffMYxK1-EWT_TrHo0fdByEkUK3xGDYk,1718
4
+ adbproxy/cli/__init__.py,sha256=ZXXukaAohUK_yPCxcYrsL0d-Dn_o82V2j_R5ZTKxOcw,77
5
+ adbproxy/cli/device.py,sha256=1k1oMCH3dhc5mXB2EIfbdLEHzsCPMSTYVpU7O4FKcww,226
6
+ adbproxy/cli/main.py,sha256=0YsGtrW1mx5euWfD8u5_R_h08VcDTScHC0-bhNPW33Y,1530
7
+ adbproxy/cli/server.py,sha256=fRrv-zYis2tXvnzEuWPJ8CWFZGeO8CCccw9tkL_yMB4,187
8
+ adbproxy/device/__init__.py,sha256=iZRxvRpb_gy7w5oLUoRdhJFYjwWodEb8Hf4Fg7nrLEE,47
9
+ adbproxy/device/app.py,sha256=govCVOVwmYTJs_cvNf2n1xyEO-6HI2V3jBxxbRoTfyo,22027
10
+ adbproxy/device/backend.py,sha256=8aWvRyFbCum4_jQ5idxxqxR78N9FBEWmtivfSdllH4M,9651
11
+ adbproxy/device/banner.py,sha256=Ki6dLD_MDG_9DZgRHXLigUVtQX3Xs6XLfmVbJuPL_j4,955
12
+ adbproxy/device/connection.py,sha256=LTOEVKKY2ZlAzk9Vc5UjUEl0YHBozs3hf3MBmN5rBng,18151
13
+ adbproxy/device/session.py,sha256=_OF6q5Fg1YTs-r4bB9iRVy5BvaFrlwUWm1GQBRZpvOg,8800
14
+ adbproxy/device/stream_table.py,sha256=PWgQAC8PZ23yP5CTGj16aYmSnGXu8-JRrUJxvsaCsM4,3709
15
+ adbproxy/observers/__init__.py,sha256=Pf__wL0xXZkcaMhmIXb5KmqlbCukcvKRZOZUDB79qw4,57
16
+ adbproxy/observers/events.py,sha256=6COj4bBWNMBMu6eW9q5i5O4LXwV9ZDWeofYBZ3GOhfE,384
17
+ adbproxy/observers/install.py,sha256=wX_ZMEZuoGsAiXgvW8bAzAQ4G457XJQDb5swuXwwAGc,5076
18
+ adbproxy/observers/shell.py,sha256=srI0r5TVeeEAu_FbkoeLZ_b4Bm-OuBPy6YWS-VYe7WA,16470
19
+ adbproxy/observers/stream.py,sha256=S3_pRrFgbLNiZJb-zumzXpHyC1yssX52pVnZtb-mJR8,3335
20
+ adbproxy/observers/sync.py,sha256=_1VSbBUDGnbFelCKKADHghV40VQ2f46UK3Stjs6jXmc,25531
21
+ adbproxy/protocols/__init__.py,sha256=kklWY-mgLwigxI8sycNPXhECeaXFoOAYZh3KmZxZ-0E,60
22
+ adbproxy/protocols/adb.py,sha256=w5FW6tbA545LF44kAMd0W-WKW7BP_BgGi3RUnAOrXUA,2254
23
+ adbproxy/protocols/payload/__init__.py,sha256=GZYzSZOwziT0tJJb568DUx_WPKFRPhHegwrNhXRR8i4,485
24
+ adbproxy/protocols/payload/install.py,sha256=yTT5-TOBDJF_DpDZA45RViLuj2S0n3jREyF8UHlCW7E,1919
25
+ adbproxy/protocols/payload/shell_v2.py,sha256=ls9ENaYkTLA4uYvtmQ7k9jeladc5AEZkT1P-dVHaUf4,831
26
+ adbproxy/protocols/payload/sync.py,sha256=zMxHsvloy77JCS3N2pSP0EZkOT3SqOTO49k-ofVm6xg,5929
27
+ adbproxy/protocols/smart_socket/__init__.py,sha256=o592f7cFuRJgr7uMGl-F1SB6OSo5F-vxD6P_IBKAdEo,908
28
+ adbproxy/protocols/smart_socket/classifier.py,sha256=KEarj6wcxAmcipoRRBedqVqWTxZHMToJmC9_3sc1YAo,2937
29
+ adbproxy/protocols/smart_socket/conversation.py,sha256=JvT2ByQuEETXS7qQjLD2dvqhXUS4xU67t0ns1UTdIAM,14166
30
+ adbproxy/protocols/smart_socket/handshake.py,sha256=LFAbNNekfsgQ0i3K4abLNPP_n8QN8EzkuZ1vVhSwT8o,2406
31
+ adbproxy/protocols/smart_socket/wire.py,sha256=4o4sRh58QrTgq84oyXzPw8slKgCKBQ-Zi7IDNQ-5wKc,2946
32
+ adbproxy/protocols/transport/__init__.py,sha256=dqVxU5ToPYDSBK2CE7dmEa9dqPRh3Wwoaj6HXPkDUwE,1110
33
+ adbproxy/protocols/transport/codec.py,sha256=XP_ryUSIKhUUbO9lekB_ykQ3IrKkO8s1aiaR-5_DyFA,3569
34
+ adbproxy/protocols/transport/constants.py,sha256=LP0MKpA8eASmhtOFV0NrD9P1mZlpmp3SAXcf5wXJnTk,813
35
+ adbproxy/protocols/transport/errors.py,sha256=tTn31jy1D4MZpHKxkW4-e1cuDK9NbJP7BsrXf-RODCI,137
36
+ adbproxy/runtime/__init__.py,sha256=00moyIMdBW1PXy7aKbiC_h8afxBGmjwsw3HOXm04Aw8,58
37
+ adbproxy/runtime/adb_process.py,sha256=wlCdt9zOG6XL2P1BS0hLd4fZPbQkkzDhrisiHKSsLlo,7337
38
+ adbproxy/runtime/capture.py,sha256=31NjX-2nL2pdBfWNE0KRKNa0z7ogP5YS6pItCgy4Y6E,1181
39
+ adbproxy/runtime/logging.py,sha256=UrplyM3E6Q1VByaVS0X_6vKNUfCF4UW0LMPKbSq2HW8,3582
40
+ adbproxy/runtime/sockets.py,sha256=eRhJpw1NDmKVyxiLT67r-yr4VxO543YE7sqw7p7C2MQ,288
41
+ adbproxy/server/__init__.py,sha256=L1IHdCFZwkNaCnr2nbxNBIdOgemYqJZ5R6TWoxjEf4k,47
42
+ adbproxy/server/app.py,sha256=YP2QGXop5hnvoBplhoe4rZJWnV39BxitUAjZcoNrvM4,8762
43
+ adbproxy/server/connection.py,sha256=szc-H4Y8oXHG9x9zDMlXoTfJ-C9ZbG9Z36UKtoLTH1I,16742
44
+ adbproxy-0.1.0.dist-info/licenses/LICENSE,sha256=hgdeQ4J8Xldhj6a2rhIFWEBRVx9AjI-CPKFlFSPdYOI,1066
45
+ adbproxy-0.1.0.dist-info/METADATA,sha256=nEnxiHsEJbQv9WtOml6CPNu3_PcJEngZjK1UrDSAIfU,7040
46
+ adbproxy-0.1.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
47
+ adbproxy-0.1.0.dist-info/entry_points.txt,sha256=ZknEQho_AXMf-yywpE0m2Ags-gsc1afYPt88F2taL6E,140
48
+ adbproxy-0.1.0.dist-info/top_level.txt,sha256=pg358OC1LsblgQzVB3RlliEHDTPfVbfMOW9qC0Lr9Kc,9
49
+ adbproxy-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (83.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ adb-device-proxy = adbproxy.cli.device:main
3
+ adb-server-proxy = adbproxy.cli.server:main
4
+ adbproxy = adbproxy.cli.main:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Forgo7ten
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ adbproxy