Developer Guides
How to Send an APK to Testers Without the Play Store
Send Android APKs to testers without Play Store: sideload safety, version naming, signing-key hygiene, and iOS contrast.

Play Store tracks, Internal Testing, and closed betas are the right long-term path for many Android apps. They are not always the right path for this afternoon. A designer needs the latest debug build. A QA contractor is not on the Google Play Console yet. A client wants to tap through a flow before you commit to a store listing. In those moments you need to send an APK, not ship a release.
Sending an APK is easy to do badly. People zip the wrong artifact, include a keystore, forget to name the version, or email a file that never arrives because it is larger than the mail cap. This guide covers a practical handoff: what to build, how to label it, how testers sideload safely, and what not to put in the same archive.
When skipping the Play Store is reasonable
Use a direct APK when:
- The tester is not set up in Play Console, Firebase App Distribution, or your MDM.
- You need a same-day build from a feature branch.
- The device is a personal phone that should not join a company test track.
- You are pairing on a bug and need one specific commit, not "whatever is in Internal Testing."
Use a store track or a dedicated distribution service when:
- You have many testers and need crash analytics, staged rollouts, or update prompts.
- Legal or security policy forbids sideloading.
- You need to revoke access later from a dashboard.
Direct APK delivery is a temporary handoff, not a substitute for release engineering.
What testers actually need to install
Send the artifact they can install, not the entire repo.
- Prefer a single APK or a universal APK for mixed device fleets unless you already manage per-ABI splits.
- If you use Android App Bundles (AAB) for the store, testers cannot sideload an AAB directly. Build an APK (or a set of APKs) for ad-hoc testing.
- Include the applicationId, versionName, versionCode, git SHA, and build type in the filename.
- Say whether it is `debug` or `release`, and whether it points at staging or production APIs.
A useful name looks like `notes-staging-1.8.0-142-ab12cd3-debug.apk`. A useless name looks like `app-release.apk` sitting next to three other files with the same name.
Version naming that saves Slack threads
Testers will install the wrong build if you do not make the version obvious. Put the same identifiers in three places:
- The filename.
- An in-app debug footer or about screen.
- The message you send with the file.
If two testers report bugs on "the new build," you want to know they mean the same `versionCode`. Ask them to screenshot the about screen when they file an issue.
Sideload safety for you and for testers
Sideloading is normal for Android development. It is also how malware arrives on phones. Treat the social part of the transfer as seriously as the build.
For developers:
- Send the file through a channel the tester already trusts: a known chat, a known email, or a short-lived room you just created together.
- Do not post APKs in public channels, GitHub issues, or unrestricted cloud folders.
- Tell testers the package name and the expected permission list before they install.
- Prefer debug or staging builds that cannot charge real payments or talk to production customer data.
For testers:
- Enable install-from-unknown-sources only for the app that is doing the install, then leave it off afterward if that is your policy.
- Confirm the publisher: the person you already work with, not a lookalike account.
- Uninstall older test builds if the signature changed, or installation will fail in a confusing way.
- Do not forward the APK to friends. Test builds often have weaker auth, extra logging, or staging credentials.
If a tester is on iPhone, an Android APK will not help them. Do not bury that fact. Say it in the first message.
Testers on different OS and device types
Your "quick APK" plan falls apart when the room includes iOS, tablets, and locked-down work phones.
- Android personal devices: sideload usually works after the unknown-sources prompt.
- Android work profiles / MDM: the profile may block unknown sources. You need IT, a managed store, or a company-enrolled test track.
- iOS: there is no APK. Ad-hoc and TestFlight are different systems with Apple IDs, UDIDs, or App Store Connect testers. See the contrast below.
- Desktop reviewers: give them a screen recording or a staging web build if they cannot install anything.
Ask for OS, device model, and whether the phone is managed before you compile three flavors.
Never put signing keys in the zip
This is the mistake that turns a convenience transfer into an incident.
Do not include:
- `.jks`, `.keystore`, or `.p12` files
- `key.properties`, `keystore.properties`, or CI secrets
- `google-services.json` from a production Firebase project if testers do not need it
- Production API tokens, `.env` files, or `local.properties` with SDK paths that also contain secrets
- Mapping files you are not ready to share, if they reveal more than testers need
The zip or folder you send should contain the APK, a short `README` with version and known issues, and nothing that can sign the next release. If a tester needs a mapping file to read a crash, send that mapping in a separate, access-controlled path and expire it.
Release keystores belong in a secrets manager or a locked CI context, not in the same Drive folder as `app-debug.apk`.
How to actually deliver the file
APKs are often tens of megabytes. Email and many chat apps will refuse them or compress them into something unusable.
Practical options:
- Firebase App Distribution, Play Internal Testing, or your MDM when the tester will stay for more than one build.
- A temporary browser room when you need a one-off handoff and both sides can open a laptop or phone browser. Tools such as [PeerPizza](/) work without an account: share a room code, set an optional PIN, drop the APK plus a short chat note, and remember the room auto-cleans after roughly two hours of inactivity. There is no fixed per-file size cap because uploads are chunked, but rooms are temporary—keep the APK in your own CI artifacts or local `build/` folder as the source of truth.
- Signed cloud links from the object storage you already use for CI, with a short expiry.
- USB or Nearby Share when you are in the same room as the device.
Whatever you pick, send a checksum (`sha256sum`) for release-like builds so testers can confirm they downloaded the file you built.
iOS contrast: why TestFlight is a different sport
Android lets you sideload an APK with a user-facing toggle. iOS does not work that way for most testers.
- TestFlight distributes builds through App Store Connect. Testers use an Apple ID, accept an invite, and install from TestFlight. Builds expire (commonly after 90 days). You get crash reports and a familiar update flow.
- Ad-hoc builds require device UDIDs in the provisioning profile. Fine for a handful of phones, painful at twenty.
- Enterprise / developer MDM paths exist for companies, not for a random client iPhone.
If your product is both Android and iOS, plan two pipelines. Do not tell an iOS tester to "just install the APK." Do not tell an Android tester to "check TestFlight." Write the install steps for the OS they have.
A tester handoff checklist
Copy this into the chat when you send a build:
- App name and package name
- versionName / versionCode / git SHA
- debug vs release, staging vs production API
- Minimum Android version
- Whether they must uninstall the previous build first (signature change)
- Known broken flows
- Where to send bugs (and that they should include the version line)
- How long the download link or room will remain available
- Reminder: do not forward the file
If you cannot fill that list, you are not ready to send the APK.
Troubleshooting sideload and delivery problems
"App not installed" or a generic install failure
- Signature conflict with an existing install. Uninstall the old app, then retry.
- ABI mismatch (you sent an `arm64-v8a` APK to an emulator that is x86_64). Send a universal APK or the matching split.
- The file was truncated in transit. Compare size and checksum.
- `minSdk` is higher than the device. Say so in the notes before they try.
Tester cannot enable unknown sources
- Work profile or MDM is blocking it. You need a managed distribution path, not another zip.
- They are on iOS. Switch to TestFlight or ad-hoc.
File never arrives in email or Slack
- Size limits. Zip will not help much if the APK itself is larger than the cap. Use a room, a signed URL, or App Distribution.
- The chat app scanned and blocked the attachment because it is an executable package. That is expected. Do not rename `.apk` to `.jpg` to bypass scanners; send it through a path that allows binaries.
Tester installed it but "nothing works"
- They are on production data with a staging build, or the reverse.
- Cleartext HTTP is blocked on newer Android if you pointed at `http://` staging.
- They installed an older file with the same generic name. Check versionCode on the device.
Delivery methods compared
| Method | Best for | Setup cost | Revoke later | Typical pain |
|---|---|---|---|---|
| Play Internal / closed testing | Ongoing Android testers | Play Console | Yes | Invites and review delays |
| Firebase App Distribution | Frequent CI builds | Firebase project | Yes | Tester email list |
| Temporary room or signed URL | One-off APK today | Low | Expire the link or room | Room or link lifetime |
| Email / Slack attachment | Tiny debug APKs | None | No | Size and executable blocks |
| TestFlight (iOS only) | iOS testers | App Store Connect | Yes | Not an APK path |
Final thoughts
Sending an APK without the Play Store is a normal developer task if you treat it like a labeled, temporary artifact. Name the version so testers cannot mix builds. Sideload through a trusted channel. Never ship signing keys, production tokens, or the rest of the repo next to the binary. Use Play tracks, Firebase, or TestFlight when the tester group will last more than a day. Use a short-lived room or signed URL when you just need this build on that phone before standup. Keep the real artifact in CI or on your machine—every temporary link will go away, and that is the point.
Try PeerPizza: free temporary rooms to chat and share files — no signup, room codes, optional PIN, auto cleanup. Open home