Back to .md Directory

Release Playbook

Guides an Android developer through building, signing, and releasing an app to Google Play, including versioning, ProGuard, and rollback steps.

May 2, 2026
0 downloads
0 views
View source

What 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

AndroidKotlinGradleProGuardGoogle Play Consolebundletool

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

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 release
  • 1.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%)

  1. Play Console β†’ Production β†’ Active release
  2. Click "Halt rollout"
  3. Fix bug locally
  4. Build new release with patch
  5. Upload new version

Option 2: Rollback to Previous Version

  1. Play Console β†’ Production β†’ Releases
  2. Select previous stable version
  3. Click "Roll back to this version"
  4. 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:

  1. Create hotfix branch:

    git checkout -b hotfix/1.2.1 v1.2.0
    
  2. Fix bug and test thoroughly:

    # Make changes
    git commit -m "fix: resolve crash on Android 14"
    
  3. Increment patch version:

    versionCode = 10201  // Was 10200
    versionName = "1.2.1"
    
  4. Build and upload immediately:

    ./gradlew bundleRelease
    # Upload to Play Console
    
  5. Expedited review:

    • Contact Google Play Support if urgent
    • Explain critical nature of fix
    • Request expedited review
  6. 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:

  1. Crashes & ANRs:

    • Android Vitals β†’ Crashes
    • Target: <0.5% crash rate
    • Action: Investigate top crashes immediately
  2. Ratings & Reviews:

    • User reviews (filter by star rating)
    • Action: Respond to 1-2 star reviews within 48 hours
  3. Installation Analytics:

    • Install/uninstall rate
    • Device compatibility issues
    • Target: <10% uninstall rate
  4. 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


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.jks with your own keystore filename
  • Replace com.lamontlabs.quantravision with your app's package name
  • Replace support@lamontlabs.com with your support email
  • Replace Lamont Labs with 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