Choosing a Zygisk Implementation: A Detailed Comparison

2272 words
11 minutes
Choosing a Zygisk Implementation: A Detailed Comparison

If you want to use Zygisk modules on KernelSU or APatch, or replace Magisk’s built-in Zygisk, there are now several options. Their names are similar, but their capabilities differ a lot, and some of them are not even the same kind of thing.

The short answer: if you want an open-source solution that runs both Zygisk modules and Zygisk Next modules from a single install, and that treats being lean and hiding well as its top goals, I recommend NyaZygisk. The rest of this post compares what each project actually does and doesn’t do, including the cases where NyaZygisk is not a good fit, so you can check against your own needs.

Note

Disclosure: I maintain NyaZygisk, so this post recommends it. The comparison itself only states facts that can be backed by source code or official documentation, and NyaZygisk’s limitations are listed as well.

Sources: the default-branch source code, READMEs, and GitHub data of each repository as retrieved on 2026-10-20. Zygisk Next is closed source; its information comes only from the official README, API documentation, and release page, and its internals cannot be verified. Wherever that applies, it is marked. “Not found in the source” only means I read the relevant code and saw no implementation; it does not prove the feature is unsupported.


🧭 First: these five are not the same kind of thing#

“Zygisk” actually refers to two different module APIs:

  • Magisk Zygisk API: the module interface defined by Magisk (entry point zygisk_module_entry). Most Zygisk modules, including LSPosed, use it. The latest version is v5.
  • Zygisk Next API (ZN API): an interface Zygisk Next added after going closed source (entry point zn_module, declared in zn_modules.txt). It can inject into processes started by init, provides inline / PLT hook and symbol resolution interfaces, and offers callbacks for the HyperOS Rust Runtime.

Each project supports these APIs differently:

  • Zygisk Next supports both and is the original author of the ZN API, but it is closed source.
  • NyaZygisk supports both, and is currently the only open-source implementation that supports both APIs.
  • NeoZygisk and ReZygisk implement only the Magisk Zygisk API.
  • ZygiskNextNext only loads ZN modules and is not a Zygisk implementation itself; you need to install a separate one to use Zygisk modules.

📋 Overview#

Zygisk NextNyaZygiskNeoZygiskReZygiskZygiskNextNext
MaintainerDr-TSNG (LSPosed)HSSkyBoy / NkBeJingMatrixPerformanCVeryBaaad
OriginOriginal projectFork of NeoZygiskIndependentFork of Zygisk Next from its open-source eraZN module loader written from scratch
LicenseClosed source (since v4-0.9.2)GPL-3.0GPL-3.0AGPL-3.0GPL-3.0
Auditable source❌✅✅✅✅
Magisk Zygisk API✅✅ v5✅ v5✅ v5❌
ZN API✅✅ v4❌❌✅ v4
HyperOS Runtime API✅✅ v1❌❌✅ v1
Both module types from one module✅✅❌❌❌
Main languagesNot publicC++ + RustC++ + RustCC++ + Rust (injector)
Minimum Android8.07.18.07.15.0
Architecturesarm64, armv7, x86, x86_64, riscv64arm64, armv7, x86_64arm64, armv7, x86, x86_64arm64, armv7, x86, x86_64arm64, armv7, x86, x86_64, riscv64
WebUIYes (README mentions translations)YesNoYesYes
Latest releasev1.5.2 (2026-10-15)v2.4 (2026-08-10)v2.4 (2026-08-08)v1.0.0 (2026-05-10)v2.0.0 (2026-10-19)
Commits, last 3 months¹536929216
GitHub stars¹10.7k2862.5k4.1k65

¹ From GitHub, covering 2026-07-20 to 2026-10-20. Zygisk Next’s commit count only reflects its public repository; its source is not published, so the number does not represent actual development effort.

Note

“Minimum Android” and “Architectures” come from each project’s install script, build configuration, or public documentation. The architecture entry is compiled from project releases and community testing.

Stars and commit counts are only side indicators: stars reflect visibility and user base, commits reflect development activity, and neither equals stability or quality. NyaZygisk’s user base is comparatively small. That is a plain fact, and it means there is less issue feedback and community experience than for NeoZygisk or ReZygisk.


🔒 Why open source matters here#

