Release packages — what each download actually is¶
Every published Echidna release attaches the same set of files. Most of them are not things you install: three are real installable packages, three are convenience bundles for offline, manual, or integrator use, and two are text files describing and hashing the rest. This page says what is inside each one, who needs it, and how it is consumed.
⚠️ Downloading is the easy part
Two of these packages install a root module that hooks the audio capture path. Echidna is experimental and is likely not to work on many phones. Do not flash anything unless you already know how to disable a Magisk/Zygisk module manually from recovery, adb, safe mode, or another out-of-band rescue path — see Recovering from a bootloop.
The short answer
For a normal install you need exactly two files: the companion APK and
the Magisk zip. Everything else is optional, and the three .zip bundles
are repackagings of files you already have.
| Asset | Kind | Do you need it? |
|---|---|---|
echidna-companion-<TAG>.apk |
Installable | Yes — start here. |
echidna-magisk-<TAG>.zip |
Installable | Yes, for interception on a rooted device. |
echidna-lsposed-shim-<TAG>.apk |
Installable | Only for the Java AudioRecord fallback path. |
echidna-apks-<TAG>.zip |
Convenience bundle | No — it contains the two APKs above. |
echidna-native-libs-<TAG>.zip |
Convenience bundle | No — raw .so files for inspection. |
echidna-complete-<TAG>.zip |
Convenience bundle | No — an archive of everything above. |
SHA256SUMS.txt |
Metadata | Yes, if you intend to verify your downloads. |
RELEASE_ARTIFACTS.md |
Metadata | The short manifest this page expands on. |
⚠️ Use the newest release
Use the newest release unless you are intentionally rolling back or already
understand the recovery procedure. Earlier releases may contain boot/module
bugs fixed later and can be harder to recover from after flashing. The
companion app resolves releases/latest at run time and never carries a
hardcoded tag.
Installable packages¶
echidna-companion-<TAG>.apk — the companion app¶
What it contains. The Jetpack Compose companion app and its in-process
control service (libechidna_control_jni.so), plus three things that are easy
to overlook:
- Per-ABI
libech_dsp.so, so the Lab can run your own audio through the DSP engine locally, with no root and no other app involved. - The whole
docs/tree mirrored intoassets/help/docs/, which is what in-app Help & search renders offline — including this page.
The published APK does not bundle the module zip
A locally built APK embeds out/echidna-magisk.zip as an asset when that file
exists, which lets the guided installer flash without a
file picker. The published release APKs do not: CI builds the module in a
separate job from the APKs, so the zip is absent at APK-assembly time. On a
release build the installer therefore says "No engine package is bundled in
this build" and the module comes from either the in-app download below or a
.zip you pick yourself. Verified against the published
echidna-companion-<TAG>.apk, whose only non-help/ assets are the baseline
profiles.
Who needs it. Everyone. It is the only package that is useful on its own: on an unrooted phone the app still runs, every screen renders, the Lab works, and the engine honestly reports itself as not installed.
How to install it. Sideload it — adb install -r echidna-companion-<TAG>.apk
or the system package installer. It is not a Play Store app.
Why pick it over the alternatives. There is no alternative; the copy inside
echidna-apks-<TAG>.zip is the same file.
Signing-certificate migration
Android only replaces a package in place when the installed and replacement APKs share a signing certificate. A previously installed debug-signed companion cannot be upgraded to a release-signed one: back up any app data you need, uninstall once, then install the release APK. See Signing.
echidna-magisk-<TAG>.zip — the flashable engine module¶
What it contains. A real, flashable Magisk module built by
tools/build_magisk_module.sh:
zygisk/<abi>.so— the Zygisk hook engine (libechidna.so) forarm64-v8a,armeabi-v7a, andx86_64.libs/<abi>/libech_dsp.so— the DSP engine, placed system-side bycustomize.sh.preproc/<abi>/libechidna_preproc.so— the default-off legacy input preprocessor, packaged as a next-boot registration source only. Packaging it is not registration, and registration is not session attachment.module.prop,customize.sh,post-fs-data.sh,service.sh,sepolicy.rule, theMETA-INFinstaller stub, the boot/trust helper scripts undercommon/, andLICENSE.md.common/release-cert-sha256— the exact certificate the companion app must be signed with. This pin is what binds the module to your installed app, and the packager refuses to build a production module pinned to the public Android debug certificate.
Who needs it. Anyone who wants Echidna to transform audio in other apps. Nobody who only wants to try the Lab.
How to install it. Either let the guided installer stage and flash the bundled or downloaded copy, or flash it by hand from Magisk Manager → Modules → Install from storage. Magisk 24.0+ with Zygisk enabled is required, and the installer aborts on API < 26. A Zygisk module only loads at boot, so a reboot is always required.
Why pick it over the alternatives. The raw .so files in
echidna-native-libs-<TAG>.zip are the same libraries, but they are not a
module: no installer stub, no boot scripts, no SELinux rule, no certificate
pin. Placing them by hand is not a supported install path.
echidna-lsposed-shim-<TAG>.apk — the optional Java fallback¶
What it contains. The LSPosed/Xposed shim module that hooks Java
AudioRecord, bundling its own per-ABI libechidna_shim_jni.so bridge and
libech_dsp.so. It fetches policy from the companion's authenticated read-only
Binder provider.
Who needs it. Only people validating or using the Java fallback route — for example when a target app never reaches the native hook candidates. It is not part of a normal install.
How to install it. Sideload the APK, install and enable LSPosed, enable the Echidna module, and pick its scope.
Assign one capture owner per process
Do not scope the same target app into both Zygisk and LSPosed unless you are
deliberately testing duplicate-hook behaviour. Each consumer needs its own
captureOwners value — see Limitations.
Convenience packages — not needed for a normal install¶
None of the three bundles below contain anything you cannot get from the installable assets. They exist for offline transfer, manual archiving, and development. If you are installing Echidna on a phone, skip all three.
echidna-apks-<TAG>.zip¶
apks/echidna-companion-<TAG>.apk, apks/echidna-lsposed-shim-<TAG>.apk, and a
short README.md. The release workflow verifies that both bundled members are
byte-identical (SHA-256) to the standalone APKs and that the bundle carries no
other APK.
Pick it when you are moving both APKs to an offline machine in one download. Otherwise take the standalone APKs — they are the same bytes with fewer steps.
echidna-native-libs-<TAG>.zip¶
native-libs/<abi>/ for arm64-v8a, armeabi-v7a, and x86_64, each holding
four libraries — libechidna.so (Zygisk engine), libech_dsp.so (DSP),
libechidna_shim_jni.so (shim JNI bridge), and libechidna_preproc.so (the
default-off legacy effect library) — plus a README.md.
Pick it when you want to inspect, disassemble, or diff the shipped binaries, or you are integrating the DSP library elsewhere. This is not an install path: these files carry no installer, no boot scripts, and no certificate pin.
echidna-complete-<TAG>.zip¶
The five assets above plus RELEASE_ARTIFACTS.md. Note that SHA256SUMS.txt is
generated after this archive is built, so it is not inside it.
Pick it when you are archiving a whole release or preparing an offline mirror. For installing, it just makes you unzip before you can start.
Verifying a download with SHA256SUMS.txt¶
SHA256SUMS.txt lists the SHA-256 of every other asset in the release,
including the bundles. Download it alongside whatever you fetched and check the
files you actually have:
```sh
From the directory holding the downloaded files¶
sha256sum --ignore-missing -c SHA256SUMS.txt ```
On Windows without a POSIX shell:
powershell
Get-FileHash .\echidna-magisk-<TAG>.zip -Algorithm SHA256
then compare that hash against the matching line in SHA256SUMS.txt.
What a checksum does and does not prove
SHA256SUMS.txt travels over the same channel as the artifacts, so on its
own it proves integrity — that you got the bytes the release published — not
provenance. Origin is established separately: the APKs are signed with the
release certificate, and the Magisk zip carries the
common/release-cert-sha256 pin. That is exactly the distinction the in-app
downloader enforces below.
Fetching a release from inside the app¶
The guided installer can fetch a release for you instead
of you downloading and pushing a zip by hand. On a published release build,
where no module is bundled, this and the .zip picker are the two ways to get
the module. It is strictly additive: the picker (and a bundled asset when a
locally built APK has one) remains the offline path, nothing is polled or
downloaded automatically, and the resolved tag and asset name are shown before
any bytes are fetched.
Check for latest release resolves releases/latest from the GitHub API —
no tag or filename is hardcoded — and identifies the echidna-magisk-<tag>.zip
asset by shape. Download then fetches it over HTTPS-only transport confined
to GitHub-owned hosts and runs two independent checks before anything can be
staged for install:
- Integrity — SHA-256 against the
SHA256SUMS.txtpublished in the same release. - Origin — the module's
common/release-cert-sha256pin must equal the certificate that signed the running companion app. An APK is instead checked against that certificate directly.
Any failure deletes the file and names the check that rejected it; it never falls back to the bundled asset behind your back. A debug-signed companion cannot download at all, because it has no forgery-resistant certificate to bind a download to. Full detail is in Signing → In-app release downloads.
The convenience bundles cannot be fetched in-app — by design
echidna-native-libs-<TAG>.zip, echidna-apks-<TAG>.zip, and
echidna-complete-<TAG>.zip are refused by the in-app downloader. They
are plain zips: they carry no APK signature, and they carry no
common/release-cert-sha256 pin. Nothing binds them to the certificate that
signed your installed app, so the verifier has no origin to check and rejects
them rather than accepting them on their checksum alone. This is not a gap to
be worked around — if you want those bundles, download them yourself and
verify them against SHA256SUMS.txt.
See also¶
- Build & Install — building these same artifacts from source.
- Installer guide — the guided in-app engine installer.
- Magisk Release — the module layout and manual flash path.
- Signing — release signing, certificate migration, and download verification.
- Verification — what is proven on host/emulator vs. still device-gated.