How to Install Debug and Release Apps Side-by-Side on Android
By Hisham Al Nahas ยท Published on December 30, 2025
When developing a Android or Flutter app, running flutter run usually overwrites the existing installed
version of your app.
This is annoying if you want to keep your "Production/Release" version (with real user data) while testing
new features on a "Debug" version.
By adding a applicationIdSuffix to your build type, Android treats the Debug
version as a completely different app.
1. The Logic
We need to tell Gradle: "If the build type is Debug, add .debug to the package
name."
Original ID: hesham.hcody.az
Debug ID: hesham.hcody.az.debug
2. Kotlin DSL (`build.gradle.kts`)
If your project uses Kotlin DSL (the modern standard), use the code below. This matches the snippet you provided.
android {
// ... existing config ...
defaultConfig {
applicationId = "hesham.hcody.az"
// ...
}
buildTypes {
getByName("debug") {
// Adds a suffix to the App ID, creating a new app instance
applicationIdSuffix = ".debug"
// Optional: Changes the version name so you can spot it easily
versionNameSuffix = "-debug"
}
getByName("release") {
signingConfig = signingConfigs.getByName("release")
}
}
}
3. Groovy DSL (`build.gradle`)
If you are using the older Groovy syntax, the logic is the same but the syntax differs slightly.
android {
// ... existing config ...
defaultConfig {
applicationId "hesham.hcody.az"
// ...
}
buildTypes {
debug {
// No '=' sign in Groovy for these properties
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
}
release {
// Assuming you defined the signing config above
signingConfig signingConfigs.release
}
}
}
Now when you run the app via Android Studio or VS Code, it will install a separate icon named "App Name (Debug)" alongside your original app.