Skip to content

Comparison and architectural synthesis ​

Last reviewed: September 30, 2026.

At a glance ​

Dimensionnix-on-droidAVFGunyah custom VMMNNS/native
Stock app reachBroad sideload route, subject to executable policyDevice/API/permission dependentDocumented custom routes rooted; stock AVF separateNNS app path needs provisioned kernel/policy
Full NixOSNoYes, if custom guest bootsPossible; adaptation unverified locallyNo, shared Android kernel/userspace integration
Standard Linux cacheCanonical translated storeCanonical guest storeCanonical guest storeCanonical mounted store
Guest kernel ownershipNoYesYesNo
No-DEX fitNative login + PTY already implementedJNI hypothesis or explicit helperNative helper plausible; authority requiredNative launcher + PTY
Long-lived ownerApp supervisor neededFramework/owner lifecycle neededRoot helper/VMM lifecycle neededProvisioning daemon + app session
Cost centerSyscall tracing, compatibility patchesGuest RAM/boot, API integrationVendor forks, firmware/verification and I/OKernel/SELinux upgrades, DNS/TTY bridge
Physical-device evidenceSeparate nix-on-droid PRoot observed; custom bootstrap not independently completedPad protected Microdroid boot, shell-owned; Pixel contributor reports both guest modesPad exposes Gunyah; no custom NixOS bootStock Xiaomi app namespace attempts rejected; contributor Pixel has live same-UID NNS Zsh

Per-dimension comparison ​

Deployment and permissions ​

PRoot has the fewest kernel prerequisites, but target-SDK executable policy is a serious product constraint. AVF's feature bit does not imply an app permission grant or usable nonprotected guest. The Pad demonstrates a stock protected-only route; it changes the Qualcomm feasibility assessment without proving unprotected NixOS. NNS makes its required custom stack explicit. Rooted Gunyah work should remain an advanced-device track until exact configurations are verified.

The contributor Pixel 7 Pro separates two useful tracks: AVF declares both protected/non-protected support, while NNS has an already running app-UID canonical-store session under deliberately provisioned policy. The former is a capability declaration, the latter a captured userspace process. Neither establishes Sparkles ownership, a complete Nix workload, or an unmodified stock deployment. The kernel's CONFIG_GUNYAH=y does not change its reported active pKVM backend.

Nix compatibility and services ​

All four can preserve the logical /nix/store under the appropriate execution view. Only an independently booted Linux VM can provide the complete NixOS system model. Shared-kernel paths support a large Linux userspace but inherit Android limitations. Disabling Nix build sandboxing enables some workloads at a loss of isolation; it is not evidence of equivalent sandbox support.

Terminal and no-DEX integration ​

Local PRoot/native entry naturally fit the existing PTY. VMs require guest PTY sessions and a host owner/control channel. Installed framework classes may be called via JNI while the APK has no DEX; hidden APIs and lifecycle callbacks remain concrete engineering gates. A managed helper can be explicitly owned and deployed separately if that product choice is accepted, but no dependency on Android Terminal's owner is permitted.

Files, networking and DNS ​

Every backend needs a deliberate host-file contract. Shared-kernel paths do not escape Android file permissions; guest sharing needs an exporter and supported virtual transport. PRoot's static resolver, NNS's Bionic bridge and VM networking differ under VPN/private DNS. Port exposure and session/control authentication must be tested as actual behavior, not inferred from localhost labels.

Performance and isolation ​

PRoot pays for intercepted syscalls; namespaces eliminate that translation; hardware VMs add memory and virtual I/O overhead but supply kernel independence. Source inspection cannot rank real workload throughput. The original phone was warm and low on available RAM; the Pad test used only a 256 MiB Microdroid guest. These observations do not support numerical build-speed or battery claims.

Lifecycle and maintenance ​

App process survival, terminal session survival and persistent files are different promises. VM disks can persist while guests are stopped; reconnectable PTYs need a guest service. Shared-store daemons can outlive UIs only when deliberately supervised. Bootstrap recovery, image migrations, kernel policy changes and owner death are required acceptance cases.

Consensus standard ​

The inspected implementations converge on a canonical Linux filesystem view, a backend-specific entry/owner, and a terminal transport layered above it. They also require explicit adaptations for Android lifecycle and networking. A capability report must include authority and guest mode, not simply CPU architecture or the presence of a node.

Architectural trade-offs ​

  1. Broad reach versus guest completeness: ship PRoot first; add full NixOS where proven custom guests are available.
  2. Native speed versus managed device stack: NNS removes tracing by accepting kernel/policy ownership.
  3. Protected boot versus flexible images: protected-only hardware demands verified guest preparation and may constrain I/O; unsigned images are simpler where nonprotected capability exists.
  4. No-DEX UI versus owner integration: native rendering is already solved; portable API access and durable owner lifecycle remain separate work.

Sparkles delta table ​

Modern capabilityCurrent baselineRequired delta
Custom local terminalNativeActivity + native PTY worksPreserve UI/backend separation
Custom PRoot package identityConfigurable module + installer/login sourceDemonstrate full bootstrap/cache/build cycle in custom app
Honest capability discoveryResearch inventory/probesProduct report with deployment/permission/mode gates
Independent AVF lifecycleNot implementedJNI or explicit helper create/start/stop/delete/reconnect spike
Full NixOS guestGuest prior art inspectedApp-owned disks/config and guest PTY broker
Qualcomm protected/custom routeStock Microdroid boot proven on PadProve accepted custom Linux boot inputs before promising NixOS
Native namespace entryRejected on stock Xiaomi; contributor Pixel has an NNS app-UID sessionSparkles-owned launcher contract, deployment provenance and workload/isolation tests
Durable sessionsActivity/session machineryDefined owner death, UI recreation, reboot and unlock behavior
Quantified workload comparisonNoneSame-device, same-output workload protocol after two backends work

Sources ​