A Zygisk implementation runs as root and can inject into every app process. In principle, the only way to confirm what it does and what it collects is to read its source code.

Starting with v4-0.9.2, Zygisk Next became all rights reserved, and its license explicitly forbids modification, redistribution, and extracting any part for use in other projects. ReZygisk’s README puts it plainly: going closed source prevents the community from contributing and from auditing the code, which is a major security concern for a root-level module.

Zygisk Next’s developers have a good reputation in the community, and this post is not questioning them. But if your rule is “root-level components must be auditable”, Zygisk Next is off the table.

This is also the main reason NyaZygisk exists: among open-source options, using both Zygisk modules and ZN modules used to mean stacking two modules, “NeoZygisk / ReZygisk + ZygiskNextNext”. NyaZygisk puts both APIs into a single GPL-3.0 implementation, so one install is enough.


🔬 Item-by-item comparison#

1. Injection and module loading#

NyaZygiskNeoZygiskReZygiskZygiskNextNext
How it injectsptrace remote call to dlopen to load libzygisk.soSameptrace plus a custom remote linker (CSOLoader), bypassing the system linkerA standalone injector process using ptrace
How it finds targetsWatches execve, recognizes Zygote and hyos_spawnerWatches execve, recognizes ZygoteWatches Zygotetracefs sched_process_exec, proc connector, eBPF, fanotify, KPM, falling back to /proc polling
Loading Zygisk modulesThe daemon creates a sealed read-only memfd per module; the process loads it with android_dlopen_ext from the fdSameLoaded by the custom linkerN/A
Loading ZN modulesPer zn_modules.txt, also via memfdNot supportedNot supportedPer zn_modules.txt
ZN module injection targetsZygote and hyos_spawner——Any init-spawned process named by name= / path=
Process flag lookupCached by the daemon in shared memory (memfd + mmap), the rest over IPCIPC on every lookupIPCN/A
Hook backendsDobby, LSPltLSPltPLTIDobby, ShadowHook, rv64hook, And64InlineHook; LSPlt, PLTI, ByteHook, xHook, selectable

Notes:

  • NyaZygisk and NeoZygisk share essentially the same injection flow (they are a fork pair). The differences are the hyos_spawner target and the ZN loader added in Nya.
  • ReZygisk takes a different approach: it does not use the system linker, to defeat linker-based detection (for example inspecting solist). That is a different philosophy from Neo / Nya, which load through the system linker and clean up afterwards. Neither is strictly better.
  • ZygiskNextNext has the most varied ways of discovering targets and the lowest kernel requirements, which is part of why it can support Android 5.0 and riscv64.
  • NyaZygisk’s ZN injection scope is a real functional gap: the daemon does parse path=, but the process monitor only intercepts Zygote and hyos_spawner, so ZN modules that target other system daemons will not take effect.

2. Hiding and trace handling#

This table only compares implementations I could confirm in the source. ”—” means I did not find a corresponding implementation.

