An Android TV-focused fork of VInstall, adapted for reliable five-way remote navigation and package management on a television.
Note
This is an independent Android TV port, not an official release of the upstream VInstall project. For the original project, its releases, or upstream support, visit vinstall/VInstall.
The original phone interface is retained as the phone build flavor, while the tv flavor provides the television experience and can be installed separately.
- A Leanback-style home screen designed for D-pad remotes
- Remote-friendly package selection, settings, installation history, and queue controls
- A built-in TV file browser for devices without a suitable system document picker
- Browser-to-TV transfers over the local network using a six-digit pairing code
- Separate
phoneandtvapplication flavors - Additional archive validation, storage checks, and installer hardening
Captured on an NVIDIA Shield Android TV using the tv debug build.
| Dashboard | Package installer |
|---|---|
![]() |
![]() |
| Browser transfer | Settings |
|---|---|
![]() |
![]() |
See the physical-device test matrix for verified Shield TV behavior and flows that still require device testing.
Supports six package formats:
| Format | Description |
|---|---|
| APK | Standard Android package |
| XAPK | APK with OBB expansion data or split APKs bundle |
| APKS | Split APKs archive (SAI format) |
| APKM | Split APKs archive (APKMirror format) |
| APKV | Encrypted or plain split APKs archive (custom format, see APKV spec) |
| ZIP | Generic ZIP archive containing APK split files |
For split APK formats (XAPK, APKS, APKM, APKV, ZIP), individual splits can be selected or deselected before installation. APKV files support optional password-based encryption and integrity verification via SHA-256 checksums.
Three installation modes are available:
- Normal — uses the standard Android package installer
- Root — installs silently using root access
- Shizuku — installs silently via the Shizuku service without requiring full root
Browse all installed user apps with the ability to:
- View app details: version, SDK range, install and update dates, APK size, data directory, split count, and requested permissions
- Launch or open the system app info page
- Export the app as an
.apkvarchive - Uninstall the app (supports Normal, Root, and Shizuku modes)
- Compute and copy the APK hash (MD5, SHA-1, SHA-256)
Export any installed user app as an .apkv archive directly from the App Manager or the dedicated Backup screen. Exports are created in private app storage and can then be saved with Android's document picker. Optional password-based encryption is supported when exporting.
The tv flavor is a separately installable, five-way-remote-friendly build with a Leanback dashboard. Its Receive screen starts a lifecycle-bound LAN server with a six-digit pairing code for browser uploads and authenticated APKV downloads. Received packages are always reviewed and explicitly installed on the TV.
XAPK expansion files are accepted only when Root or an active, granted Shizuku installation mode is selected. VInstall validates the APK package name and writes only .obb files beneath that package's protected OBB directory.
| Setting | Description |
|---|---|
| Install mode | Normal, Root, or Shizuku |
| Theme | Light, Dark, or follow system |
| Confirm before install | Show a confirmation dialog before installing |
| Clear cache after install | Automatically remove temp files after installation |
| Debug window | Show or hide the in-app log viewer |
| Crash Reports | Logs can be viewed, copied, or cleared directly from the app |
- Android 5.0 (API 21) or higher
- "Install unknown apps" permission granted for this app
- Root or active Shizuku access is required for XAPK packages that contain OBB data
- Root access required when using Root mode
- Shizuku installed and running when using Shizuku mode
./gradlew assemblePhoneDebug
./gradlew assembleTvDebugBefore triggering a release build, create a keystore and configure the following secrets in your GitHub repository settings:
| Secret | Description |
|---|---|
KEYSTORE_BASE64 |
Base64-encoded .jks keystore file |
STORE_PASSWORD |
Keystore password |
KEY_ALIAS |
Key alias |
KEY_PASSWORD |
Key password |
Then push a tag prefixed with v to trigger the release workflow:
git tag v1.0.0
git push origin v1.0.0The signed release APK will be automatically attached to the corresponding GitHub Release.
Alternatively, you can build a signed release APK locally by adding the following properties to your local.properties file:
STORE_FILE=/absolute/path/to/your/keystore.jks
STORE_PASSWORD=your_store_password
KEY_ALIAS=your_key_alias
KEY_PASSWORD=your_key_passwordThen run:
./gradlew assemblePhoneRelease
./gradlew assembleTvReleaseThe gradle/wrapper/gradle-wrapper.jar file is included in the repository. However, if you want to generate the file again, just type:
gradle wrapper --gradle-version=9.4.1VInstall introduces APKV, a custom container format for archiving and distributing Android application packages. It supports plain and password-encrypted payloads, embeds an application icon, includes integrity checksums per APK file, and includes a structured JSON manifest. The full specification is available in the APKV spec and apkv-cli.
Licensed under the GNU General Public License v3.0.
This project uses the following open-source libraries:
| Library | Author | License | Notes |
|---|---|---|---|
| AndroidX | Apache 2.0 | ||
| Material Components for Android | Apache 2.0 | ||
| Kotlin Coroutines | JetBrains | Apache 2.0 | |
| Gson | Apache 2.0 | ||
| Shizuku | RikkaApps | Apache 2.0 | |
| Bouncy Castle | The Legion of the Bouncy Castle | MIT-style | Removed in v0.4.2-hotfix2 |
VInstall was created by AlwizBA and is maintained at vinstall/VInstall. This fork retains the upstream project and license while adding the Android TV-specific work described above.



