Skip to content

旧手机除了转转还能干嘛:在非 Root 的 Android 手机上搭建开发环境

前言

本文将教你如何把闲置的 Android 手机变成一台可以运行 Docker 容器的"小服务器",并通过 VSCode/Cursor 进行远程开发。

适用场景:

  • 想在手机上运行轻量级服务(如数据库、小型网站)
  • 学习 Linux 和 Docker,但没有多余的电脑
  • 利用旧手机的性能,避免浪费

你将学到:

  • 在手机上安装 Linux 终端环境(Termux)
  • 在手机上运行 Docker 容器(使用 udocker)
  • 通过电脑远程连接手机进行开发

前置条件:

  • 一台 Android 手机(arm64 架构)
  • 电脑上安装了 adb 工具
  • 手机和电脑在同一局域网内
  • 已经打开开发者模式并配对电脑adb

第一步:安装和配置 Termux

1.1 什么是 Termux?

Termux 是一个在 Android 上运行的 Linux 终端模拟器,不需要 root 权限就能让你在手机上使用 Linux 命令行工具。

1.2 下载和安装 Termux

重要提示: 请从 F-Droid 下载 Termux,不要使用 Google Play 版本(已过时)。

下载地址:https://f-droid.org/en/packages/com.termux/

在电脑上通过 adb 安装:

bash
adb install <your_termux.apk>

调优建议 Android 12 及更高版本引入了一个机制,会自动杀死后台占用 CPU 过高的进程
你需要执行
adb shell "/system/bin/device_config put activity_manager max_phantom_processes 2147483647"
来防止 termux被限制
在手机系统设置中,找到“应用管理” -> Termux -> “电池” -> 设置为 “不限制” (不同品牌设置方法不同,建议搜索教程)

1.3 通过 adb 进入 Termux 环境

在电脑上执行以下命令,连接到手机并切换到 Termux 环境:

bash
# 连接到手机
adb shell

# 切换到 Termux 的运行环境
run-as com.termux files/usr/bin/bash -lic 'export PATH=/data/data/com.termux/files/usr/bin:$PATH; export LD_PRELOAD=/data/data/com.termux/files/usr/lib/libtermux-exec.so; cd /data/data/com.termux/files/home; bash -i'

1.4 配置 Termux 基础环境

进入 Termux 后,依次执行以下命令:

bash
# 切换到国内镜像源(加快下载速度)
termux-change-repo

# 授予 Termux 访问手机存储的权限(会弹出权限请求,请点击"允许")
termux-setup-storage

# 安装 SSH 服务器,用于远程连接和传输文件
pkg install openssh

# 安装 Termux 服务管理工具
pkg install termux-services

# 安装基础工具
# file: 查看文件类型
# proot: 运行其他 Linux 发行版(稍后会用到)
# curl: 下载文件
# busybox: 常用 Linux 命令集合
pkg install file proot curl busybox

1.5 配置 SSH 远程连接

bash
# 设置 Termux 的登录密码
passwd

# 启动 SSH 服务(默认监听 8022 端口)
sshd

测试连接: 在电脑上打开任意 SSH 客户端,执行:

bash
# 用户名可以随意填写,密码是你刚才设置的密码
ssh 任意用户名@<手机IP地> -p 8022

注意:

  • 此时普通 SSH 客户端可以连接,但 VSCode/Cursor 可能无法连接,这是正常的
  • 稍后我们会配置 proot 环境来解决这个问题
    Pasted image 20260109161855.png
    Pasted image 20260109161907.png

第二步:安装 udocker 并运行容器

2.1 什么是 udocker?

udocker 是一个"用户态"的 Docker 实现,它不需要 root 权限就能运行 Docker 容器。这对于 Android 手机来说非常理想,因为大多数手机没有 root。

与普通 Docker 的区别:

  • 普通 Docker:需要 root 权限,提供完整的资源隔离和网络隔离
  • udocker:无需 root,但几乎没有资源隔离(包括端口和网络)

2.2 安装 udocker

项目地址:https://github.com/indigo-dc/udocker

在 Termux 中执行:

bash
# 下载 udocker
wget https://github.com/indigo-dc/udocker/releases/download/1.3.17/udocker-1.3.17.tar.gz

# 解压
tar zxvf udocker-1.3.17.tar.gz

# 添加到环境变量 官方这里的有问题,程序自带的proot太旧,会在新安卓上被系统杀掉,这里需要使用termux包管理提供的proot
export PATH=$PATH:`pwd`/udocker-1.3.17/udocker

# 安装依赖组件
udocker install

提示: 安装过程需要下载依赖,如果网络较慢,可以在手机上开启代理。