ItemNyaZygiskNeoZygiskReZygisk
Mount namespace for DenyList appsUnmounts directly inside Zygote; if that fails or is aborted, setns into a cached clean namespaceSamesetns into a Clean / Mounted namespace prepared by the daemon
Gives up direct unmount when a critical overlay is present✅ (e.g. /product)✅—
Uniform mount view across all isolated processes✅✅—
Removing traces inside the linker (solist) after unload✅✅N/A (does not use the system linker)
Cleaning libc / linker load traces, fossil spoofing✅✅—
Traces left by the unloading itself✅✅ (commit #161, after v2.4)—
Clearing ptrace_message✅ (hybrid seccomp / PTRACE_SYSCALL)✅✅ (seccomp)
Stripping release logs for DenyList apps✅✅—
Anonymizing module memory mappings (maps)✅ optional; enable “Anonymous memory” in the WebUI——
CFI shadow synchronization✅——
TracerPid sanitization✅ (FD-tracked, hooks open / openat / close / read)——
System property spoofing (spoof.prop)✅——
Per-app module exclusion list✅——
Taking over KernelSU’s kernel_umount✅✅—

Notes:

  • Nya’s hiding is layered on top of Neo’s. Rows marked ✅ for both are inherited from upstream; what Nya adds itself is anonymous memory, CFI shadow, TracerPid, property spoofing, and per-app exclusion.
  • TracerPid sanitization has a limited scope: it only hooks the PLT of libandroid_runtime, libart, libjavacore, libopenjdk, and libbase. It intercepts reads of /proc/*/status going through those libraries, and does not cover syscalls issued directly from an app’s own native code.
  • Anonymous memory is off by default, because it changes the mappings; users have to enable it in the WebUI.
  • Property spoofing changes the values returned for system properties. The default spoof.prop covers bootloader state, build type, debuggable flags, and MIUI, Realme, and OPlus specific properties; ro.boot.vbmeta.digest is randomly generated on every load. Delete the lines you don’t need.
  • ReZygisk chose the “never touch the system linker” route, so it has no solist cleanup. I did not find corresponding implementations for TracerPid, property spoofing, or maps spoofing.
  • Zygisk Next cannot be verified. ZygiskNextNext’s hiding focuses on the injector’s own behavior, a different scope from the Zygisk implementations above, so it is not compared item by item here.
  • None of these projects can guarantee passing every check, and I have not tested them device by device or app by app.

3. Platform and environment support#

NyaZygiskNeoZygiskReZygiskZygiskNextNext
APatch / KernelSU / Magisk✅✅✅✅
KernelSU Next and other variants detected✅✅✅Not verified item by item
Magisk Alpha / Kitsune detected✅✅Not foundNot verified item by item
KernelSU LKM late-load✅———
KernelSU emulated soft reboot (temporary root)✅——✅ (ships emulated-soft-reboot.sh)
HyperOS hyos_spawner✅——✅
Android 17 Zygote signatures✅ (inherited)✅Not verified item by itemNot verified item by item
BTI devices✅ (inherited)✅Not verified item by itemNot verified item by item
32-bit PLT hook fix✅ (inherited)✅N/AN/A

4. Management UI#

NyaZygiskNeoZygiskReZygiskZygiskNextNext
WebUI✅ tabbed: overview, modules, settings—✅✅ Vue 3, two skins
LanguagesTraditional Chinese, Simplified Chinese, English—Translated via CrowdinNot verified item by item
Distinguishes module type (Zygisk / Next)✅N/AN/AN/A
Shows ROM, kernel, ABI, SDK✅—Not verified item by itemNot verified item by item
action.sh status output—✅Not verified item by itemNot verified item by item

🔍 Project summaries#

Zygisk Next#

  • Strengths: supports both APIs, and ZN modules can inject into any init-spawned process; the HyperOS Runtime API was introduced by it; new ZN modules are usually tested against it first; actively maintained, with v1.5.2 released on 2026-10-15.
  • Limitations: closed source, so it cannot be audited, modified, or forked.

NyaZygisk#

  • Strengths:
    • Open source, and a single module loads Magisk Zygisk modules (v5), ZN modules (v4), and HyperOS Runtime modules (v1);
    • Adds TracerPid, property spoofing, anonymous memory, CFI shadow, and per-app exclusion on top of NeoZygisk’s DenyList;
    • Supports KernelSU LKM late-load and emulated soft reboot;
    • Supports Android 7.1 and above, lower than upstream NeoZygisk’s 8.0;
    • Has a WebUI that distinguishes [Zygisk] / [Next] modules and offers per-app exclusion.
  • Limitations:
    • ZN modules are only injected into Zygote and hyos_spawner;
    • No riscv64 support, and the minimum Android version is higher than ZygiskNextNext’s 5.0;
    • A smaller user base and less community experience than NeoZygisk and ReZygisk (286 stars versus 2.5k and 4.1k);
    • A larger codebase and maintenance surface than upstream (see below);
    • Property spoofing changes the values returned for system properties; if you don’t need it, it is extra behavior.

NeoZygisk#

  • Strengths: the upstream of NyaZygisk; focuses on doing the Magisk Zygisk API well with a restrained feature scope, and has more community experience (2.5k stars); the DenyList design of direct Zygote unmounting with a setns fallback lives here; keeps up with Android 17 and BTI devices.
  • Limitations: no ZN API support, so ZN modules cannot be used; no WebUI; minimum Android 8.0; no TracerPid sanitization or property spoofing.

ReZygisk#

  • Strengths:
    • The whole codebase is rewritten in C, with smaller binaries;
    • A custom linker (CSOLoader) that bypasses the system linker to defeat linker-based detection, a design direction unique among the five;
    • A large user base (4.1k stars), with WebUI translations and well-established community channels;
    • Supports Android 7.1 and above;
  • Limitations: no ZN API support; I did not find implementations for TracerPid, property spoofing, or maps spoofing; the latest stable release is v1.0.0 (2026-05-10).

ZygiskNextNext#

  • Strengths: complete ZN API implementation that can inject into any init-spawned process; the lowest kernel requirements, supporting Android 5.0 and up and riscv64; the most active development (216 commits in the last three months, v2.0.0 released on 2026-10-19).
  • Limitations: it is not a Zygisk implementation. Magisk Zygisk modules (such as LSPosed) are not loaded by it, so it must be paired with another Zygisk implementation, meaning two modules to install.

✅ Choose by need#

Your needRecommendation
Open source, running both Zygisk modules and ZN modulesNyaZygisk
On HyperOS and need HyperOS Runtime modulesNyaZygisk
Only Magisk Zygisk modules (such as LSPosed), but you care about hiding properties and injection tracesNyaZygisk
Using KernelSU LKM late-load or temporary rootNyaZygisk
Only Magisk Zygisk modules, want the leanest option with no extra hiding, and value community experienceNeoZygisk
Only Magisk Zygisk modules, care about resisting linker-based detection, or prefer a C codebaseReZygisk
ZN modules that inject into system daemons other than ZygoteZygisk Next, or NyaZygisk, or NeoZygisk / ReZygisk + ZygiskNextNext
riscv64 devices, or Android 5.0 to 7.0, needing ZN modulesZygisk Next, or ZygiskNextNext (pick a compatible implementation for the Zygisk side)
Don’t mind closed source and want the most “original” ZN behaviorZygisk Next

A few more notes:

  • Do not install multiple Zygisk implementations at once. NyaZygisk, NeoZygisk, ReZygisk, and Zygisk Next replace each other, and Magisk users must disable the built-in Zygisk first. ZygiskNextNext is the only one designed to coexist with a Zygisk implementation.
  • Magisk users: on NyaZygisk / NeoZygisk, do not enable Magisk’s Enforce DenyList. It is Magisk’s own mechanism and may conflict with the implementation’s hiding.
  • Hiding results vary by device and detection method. The above only describes each project’s mechanisms; none can guarantee passing every check.

🎯 NyaZygisk’s positioning: lean, and hidden#

Finally, here is what NyaZygisk is trying to be, so you can judge whether it is what you want.

Lean describes the goal, not the line count. NyaZygisk spends its effort on the injection engine and the module loading engine itself, and does not pile on features such as module management, online updates, or theming; even the ZN API layer only implements what modules actually need (hooking, symbol resolution, companions) instead of duplicating all of Zygisk Next.

To be clear, that does not mean the smallest codebase. Roughly counting injector and daemon source, NyaZygisk is about 14k lines, NeoZygisk about 11k, ReZygisk about 11k, and ZygiskNextNext about 13k (excluding third-party libraries and WebUI frontends). The extra over upstream is mainly the ZN compatibility layer, the hiding work, and the WebUI. If “lean” means “least code” to you, NeoZygisk fits better.

Hidden is the main direction in which NyaZygisk diverges from upstream:

  • On top of the upstream DenyList (direct Zygote unmount plus a setns fallback), it adds TracerPid, property spoofing, anonymous memory, and CFI shadow handling;
  • After all modules are unloaded it cleans up its traces, including the ones left by the unloading itself;
  • These extra hiding steps are kept optional or adjustable where possible: anonymous memory has to be turned on manually, and spoof.prop can be edited, so nobody is forced to accept them.

So if what you want is “modules load, leave as few traces as possible, and don’t make me install two modules for two APIs”, NyaZygisk is built for that. If you only need a basic Zygisk, or need ZN modules to inject into arbitrary system processes, the tables above point to better choices.


Support & Share

If this article helped you, please share or support!

Sponsor
Choosing a Zygisk Implementation: A Detailed Comparison
https://www.nkbe.top/posts/zygisk-implementations-compare/
Author
NkBe
Published at
2026-10-18
Table of Contents