Copy and re-sign overhead
Every new channel means another copy, signature and upload. More packages, longer pipelines, more storage.
SELF-HOSTED APK REFERER INJECTION
Attach a channel parameter to APK downloads without re-signing, decompiling, or changing the original APK. One deployment gives you the Console, download statistics, offline licensing, and an Android AAR SDK.
WHY IT EXISTS
The usual approach copies and re-signs an APK for every channel. APK Ref Injector attaches the channel value to the download so one base APK serves every source.
Every new channel means another copy, signature and upload. More packages, longer pipelines, more storage.
Re-signing changes the certificate and install identity. When scripts fail, it is hard to tell which package is wrong.
The channel value stops at the download link. The installed app cannot read it, so attribution becomes indirect.
REQUEST PATH
From download request to APK response, the original package stays untouched.
Read the channel parameter from the download URL.
Attach the channel marker during the download response.
No re-signing and no APK content changes.
Return the marked APK without buffering the whole file.
CORE CAPABILITIES
Every component lives in one binary and one operational boundary.
Strict APK structure and signature validation; unsupported packages are rejected explicitly.
Upload base APKs, manage apps, copy download links, and inspect statistics.
Aggregate by channel, time, and status without slowing downloads.
Validate licenses offline; renewal only needs a new license file.
install / start / stop / status / license update / uninstall.
One executable, systemd unit, config sample, and license.zip.
OPERATIONS
Production runs on systemd. Data stays on your machine, with clear upgrade and renewal paths.
sudo ./apk-ref-injector install \ --license /path/to/license.zip \ --public-url https://apk.example.com sudo apk-ref-injector status sudo systemctl restart apk-ref-injector
ANDROID SDK
The AAR packages the reader behind one synchronous Kotlin API. Customers do not integrate parsing logic and do not need storage permission.
val result = RefererReader.read(context)
when (result) {
is RefererResult.Found -> use(result.referer)
RefererResult.NotFound -> { /* no channel value */ }
is RefererResult.Error -> handle(result.code)
}SECURITY & LIMITS
No guessing at uncertain APK structures, no sensitive values in logs, and no trust in the channel value itself.
No. The channel marker is attached during the download response; the original signature and APK content stay unchanged.
They are rejected explicitly. Only structurally valid APKs with a supported signature format are accepted; the server never guesses.
Full values are not logged. Stats aggregate by the original value; logs keep only the context they need. License contents, passwords, and session secrets are never logged.
No, and there is no container delivery. You get the executable, systemd unit, config sample, and license.zip.
Tell us about your app scale, deployment environment and current channel pipeline. We will prepare a focused demo and deployment recommendation.
This opens your default mail client. The v1 site does not collect form data online.