中文 | English
面向 ARM64 Android/Droidspaces(尤其 4.19 内核设备)的 Arch Linux + niri/ANiri + Anland + Noctalia RootFS 构建器。唯一 active 目标是 Droidspaces-Arch-Niri.Dockerfile;可生成 kitty、ghostty 或两种终端变体,并选择 remote=none|wayvnc|lamco。
Droidspaces 是共享 Android 内核、使用 namespace + pivot_root 的特权容器,不是 PRoot。本仓库只组合并固定 Linux RootFS;Android APK、root helper、Surface/MediaCodec 组件始终属于设备侧前置依赖,不会装进 RootFS。
- Canonical repository: https://github.com/collegeming/Droidspaces-Arch-Niri-rootfs-builder
- Workflow: Build and release Droidspaces Arch-Niri RootFS
- English documentation: README_english.md
- 已归档的多发行版 KDE 文件:legacy/README.md
| 项目 | 职责 | 当前 Builder 状态 |
|---|---|---|
| niri / Celvra/ANiri | niri 上游与 Anland 后端的历史来源 | Builder 消费下列 tuned fork 的最终 immutable Release。 |
| collegeming/ANiri-anland-tuned | Linux compositor、输入、CF_UNICODETEXT 剪贴板与 Anland polling 调优 |
RootFS 固定消费最终 Arch ARM64 Release v26.4.0-anland.5;其 source commit 包含 74ce2a9… 实现基线、最小 strict-Clippy 修复与最终公开 Release 复验修复。 |
| superturtlee/anland / collegeming/anland-bridge | Android Surface、`local | remote |
| collegeming/lamco-anland-bridge | Linux RDP/TLS/EGFX、输入、CLIPRDR 和私有 UDS listener | remote=lamco 固定消费已发布并校验的 ARM64 二进制,不在 RootFS 内构建 Rust。 |
| 本 Builder | 组合并 pin Linux RootFS,生成变体、校验和与 metadata,并记录 Android prerequisite | 唯一 active Dockerfile/workflow;旧 KDE 内容仅在 legacy/ 保存。 |
两条 socket 不可互换:
| 路径 | 用途 | Android 侧来源 |
|---|---|---|
/run/display.sock |
ANiri 本地显示链,将桌面送到 Android Surface consumer | Droidspaces/Anland 挂载的 display socket。 |
/run/anland-rdp/bridge.sock |
Lamco 专用的 HMAC mutual-auth 私有桥接通道 | 必须把目录 /data/local/tmp/anland-rdp bind mount 到 /run/anland-rdp。 |
Lamco 必须绑定目录,不能绑定单个 bridge.sock inode。服务重启会安全地 unlink/rebind socket;目录绑定才能继续看到新 inode。不要将该 socket 映射到网络,也不要使用 chmod 777。
/data/local/tmp/anland-rdp -> /run/anland-rdp
这是 Android anland-bridge 的显示状态,不是 Builder 的 remote 输入:
local:只保持本机 Android Surface viewer。remote:只保持远程硬件编码/RDP 图形链。both:同时保持本机 Surface 和远程 viewer。- viewer 缺失或长期最小化,且没有本地 Surface 时,Android 必须停止 MediaCodec encoder 和图形消费链,避免空闲编码与持续耗电。
Builder 的 remote=none|wayvnc|lamco 只决定 RootFS 是否安装远程服务。
- H.264 只允许 Android MediaCodec 硬件 Surface encoder。没有 OpenH264、x264、FFmpeg/libavcodec 软件 fallback;硬件链不可用时失败或无视频。
- Lamco 不通过 Portal、PipeWire、screencopy 或 Android MediaProjection 捕获整块屏幕;它只消费专用 Anland bridge 的 ANiri 桌面。
- Win/Super 作为原始 RDP input 转发;niri 保持原生
Mod+T、Mod+E等语义,禁止 Win→Alt 映射。 - RDP 剪贴板仅支持
CF_UNICODETEXT文本,包括 CJK、emoji、换行和清空;不支持图片、文件、HTML 或 RTF。 - 当前无 RDPSND,PC 端没有 RDP 音频;本地 Android audio 是独立链路。
| 组件 | Repository / annotated tag | Source commit / baseline | Asset / SHA-256 | 状态 |
|---|---|---|---|---|
| ANiri tuned | collegeming/ANiri-anland-tuned / v26.4.0-anland.5,tag object 975beeef6d99c81d8ad98ac32500c0e96353dbdf |
source 6480280d4baa624d00cf26bb816e4312dc9409c9;implementation baseline 74ce2a92eb2151d729818a784ced605ec950b56c |
niri-arm64-linux-bin / 54f6aad1a8e47515527ac24fc120ff670675d75cbe6b4be6ae52fcdcfbc0227c |
当前 RootFS 实际消费;三个 job 全绿的成功 run。Arch ARM64 公开复验确认 libdisplay-info.so.3、全部直接 SONAME、ldd 与 --version。 |
| Android anland bridge | collegeming/anland-bridge / anland-v5.19.3,tag object 1d912e982a8f35e90e81255afd9f8444cd319295 |
source e26a080e990d0c9fc18d64b35e161d134bc51e63;feature baseline 95b2d73ff799639ce8576ff908f13f5a31e024a1 |
plain APK、Tracy APK、anland-daemon.zip 与 SHA256SUMS,见下表 |
最终设备侧 prerequisite;成功构建 run。不下载或安装到 RootFS。 |
| Lamco | collegeming/lamco-anland-bridge / anland-v0.2.0 |
03902875622f04c8c64ab52fd4dc72981bb93e64 |
lamco-anland-bridge-0.2.0-aarch64-unknown-linux-gnu.tar.xz / 593a2639f7c06bc3f453ae094114f85e03f442f5d9482d132b5662cd9a146eea |
remote=lamco 实际消费,pin 保持不变。 |
| Lamco IronRDP pin | collegeming/IronRDP / branch anland-preauth-timeout |
33fc287b83af35ba3650519fe059db99d1cdf131 |
记录在 Lamco metadata | 由 Lamco Release 固定,保持不变。 |
ANiri Release 还提供 BUILD-METADATA.txt(SHA-256 37b20cfa0aa5664790a2a0d67d21df41c9bcb58f619c9dc46db284629790064f)和 CycloneDX SBOM ANiri-SBOM.cdx.json(SHA-256 600e71d2cd3ad52f31f4690556a08e7430297c0aab62894e6f197e7b9e437734)。Builder 与 ANiri 使用相同的固定 Arch 基础 index sha256:f92ed48cdfc274181f16e94e6a4e90e4c90c59a3d14fc7a133483a93ebc16ec6,对应 ARM64 manifest sha256:019992bf3dc54ab4ba1515dd80e613d473b2ca7a97e410e1da053ae501b6383d 和 layer sha256:c714810994102b031ad2f2319282528593ae84ce86b5131b82e859642e3c79f4。
Android anland-v5.19.3 设备侧资产:
| 资产 | 用途 | SHA-256 / 下载 |
|---|---|---|
anland-bridge-5.19.3-plain-release-arm64-v8a.apk |
常规设备安装,默认推荐 | f7d698d17a3611f8cb4a0af5c1f1d5781c8c84731f656de744b4251fab5b4c38 / 下载 |
anland-bridge-5.19.3-tracy-profiling-release-arm64-v8a.apk |
仅 Tracy profiling | 983e2a03aac1f0d56dda2fb9e3ac7048e8d37051492714dd1c918a2e19fe2d29 / 下载 |
anland-daemon.zip |
Android host/root 的 Magisk module/daemon | a258b4a5de851f24cd94fe1232528de2d56d525ea54f0ec478592772da6f6df4 / 下载 |
SHA256SUMS |
Release 校验清单 | 文件 SHA-256 63b82e1e64c3574c94d3d7381fc44ac00df9bbfff5659ea36dad25702a43cc95 / 下载 |
以上 APK/ZIP 仅供 Android host/root 使用;Dockerfile、workflow 和 RootFS 都不会下载、COPY 或安装它们。anland-v5.19.2 因 Tracy versionName 污染不推荐,最终 pin 仅为 anland-v5.19.3。
RootFS 内会写入 /usr/share/doc/droidspaces-arch-niri/ANIRI-PIN.txt 与 BUILD-COMPATIBILITY.txt。workflow 还会生成外部 BUILD-METADATA.txt 和 SHA256SUMS,其中 Builder commit 取运行时精确 github.sha,不会使用可变 latest。
- ARM64 Arch Linux;niri/ANiri over Anland;Noctalia + fuzzel。
- kitty、ghostty 或
both两个独立 RootFS 变体。 - fcitx5 + Rime-Ice、中文 locale、Nemo、neovim、fish/reef/Fisher/Tide 和 Maple Mono NF CN。
- Qualcomm KGSL Mesa、Snapdragon 8 Gen 2 UBWC hint。
- systemd 257 旧内核兼容、Droidspaces USB manager、可选 firmware/binfmt/container integration。
- 可选开发工具、压缩工具、Docker 和 TMOE。
remote=none|wayvnc|lamco。
RootFS 默认 Linux 用户为 colle,构建参数可修改。镜像目前为 Linux 账户设置初始密码 1234;导入后必须立即通过 passwd 修改。Lamco 不复用该密码,必须单独配置强 RDP 凭据。
唯一 active workflow 为 .github/workflows/build-arch-niri-rootfs.yml,名称为 Build and release Droidspaces Arch-Niri RootFS。
主要输入:
| 输入 | 值 | 默认值 |
|---|---|---|
version |
安全的版本/文件名标签;candidate 自动附加 run id/attempt |
candidate |
publish_release |
是否发布 immutable tag/Release | false |
build_mode |
native-arm64 或 qemu-x86_64 |
native-arm64 |
username |
RootFS 用户名 | colle |
terminal |
`kitty | ghostty |
remote |
`none | wayvnc |
niri_autostart |
niri 自动启动 | true |
enable_zh_locale |
中文 locale/上海时区 | true |
enable_fcitx_rime |
fcitx5 + Rime-Ice | true |
enable_qualcomm_mesa |
Qualcomm KGSL Mesa | true |
enable_systemd257 |
systemd 257 兼容运行时 | true |
enable_usb_manager |
Droidspaces USB manager | true |
enable_firmware |
Linux firmware 包 | false |
enable_binfmt |
RootFS 内 binfmt helper | false |
enable_container_integration |
Droidspaces 硬件/网络集成 | true |
enable_8gen2_wayland |
8 Gen 2 UBWC hint | false |
enable_dev_tools |
开发工具链 | false |
enable_compression_tools |
附加压缩工具 | true |
enable_docker |
RootFS 内 Docker 包 | false |
enable_tmoe |
TMOE | false |
-
正常验证保持
publish_release=false;产物作为 Actions artifact,不创建 tag/Release。 -
native-arm64固定使用 ARM64 runner,并由脚本拒绝非 ARM64 host。 -
qemu-x86_64在 x86_64 runner 显式注册 arm64 QEMU,仅构建linux/arm64;ARM64 host 不能误用该脚本。 -
terminal=both展开为 kitty 与 ghostty 两个变体;文件名始终包含真实remote和terminal:Droidspaces-Arch-Niri-Anland-aarch64-<version>-<remote>-<terminal>.tar.xz -
每个 archive 先通过 tar listing 与内容门禁校验;发布步骤再把各变体汇总为 exact asset set,并重新校验 SHA-256 与数量。
-
publish_release=true只允许从main和显式非candidate版本运行。workflow 在构建前、发布前分别验证 tag/Release 不存在;拒绝覆盖已有 tag、Release 或 asset。 -
仓库必须在 GitHub Settings 中启用原生 Immutable Releases。workflow 发布后要求 REST
immutable=true;原生保护锁定 tag 和 assets。此设置只作用于启用后发布的 Release,不追溯旧 Release。 -
第三方 actions 固定 40 位 commit SHA;默认权限为
contents: read,仅 release job 提升为contents: write。
本项目不会自动触发 workflow。只有人工在 GitHub Actions 页面运行时才会开始构建;不要把旧 run/Release 当成当前 commit 的验证结果。
要求 Docker + Buildx + xz。所有命令从仓库根目录执行。
ARM64 host 原生构建:
./build_rootfs-native.sh \
-i Droidspaces-Arch-Niri.Dockerfile \
-v local \
-u colle \
-T both \
-R lamco \
-N true -g true -h true -c true -S true \
-U true -F false -a false -b true -t false \
-d false -e true -f false -j falsex86_64 host 必须使用显式 QEMU 脚本:
./build_rootfs-qemu-aarch64.sh \
-i Droidspaces-Arch-Niri.Dockerfile \
-v local \
-u colle \
-T kitty \
-R none \
-N true -g true -h true -c true -S true \
-U true -F false -a false -b true -t false \
-d false -e true -f false -j false脚本会拒绝错误 host 架构、非 canonical Dockerfile、不安全版本/用户名、无效 boolean、terminal 或 remote。
-
把
.tar.xz导入 Droidspaces 特权容器;不要按 PRoot 教程配置。 -
为 Qualcomm Mesa/niri 启用 GPU 与必要硬件访问。
-
4.19 内核建议保持
enable_systemd257=true。enable_binfmt只有目标内核启用CONFIG_BINFMT_MISC才有意义。 -
使用最终
anland-v5.19.3配置 Anland Android 端,并提供本地显示 socket 到/run/display.sock。这些是 Android host/root 资产;不要从 RootFS 寻找 APK/daemon/Magisk ZIP。 -
niri.service默认自动启动;检查命令:systemctl status niri.service journalctl -u niri.service
-
首次导入后修改 Linux 账户密码:
passwd。
不安装远程服务,只使用 Android 本地 Surface 显示链。
wayvnc 监听 guest 0.0.0.0:5900,当前默认没有 VNC 密码:仅可在受信任网络使用,并通过防火墙、SSH tunnel 或 Droidspaces 隔离/端口发布策略限制入口。
- host/shared network:连接
<手机 WLAN IP>:5900。 - isolated/NAT network:必须把 guest TCP 5900 发布到 host 端口,然后使用 Droidspaces 实际显示的
<host address>:<host port>;未发布时手机 WLAN IP 不能直接访问 guest 5900。
wayvnc 使用独立的 Wayland screencopy/virtual-input 路径,不等同于 Lamco 的私有硬件编码桥。
Lamco Release 已固定并在安装时验证 archive entry、AArch64 ELF、interpreter、动态依赖、metadata、SBOM 和 license。RootFS 不预置 config、bridge token、TLS private key 或 RDP 凭据,也不会自动启用未经配置的服务。
-
Android host 创建
/data/local/tmp/anland-rdp,并做目录 bind:/data/local/tmp/anland-rdp -> /run/anland-rdp -
容器启动后核对 PID 1 mount:
findmnt --task 1 --mountpoint /run/anland-rdp --output TARGET,FSROOT
-
在 Android App 选择
remote或both,获取 32 位小写十六进制 bridge token。 -
在容器内交互配置:
sudo setup-lamco-anland-bridge
helper 关闭 xtrace、隐藏读取 token/密码、拒绝全零 token 和弱密码,要求 RDP 密码至少 12 个字符且不同于用户名。它原子写入 mode
0600的 config,使用专用lamco-anland-bridgeno-login 用户,并准备 mode0700的 TLS/socket 目录。 -
检查服务:
systemctl status lamco-anland-bridge.service journalctl -u lamco-anland-bridge.service
-
网络入口:
- host/shared:
mstsc连接<手机 WLAN IP>:3389。 - isolated/NAT:发布 guest TCP 3389 后,连接 Droidspaces 实际显示的
<host address>:<host port>。只有明确把 host address/port 配成手机 WLAN IP:3389 时,入口才是该地址。 - 两种模式都应只允许目标 PC/受信任子网;绝不转发私有 UDS,也不暴露调试 TCP 33910。
- host/shared:
首次自签名 TLS 会让 mstsc 显示证书提示,应核对设备身份;生产环境可替换为受信任证书和匹配私钥。
静态/构建系统可验证:
- active Bash
bash -n、ShellCheck;workflow YAML parse、actionlint;Dockerfile parse。 - active/legacy scope、唯一 workflow、旧 active 参数、action SHA、permissions、mode、symlink、secret signature 和 hard-coded URL 扫描。
- workflow 产物的 xz/tar、文件名、变体数、SHA256、metadata 与 exact Release asset set;最终 archive 还会拒绝 Android 设备侧资产、OpenH264/FFmpeg/x264 软件编码包和源码构建残留;
enable_dev_tools=false时也拒绝 paru/base-devel/Zig/Rust/GCC 等构建期工具链残留。 - Lamco Release installer 的 AArch64 ELF、依赖、metadata、SBOM/license 与软件 H.264 依赖拒绝。
除非有对应设备测试记录,否则以下均视为未验证:目标手机导入/启动、实际 GPU、Android Surface 生命周期、MediaCodec、mstsc 互操作、剪贴板端到端、host/NAT UI、功耗、温度、长时间稳定性。Actions 成功不能替代真机验证。
旧 Debian/Ubuntu/Fedora/Arch-KDE/Artix/NixOS Dockerfiles、KDE 脚本和旧 workflow 保留在 legacy/,用于历史参考和恢复,不是 active target:
.github/workflows中不会发现它们,GitHub Actions 不会注册或自动运行。- active scripts 不再接受
build_KDE、build_KDE_plus、enable_anland_kde、build_wayland_packages、all-wayland等旧参数。 - 旧文件可能保留外部上游
Goldzxcbug/Droidspaces-rootfs-KDE-builderpin;这不是本仓库 self URL,也不代表 active 支持。
详见 legacy/README.md。