Files
ykxmz/_build/patch_android_relayonly.py
T
xmz7891 b62ac865ea ykxmz 1.5.0:修复手表端 TLS 证书校验 + MTU 修复网络稳定性
被控端
- 修复 MTU 问题:夹 MSS + 路径 MTU 探测(公网可用率 48% -> 100%)
- 复用 HTTP 连接(免掉每次新建 TLS 的 30% 握手失败)
- 每分钟回头找局域网,自动切回快 400 倍的路径
- 画面心跳帧:静止时省流量,客户端仍知道流是活的
- 锁屏时给出可操作的提示

手表端
- 内置 GTS Root R4 / GlobalSign Root CA,修 SSLHandshakeException
- 连接错误翻译成人话(证书/时间/解析/超时分别提示)
- 经中转连上后用服务器报的地址刷新已配对记录
- 新增局域网连接页面、服务器延迟检测

服务器端
- 支持 chunked 请求体(修每 16 秒一次的连接错乱与大面积 502)
- 网络调优脚本 net-tune.sh(开机自动应用)
- 管理页:批量删除、网络体检、下载区
- 隧道改 HTTP/2 + 双连接

文档
- 许可协议 / 安装前必读 / 安装后须知(作者:小麦子)
2026-10-06 19:01:05 +08:00

