Post

高通骁龙平台下 Termux Chroot/PRoot 容器实现全局硬件加速的笔记

高通骁龙平台下 Termux Chroot/PRoot 容器实现全局硬件加速的笔记

本文于 2025 年 3 月 9 日在 Bilibili 发布:https://www.bilibili.com/opus/1042342069764358179

笔者接触 Termux 这款强大的 Android 虚拟终端大概已有两年半,虽相关的学习多浮于表面,但仍摸索了一些玩法,利用它运行 Linux 容器便是其中之一。由于相关的知识技巧比较零碎,故总结了这篇笔记,记录一下关键步骤和常见问题的解决办法,后面如果解决了什么新的问题也会更新在这里。

本文仅涉及使用 Termux 运行原生 arm64 架构的 Linux 容器,不涉及跨架构模拟、图形 API 转译等内容(Windows 游戏转译可以选择 WinlatorMobox 等)。本文使用的驱动为 Turnip + Zink

一、Termux 配置

Termux 利用 TMOE 部署 Linux 容器的教程很多,这里就不在赘述。笔者部署时选的是 Debian 13 的 Chroot 容器,安装了 KDE Plasma 桌面。没 Root 的话也可以选择 PRoot 容器,也可以正常使用(笔者在骁龙 888 、骁龙 8+ Gen 1、骁龙 8 Elite 和 骁龙 8 Elite Gen 5 的 PRoot 容器上测试成功)。

如果是 Android 12 及以上版本的系统,需要解除单个应用的多线程限制,在 TMOE 里可以快捷设置。

安装 Linux 容器过程中可以不安装 vnc 服务(性能不太行),因为本文用的是 Termux:X11 连接容器内的桌面环境。KDE Plasma 桌面环境在容器内使用 TMOE 安装即可。安装完成后需要挂载 tmp,关闭容器后在容器外的 TMOE 进行操作。

二、Termux:X11 配置

安装 Termux:X11 后,建议先设置 Preferences。若连接键鼠使用,建议修改图中橙色方框中的选项为图中所示配置;若需要在 Linux 容器中正常使用 Alt + Tab 等快捷键,需要在安卓设置中打开 Termux:X11 的无障碍服务,如图中绿色方框中所示。

设置好后在 Termux 中安装 X11 源。

1
pkg install x11-repo -y

安装好后可以通过 termux-change-repo 命令更换国内的软件源以加快下载速度,然后安装连接 Termux:X11 和硬件加速相关的软件包。

1
pkg update && pkg upgrade -y

三、Linux 容器配置

在容器外,先启动 termux-x11 服务,再启动容器,可以参考以下脚本:

1
2
3
4
#!/bin/bash
kill -9 $(pgrep -f "termux.x11") 2>/dev/null
termux-x11 :2 -dpi 96 &
tmoe ls

进入容器后,不要启动 KDE 桌面会话,先使用 vim 等工具编辑 ~/.config/kwinrc 文件(若用户目录下 .config 文件夹不存在需要先新建),禁用 KDE 的桌面特效,在 [Compositing] 部分添加或修改以下内容:

1
2
[Compositing]
Enabled=false

然后安装相关驱动及工具(假设安装的是 Debian 13):

1
2
3
4
5
6
sudo apt update && sudo apt upgrade -y
sudo apt install wget mesa-utils vulkan-tools -y
wget https://github.com/lfdevs/mesa-for-android-container/releases/download/debian%2F25.0.7-2-turnip/mesa-vulkan-drivers_25.0.7-2+deb13u1_arm64_unpatched.deb
sudo apt install --reinstall ./mesa-vulkan-drivers_25.0.7-2+deb13u1_arm64_unpatched.deb -y
sudo apt-mark hold mesa-vulkan-drivers:arm64
rm ./mesa-vulkan-drivers_25.0.7-2+deb13u1_arm64_unpatched.deb

若手机的 SoC 为骁龙 8 Elite 等更新的处理器,则上面的驱动无法正常使用,可以前往笔者的这个仓库下载最新的驱动(安装使用方法请查看仓库的 README):lfdevs/mesa-for-android-container: A Mesa build for containers on Android (Proot, Chroot, LXC, etc.), to support hardware acceleration with Adreno GPU.

