An installed hooking module is as much a tell as a root manager, but
Veil's own package wasn't in the hidden list, so any scoped app could
find it with getPackageInfo or the installed-package lists. It's now a
default alongside KernelSU and Magisk.
DEFAULT_HIDDEN_PACKAGES only applies while no list has been saved, so a
one-time migration adds Veil to an existing list the first time the
settings screen opens; a flag stops it from re-adding Veil after a
manual removal.
Discovery is unaffected: the hooked process resolves Veil's provider
through ActivityManager, not the hooked ApplicationPackageManager.
Verified on device (Android 16, Vector) with Veil Probe: getPackageInfo
for Veil now throws NameNotFoundException, the probe still registers,
and every other hooked path stays hidden.
Co-Authored-By: agent <agent@bdeshi.space>
- Real release build type: R8 shrinking + shrunk resources, with a keep
rule for VeilHook specifically — LSPosed finds it by exact class name via
the plaintext xposed_init asset, which R8 can't see, so obfuscating it
would silently break module loading with no build error to point at why.
- Signing config that reads keystore.properties if present (gitignored,
generated via scripts/generate-keystore.sh), falling back to debug
signing otherwise so assembleRelease always produces something
installable.
- scripts/release.sh builds and copies a version-stamped APK into dist/.
- GitHub Actions workflow building and publishing a release on any tag
matching *.*.* (bare semver, e.g. 1.2.0 — no v prefix required), optionally
using repo secrets for real release signing in CI.
- README covering setup, the feature table, and the DenyList gotcha.
No native code in this module, so a single APK already covers every
architecture — no per-ABI splitting needed.
Co-Authored-By: agent <agent@bdeshi.space>