验证安装:

bash
$ udocker --version
version: 1.3.17
tarball: https://download.a.incd.pt/udocker/udocker-englib-1.2.11.tar.gz
tarball_release: 1.2.11

2.3 udocker 与 Docker 的重要区别

⚠️ 必须了解的差异:

  1. 端口隔离问题

    • 普通 Docker:容器端口需要手动映射(如 -p 3306:3306),不同容器可以使用相同端口
    • udocker:所有容器的端口直接暴露在主机上,无法做端口隔离
    • 安全风险:如果容器运行了数据库等服务,端口会直接暴露到局域网,务必注意安全
  2. 容器管理差异

    • 普通 Docker:可以使用 docker stop 停止容器,docker-compose 管理多容器
    • udocker:没有 stop 命令,只能用 rm 删除容器
    • 进程管理:容器进程会直接显示在 ps -aux
  3. 命令语法对比

Docker 命令:

bash
docker run -it --rm -v my-dir:my-dir hello-world

等价的 udocker 命令:

bash
udocker run --volume "my-dir:my-dir" --rm hello-world

2.4 使用建议

  • 如果容器服务卡死无法停止,可能需要重启手机
  • 使用 udocker --help 查看完整命令列表,也可以将输出给 AI 寻求帮助
  • 到这里,你已经可以在手机上运行 Docker 容器了!

第三步:配置 VSCode/Cursor 远程连接

3.1 为什么需要 proot?

技术背景:

  • Termux 使用的是 Android 的 bionic libc 库,而不是标准的 glibc
  • VSCode/Cursor 的远程连接组件依赖 glibc,无法直接在 Termux 中运行
  • 解决方案:使用 proot 在 Termux 中运行一个完整的 Linux 发行版(如 Alpine、Ubuntu 等)

简单理解: proot 就像是在 Termux 里面套了一个"虚拟的"Linux 系统,这个系统可以运行 VSCode 需要的组件。

3.2 安装 proot-distro 工具

proot-distro 是 Termux 官方提供的工具,用于管理不同的 Linux 发行版。

项目地址:https://github.com/termux/proot-distro/

3.2.1 下载安装脚本

bash
# 下载 proot-distro 安装包(在电脑上执行)
wget https://github.com/termux/proot-distro/archive/refs/heads/master.zip

# 通过 SSH 传输到手机
scp proot-distro-master.zip <手机IP地>:.

3.2.2 在手机上安装

在 Termux 中执行:

bash
# 解压安装包
unzip proot-distro-master.zip

# 进入目录并安装
cd proot-distro-master
./install.sh

Pasted image 20260109163940.png

Pasted image 20260109164112.png

3.3 下载并安装 Linux 发行版

3.3.1 选择发行版

前往 proot-distro releases 页面下载发行版镜像。

推荐使用 Alpine Linux,原因:

  • 体积小,安装快
  • 兼容性好,没有 systemd 相关问题
  • 适合运行服务

不推荐 Arch Linux / Ubuntu

  • 这些发行版依赖 systemd
  • systemd 需要 dbus 支持,但在 proot 环境下无法正常工作
  • 如果你只是需要命令行环境(不运行后台服务),也可以使用

3.3.2 传输发行版文件到手机

在电脑上执行:

bash
# 通过 SSH 传输(注意端口是 8022)
scp -P 8022 ./Downloads/alpine-aarch64-pd-v4.30.1.tar.xz <用户>@<手机IP>:.

# 示例输出
archlinux-aarch64-pd-v4.30.1.tar.xz    100%  156MB  58.3MB/s   00:02

3.3.3 离线安装发行版

在 Termux 中执行:

bash
# 1. 计算文件的 SHA256 哈希值(用于验证文件完整性)
sha256sum alpine-aarch64-pd-v4.30.1.tar.xz

# 输出示例:
# bb23e51cd5b5ae56bf946a34992876902de1bb2ecc0f639d59c702c6371adc62  alpine-aarch64-pd-v4.30.1.tar.xz

# 2. 设置环境变量,告诉安装脚本使用本地文件
export PD_OVERRIDE_TARBALL_SHA256=bb23e51cd5b5ae56bf946a34992876902de1bb2ecc0f639d59c702c6371adc62
export PD_OVERRIDE_TARBALL_URL="file://$(pwd)/alpine-aarch64-pd-v4.30.1.tar.xz"

# 3. 执行安装
proot-distro install alpine

安装过程输出示例:

[*] Installing Alpine Linux...
[*] Creating directory '/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/alpine'...
[*] Creating directory '/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/alpine/.l2s'...
[*] Downloading rootfs archive...
[*] URL: file:///data/data/com.termux/files/home/alpine-aarch64-pd-v4.30.1.tar.xz

