* feat: run Flatpak apps through a proot bwrap stand-in and add a Flathub store * feat: give Flatpak apps the KGSL GPU, the controllers and a CPU LLVM can target * feat: Flatpak games on the desktop, Store apps on the Desktop page, safer remove * test: cover the sandbox planner and store helpers; docs: explain Flatpak on DroidDeck * fix: keep controller focus through Store tabs and app pages; show progress per Flatpak step * fix: let Chromium, Electron and Firefox Flatpaks start without their own sandboxes * fix: fetch Flatpak's supporting libraries when the runtime lacks them * fix: add Flathub without a download, log store commands, keep Electron apps on X11 under gamescope * feat: import ARM64 AppImages from storage and run them from the Desktop page * fix: report failed Flatpak installs as failures and deploy runtimes that ship a resolv.conf link * fix: let Flatpak create its repo where Android denies hard links * fix: point store commands at the current network's DNS * fix: keep failed Flatpak extensions non-fatal, give Electron AppImages a bus, X11 and time to relaunch * docs: AppImage import and what x86 apps would take * feat: put the Flathub Store and AppImage import behind beta toggles in Setup --------- Co-authored-by: MaxsTechReview <maxjividen@gmail.com>
6.2 KiB
proot patches carried by the app
Built by tools/proot/build.sh with the NDK on top of termux/proot 4dba3afb (Termux's
5.1.107-70 package, the proot the Linux runtime ships at opt/android-host/proot; every
file.c:line site in that binary matches this commit). talloc is linked in statically from
Samba's release tarball, so the apk carries one self-contained libproot.so plus
libproot-loader.so, and LinuxRuntime prefers them over the runtime's copy.
Ported from WinNative (feature/proot-enhancements, e7af0f24):
0001-tracee-lookup-by-pid.patch- tracees are hashed by pid, so each ptrace stop finds its tracee without walking one list entry per thread, and terminated tracees are swept only after a termination.0002-canon-resolve-parent-at-once.patch- a clean absolute guest path at least three directories deep under the rootfs binding alone has its parent opened once withO_PATHand taken as canonical when/proc/self/fdnames the path proot would build, replacing anlstatper component. The final component of a call that does not follow it is no longerlstated. Extensions still see the parent's host path, and the fast path stays off while the f2fs workaround is active.0003-clone3-flags-read-guard.patch- a thread created withclone3keeps the flags it inherited whenstruct clone_argscannot be read, instead of being tracked as a fork.
Ported from WinNative (main, 53836ca9, "Fix/performance and vac"):
0004-seccomp-filter-by-argument.patch- the seccomp filter tracesprctlonly forPR_SET_DUMPABLE,setrlimitonly forRLIMIT_STACKandprlimit64only when it sets a newRLIMIT_STACK, the only cases proot acts on; every other call runs without a stop.unameis traced by the core only on x86_64, the one arch it rewrites; kompat still adds it for--kernel-release.0005-seccomp-skip-unneeded-sysexit.patch- a seccomp stop fetches the registers once and looks the filter flags up by syscall number, instead of aPTRACE_GETEVENTMSGand a second register fetch. The flags table is built from proot's list merged with the enabled extensions' (kompat and fake_id0 here), so it is exactly what the filter reports.wait4/waitpidleft to the kernel andaccept/accept4without a sockaddr skip their exit stop, unless an extension replaced the syscall (kompat turningaccept4intoaccept).0006-clone3-exit-signal.patch-clone3flags and exit signal are read as the 64-bit fields ofstruct clone_args, so aclone3fork is told apart from a thread when proot decides how the child is traced.0007-proc-self-thread-group.patch- tracees track their thread group,/proc/selfnames it instead of the calling thread, and/proc/thread-selfresolves to/proc/<tgid>/task/<tid>.0008-fchmodat2-openat2.patch-fchmodat2paths are translated (honouringAT_SYMLINK_NOFOLLOW),openat2answersENOSYSso callers fall back to the translatedopenat, and syscall numbers past the end of a table are rejected instead of read.0009-tracee-relatives-sweep.patch- tracees count their children, so a terminating thread with no children or ptracees no longer walks every tracee; the per-stop memory collector is emptied instead of freed and reallocated.
Added for Flatpak:
-
0010-new-mount-api-enosys.patch-open_tree,move_mount,fspickandmount_setattranswerENOSYS. They take paths proot never translated, so libglnx'sopen_tree(AT_FDCWD, "/")handed Flatpak a descriptor for the host's root and it tried to create directories there (mkdirat(root): Operation not permitted); unsupported, libglnx falls back toopenat. -
0012-android-hardlink-denial.patch- Android's SELinux policy denies apps hard links, solinkatfails withEACCESand Flatpak could not create its repo (Creating repo: linkat: Permission denied).O_TMPFILEanswersEOPNOTSUPP, so libglnx writes a named temporary file and renames it, and a denied link answersEPERM, on which ostree's checkout copies instead. Added by DroidDeck: -
0011-kompat-utsname-only.patch---kernel-release(the guest'sDroidDeckhostname) loads kompat, whose filter trapsfutex,fcntl,epoll_pwait,pselect6,pipe2,eventfd2,socketand more, and which stripsAT_SYSINFO_EHDRon everyexecve, so glibc runs without the vDSO. When the virtual release is not older than the real kernel and the hwcap is left alone, every one of those handlers is a no-op: kompat now traces onlyuname,sethostnameandsetdomainnameand leaves the auxv as the kernel wrote it. On an SD 8 Gen 2 guest this took a futex ping-pong from 467 to 97 us,epoll_pwaitfrom 60 to 0.8 us andfcntlfrom 40-107 to 0.4 us, andclock_gettimeback to the vDSO. -
0012-fake_id0-identity-only.patch--i uid:gid(for Xwayland's setgid/setuid before it runs xkbcomp) loads fake_id0, whose filter traps everyfstat/newfstatat/stat(entry and exit), everysendmsg(all Wayland, X11, Chromium and PulseAudio traffic),socket,getsockopt, theget*idfamily and the chown/chmod family. When the ids given are the ones proot really has and are not 0, every one of those handlers is a no-op; fake_id0 now traces only theset*idfamily and the xattr permission fixups, and leaves set-user-ID bits alone onexecve(Android mounts the app's datanosuid, so the kernel would not honour them either), which keeps the ids fixed. On an x86_64 host build under the same options:fstat41.7 -> 1.3 us,sendmsg18.0 -> 2.5 us. -
0013-seccomp-ioctl-by-request-and-kernel-exit-stops.patch- everyioctlstopped on entry and exit, which is every GPU submit and wait. The filter now traces only the requests enter.c and exit.c act on (TCSETSF, the four termios2 requests,FICLONE) and allows the rest at once, and the ioctl block is emitted first (after WinNative 53836ca9, which traces only the termios2 ones). Thefaccessat2exit stop (termux 5ba8b95, for glibc's ENOSYS fallback on kernels before 5.8) and thestatxone (emulation on kernels before 4.11) are dropped when the running kernel is newer. Host build:ioctl31.6 -> 0.5 us;stat/statx/faccessat2about 44 -> 28 us (one stop).