Gravity Installer is a modern Android package manager that handles what the default installer can't.
Install APK, APK+, APKS, XAPK, APKM (with split APKs and OBB files), download packages from URLs, manage installed apps, and silent-install via Shizuku — all in one Material 3 app. Now with Android TV support.
- Expressive UI — Beautiful, bouncy spring animations (inspired by InstallerX-Revived) that make the dialog card "living" and responsive.
- Brand Identity — Sleek default Orange theme for a premium, high-contrast look (Dynamic Color still available as an option).
- Multi-format —
.apk,.apk+,.apks,.xapk,.apkmwith split APK handling (via Ackpine) - Merge split APKs — Group multiple individual
.apkfiles (e.g. from a manual split extraction) into a single installation session. Perfect for installing apps served as a collection of separate splits. - Modern Android Support — Fully compatible with Android 14, 15, 16, and ready for Android 17. Fixes common parsing errors (e.g.
aconfig_flags.pb) found on newer system versions. - Package preview — App name, icon, version, package, size, min/target SDK, supported ABIs, languages, permissions, OBB count, split count — shown in a bottom sheet before you commit
- Three local pick modes — Find automatic (scans device storage), Browse packages (APK/XAPK/APKS/APKM only), Browse all files
- Remote download — Paste a URL, download package directly. Files land in
/sdcard/Download/GravityInstaller/with their Content-Disposition name so they're easy to re-find in any file manager - Download history — Every download is logged; re-install later, copy the source URL, or delete from the dedicated history screen
- Intent handling — Open APK/XAPK files from Chrome downloads, Gmail attachments, Telegram, or any file manager — even when the URL has no extension
- Bundle-embedded OBBs — XAPK/APKM/APKS archives containing
.obbfiles are auto-detected and copied toAndroid/obb/<package>/after the APK installs - Standalone attach — Pick a base APK, then attach one or more
.obbfiles via the preview sheet; they're installed alongside - Runs in a foreground worker — OBB copy survives app closure, with progress on the notification shade
- Three write strategies — Falls back in order based on what the device permits:
- Direct I/O (pre-Android 11)
- Shizuku (
shellUID can write to any app's OBB dir on modern Android) - SAF tree grant (user grants access to
Android/obb/<pkg>/once per package; reused on subsequent installs)
- VirusTotal integration — Auto SHA-256 hash lookup on every picked file; if VirusTotal doesn't know the file yet, optionally upload it for a full multi-engine scan (supports files up to 650 MB via VirusTotal's large-file endpoint)
- Clear verdict — See engine counts (malicious / suspicious / harmless / undetected) before you install
When Root access or Shizuku is enabled, unlocks:
- Installer Profiles — Save and reuse custom install configurations (installer package spoofing, privileged flags, targeted users) per app or globally.
- Silent install / uninstall — No system confirmation prompt
- Replace existing, Allow downgrade, Grant all requested permissions, Allow test packages, Bypass low target SDK block, Install for all users
- Set install source — Spoof the installer package name (Google Play, Aurora, F-Droid, Amazon, Samsung, Huawei, Xiaomi presets, or custom) so apps with "installed from Play Store" checks accept your sideload
- Send to TV — Quickly transfer and install packages on your Android TV by scanning a QR code.
- Built-in HTTP server — Share and manage your packages across a local Wi-Fi network from any browser.
- Web dashboard — Download APKs straight to your PC or upload new packages directly to your phone.
- Live tracking — Real-time progress updates visible inside the app as files transfer.
- PIN security — Set an optional 4–8 digit PIN code to restrict local access to your shared folder.
- Full app list — Browse user apps (system apps optional)
- Rich metadata — App name, package, version, APK size, first install date, last used time
- Sort — By Name / Size / Installed date / Last used — each with ascending/descending toggle
- Batch select — Long-press to enter selection mode, uninstall many at once
- Filter sheet — Tap FAB for sort/filter options; long-press FAB to scroll to top
- Usage access hint — "Last used" sort prompts user to grant the Usage Access permission only when needed
- Uninstall logs — Separate log screen for every uninstall attempt (success / failure with reason)
- Storage card on Install screen — At-a-glance internal storage usage (free / total, color-coded warning at 75% / 90%)
- Install history — Every install attempt logged with app name, package, version, success/failure, and error reason
- Material 3 — Orange brand theme (default) + Dynamic color + Light / Dark / System theme
- Multi-language — Arabic, German, Greek, English, Spanish, French, Hindi, Indonesian, Italian, Japanese, Korean, Portuguese (BR), Russian, Turkish, Ukrainian, Vietnamese, Chinese
- Progress notifications — Download, install, and OBB copy all surface their progress in the notification shade
- Kotlin + Jetpack Compose — UI
- Ackpine — Package install/uninstall with split APK, Shizuku, and libsu plugins
- Shizuku — Privileged operations via ADB/root
- Ktor — HTTP client for VirusTotal and remote downloads
- WorkManager — Foreground worker for OBB copy (survives app process death)
- Room — Local DB for install / uninstall / download history
- Koin — Dependency injection
- DataStore — Preferences storage
- Coil 3 — App icon loading
- Android Studio
- JDK 17+ (required by AGP 8.11)
- Android SDK 36
The project is a multi-module Gradle build:
| Module | Type | What it is |
|---|---|---|
:app |
application | The phone/tablet app (the main, shipping app) |
:tv |
application | The Android TV (10-foot, D-pad) app |
:core |
library | Shared, UI-agnostic install/manage engine consumed by :app/:tv |
A single distribution ships Shizuku, Root (libsu), and the default system installer together — the old
store/fullproduct flavors were removed.
- Clone the repository:
git clone https://github.com/teamantigravity/gravityinstaller.git cd gravityinstaller - Open the project in Android Studio
- Pick the
app(phone) ortvrun configuration, sync Gradle, and run on a device (an emulator works for most features except Shizuku-backed install)
# Phone app
./gradlew :app:assembleDebug
./gradlew :app:assembleRelease
# Android TV app
./gradlew :tv:assembleDebug
./gradlew :tv:assembleRelease
# Release App Bundle (phone + TV)
./gradlew assembleBundleRelease
# Everything at once
./gradlew assembleDebug# Install dependencies
bundle install
# Build debug APK
bundle exec fastlane build_debug
# Build release APK
bundle exec fastlane build_release
# Deploy beta to Firebase App Distribution
bundle exec fastlane beta
# Deploy to Play Store internal track
bundle exec fastlane internal
# Bump version code
bundle exec fastlane bump_version
# Bump version code + name
bundle exec fastlane bump_version version_name:"2.0"- Install Shizuku on your device
- Start the Shizuku service via ADB (or via the Shizuku app if rooted)
- Open Gravity Installer → Settings → Installation → Shizuku Backend → grant permission when prompted
- Optional: enable Set install source to pick the installer package name apps will see
- Get a free API key at virustotal.com/gui/my-apikey
- Settings → Security → VirusTotal API Key → paste key
- Every picked APK is hashed and looked up automatically; unknown files can be uploaded on demand from the preview sheet
- Android 11+: grant All files access when prompted (used for
Find automaticdevice scan and for the direct-write OBB path). If you decline, OBB copy falls back to Shizuku or a per-package SAF tree grant - Pre-Android 11: falls back to legacy
READ/WRITE_EXTERNAL_STORAGE - Usage access (optional, Uninstall screen only): grant when you tap the "Last used" sort option — enables sorting and date metadata per row