旧安卓手机再利用 - 啫神的博客

旧安卓手机再利用

将任意旧安卓手机变成 Linux 桌面或智能家居服务器 — 无需电脑、无需 Root、无需云服务,只需 Termux。



选择你的方案

Linux 桌面智能家居服务器
是什么手机上的完整 GUI 桌面环境控制 WiFi 设备的 Home Assistant 中心
使用场景学习 Linux、Python 开发、SSH 服务器、网页浏览、媒体播放控制智能灯/插座、自动化、仪表盘
脚本bash termux-linux-setup.shbash setup-homeassistant.sh
耗时10–30 分钟15–45 分钟
跳转桌面安装Home Assistant 安装

两者可以在同一部手机上运行 — 互不冲突。

系统要求

硬件

  • 搭载 arm64(64 位) 处理器的安卓手机
  • 推荐 3 GB 以上内存(KDE Plasma 需 4 GB 以上)
  • 5–10 GB 可用存储空间(安装 Wine 需要更多)
  • 高通骁龙芯片最佳 — 可获得最好的 GPU 加速效果(Turnip/Adreno)。脚本也支持 Mali 及其他 GPU,但性能较弱。

软件

Termux-X11

桌面环境 — 如何选择?

#桌面环境适合人群资源占用
1XFCE4 (默认)大多数用户。快速、可定制、macOS 风格 Dock低–中
2LXQt旧手机或低内存设备(2–3 GB)极低
3MATE经典桌面体验中等
4KDE Plasma仅适合高性能手机 — Windows 11 风格高

如果不确定,选择 XFCE4。

安装

步骤 1 — 安装必要应用

从 F-Droid 安装 Termux,从 GitHub 安装 Termux-X11(链接见上方)。授予两个应用所需的所有权限。

步骤 2 — 预升级 Termux(重要 — 请先执行此步)

打开 Termux 并运行:

termux-wake-lock
pkg upgrade -y

termux-wake-lock 命令可保持 Termux 在屏幕关闭时继续运行 — 没有它,安卓可能会在安装过程中杀死进程。pkg upgrade 会在脚本运行前更新基础系统,避免 libpcre 和 libandroid-selinux 相关的已知崩溃问题。

步骤 3 — 下载并运行脚本

curl -O https://raw.githubusercontent.com/mayukh4/linux-android/main/termux-linux-setup.sh
chmod +x termux-linux-setup.sh
bash termux-linux-setup.sh

脚本会询问你选择哪个桌面环境以及是否安装 Wine,其余全部自动完成。

安装耗时 10–30 分钟,取决于网络速度。完整的日志保存在 ~/termux-setup.log 中,方便排查问题。

步骤 4 — 启动桌面

bash ~/start-linux.sh

然后在手机上打开 Termux-X11 应用,Linux 桌面将显示在其中。

停止桌面:

bash ~/stop-linux.sh

安装内容一览

组件说明
Termux-X11显示服务器 — 在屏幕上渲染桌面
桌面环境你的选择:XFCE4、LXQt、MATE 或 KDE
Mesa / Zink通过 Vulkan 实现 OpenGL — 启用 GPU 加速图形渲染
Turnip 驱动高通 Adreno 开源 Vulkan 驱动(如检测到)
PulseAudio音频服务器
Firefox完整桌面浏览器
VLC视频和音频播放器
Git、wget、curl常用开发工具
Python 3 + pipPython 运行时和包管理器
OpenSSHSSH 服务器和客户端 — 从电脑远程访问
Wine (可选)通过 Hangover + Box64 运行 Windows x86 应用

GPU 加速

脚本通过硬件属性自动检测 GPU(而非品牌名称 — 三星根据地区不同会同时使用 Adreno 和 Mali,因此品牌检测不可靠)。

高通 Adreno(骁龙手机): 使用开源 Turnip Vulkan 驱动 + Zink(Vulkan 上的 OpenGL)。接近原生 GPU 性能。

Mali / 其他 GPU: 回退到 Zink + SwRast(软件 Vulkan)。功能可用,但强烈建议使用轻量级桌面(XFCE4、LXQt)。

GPU 环境配置保存在 ~/.config/linux-gpu.sh 中,每次运行 start-linux.sh 时自动加载。你可以编辑该文件来调整 Mesa 参数。

SSH — 从电脑访问手机

脚本会自动安装 OpenSSH。你可以从同一 WiFi 网络中的任何电脑 SSH 到手机 — 适合执行命令、传输文件或在正式键盘上进行开发。

首次 SSH 设置

在 Termux 中打开终端(不是桌面内的终端,而是 Termux 应用本身),运行:

# 启动 SSH 服务器
sshd

# 设置 Termux 密码(SSH 登录时使用)
passwd
查看手机 IP 地址:
ip addr show wlan0 | grep 'inet '

