# 旧手机改造交接说明:人工清单 + 架构 + AI 提示词
> 这套方案的核心思路:**人只做"只有人能做的事",其余全部交给 AI 助手(DSH)**。
> 于是文档也分成三份:① 整体架构(看懂在搭什么)② 人工操作清单(你亲手做的部分)③ 一段提示词(丢给 AI 的部分)。
>
> 注:下文出现的设备参数(系统版本、内核、内存、存储等)都是**本机实测值,仅作示例**。
> 这套方案的适用边界不由具体配置决定——提示词里也**不写死硬件**,AI 会自己探测环境;
> 如果设备条件更好(有 root、内核支持 Landlock、存在可写且可执行的非 FUSE 分区),它能做的事只会更多。
---
## 一、整体架构
```
┌───────────────────────────────────────────────────────────────────────┐
│ Android 12(内核 4.19.157,EMUI) │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ Termux(bionic 用户态 · app uid 10191 · 由人安装并授权) │ │
│ │ │ │
│ │ 原生层(无翻译开销,适合长跑服务) │ │
│ │ sshd :8022 OpenList :5244 aria2 :6800 │ │
│ │ python3 · git · pkg · android-tools(adb) │ │
│ │ │ │
│ │ ┌───────────────────────────────────────────────────────────┐ │ │
│ │ │ proot-distro Ubuntu 26.04(glibc 用户态 · 假 root) │ │ │
│ │ │ │ │ │
│ │ │ node → DSH Web :3080 ← AI 操作台(浏览器打开) │ │ │
│ │ │ │ │ │
│ │ │ AI 的三条手臂: │ │ │
│ │ │ ① 容器内 bash → glibc 程序 / Ubuntu 工具链 │ │ │
│ │ │ ② ssh -p 8022 → 原生 Termux(真内核 / 真实负载) │ │ │
│ │ │ ③ adb shell → 整机(uid 2000,系统设置/别的应用) │ │ │
│ │ └───────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ 人负责的只有三件事:装应用 / 点授权弹窗 / 改厂商设置(+ 重启) │
└───────────────────────────────────────────────────────────────────────┘
```
### 三层各自的职责与代价
| 层 | 提供什么 | 代价(实测) |
|---|---|---|
| **Termux**(bionic) | 原生速度、`pkg`、真实内核与负载、adb 客户端 | 跑不了 glibc 程序(AList/OpenList 官方二进制、DSH 的原生模块 `flock`/`node-pty`) |
| **proot Ubuntu**(glibc) | 兼容 glibc 生态、Ubuntu 工具链 | 假 root(`id`=0 但内核里 uid 仍是 10191)、无 capability(不能绑 <1024)、无 namespace(Docker 免谈)、无 Landlock(内核 4.19)、`/proc/loadavg` 是静态快照、`/sdcard` noexec、ptrace 性能税(实测小目录 0.42s vs 原生 0.33s) |
| **adb**(uid 2000 shell) | 越过应用沙箱:改全局设置、读 logcat、读别的应用数据、注入输入 | 5555 端口暴露在局域网、私钥等于万能钥匙、重启后 TCP adb 未必自动恢复 |
### 为什么必须"三条手臂"
| 通道 | 身份 | 独有能力 |
|---|---|---|
| 容器 bash | 假 root / 真 uid 10191 | 运行 glibc 程序、操作容器文件 |
| `ssh -p 8022` | Termux app uid | 真实 `uptime`/内核、`pkg install`、原生速度、`/proc` 里大部分真实信息 |
| `adb shell` | uid 2000 shell(含 `readproc`/`log`/`input`/`ext_data_rw`) | `settings`/`device_config` 改系统、`logcat`、`/sdcard/Android/data`、`pm` 装装卸卸、`input` 注入 |
**只有一条腿会瞎**:只在容器里,你会以为内核是 6.17、负载永远是 0.12;只在 Termux 里,你跑不了需要 glibc 的服务;只有 adb,你碰不到 Termux 的私有目录。
---
## 二、人工操作清单(AI 做不了 / 不该做的部分)
### 阶段 1:给 AI 一条能进来的通道(一次性,约 15 分钟)
| # | 你要做的事 | 为什么必须人工 | 完成标志(怎么确认没漏) |
|---|---|---|---|
| 1 | **装 Termux**:用 GitHub 的 debug 构建(`termux-app_v0.118.3+github-debug_arm64-v8a.apk`),不要 Play 版 | 此时手机上一个自动化通道都还没有;而且插件必须与 Termux 同源同签名 | 能打开 Termux,跑 `pkg update` 有反应 |
| 2 | **装 Termux:Boot**(同样用 GitHub debug 版),**并打开它一次** | 同签名要求;"打开一次"是它生效的前提 | 应用列表里能看到,且点开过 |
| 3 | **开开发者选项**:设置→关于手机→连点版本号 7 次;打开 **USB 调试** | 纯 GUI 操作 | 设置里能看到"开发者选项" |
| 4 | **开通 adb TCP 通道**(二选一) | 需要人在设置里点、或插一次 USB | `adb devices` 能看到设备 |
| 4a | 路线 A(推荐,需一台电脑 + 数据线):插 USB → `adb tcpip 5555`,之后可拔线 | 首次必须 USB | `getprop service.adb.tcp.port` = `5555` |
| 4b | 路线 B(无电脑):开发者选项→**无线调试**→打开 → 记下**配对端口+6 位配对码**;然后在 Termux 里 `pkg install android-tools` 后自己连自己:
`adb pair 127.0.0.1:<配对端口>` → 输入配对码
`adb connect 127.0.0.1:<调试端口>` | 配对码需要人看一眼并输入 | `adb devices` 显示 `device`(不是 `unauthorized`) |
| 5 | **`adb connect` 时手机上弹出"允许 USB 调试吗" → 勾"一律允许" → 允许** | 这是系统安全弹窗,只能人点 | `adb shell id` 输出 `uid=2000(shell)` |
| 6 | **在 Termux 里粘贴一次引导命令**(见下) | 需要人执行一次"把 AI 装上去"的动作 | 最后会打印一个 `http://127.0.0.1:3080/?token=...` |
| 7 | **把打印出来的网址在手机浏览器打开** | AI 的界面 | 看到 DSH 的操作台 |
#### 第 6 步的引导命令(整段粘贴,约 10–20 分钟,看网速)
```bash
# ① Termux 侧基础件
pkg update -y && pkg install -y proot-distro openssh android-tools python3 curl git
termux-setup-storage # ← 会弹系统对话框,点"允许"
ssh-keygen -A && sshd # 生成 host key 并启动 SSH(8022)
# ② 装 Ubuntu 并在里面装 Node + DSH
proot-distro install ubuntu
proot-distro login ubuntu -- bash -lc '
apt update && apt install -y curl ca-certificates &&
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - &&
apt install -y nodejs && npm i -g @deepseek-ai/dsh && echo "DSH 安装完成"'
# ③ 启动 DSH(前台运行,会打印带 token 的地址;这个窗口先别关)
proot-distro login ubuntu -- /usr/bin/dsh web --no-open
```
> 提示:③ 的地址里那个 `token` **只能打开一次**(打开后会换成 30 天有效的 cookie),所以看到就先打开。
> 之后 AI 会自己把 DSH 改成开机自启、把地址留档、并提供 `dsh-url` / `dsh-open` 这类命令。
>
> **关于 SSH(AI 的第一条手臂)**:引导命令里已经起了 `sshd`,这一步人只需要"把服务打开"。
> **公钥不用你复制** —— 因为容器能直接看到 Termux 的家目录,AI 会自己生成密钥、把公钥写进 `~/.ssh/authorized_keys`,
> 然后 `ssh -p 8022` 自己连进来。这条通道是它后续所有原生操作(装包、起服务、写开机脚本)的前提;
> 验证标志是它的汇报里出现 `TracerPid=0`、真实的内核版本与真实的 load average。
### 阶段 2:让"开机自启"能生效(EMUI 专属,AI 改不了)
| # | 你要做的事 | 为什么必须人工 | 完成标志 |
|---|---|---|---|
| 8 | 设置→应用和服务→**应用启动管理**:把 `Termux` 和 `Termux:Boot` 从"自动管理"改成**手动管理**,三个开关(自启动/关联启动/后台活动)全开 | 华为的启动管理是私有实现,`adb`/`appops` 都碰不到它的数据库 | 见阶段 3 的重启验证 |
| 9 | 设置→电池→**应用耗电管理**:`Termux` 设为**不受限制** | 同上 | 同上 |
> 这一步不做会怎样?实测过:重启后服务**一个都不会起**,而且脚本自己的日志 `~/boot.log` 里**连一条记录都没有** —— 不是脚本错,是开机广播压根没送到。
### 阶段 3:需要"人"来做零散动作
| 场景 | 为什么 AI 不做 |
|---|---|
| **重启手机验证自启** | `adb reboot` 会连带杀掉 DSH 自己(宿主没了),所以必须由人重启;AI 应在重启前把状态写盘并告诉你重启后怎么核对 |
| **任何系统弹窗**(存储权限、adb 授权、安装未知应用…) | 只能人点 |
| **接 WiFi / 换网络 / 输入密码** | AI 无法代做(除非你明确让它用 adb 注入输入,且界面可靠) |
| **厂商私有设置**(启动管理、省电策略、权限管理) | 非 AOSP 接口,adb 改不了 |
| **卸载/停用系统应用** | 高风险写操作,应由人确认后再让 AI 执行 |
| **常年插电的电池保护**(强烈建议) | 纯硬件风险,AI 无法代劳:锂电池长期满电 + 温热会鼓包。三选一——①系统里设**充电上限 80%**(电池健康/智能充电/电池保护);②用**定时插座**每天只充 1~2 小时;③买**直供电电池小板**替换电池(一劳永逸,但失去"自带 UPS",建议接个小 UPS/充电宝)。原电池尤其已鼓包的**不要继续充放**,交回收点 |
### 交接之后:AI 会自己完成的(不需要你参与)
**建立原生 SSH 通道**(自己生成密钥 → 写进 `~/.ssh/authorized_keys` → 连上并自证是真原生)、
装原生服务(OpenList / aria2)、配 aria2 RPC 密钥与鉴权、把 OpenList 接上 aria2、配 OpenList 的存储挂载与临时目录、
写开机自启脚本(端口守卫 + 幂等 + `boot.log`)、配 `.bashrc` 兜底、配 MOTD 显示常用命令与本次 DSH 地址、
写 `dsh-url`/`svc-status`/`ol-temp` 之类小工具、用 adb 抓资源报告、排查问题。
**它每做一步都会自己验证,并给出证据**(进程、端口、日志、hash),而不是"应该可以了"。
---
## 三、把下面这段丢给 AI
> 完整可直接粘贴的提示词在 **`old-phone-prompt.txt`**(纯文本,无 markdown 包裹,方便整段复制)。
> 用法:在 DSH 的对话框里粘贴它,然后等它汇报第一轮取证结果。
提示词里包含五块内容:
1. **目标与环境事实**(设备、内核 4.19、假 root、无 Landlock、EMUI 拦截、`sh` 是 dash 等)—— 让它不用自己去踩已知的坑
2. **要它交付的东西**(native 服务 + 自启 + MOTD + 小工具 + 验证报告)
3. **工作方式约束**(先只读取证 → 假设 → 最小改动 → 验证;每步给证据;写操作先说明)
4. **安全红线**(不碰密码、不开 `allow-external-apps`、不动 `/sdcard` 上的可执行文件、不 `adb reboot`)
5. **什么情况下必须停下来找你**(需要重启 / 需要点弹窗 / 需要改厂商设置)
### 为什么要用"提示词"而不是"教程"
- 教程是**给人读的**,读完还得人翻译成命令、再一条条执行、再自己判断对错
- 提示词是**给 AI 读的**:目标、约束、验收标准一次说清,它自己去取证、试错、验证、汇报
- 而且提示词可以**随环境变化重写**:换台手机只需改"环境事实"那一段,剩下原封不动
- 真正需要人守着看的,只有本文第二节那几行 —— 那部分写清楚就够了
---
## 附:这套方案的能力边界(写提示词时也要告诉 AI)
**能做**:单二进制服务、Web 面板、下载机、WebDAV、定时脚本、整机运维(改设置/看日志/抓报告/输入注入)
**别指望**:Docker/任何容器(无 namespace)、FUSE 挂载类(`rclone mount`/`sshfs`/`s3fs`)、监听 80/443、真正的沙箱隔离、systemd
**架构口诀**:**重 I/O 放原生,重依赖放容器,整机操作走 adb**。