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.
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 inzn_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 Next | NyaZygisk | NeoZygisk | ReZygisk | ZygiskNextNext | |
|---|---|---|---|---|---|
| Maintainer | Dr-TSNG (LSPosed) | HSSkyBoy / NkBe | JingMatrix | PerformanC | VeryBaaad |
| Origin | Original project | Fork of NeoZygisk | Independent | Fork of Zygisk Next from its open-source era | ZN module loader written from scratch |
| License | Closed source (since v4-0.9.2) | GPL-3.0 | GPL-3.0 | AGPL-3.0 | GPL-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 languages | Not public | C++ + Rust | C++ + Rust | C | C++ + Rust (injector) |
| Minimum Android | 8.0 | 7.1 | 8.0 | 7.1 | 5.0 |
| Architectures | arm64, armv7, x86, x86_64, riscv64 | arm64, armv7, x86_64 | arm64, armv7, x86, x86_64 | arm64, armv7, x86, x86_64 | arm64, armv7, x86, x86_64, riscv64 |
| WebUI | Yes (README mentions translations) | Yes | No | Yes | Yes |
| Latest release | v1.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¹ | 5 | 36 | 9 | 29 | 216 |
| GitHub stars¹ | 10.7k | 286 | 2.5k | 4.1k | 65 |
¹ 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.
“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
| NyaZygisk | NeoZygisk | ReZygisk | ZygiskNextNext | |
|---|---|---|---|---|
| How it injects | ptrace remote call to dlopen to load libzygisk.so | Same | ptrace plus a custom remote linker (CSOLoader), bypassing the system linker | A standalone injector process using ptrace |
| How it finds targets | Watches execve, recognizes Zygote and hyos_spawner | Watches execve, recognizes Zygote | Watches Zygote | tracefs sched_process_exec, proc connector, eBPF, fanotify, KPM, falling back to /proc polling |
| Loading Zygisk modules | The daemon creates a sealed read-only memfd per module; the process loads it with android_dlopen_ext from the fd | Same | Loaded by the custom linker | N/A |
| Loading ZN modules | Per zn_modules.txt, also via memfd | Not supported | Not supported | Per zn_modules.txt |
| ZN module injection targets | Zygote and hyos_spawner | — | — | Any init-spawned process named by name= / path= |
| Process flag lookup | Cached by the daemon in shared memory (memfd + mmap), the rest over IPC | IPC on every lookup | IPC | N/A |
| Hook backends | Dobby, LSPlt | LSPlt | PLTI | Dobby, 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_spawnertarget 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 andhyos_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.
| Item | NyaZygisk | NeoZygisk | ReZygisk |
|---|---|---|---|
| Mount namespace for DenyList apps | Unmounts directly inside Zygote; if that fails or is aborted, setns into a cached clean namespace | Same | setns 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. TracerPidsanitization has a limited scope: it only hooks the PLT oflibandroid_runtime,libart,libjavacore,libopenjdk, andlibbase. It intercepts reads of/proc/*/statusgoing 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.propcovers bootloader state, build type, debuggable flags, and MIUI, Realme, and OPlus specific properties;ro.boot.vbmeta.digestis 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
solistcleanup. I did not find corresponding implementations forTracerPid, 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
| NyaZygisk | NeoZygisk | ReZygisk | ZygiskNextNext | |
|---|---|---|---|---|
| APatch / KernelSU / Magisk | ✅ | ✅ | ✅ | ✅ |
| KernelSU Next and other variants detected | ✅ | ✅ | ✅ | Not verified item by item |
| Magisk Alpha / Kitsune detected | ✅ | ✅ | Not found | Not 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 item | Not verified item by item |
| BTI devices | ✅ (inherited) | ✅ | Not verified item by item | Not verified item by item |
| 32-bit PLT hook fix | ✅ (inherited) | ✅ | N/A | N/A |
4. Management UI
| NyaZygisk | NeoZygisk | ReZygisk | ZygiskNextNext | |
|---|---|---|---|---|
| WebUI | ✅ tabbed: overview, modules, settings | — | ✅ | ✅ Vue 3, two skins |
| Languages | Traditional Chinese, Simplified Chinese, English | — | Translated via Crowdin | Not verified item by item |
| Distinguishes module type (Zygisk / Next) | ✅ | N/A | N/A | N/A |
| Shows ROM, kernel, ABI, SDK | ✅ | — | Not verified item by item | Not verified item by item |
action.sh status output | — | ✅ | Not verified item by item | Not 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.
- ZN modules are only injected into Zygote and
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
setnsfallback 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
TracerPidsanitization 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 need | Recommendation |
|---|---|
| Open source, running both Zygisk modules and ZN modules | NyaZygisk |
| On HyperOS and need HyperOS Runtime modules | NyaZygisk |
| Only Magisk Zygisk modules (such as LSPosed), but you care about hiding properties and injection traces | NyaZygisk |
| Using KernelSU LKM late-load or temporary root | NyaZygisk |
| Only Magisk Zygisk modules, want the leanest option with no extra hiding, and value community experience | NeoZygisk |
| Only Magisk Zygisk modules, care about resisting linker-based detection, or prefer a C codebase | ReZygisk |
| ZN modules that inject into system daemons other than Zygote | Zygisk Next, or NyaZygisk, or NeoZygisk / ReZygisk + ZygiskNextNext |
| riscv64 devices, or Android 5.0 to 7.0, needing ZN modules | Zygisk Next, or ZygiskNextNext (pick a compatible implementation for the Zygisk side) |
| Don’t mind closed source and want the most “original” ZN behavior | Zygisk 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
setnsfallback), it addsTracerPid, 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.propcan 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.
🔗 Links
- Zygisk Next (README and API header)
- NyaZygisk (project page)
- NeoZygisk
- ReZygisk
- ZygiskNextNext
- ZygiskNextModuleSample: ZN module sample
Support & Share
If this article helped you, please share or support!

