Third-party app stores finally have a sanctioned installation path on Android, with one big caveat: verified stores install only on Android 17 QPR2. That gate is about the OS build, not about sideloading in general — it applies to verified stores, not to every APK you push onto a phone.
Below is the full flow, from confirming your Pixel is on the right branch to checking which installer actually placed the package on the device. Budget 30–45 minutes plus over-the-air download time, and expect to spend most of it in a terminal running adb (Android Debug Bridge, the command-line tool that talks to a phone from your computer).
What you need before you start
- A compatible Pixel that is enrolled in the Android 17 QPR2 beta program.
- A host machine on Windows, macOS or Linux with Android SDK Platform-Tools installed and
adbon yourPATH. - A USB-C cable that carries data, not just power.
- USB debugging switched on, and "Install unknown apps" allowed for the source you plan to use.
- The store's official signed installer, taken from the developer's own site — the developer whose verification you are relying on. Skip mirrors and repackaged copies.
One thing worth saying out loud: the source reporting does not publish build numbers, a supported device list or release dates. Treat all three as documentation lookups. Don't guess a build number and don't assume your model is supported.
Step 0 — Get adb and the cable working
Before anything else, confirm the host sees the phone:
adb version
adb devices
On a correctly prepared machine the second command prints two lines:
List of devices attached
XXXXXXXXXXXX device
If the state column says unauthorized instead of device, unlock the phone and tap "Allow USB debugging". Nothing later in this guide will work until that column reads device.
Quick checklist before you continue:
- [ ]
adb versionprints a version string. - [ ]
adb deviceslists your Pixel asdevice. - [ ] Settings > System > Software update shows an Android 17 QPR2 build (the exact label varies by build).
- [ ] The Google account on the phone is the one enrolled in the beta program.
- [ ] The store installer is downloaded and you have noted its package name.
Step 1 — Prove the phone is really on QPR2
Read the build properties straight off the device and compare them with what the requirement asks for:
adb devices
adb shell getprop ro.build.version.release
adb shell getprop ro.build.version.sdk
adb shell getprop ro.build.version.security_patch
adb shell getprop | grep -i qpr
With a healthy connection you should see the serial and state, then 17 as the release value, an API level and a security patch date. The last command may print nothing at all — that is expected, because no QPR build number is published in the source. Confirm the QPR2 level in Settings > About phone > Android version, and if the value is missing there too, go back to the documentation for that build.
This matters because getprop reads the same system property store that the package installer and the store's own verification code consult. What you see is what the installer sees. A phone still sitting on Android 16 answers the release query with 16 — that is your failure signal, and pushing the installer now will just produce a confusing error. Move on to Step 2 instead.
Step 2 — Enroll in the beta and take the OTA
Enrollment is the gate. The build is distributed through the beta program to compatible Pixel devices and beta-enrolled accounts; there is no separate side channel.
- Open Google's official Android Beta Program page from its documentation — verify the URL yourself rather than following a link someone handed you — and enroll the Google account that is active on the Pixel.
- On the phone, go to Settings > System > Software update and check for updates.
- Download and install the offered Android 17 QPR2 build. Beta 6 arrived one week after Beta 5, so if you are behind, a fresh prompt should appear quickly.
- Reboot when asked and leave the phone idle for a few minutes while the first boot settles.
After the reboot, confirm the boot actually finished:
adb wait-for-device
adb shell getprop sys.boot_completed
adb shell getprop ro.build.version.release
A 1 from the boot-completed property means you are good to go; 0 or an empty answer means the boot is still in progress. If you want to watch the installer's decisions in real time once you start Step 3, keep a log running in a second terminal:
adb logcat -c && adb logcat | grep -iE "PackageInstaller|PackageManager|Verifier"
The beta OTA replaces the system image, which is exactly why this works: the version check the store performs moves from a failing branch to a passing one.
Step 3 — Install from the signed installer
With the build confirmed, the install itself is a single command:
adb install -r <store-installer>.apk
Swap in the file you downloaded from the store's own site. The expected result is Success.
Step 4 — Verify the package, its version and who installed it
A Success line is not the whole story. Version-gated installs fail at the installer stage, and the installer records the outcome in the package database — so read the database back:
adb shell pm list packages | grep <store-package>
adb shell dumpsys package <store-package> | grep -E "versionName|firstInstallTime"
adb shell pm list packages -i | grep <store-package>
Replace <store-package> with the store's application ID, as shown on its download page or listing. Expected output:
package:<store-package>
versionName=<version-string>
firstInstallTime=<timestamp>
package:<store-package> installer=<installer-package>
| Check | Command | Expected result |
|---|---|---|
| Package present | `adb shell pm list packages \ | grep ` |
| Version recorded | `adb shell dumpsys package \ | grep versionName` |
| Installer identity | `adb shell pm list packages -i \ | grep ` |
| App launches | tap the store icon | store UI opens, no version-block dialog |
Finally, open the store and browse a catalogue page. Success looks like a working store front end with no "cannot be installed on this version" style dialog. Write down the installer= value — for example, installer=com.android.packageinstaller tells you the system installer did the job rather than some side route. That value is your baseline to compare against after any future update.
When the install is rejected
If you see Failure [INSTALL_FAILED_VERIFICATION_FAILURE], the source points at two causes worth checking first: the device is not on the required Android 17 QPR2 build, or the store you are installing is not one of the verified ones. Re-run the getprop checks from Step 1, confirm the beta enrollment actually took effect on the account used by the phone, and make sure the installer came from the developer's own site rather than a mirror. Nine times out of ten the version gate is the culprit, and the fix is Step 2, not another installer flag.
This article was originally published on AI Release — https://ai-release.org — where you'll find more Android and app-distribution walkthroughs; the channel is at https://t.me/ai_release1 if you want new guides as they land.
Takeaway
The install command is trivial; the discipline around it is not. Check the build with getprop before you push anything, take the beta OTA if you are on the wrong branch, use only the official signed installer, and then read the package database back to see what actually happened. That last step is what turns "it seemed to work" into a verifiable result you can compare against the next time the phone updates.
Top comments (0)