Android - Qa-apk | No Password
Release builds send crashes to Firebase or Sentry. QA builds should do that plus save the last 10 crashes to internal storage.
Invest the two hours to set up the qa build variant today. Your testers will stop pinging you on Slack every five minutes, and your release nights will be far less chaotic.
| Question | How QA APK Answers It | | :--- | :--- | | What server am I hitting? | A colored status bar or a badge on the splash screen. | | Why is this API failing? | An on-screen network log (Chucker/Stetho). | | What is the current feature flag state? | A toggle in the debug drawer. | | Did the app crash last night? | A "Crash History" screen accessible from the launcher. | | What version of the code is this? | Display Git SHA and build timestamp in "About" screen. | Stop testing blind. Stop using debug builds for final verification. The QA APK is your team's best tool for catching the bugs that only appear when Proguard is on, on a specific API environment, with no USB cable attached. Android - QA-APK
Your testers shouldn't need adb to see what's happening. Implement a drawer using a library like Slidr or build a simple overlay service.
Enter the : The specialized build variant designed to bridge the gap between developer productivity and real-world release validation. Release builds send crashes to Firebase or Sentry
// In your app/build.gradle.kts android flavorDimensions += "environment" productFlavors create("dev") dimension = "environment" applicationIdSuffix = ".dev" versionNameSuffix = "-dev" buildConfigField("String", "API_URL", "\"https://dev.api.example.com\"") create("qa") dimension = "environment" applicationIdSuffix = ".qa" versionNameSuffix = "-qa" buildConfigField("String", "API_URL", "\"https://qa.api.example.com\"") // Mimic release behavior: Minify but keep debuggable isMinifyEnabled = true isShrinkResources = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") create("prod") dimension = "environment" isMinifyEnabled = true buildConfigField("String", "API_URL", "\"https://api.example.com\"") buildTypes getByName("debug") // For developers only applicationIdSuffix = ".debug" isDebuggable = true getByName("release") isDebuggable = false isMinifyEnabled = true create("qa") initWith(getByName("release")) // Start from release config isDebuggable = true // But allow debugging isMinifyEnabled = true // Test proguard rules! signingConfig = signingConfigs.getByName("debug") // Easy install matchingFallbacks += listOf("release")
// Inside your QA Application class if (BuildConfig.FLAVOR == "qa") FloatingDebugView.show(context).apply addAction("Copy Logs") copyRecentLogs() addAction("Mock GPS: NYC") mockLocationService.set(40.7128, -74.0060) addAction("Crash Test") throw RuntimeException("Manual crash triggered by QA") setNetworkInterceptor request, response -> // Log to a local database Your testers will stop pinging you on Slack
The problem isn’t your testing skills; it’s the build type. Relying on standard debug builds for QA or, worse, release builds is a recipe for frustration.