Release Playbook
Guides an Android developer through building, signing, and releasing an app to Google Play, including versioning, ProGuard, and rollback steps.
View sourceWhat this file does
Guides an Android developer through building, signing, and releasing an app to Google Play, including versioning, ProGuard, and rollback steps.
When to use it
- Preparing a production release of an Android app
- Setting up signing configuration for the first time
- Defining a repeatable release process for a team
- Documenting emergency rollback and hotfix procedures
Assumes this stack
Release Playbook
QuantraVision Android Application Release Guide
This document provides comprehensive instructions for building, signing, and releasing QuantraVision to production.
π Table of Contents
- Version Numbering
- Build Types
- Pre-Release Checklist
- Build Instructions
- Signing Configuration
- ProGuard Configuration
- APK/AAB Generation
- Google Play Console Upload
- Rollback Procedures
- Post-Release Monitoring
π¦ Version Numbering
QuantraVision follows Semantic Versioning 2.0.0:
MAJOR.MINOR.PATCH
Version Components
- MAJOR: Incompatible API changes or major feature releases
- MINOR: Backward-compatible new features or significant enhancements
- PATCH: Backward-compatible bug fixes or minor improvements
Examples
1.0.0- Initial production release1.1.0- Added geometric pattern detection (new feature)1.1.1- Fixed memory leak in pattern cache (bug fix)2.0.0- Complete UI redesign (breaking change)
Version Code
Android versionCode must increment sequentially for each release:
// app/build.gradle.kts
android {
defaultConfig {
versionCode = 10 // Increment by 1 for each release
versionName = "1.2.3"
}
}
Formula: versionCode = (MAJOR * 10000) + (MINOR * 100) + PATCH
- Version 1.0.0 β versionCode 10000
- Version 1.2.3 β versionCode 10203
- Version 2.0.0 β versionCode 20000
π¨ Build Types
Debug Build
Purpose: Development and testing
Configuration:
buildTypes {
getByName("debug") {
applicationIdSuffix = ".debug"
isDebuggable = true
isMinifyEnabled = false
isShrinkResources = false
}
}
Features:
- Debuggable via Android Studio
- No code obfuscation
- Larger APK size
- Debug signing certificate (auto-generated)
Release Build
Purpose: Production distribution via Google Play
Configuration:
buildTypes {
getByName("release") {
isDebuggable = false
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
}
}
Features:
- Code obfuscation via ProGuard/R8
- Resource shrinking (smaller APK)
- Release signing certificate (production key)
- Not debuggable
β Pre-Release Checklist
Complete all items before building a release:
Code Quality
- All unit tests passing (
./gradlew test) - All instrumentation tests passing (
./gradlew connectedAndroidTest) - Lint checks passing with no critical warnings (
./gradlew lint) - Code coverage β₯80% for business logic
- No TODO/FIXME comments in production code
- No debug logging or print statements
- ProGuard rules tested and validated
Documentation
- CHANGELOG.md updated with release notes
- Version numbers updated in
build.gradle.kts - README.md reflects latest features
- All public APIs have KDoc comments
- SECURITY.md updated if applicable
Security
- No hardcoded API keys or secrets
- All secrets stored in Android Keystore or secure config
- Permissions justified and documented
- Security audit completed (if major release)
- Third-party dependencies scanned for vulnerabilities
Functional Testing
- Manual testing on physical device (Samsung S23 FE or similar)
- Pattern detection accuracy validated (β₯60% on test dataset)
- Billing flow tested (all tiers: FREE, STARTER, PRO)
- Cloud narration tested (quota limits, fallback behavior)
- Offline mode tested (no network required for FREE tier)
- Performance benchmarks met (2-4 FPS scan rate)
Legal & Compliance
- Privacy policy updated (if data collection changes)
- Terms of use reviewed
- Apache-2.0 license headers on all source files
- Third-party licenses documented in app
π οΈ Build Instructions
Prerequisites
Required:
- Android Studio Ladybug (2024.2.1+)
- JDK 17
- Gradle 8.7+ (included via wrapper)
- Release keystore file (
quantravision-release.jks) - Keystore password and key alias
Debug Build
# Clean previous builds
./gradlew clean
# Build debug APK
./gradlew assembleDebug
# Output: app/build/outputs/apk/debug/app-debug.apk
Release Build
# Clean previous builds
./gradlew clean
# Build release APK (requires signing configuration)
./gradlew assembleRelease
# Output: app/build/outputs/apk/release/app-release.apk
Android App Bundle (AAB)
Recommended for Google Play uploads (smaller download size):
# Build release AAB
./gradlew bundleRelease
# Output: app/build/outputs/bundle/release/app-release.aab
π Signing Configuration
Generate Release Keystore
First-time setup only:
keytool -genkey -v \
-keystore quantravision-release.jks \
-keyalg RSA \
-keysize 4096 \
-validity 25000 \
-alias quantravision-key
Enter information:
- Keystore password: [SECURE PASSWORD - STORE IN PASSWORD MANAGER]
- Key password: [SECURE PASSWORD - SAME OR DIFFERENT]
- Name: Lamont Labs
- Organization: Lamont Labs
- City/State/Country: Your location
β οΈ CRITICAL: Backup keystore file to secure location (password manager, encrypted backup). If lost, you cannot update the app on Google Play.
Configure Signing in build.gradle.kts
Option 1: Environment Variables (Recommended for CI/CD)
// app/build.gradle.kts
android {
signingConfigs {
create("release") {
storeFile = file(System.getenv("QUANTRA_KEYSTORE_PATH") ?: "quantravision-release.jks")
storePassword = System.getenv("QUANTRA_KEYSTORE_PASSWORD")
keyAlias = System.getenv("QUANTRA_KEY_ALIAS")
keyPassword = System.getenv("QUANTRA_KEY_PASSWORD")
}
}
buildTypes {
getByName("release") {
signingConfig = signingConfigs.getByName("release")
}
}
}
Set environment variables:
export QUANTRA_KEYSTORE_PATH=/path/to/quantravision-release.jks
export QUANTRA_KEYSTORE_PASSWORD=your_keystore_password
export QUANTRA_KEY_ALIAS=quantravision-key
export QUANTRA_KEY_PASSWORD=your_key_password
Option 2: keystore.properties File (Local Development)
Create keystore.properties (DO NOT commit to Git):
storeFile=/path/to/quantravision-release.jks
storePassword=your_keystore_password
keyAlias=quantravision-key
keyPassword=your_key_password
Add to .gitignore:
keystore.properties
*.jks
*.keystore
Load in build.gradle.kts:
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
android {
signingConfigs {
create("release") {
storeFile = file(keystoreProperties["storeFile"] ?: "")
storePassword = keystoreProperties["storePassword"] as String?
keyAlias = keystoreProperties["keyAlias"] as String?
keyPassword = keystoreProperties["keyPassword"] as String?
}
}
}
π‘οΈ ProGuard Configuration
ProGuard/R8 obfuscates code and removes unused code to reduce APK size.
Location
app/proguard-rules.pro
Standard Configuration
# ===================================
# QuantraVision ProGuard Rules
# Version: 1.0
# Last Updated: November 24, 2025
# ===================================
# ===================================
# STANDARD ANDROID RULES
# ===================================
# Keep Android framework classes
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
# Keep Jetpack Compose
-keep class androidx.compose.** { *; }
-keep class kotlin.Metadata { *; }
# Keep Kotlin Coroutines
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembers class kotlinx.coroutines.** {
volatile <fields>;
}
# ===================================
# QUANTRAVISION-SPECIFIC RULES
# ===================================
# Keep all Apex Protocol classes (used via reflection)
-keep class com.lamontlabs.quantravision.apex.** { *; }
-keepclassmembers class com.lamontlabs.quantravision.apex.** {
<fields>;
<methods>;
}
# Keep billing classes (Google Play Billing API)
-keep class com.lamontlabs.quantravision.billing.** { *; }
-keep class com.android.billingclient.** { *; }
# Keep Room database entities and DAOs
-keep class com.lamontlabs.quantravision.data.** { *; }
-keepclassmembers class com.lamontlabs.quantravision.data.** {
<fields>;
}
# Keep ML models (TensorFlow Lite, OpenCV)
-keep class org.tensorflow.lite.** { *; }
-keep class org.opencv.** { *; }
# Keep Cloud Narration API models (JSON serialization)
-keep class com.lamontlabs.quantravision.cloud.** { *; }
-keepclassmembers class com.lamontlabs.quantravision.cloud.** {
<fields>;
}
# ===================================
# OPTIMIZATION SETTINGS
# ===================================
# Enable aggressive optimization
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
# Optimization options
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# ===================================
# OBFUSCATION SETTINGS
# ===================================
# Keep source file names and line numbers for crash reports
-keepattributes SourceFile,LineNumberTable
# Keep generic signatures for reflection
-keepattributes Signature
# Keep annotations
-keepattributes *Annotation*
# ===================================
# WARNINGS SUPPRESSION
# ===================================
# Suppress warnings for missing classes (third-party libraries)
-dontwarn org.tensorflow.**
-dontwarn org.opencv.**
-dontwarn okhttp3.**
-dontwarn okio.**
Testing ProGuard Rules
1. Build release APK:
./gradlew assembleRelease
2. Install and test on device:
adb install app/build/outputs/apk/release/app-release.apk
3. Test all features:
- Pattern detection
- Billing flow
- Cloud narration
- Settings
- Database operations
4. Check for ProGuard-related crashes:
adb logcat | grep -E "(ProGuard|R8|StackTrace)"
5. Add rules if needed:
If a feature breaks, add specific -keep rules for affected classes.
π¦ APK/AAB Generation
APK (Android Package)
Use case: Direct installation, testing, internal distribution
./gradlew assembleRelease
Output: app/build/outputs/apk/release/app-release.apk
Size: ~30-50 MB (includes all architectures and densities)
AAB (Android App Bundle)
Use case: Google Play Store uploads (recommended)
./gradlew bundleRelease
Output: app/build/outputs/bundle/release/app-release.aab
Advantages:
- Smaller downloads (Google Play generates optimized APKs per device)
- Supports Dynamic Feature Modules
- Required for apps >150 MB
Size: ~25-35 MB (before Play Store optimization)
Universal APK from AAB
Generate a universal APK from AAB for testing:
bundletool build-apks \
--bundle=app/build/outputs/bundle/release/app-release.aab \
--output=app-release.apks \
--mode=universal
unzip app-release.apks -d apks/
# Install: adb install apks/universal.apk
π Google Play Console Upload
Prerequisites
- Google Play Developer account ($25 one-time fee)
- App listing created in Play Console
- Release build (AAB) ready
- All store assets prepared (screenshots, descriptions, icon)
Upload Steps
1. Login to Google Play Console: https://play.google.com/console/
2. Select QuantraVision app: Navigate to your app from the app list
3. Create new release:
- Production β Create new release
- Or: Internal testing / Closed testing / Open testing
4. Upload AAB:
- Drag and drop
app-release.aab - Or click "Upload" and select file
5. Release notes:
Version 1.2.0 - November 24, 2025
New Features:
- Added geometric pattern detection for improved accuracy
- Cloud narration with GPT-4 integration (PRO tier)
Improvements:
- Optimized pattern detection speed (2x faster)
- Reduced memory usage by 30%
Bug Fixes:
- Fixed crash on Android 14 devices
- Resolved billing synchronization issue
6. Review and rollout:
- Review app content
- Set rollout percentage (100% for full release, or phased rollout: 10% β 50% β 100%)
- Click "Start rollout to production"
Rollout Timeline
- Review: 1-3 days (Google's automated + manual review)
- Staged rollout: Control exposure (10% β 50% β 100% over days)
- Full availability: 24-48 hours after approval
π Rollback Procedures
Emergency Rollback
If critical bug discovered post-release:
Option 1: Halt Rollout (Before 100%)
- Play Console β Production β Active release
- Click "Halt rollout"
- Fix bug locally
- Build new release with patch
- Upload new version
Option 2: Rollback to Previous Version
- Play Console β Production β Releases
- Select previous stable version
- Click "Roll back to this version"
- Confirm rollback
β οΈ Limitations:
- Cannot roll back to version with lower
versionCode - All users will need to update to previous version
- May take 24-48 hours to propagate
Hotfix Process
For critical bugs:
-
Create hotfix branch:
git checkout -b hotfix/1.2.1 v1.2.0 -
Fix bug and test thoroughly:
# Make changes git commit -m "fix: resolve crash on Android 14" -
Increment patch version:
versionCode = 10201 // Was 10200 versionName = "1.2.1" -
Build and upload immediately:
./gradlew bundleRelease # Upload to Play Console -
Expedited review:
- Contact Google Play Support if urgent
- Explain critical nature of fix
- Request expedited review
-
Merge to main:
git checkout main git merge hotfix/1.2.1 git tag v1.2.1 git push origin main --tags
π Post-Release Monitoring
Metrics to Monitor
Play Console Dashboards:
-
Crashes & ANRs:
- Android Vitals β Crashes
- Target: <0.5% crash rate
- Action: Investigate top crashes immediately
-
Ratings & Reviews:
- User reviews (filter by star rating)
- Action: Respond to 1-2 star reviews within 48 hours
-
Installation Analytics:
- Install/uninstall rate
- Device compatibility issues
- Target: <10% uninstall rate
-
Performance Metrics:
- App startup time (target: <2 seconds)
- Battery usage (target: <5% per hour active use)
- Network usage (target: <1 MB/day for FREE tier)
Internal Monitoring
GitHub Actions CI/CD:
- Monitor build status
- Review test failures
User Support:
- Monitor support emails (support@lamontlabs.com)
- Track common issues in issue tracker
- Create FAQ based on recurring questions
π Additional Resources
- Google Play Console: https://play.google.com/console/
- Android Publishing Guide: https://developer.android.com/studio/publish
- ProGuard Manual: https://www.guardsquare.com/manual/home
- Bundletool Documentation: https://developer.android.com/studio/command-line/bundletool
Last Updated: November 24, 2025
Maintainer: Lamont Labs
Contact: support@lamontlabs.com
What's inside
10 sections covering versioning, build types, checklist, build commands, signing, ProGuard, APK/AAB generation, Play Console upload, rollback, and monitoring
Change this for your project
- Replace
quantravision-release.jkswith your own keystore filename - Replace
com.lamontlabs.quantravisionwith your app's package name - Replace
support@lamontlabs.comwith your support email - Replace
Lamont Labswith your organization name
Where it goes
Keep it in your repository where the agent or team that needs it will read it.
Worth borrowing
- Checklist-driven pre-release process with code quality, security, and legal items
- Two-option signing configuration (env vars for CI, properties file for local dev) with.gitignore guidance
- Structured hotfix branch workflow with version bump and expedited review request
Related Documents
Video/Content Producer
Defines a video/content producer role with script structures, hook formulas, storyboard templates, and platform-specific formats for short-form and long-form video production.
Media Handling Playbook - ZyeutΓ© v3
Documents upload, storage, optimization, delivery, and edge-case handling for images, videos, and audio in a social app.
Visual Truth Engine: Product-Market Fit & Go-to-Market Strategy
Outlines a product-market fit strategy and go-to-market plan for a B2B SaaS tool that automates proof asset creation for video creators.
Devin Triage Playbook
Defines a 7-phase automated triage playbook for Devin to analyze alerts, find root causes, implement fixes, and notify teams.