输出类似 inet 192.168.1.42/24 — IP 地址是 / 前面的部分。

从电脑连接

在你的电脑上(Linux、macOS 或 Windows 终端):

ssh 你的termux用户名@192.168.1.42 -p 8022

端口 8022 是 Termux SSH 的默认端口(不是标准的 22 端口,后者需要 Root 权限)。

在 Termux 中运行 whoami 查看你的用户名,通常是类似 u0_a123 的格式。

使用 SSH 配置简化登录(可选)

在电脑上将以下内容添加到 ~/.ssh/config,无需每次输入完整命令:

Host myphone
    HostName 192.168.1.42
    User u0_a123
    Port 8022
之后只需输入:
ssh myphone

使用 SCP 或 SFTP 传输文件

从电脑复制文件到手机:

scp -P 8022 myfile.txt u0_a123@192.168.1.42:~/
从手机复制文件到电脑:
scp -P 8022 u0_a123@192.168.1.42:~/somefile.txt ./

也可以使用任何 SFTP 客户端(如 FileZilla 或 Cyberduck)— 连接到相同 IP 和端口 8022。

关闭 Termux 后保持 SSH 运行

默认情况下 sshd 会在 Termux 关闭时停止。要保持持久运行:

# 添加到 ~/.bashrc,使 sshd 在 Termux 打开时自动启动
echo 'sshd 2>/dev/null' >> ~/.bashrc

Windows 应用支持(Wine)

如果你选择安装 Wine,它使用 Hangover Wine 配合 Box64 将 Windows x86 调用转换为 ARM64。简单工具和实用程序通常可以运行;大型软件或游戏可能无法正常工作。

要配置 Wine,在桌面终端中运行 winecfg 或点击桌面上的 Wine Config 快捷方式。

Home Assistant — 智能家居服务器

将旧安卓手机变成全天候智能家居中心,控制 WiFi 智能灯、插座和其他设备 — 可从网络中的任何浏览器访问。

Home Assistant Core 运行在手机上的轻量级 Ubuntu 容器中(通过 proot-distro),无需 Root,本地设备无需云服务。

可控制的设备

设备类型品牌示例连接方式
WiFi 智能灯TP-Link Kasa、Govee、LIFX通过本地网络直连 IP
WiFi 智能插座TP-Link Kasa、Wemo通过本地网络直连 IP
云连接设备Tuya / Smart Life、Govee通过云 API(随处可用)
其他 WiFi 设备智能开关、传感器、摄像头通过 IP 或云集成

安卓上的限制

  • 不支持蓝牙 — HA 无法通过 Termux 访问手机的蓝牙协议栈
  • 不支持 USB 适配器 — Zigbee/Z-Wave USB 设备需要 Root 和内核支持才能使用
  • 不支持自动发现(mDNS) — Android 10+ 阻止了 /proc/net/dev 的访问,导致 Zeroconf 无法工作。必须通过 IP 地址或云 API 添加设备,不能依赖自动发现
  • 不支持 Docker/插件 — 这是 HA Core,不是 HA OS。需要 Docker 的社区插件无法运行。核心集成(2000+)均可正常使用。

安装

curl -O https://raw.githubusercontent.com/mayukh4/linux-android/main/setup-homeassistant.sh
bash setup-homeassistant.sh

安装耗时 15–45 分钟,取决于手机性能。最耗时的步骤是在 Ubuntu 容器中编译 Home Assistant 的 Python 依赖(numpy、cryptography 等)。

启动和停止

# 启动 Home Assistant
bash ~/start-homeassistant.sh

# 停止 Home Assistant
bash ~/stop-homeassistant.sh

# 升级到当前容器 Python 所能支持的最新版本
bash ~/upgrade-homeassistant.sh

HACS — 社区插件商店

HACS 是社区集成、主题和 Lovelace 卡片的商店,收录了 HA 核心之外的内容。安装脚本会询问是否为你安装。

(请在安装任何其他自定义集成之前先安装 HACS。 如果 custom_components/ 中已有手动安装的集成,请先删除它们,否则 HACS 可能会处于损坏状态。)
事后手动安装:
proot-distro login ubuntu -- sh -c "cd ~/hass-config && wget -O - https://get.hacs.xyz | bash -"

然后重启 Home Assistant,并在仪表盘中完成设置:

  1. 设置 → 设备与服务 → + 添加集成
  2. 搜索 HACS
  3. 勾选所有确认项,然后使用 GitHub 账号授权

完整配置文档:hacs.xyz/docs/use/configuration/basic。

升级 Home Assistant

bash ~/upgrade-homeassistant.sh

为什么全新安装得到的版本比 HA 官网显示的旧。 pip 只会安装解释器所满足 requires-python 的最新版本,然后就停下来。这不是安装失败:

容器 Python可运行的最新 Home Assistant
3.122025.1.x
3.13.0 – 3.13.12025.5.x
3.13.2+2026.2.x
3.14.2+2026.3 及以后

(依据 PyPI 上各版本的 requires-python 核实。)

proot-distro install ubuntu 跟随 Ubuntu 滚动发行版,所以你拿到哪个 Python 取决于安装容器的时间。bash ~/upgrade-homeassistant.sh 会打印你的 Python 版本,并在触及上限时告诉你。

(想突破这个上限(改用 Python 3.14)请参见英文文档的 Upgrading Home Assistant 一节。该操作会替换正在运行的安装所用的解释器,因此没有自动化。)

访问仪表盘

HA 运行后,在同一 WiFi 网络中的任何设备的浏览器中访问:

http://<你的手机IP>:8123

在 Termux 中运行 ip addr show wlan0 | grep 'inet ' 查看手机 IP。

首次启动需要 5–10 分钟 进行初始化。首次访问时你需要在浏览器中创建管理员账户。

添加第一个设备 — TP-Link Kasa

  1. 在常用手机上打开 Kasa 应用,记下设备的 IP 地址(设备设置 → 设备信息)
  2. 在 HA 仪表盘中:设置 → 设备与服务 → + 添加集成
  3. 搜索 "TP-Link Kasa Smart"
  4. 按提示输入设备 IP 地址
  5. 你的灯/插座应该会出现 — 现在可以从 HA 仪表盘控制它了
(由于安卓上 mDNS 被禁用,自动发现无法找到设备。请始终通过 IP 手动添加。)

添加 Tuya / Smart Life 设备

Tuya 设备通过 Tuya 云 API 连接,不受本地网络限制影响:

  1. 前往 iot.tuya.com 创建免费开发者账户
  2. 创建云项目 → 选择你的数据中心区域 → 添加智能家居 API
  3. 进入设备 → 关联涂鸦 App 账号 → 使用 Smart Life / Tuya Smart 应用扫描二维码
  4. 在 HA 仪表盘中:设置 → 设备与服务 → + 添加集成 → Tuya
  5. 输入 Tuya IoT 控制台中的 Access ID 和 Access Secret

保持 Home Assistant 后台运行

默认情况下,安卓会在 Termux 切到后台时杀死其进程。要保持 HA 24/7 运行:

# 方式 1:使用 nohup 后台运行
termux-wake-lock
nohup bash ~/start-homeassistant.sh > ~/hass.log 2>&1 &

# 方式 2:Termux 启动时自动运行(添加到 ~/.bashrc)
echo 'termux-wake-lock && nohup bash ~/start-homeassistant.sh > ~/hass.log 2>&1 &' >> ~/.bashrc
termux-wake-lock 可防止安卓挂起进程。将手机接上充电器,它就变成了一台专用常驻服务器。

视频使用场景

旧安卓手机运行此方案后的用途灵感:

  • 智能家居控制器 — 插上电源,24/7 运行 Home Assistant,从网络中的任何设备控制灯光和插座
  • 学习用 Linux 桌面 — 完整的 XFCE4/KDE/MATE 桌面,无需购买电脑即可学习 Linux
  • SSH 开发服务器 — 在笔记本上编码,通过 SSH 在手机上运行
  • Python 开发工作站 — Python 3 + pip 开箱即用,适合学习或小型项目
  • 媒体服务器 / 文件服务器 — 使用 Python 内置 HTTP 服务器或安装 Samba 在本地网络上共享文件
  • 网络监控仪表盘 — 从任何浏览器访问 Home Assistant 和系统状态

故障排除

脚本安装中途退出且无明确错误 查看 ~/termux-setup.log。脚本会记录每个包的安装结果,最后一行会告诉你具体是哪个包导致了失败。

运行 start-linux.sh 后桌面不显示 手动打开 Termux-X11 应用 — 桌面在该应用内渲染,而不是在 Termux 终端中。

Termux-X11 中黑屏 运行 stop-linux.sh 然后重新运行 start-linux.sh。KDE Plasma 首次启动比其他桌面环境多需要 20–30 秒。

安装时出现"library not found"或"cannot link executable"错误 这是 libpcre 崩溃问题。完全关闭 Termux,重新打开,运行 pkg upgrade -y,然后重新运行脚本。

出现"Unable to contact settings server"或"Failed to connect to socket .../dbus-XXXX: Connection refused" 桌面的设置守护进程通过 D-Bus 会话总线通信。要么总线没有启动,要么上一次会话被强制杀死后留下了失效的 socket,而桌面仍在尝试复用它。现在 start-linux.sh 会先清理残留状态,再在固定地址上启动总线,然后才启动桌面。如果你用的是旧版脚本,重新运行 termux-linux-setup.sh 以重新生成启动脚本,或手动修复:

pkg install dbus
pkill -9 -f dbus-daemon
rm -rf ~/.dbus "$PREFIX"/tmp/dbus-*
mkdir -p "$PREFIX/var/run/dbus"
export DBUS_SESSION_BUS_ADDRESS="unix:path=$PREFIX/var/run/dbus/session_bus_socket"
dbus-daemon --session --address="$DBUS_SESSION_BUS_ADDRESS" --nopidfile --fork

Vulkan / Mesa 包安装失败:提示"vulkan-loader-generic : Conflicts: vulkan-loader-android",或 dpkg 报"trying to overwrite libvulkan_freedreno.so" 这是两个独立的原因,现在都已修复:

  • vulkan-loader-generic 同时 provides 和 conflicts vulkan-loader-android,因此在正常安装环境下请求 android 版本会让整个事务失败,且毫无收益。脚本现在直接安装 vulkan-loader-generic。
  • 第三方的 mesa-zink-vulkan-icd-freedreno(Mesa 22)与主仓库的 Turnip 驱动(Mesa 26)打包了同名的 libvulkan_freedreno.so,同时安装会让 dpkg 中止。脚本现在只选择其中一套并始终保持一致。

如果你的安装早于此修复,GPU 加速大概率仍然可用 — 这两个报错声势很大但并不致命。重新运行脚本即可清理。

包安装失败,提示"unmet dependencies"或"Conflicts" 脚本的 safe_install_pkg 函数会读取每个包声明的冲突,正确处理版本约束,并允许 apt 执行该包合法替换(Replaces)的冲突。如果仍然出现此问题,请查看日志并提交 GitHub Issue,附上你的设备型号和安卓版本。

音频不工作 桌面出现后等待 5–10 秒。PulseAudio 首次启动需要一点时间来初始化。

SSH 连接被拒绝 确保 sshd 正在运行(ps aux | grep sshd)。如果未运行,重新执行 sshd。确认使用的是端口 8022,而非 22。

Wine 无法启动 Wine 需要活跃的显示环境。确保桌面已运行,然后在桌面内的终端中运行 winecfg。

Home Assistant:"pip install homeassistant"编译错误 通常表示缺少构建依赖。运行 proot-distro login ubuntu 并确认已安装 python3-dev、libffi-dev、libssl-dev 和 cargo。然后重试:source ~/hass-venv/bin/activate && pip install homeassistant。

Home Assistant:8123 端口仪表盘无法加载 首次启动需要 5–10 分钟。检查 HA 是否仍在初始化:proot-distro login ubuntu -- bash -c "source ~/hass-venv/bin/activate && hass -c ~/hass-config" 并查看输出。确保手机和浏览器在同一 WiFi 网络中。

Home Assistant:启动时出现"address already in use"错误 已有 HA 实例在运行。先停止它:bash ~/stop-homeassistant.sh,或手动停止:pkill -f "hass -c"。

Home Assistant:设备无法自动发现 这在安卓上是正常现象。Android 10+ 对 /proc/net/dev 的限制导致 mDNS/Zeroconf 无法工作。请通过 IP 地址手动添加设备,或使用云端集成(Tuya、Govee Cloud 等)。

进价

自定义 GPU 参数

~/.config/linux-gpu.sh 在每次桌面启动时被加载。常用调整:

# 强制软件渲染(用于调试)
export GALLIUM_DRIVER=llvmpipe

# 启用 Mesa 调试输出
export MESA_DEBUG=1

# 修改 OpenGL 版本覆盖
export MESA_GL_VERSION_OVERRIDE=3.3

SSH 密钥认证(免密登录)

在电脑上生成密钥对(如果还没有):

ssh-keygen -t ed25519
将公钥复制到手机:
ssh-copy-id -p 8022 u0_a123@192.168.1.42
之后 SSH 将不再要求输入密码。

Termux 打开时自动启动桌面

在 Termux 的 ~/.bashrc 中添加:

# 取消注释以在 Termux 打开时自动启动桌面
# bash ~/start-linux.sh


冲突安全安装器的工作原理

Termux 中有几个包会互相硬冲突(例如 vulkan-loader-android 和 vulkan-loader-generic 声明了互斥的 Conflicts)。标准的 apt-get 在安装一个包时如果另一个已存在会直接报错,导致脚本退出。

safe_install_pkg 函数通过在每次安装前从 apt-cache show 读取 Conflicts 字段来解决这个问题。如果声明的冲突包已安装,则跳过该包并发出警告,脚本继续运行。这意味着无论系统中预装了什么包,脚本都可以安全运行。


关于 Termux 路径

所有硬编码的 /data/data/com.termux/... 路径都已替换为 $PREFIX(Termux 标准环境变量)。这意味着脚本也适用于非标准安装,例如安卓次要用户配置文件中的 Termux。