193 lines
7.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""安卓端改造:
用户要求:
1. "安卓端中转设置下面,把那个设备诊断给删了,换成输入配对码,
输入对应配对码就可以连接对应电脑"
2. "既然你现在用中转站了,之前那些局域网的那些东西也可以删掉了"
删:
* 「连不上?点这里诊断」按钮 + openDiagPanel()
* 「手动输入地址」按钮 + toggleManual() + manualBox(电脑 IP / 端口 输入)
* foundBox / discovering(局域网搜索的残留)
* Discovery.requestSelfCheck(局域网广播让电脑弹自检窗)
加:
* 「输入配对码连接」按钮:弹个框输 6 位数字,
经中转直接连到对应电脑(不用先搜 IP)
保留:
* 中转设置(这是现在的核心)
* 已配对电脑的令牌自动重连(quickConnect)
"""
from __future__ import annotations
import re
import sys
from pathlib import Path
MAIN = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\android\src"
r"\com\lanremote\watch\MainActivity.java")
def drop_method(text: str, header_pattern: str) -> tuple:
"""按花括号配平删掉一个方法(连前面的注释行一起)。"""
lines = text.splitlines(keepends=True)
start = None
for index, line in enumerate(lines):
if re.search(header_pattern, line):
start = index
break
if start is None:
return text, False
depth = 0
seen = False
end = None
for index in range(start, len(lines)):
depth += lines[index].count("{")
if "{" in lines[index]:
seen = True
depth -= lines[index].count("}")
if seen and depth <= 0:
end = index
break
if end is None:
return text, False
while start > 0 and lines[start - 1].strip().startswith("//"):
start -= 1
while end + 1 < len(lines) and lines[end + 1].strip() == "":
end += 1
del lines[start:end + 1]
return "".join(lines), True
# ---------- 1. 把设备诊断按钮换成"输入配对码连接" ----------
BTN_OLD = ''' Button selfCheck = bigButton("连不上?点这里诊断", C_WARN, 15);
LinearLayout.LayoutParams scParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, dp(52));
scParams.setMargins(0, 0, 0, dp(8));
selfCheck.setLayoutParams(scParams);
selfCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openDiagPanel();
}
});
box.addView(selfCheck);'''
BTN_NEW = ''' // 输入配对码直接连对应电脑。
// 不再需要"先搜局域网 / 手动填 IP"那一套 ——
// 现在统一经中转,配对码就是找电脑的唯一凭据。
Button codeButton = bigButton("输入配对码连接", C_OK, 15);
LinearLayout.LayoutParams codeParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, dp(52));
codeParams.setMargins(0, 0, 0, dp(8));
codeButton.setLayoutParams(codeParams);
codeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
promptPairingCode();
}
});
box.addView(codeButton);'''
def main() -> int:
text = MAIN.read_text(encoding="utf-8")
ok = True
# ---- 1. 按钮替换 ----
if BTN_OLD in text:
text = text.replace(BTN_OLD, BTN_NEW, 1)
print(" 首页:设备诊断按钮 -> 输入配对码连接")
else:
print(" [失败] 找不到设备诊断按钮")
ok = False
# ---- 2. 删 foundBox / discovering / btnManual 的创建段 ----
text, done = drop_method(text, r"private void toggleManual\(\)")
print(f" {'删掉' if done else '[跳过]'} toggleManual()")
# btnManual 按钮创建(从 btnManual = bigButton 到 box.addView(btnManual);)
idx = text.find("btnManual = bigButton(")
if idx >= 0:
end = text.find("box.addView(btnManual);", idx)
if end >= 0:
end = text.find("\n", end) + 1
text = text[:idx] + text[end:]
print(" 删掉「手动输入地址」按钮")
else:
print(" [跳过] 找不到 btnManual 的挂载点")
else:
print(" [跳过] 没有 btnManual 创建段")
# manualBox(电脑 IP / 端口 输入)
idx = text.find("manualBox = new LinearLayout(")
if idx < 0:
idx = text.find("LinearLayout manualBox")
if idx >= 0:
# 往前找声明行所在语句
end = text.find("box.addView(manualBox);", idx)
if end >= 0:
end = text.find("\n", end) + 1
text = text[:idx] + text[end:]
print(" 删掉 manualBox(电脑 IP / 端口 输入)")
# foundBox 创建段
idx = text.find("foundBox = new LinearLayout(this);")
if idx >= 0:
end = text.find("box.addView(foundBox);", idx)
if end >= 0:
end = text.find("\n", end) + 1
text = text[:idx] + text[end:]
print(" 删掉 foundBox(局域网搜索结果列表)")
# ---- 3. 删 openDiagPanel() ----
text, done = drop_method(text, r"private void openDiagPanel\(\)")
print(f" {'删掉' if done else '[跳过]'} openDiagPanel()")
# ---- 4. 删设备诊断那一整段(诊断面板的辅助方法)----
for pattern, label in (
(r"private void runDiagnostics\(", "runDiagnostics()"),
(r"private void copyDiagToClipboard\(", "copyDiagToClipboard()"),
(r"private String buildDiagText\(", "buildDiagText()")):
text, done = drop_method(text, pattern)
if done:
print(f" 删掉 {label}")
# ---- 5. 删掉局域网广播自检那段 ----
old_block = re.search(
r"\n[ \t]*//[^\n]*连不上时:广播请求[^\n]*\n"
r"(?:[^\n]*\n)*?[^\n]*Discovery\.requestSelfCheck[^\n]*\n"
r"(?:[^\n]*\n)*?[ \t]*\}\);\n[ \t]*\}\)\.start\(\);\n",
text)
if old_block:
text = text[:old_block.start()] + "\n" + text[old_block.end():]
print(" 删掉局域网广播自检(Discovery.requestSelfCheck)")
else:
# 退一步:只把那一个方法删掉
text, done = drop_method(text, r"private void requestSelfCheck")
print(f" {'删掉' if done else '[跳过]'} 局域网广播自检")
# ---- 6. 删掉相关字段声明 ----
for field in ("private LinearLayout foundBox;",
"private boolean discovering = false;",
"private Button btnManual;",
"private EditText hostInput;",
"private EditText portInput;",
"private LinearLayout manualBox;",
"private boolean manualOpen = false;"):
if field in text:
# 连同紧跟的注释行一起删
text = re.sub(r"[ \t]*//[^\n]*\n(?=[ \t]*"
+ re.escape(field) + ")", "", text, count=1)
text = text.replace(field + "\n", "", 1)
print(f" 删掉字段 {field.split()[-1]}")
MAIN.write_text(text, encoding="utf-8", newline="\n")
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())