本目录存放 RootFS 构建期间使用的安装器、写入 RootFS 的维护工具以及 systemd 服务模板。多数文件由 Dockerfile 或 GitHub Actions 调用;运行前请先确认脚本应在 Linux 容器还是构建环境中执行。
| 文件 | 运行位置 | 作用 |
|---|---|---|
install-desktop.sh、desktops/*.sh |
RootFS 构建环境 | 按稳定 slug 分发桌面 profile,并维护软件包集合和桌面专属环境变量。 |
configure-desktop.sh |
RootFS 构建环境 | 写入桌面/显示后端配置,调用 profile 环境配置并按需安装统一自启动服务。 |
start-desktop-session.sh |
Linux 容器 | 根据 /etc/droidspaces-desktop.conf 启动实际桌面会话。 |
install-mesa.sh |
ARM64 Linux 容器 | 安装最新版 Android 容器专用 Mesa 和 MediaCodec VA-API 驱动,并锁定 Mesa 包。 |
install-anland-kde.sh |
ARM64 Linux 容器 | 安装 Anland patched KWin/Xwayland Release 包,并锁定相关包。 |
install-anland-gnome.sh |
ARM64 Debian/Ubuntu 容器 | 安装 Anland patched Mutter/Xwayland Release 包,并锁定相关包。 |
install-anland-desktop.sh |
RootFS 构建环境 | 根据桌面 slug 分发到 KDE 或 GNOME Anland 安装器。 |
lib/anland-build.sh |
RootFS 构建宿主 | 为 native/QEMU 构建统一解析 Anland 包族、Release tag 和 revision。 |
install-usb-manager.sh |
Linux 容器 | 安装 Droidspaces USB Manager、发行版依赖、菜单入口和用户权限。 |
systemd257.sh |
RootFS 构建环境 | 在需要时安装由包管理器管控的 systemd 257 完整包族,供旧 Android 内核使用。 |
download-firmware |
Debian/Ubuntu 容器 | 安装并解压 linux-firmware 中的 .zst 固件。 |
nosnap.sh |
Ubuntu RootFS 构建环境 | 移除 Snap、阻止其重新安装,并配置传统 deb 软件源。 |
bashrc.sh |
Linux 用户 shell | 提供 Docker 快捷命令、温度查看和 SSH 文件传输等辅助函数。 |
start/desktop-session.service |
Linux 容器的 systemd | 通过统一入口自动启动所选桌面会话。 |
binfmt/* |
Linux 容器的 systemd/内核 | 检查并挂载 binfmt_misc,为 QEMU 跨架构执行做准备。 |
install-mesa.sh 从 lfdevs/mesa-for-android-container 的最新 GitHub Release 选择当前发行版对应的 ARM64 Mesa 资产,并从 Re-s/droidspaces-media-decode 的最新稳定 Release 安装 msm_drm_drv_video.so。支持 Debian 13、Ubuntu 24.04/25.10/26.04、Fedora 43/44 和 Arch Linux。媒体解码驱动按发行版安装到 libva 的默认驱动目录:Debian/Ubuntu 为 /usr/lib/aarch64-linux-gnu/dri,Fedora 为 /usr/lib64/dri,Arch Linux 为 /usr/lib/dri。
安装器会严格检查 Release tag、资产名和官方下载地址。使用镜像源时,Mesa 归档会根据 GitHub Release API 公布的 SHA-256 digest 校验;媒体解码驱动在所有下载源下都会校验 Release API digest、上游 SHA256SUMS 及资产大小。下载支持断点续传,临时文件在退出时自动清理。
从仓库根目录交互运行:
sudo ./scripts/install-mesa.sh未指定参数时,脚本会测试三个下载源并提示选择。也可以直接指定来源,适合无人值守构建:
sudo ./scripts/install-mesa.sh --1 # GitHub
sudo ./scripts/install-mesa.sh --2 # gh-proxy.com
sudo ./scripts/install-mesa.sh --3 # ghproxy.net三个来源选项互斥,并同时作用于 Mesa 与媒体解码驱动下载。-1、-2、-3 是对应的短参数,--help 可查看内置帮助。第三方源仍需访问 api.github.com 取得可信元数据,并需要 jq 和 sha256sum;下载由 curl 或 wget 完成。
安装完成后,脚本按发行版写入持久锁定:
| 发行版 | 锁定位置与机制 |
|---|---|
| Debian/Ubuntu | /etc/apt/preferences.d/hold-anland-package,Pin-Priority: -1 |
| Fedora | /etc/dnf/dnf.conf 中脚本管理的 exclude 块 |
| Arch | /etc/pacman.conf 中脚本管理的 IgnorePkg 块 |
锁定范围仅根据归档中实际安装的 Mesa 包生成。KWin/Xwayland 与 Mutter/Xwayland 分别由 install-anland-kde.sh 和 install-anland-gnome.sh 锁定。托管配置可重复运行,不会不断追加相同块;已有的非托管配置会保留。
桌面名称、发行版能力和显示后端矩阵集中在 lib/desktop-config.sh。新增桌面时:
- 在
desktop_normalize、desktop_label和支持矩阵中登记稳定 slug。 - 新建可执行的
desktops/<slug>.sh,默认操作按/etc/os-release安装软件包,并实现configure-environment <backend>配置桌面专属环境变量。 - 在
start-desktop-session.sh添加会话命令;install-desktop.sh会自动发现合法 slug 对应的可执行 profile。 - 在中英文工作流入口的
desktop下拉中加入显示名称。
七个 Dockerfile 和核心工作流已经使用通用 profile 接口,普通 X11 桌面无需复制 Dockerfile。依赖 patched Wayland 包的 profile 还需在 lib/anland-build.sh 的 anland_package_family 中登记包族。
install-anland-kde.sh 默认从 Goldzxcbug/droidspaces-package 的固定滚动 Release anland-kde-packages 读取 anland-kde-manifest,为 Debian 13、Ubuntu 26.04、Fedora 43/44 或 Arch Linux ARM64 安装匹配版本的 patched KWin/Xwayland 包。
sudo ./scripts/install-anland-kde.sh它同样支持 --1、--2、--3 选择 GitHub、gh-proxy.com 或 ghproxy.net;省略时测速后交互选择。镜像下载的清单与归档均使用 GitHub API digest 校验。脚本按系统 locale 输出中文或英文,并通过 APT hold、DNF exclude 或 Pacman IgnorePkg 防止系统更新覆盖安装结果。
安装公开 Fork 发布的包时只需覆盖仓库;Fork 必须提供固定标签 anland-kde-packages:
sudo ANLAND_RELEASE_REPOSITORY=owner/repository \
./scripts/install-anland-kde.sh --1Anland 宿主模块、App、SELinux、绑定挂载和 Droidspaces 权限仍需按项目主页的 Wayland 和 Anland 配置完成。
install-anland-gnome.sh 默认从固定滚动 Release anland-gnome-packages 读取 anland-gnome-manifest,为 Debian 13 或 Ubuntu 26.04 ARM64 安装 patched Mutter/Xwayland 运行时包,并跳过归档中的测试/开发包。下载源选择、镜像 digest 校验和命令行参数与 KDE 安装器一致;安装结果通过 APT hold 防止升级覆盖。
sudo ./scripts/install-anland-gnome.sh使用公开 Fork 的包时同时覆盖 GNOME 仓库变量:
sudo ANLAND_RELEASE_REPOSITORY=owner/repository \
./scripts/install-anland-gnome.sh --1install-usb-manager.sh 支持 Debian/Ubuntu、Fedora 和 Arch,自动安装 PyQt5、ADB、udev、NTFS、exFAT 等依赖,并安装 usb-manager、usb-passthrough 和 usb-storage-passthrough 命令。
sudo ./scripts/install-usb-manager.sh --user "$USER"--user USER 指定获得 USB 管理权限和桌面入口的用户。省略时依次尝试 SUDO_USER、当前登录用户和第一个普通用户。开发或离线测试可以通过 --source DIR 使用本地 Droidspaces-USB-Manager 源码目录;运行 --help 查看完整参数。
在普通 Arch 系统上,安装器会照常安装 systemd 和其他依赖。若检测到 /etc/droidspaces-systemd257,重复运行时会保留 Pacman 的 IgnorePkg 锁定,不再把 systemd 作为显式安装目标;PyQt5、ADB、NTFS、exFAT 等 USB Manager 依赖仍会正常补齐。
RootFS 导入 Droidspaces 时必须开启硬件访问,否则容器无法看到 /sys/bus/usb 和 /sys/bus/scsi。
systemd257.sh 供 Dockerfile 在 enable_systemd257=true 时调用。它检查已安装的 systemd 主版本:257 或更低版本直接跳过,更高版本则从 Goldzxcbug/droidspaces-package 的冻结兼容 Release systemd257-packages 安装对应发行版的完整原生包族,并锁定 systemd 相关包。新包先发布到包含源码版本和仓库提交的不可变标签;RootFS 只有在该 Release 完整发布后,才会一次性更新标签、各平台 SHA-256、预期包数和包仓库提交。
sudo ./scripts/systemd257.sh这是面向旧 Android 内核的实验性兼容步骤。生成 RootFS 后应实际验证 systemd、D-Bus、udev、网络和桌面会话。
download-firmware 会被复制为 Debian 13 和 Ubuntu 24/25/26 RootFS 中的 /usr/local/bin/download-firmware,但不会自动执行。需要时在容器中运行:
sudo download-firmware脚本安装 zstd 和 linux-firmware,解压 /lib/firmware 下的 .zst 文件,并修复指向压缩文件的软链接。成功后创建 /var/lib/.fw-setup-completed;该标记目前不用于跳过重复运行。
nosnap.sh仅用于 Ubuntu。它停止并卸载 Snap、清理残留、写入 APT pin 防止重新安装,并配置项目所需的传统 deb 来源。它会修改系统软件包和 APT 配置,应在目标 RootFS 或构建层中以 root 运行。start/desktop-session.service是通用服务模板,通过start-desktop-session.sh读取桌面配置,以 RootFS 的 UID 1000 用户启动对应会话,并对异常退出进行限频重启。binfmt/qemu-binfmt-register.sh与对应 service 检查内核是否支持binfmt_misc,必要时挂载它;不支持时安全跳过。实际跨架构执行仍需要 QEMU 解释器。bashrc.sh是追加到用户 shell 环境的辅助配置,不应作为独立安装器执行。
修改 shell 脚本后,至少运行语法检查;安装了 ShellCheck 时也应执行静态检查:
bash -n scripts/install-mesa.sh
bash -n scripts/install-anland-kde.sh
bash -n scripts/install-anland-gnome.sh
bash -n scripts/install-usb-manager.sh
shellcheck scripts/install-mesa.sh涉及软件包安装和锁定配置的改动,还应分别在 APT、DNF 和 Pacman 容器中验证,并重复运行一次检查幂等性。