使用 root 权限修改 /etc/profile 文件,在文件末尾添加以下的两行内容,设置 XDG_RUNTIME_DIR (该环境变量在正常的 Linux 系统上由 systemd 自动设置,但当宿主系统为 Android 时,Linux 容器(Chroot/PRoot)一般无法使用 systemd,故需手动设置)和 DISPLAY (与上面启动 termux-x11 服务命令的:2相对应)全局环境变量:

1
2
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export DISPLAY=':2'

使环境变量生效:

1
source /etc/profile

创建目录:

1
2
3
sudo mkdir -p /run/user/$(id -u)
sudo chown $USER:$USER /run/user/$(id -u)
chmod 700 /run/user/$(id -u)

修改 /tmp 目录的权限,避免出现因权限问题导致的桌面会话启动失败的问题:

1
sudo chmod -R 777 /tmp

使用以下命令启动 KDE Plasma 的 X11 会话:

1
2
sudo service dbus start
MESA_LOADER_DRIVER_OVERRIDE=zink TU_DEBUG=noconform /etc/X11/xinit/Xsession

若不希望进入桌面会话时自动启动终端,可以编辑 /etc/X11/xinit/Xsession 文件,将 open_terminal 这行注释掉。

切换到 Termux:X11 应用(注意防止 Termux 掉后台):

若图标、字体等元素太小,可以在显示设置中调整缩放倍数。调整后点击“应用”不会立即生效,需要注销后切回到 Termux 按 Enter 或 Ctrl + C 键结束 KDE 会话,然后使用前面的命令再次启动 KDE Plasma 的 X11 会话。

四、常见问题

1. 安装 fcitx 5 和拼音输入法

1
sudo apt install fcitx5 fcitx5-pinyin fcitx5-module-cloudpinyin fcitx5-frontend-all fcitx5-chinese-addons -y

2. 在 Chromium、VS Code 等“浏览器套壳”应用无法激活 fcitx 5 输入法

按照本文的启动命令启动 KDE Plasma 一般不会出现此问题,若仍出现此问题,可尝试使用 root 权限修改 /etc/environment 文件,添加以下的四行内容:

1
2
3
4
GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
SDL_IM_MODULE=fcitx

注销用户,切回到 Termux 按 Enter 或 Ctrl + C 键结束 KDE 会话,然后使用前面的命令再次启动 KDE Plasma 的 X11 会话。

3. 一些应用程序调用 KDE 桌面的接口打开文件夹时,只能打开文件

这个疑似是 arm64 架构独有的 KDE 桌面问题,可以先将要选择的文件夹改为其他名称,然后再新建一个与文件夹原名称同名的空文件,选择完成后再删除空文件,将文件夹的名称改回来。

谨慎修改系统文件夹(如 /usr/bin 等)的名称,以免出现不可预知的问题。

4. 使用较新版本的 Termux:X11 时,默认使用 Android 输入法,而不是容器内的输入法

开启 Termux:X11 Preferences 的 Keyboard -> Enforce char based input 选项。

5. 启动 KDE Plasma 6 桌面时,屏幕左上角会出现一个白色矩形

这是进程 xwaylandvideobridge 导致的,使用以下命令结束它即可(Termux 容器中它没用)。

1
pkill -f xwaylandvideobridge

如果需要在启动桌面的时候自动结束这个进程,则可以新建一个 Shell 脚本,填入以下内容,并赋予它执行权限。然后在“系统设置 -> 系统 -> 自动启动”中添加它为登录脚本,添加后点击该项的“查看属性”图标,选择属性窗口的“权限”选项卡,勾选“允许将文件作为程序执行”。可以根据桌面启动的实际情况调整延时执行该命令的秒数(即 sleep 5 一行)。

1
2
3
#!/bin/bash
sleep 5
pkill -f xwaylandvideobridge

相关资源

参考资料

This post is licensed under CC BY 4.0 by the author.