`:app` is deleted, not deprecated — 218 files, and no longer in
settings.gradle.kts. `:manager` takes its place: 86 Kotlin files, Material 3,
one activity, because parasitically every activity has to be tracked by hand by
the zygisk hooker. Launching it has not changed: still injected into
com.android.shell, still reached through Constants.setBinder.
Most of the branch is screens the old manager did not have. The framework
updates from inside the app, canaries included. Home shows the project's commit
history rather than a status light. The log screen indexes byte offsets and
pages a window instead of loading four megabytes of strings into a process
whose heap belongs to com.android.shell, and reaches the daemon's rotated
parts. The Store runs off the mirrors that still answer. The scope editor
collects edits into a draft and writes them once, where the old one rewrote a
module's whole scope on every checkbox tap. System status states what is
running and copies itself in English whatever the phone's language.
Daemon-side, less: ModuleDatabase owns every configuration read and ConfigCache
holds no SQL, so "enable this module" and "what is enabled" agree rather than
race a rebuild. The AIDL gained the transactions the new screens need, and
ROOT_UNKNOWN takes 0 — a binder proxy answers an unimplemented transaction with
a default, so ROOT_NONE at 0 meant an old daemon told a rooted user to install
the root manager they were already running. The two ship in one zip.
Eighteen languages, crowdin.yml repointed from app/ to manager/, right-to-left
included.
No automated tests, because the repository has none, and CI runs `zipAll`. It
was verified on a device, screen by screen, checking each claim against what
the daemon had actually stored. That found real bugs late — a comment asserting
the daemon force-stops apps on a scope write, which it has never done; a filter
that hid the rows a reader had chosen. Expect a few more.