Pasted image 20260109165320.png

3.4 配置 proot 环境中的 SSH

3.4.1 进入 proot 环境

bash
# 启动 Alpine Linux(或其他你安装的发行版)
# PROOT_NO_SECCOMP=1: 禁用 seccomp,避免某些系统调用被拦截
# --fix-low-ports: 允许绑定 1024 以下的端口(如 SSH 的 22 端口)
PROOT_NO_SECCOMP=1 proot-distro login alpine --fix-low-ports

3.4.2 在 proot 环境中安装 SSH

进入 proot 环境后,根据你的发行版执行相应命令:

bash
# Alpine Linux
apk add openssh

# Arch Linux
pacman -Syu openssh

# Ubuntu/Debian
apt install openssh-server

3.4.3 配置 SSH 端口和权限

为什么要改端口? Termux 已经在 8022 端口运行了 SSH 服务,proot 环境需要使用不同的端口(如 2022)。

bash
# 编辑 SSH 配置文件
nano /etc/ssh/sshd_config

# 找到 "Port 22" 这一行,修改为:
# Port 2022

# (可选)允许 root 用户通过密码登录
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config

# 设置 root 密码
passwd

# 启动 SSH 服务
/usr/sbin/sshd

3.4.4 使用 VSCode/Cursor 连接

  1. 首次连接建议使用 VSCode(Cursor 可能需要 VSCode 先建立连接)
  2. 在 VSCode 中安装 "Remote - SSH" 插件
  3. 添加 SSH 配置:
Host termux-alpine
    HostName <手机IP地址>
    Port 2022
    User root
  1. 连接到 termux-alpine
  2. 连接成功后,Cursor 也可以使用相同配置连接

3.5 理解多个 SSH 服务共存

你可能会疑惑: 为什么有两个 SSH 服务?

  • Termux SSH(8022 端口):直接运行在 Termux 环境中
  • proot SSH(2022 端口):运行在 proot 的 Linux 发行版中

重要特性:

  • proot 是"用户态"虚拟化,所有进程都运行在 Termux 的用户空间
  • 在 proot 中执行 kill 命令,可能会影响到 Termux 的进程
  • 这个特性确保了不会对 Android 系统造成任何修改,非常安全

第四步:配置开机自动启动(可选)

如果你想让手机重启后自动启动 SSH 服务和 Docker 容器,可以配置开机自启动。

4.1 安装 Termux:Boot

Termux:Boot 是一个允许 Termux 在开机时运行脚本的应用。

下载地址: https://wiki.termux.com/wiki/Termux:Boot

安装步骤:

  1. 从 F-Droid 下载并安装 Termux:Boot
  2. 打开 Termux:Boot 应用,授予必要的权限
  3. 在 Android 系统设置中,给 Termux:Boot 完整的自启动权限

4.2 创建启动脚本

4.2.1 创建脚本目录

bash
mkdir -p ~/.termux/boot/

4.2.2 创建 SSH 自启动脚本

bash
nano ~/.termux/boot/start-alpine-sshd.sh

脚本内容:

bash
#!/data/data/com.termux/files/usr/bin/sh

# 保持 CPU 唤醒,防止锁屏后断网
termux-wake-lock

# 启动 Termux 的 SSH 服务(8022 端口)
sshd

# 启动 proot 环境中的 SSH 服务(2022 端口)
# -D: 在前台运行(适合开机自启)
# -e: 输出日志到 stderr
PROOT_NO_SECCOMP=1 proot-distro login alpine -- /usr/sbin/sshd -D -e &

# 在这里添加其他需要自启动的服务
# 例如启动 udocker 容器:
# udocker run --volume "my-dir:my-dir" --rm my-container &

赋予执行权限:

bash
chmod +x ~/.termux/boot/start-alpine-sshd.sh

4.3 添加 udocker 容器自启动

如果需要自动启动 Docker 容器,可以创建额外的启动脚本:

bash
nano ~/.termux/boot/start-docker-containers.sh
bash
#!/data/data/com.termux/files/usr/bin/sh

# 等待网络就绪
sleep 10

# 启动你的容器
udocker run --volume "/data/mydata:/data" --rm my-database &
bash
chmod +x ~/.termux/boot/start-docker-containers.sh

4.4 更多 Termux 服务

Termux 官方还提供了一些内置服务管理工具,你可以参考:

官方文档: https://wiki.termux.com/wiki/Termux-services

Pasted image 20260109165320.png

Cheat Sheet

#强行杀掉所有sshd
pkill -f sshd

遇到报错开启 udocker -D,把trace丢给Gemini