How to Publish a Kotlin App on Google Play
Kotlin is Google's preferred language for Android development, so publishing a Kotlin app on Google Play is as straightforward as it gets. Whether you're using Jetpack Compose or traditional XML layouts, the build and submission process leverages Android's mature toolchain. This guide covers the complete workflow from generating a signed release build to going live on the Play Store.
Prerequisites
- Android Studio Hedgehog (2023.1) or later
- A Google Play Developer account ($25 one-time fee)
- JDK 17 installed
- Your app targeting API 34+ (compileSdk and targetSdk)
- Your app tested on physical devices and emulators
Step-by-Step Build Process
Configure version in build.gradle.kts
Set `versionCode` (integer, must increment for each upload) and `versionName` (user-facing string like "1.0.0") in your app-level build.gradle.kts. Use a version catalog (libs.versions.toml) for dependency management.
Generate a signing keystore
Use Android Studio: Build > Generate Signed Bundle. It walks you through creating a new keystore with a key alias and passwords. Alternatively, use keytool from the command line. Store the keystore file and credentials securely.
Build a signed App Bundle
In Android Studio, go to Build > Generate Signed Bundle/APK > Android App Bundle. Select the keystore, enter credentials, choose the 'release' build variant. The AAB is generated at app/build/outputs/bundle/release/.
Test the release build
Before uploading, install the release APK on a device: `./gradlew installRelease`. Test all features, deep links, and push notifications in release mode. ProGuard/R8 might strip code that's needed at runtime.
Code Signing & Certificates
App Signing by Google Play
Enroll in Play App Signing when creating your app. Google manages the app signing key securely. You upload with a separate upload key. This provides recovery options if you lose your upload keystore.
Configure signing in Gradle
For CI/CD, configure signing in build.gradle.kts using environment variables: `signingConfigs { create("release") { storeFile = file(System.getenv("KEYSTORE_PATH")) ... } }`. Never hardcode keystore credentials.
Store Submission Steps
Create the app in Play Console
Go to 'All apps' > 'Create app'. Fill in the app name, default language, app type, and pricing. Kotlin apps should use 'Application' unless using a game engine.
Complete the store listing
Write a short description (80 chars) and full description (4000 chars). Upload hi-res icon (512x512), feature graphic (1024x500), and at least 2 phone screenshots. Use Jetpack Compose previews to quickly capture clean screenshots.
Fill in all policy declarations
Complete the content rating questionnaire, target audience declaration, news app declaration (if applicable), COVID-19 declaration (if applicable), data safety form, and government apps declaration.
Upload AAB and roll out
Create a production release, upload the AAB, add release notes, and roll out. For new apps, use internal testing first, then closed testing, then open testing, then production for a safer launch.
Common Rejection Reasons & Fixes
Target SDK too old
Google requires new apps to target the latest API level. Update compileSdk and targetSdk to 34 or later in build.gradle.kts. Test your app with the new API level — behavior changes may break existing functionality.
Data Safety Form discrepancies
Google audits data safety declarations against actual app behavior. Use Android Studio's dependency analyzer to identify all libraries that collect data. Common culprits: Firebase Analytics, Crashlytics, advertising SDKs.
Background location access without justification
If using ACCESS_BACKGROUND_LOCATION, you must demonstrate why your app needs it with a video. Most apps only need ACCESS_FINE_LOCATION with foreground service. Remove background location if not essential.
Accessibility issues
Ensure all interactive elements have content descriptions. Use Jetpack Compose's semantics API: `Modifier.semantics { contentDescription = "..." }`. Run the Accessibility Scanner tool before submitting.
Pro Tips
- Use Baseline Profiles to optimize app startup time — this significantly improves Android Vitals metrics
- Enable R8 full mode in gradle.properties for maximum code shrinking: `android.enableR8.fullMode=true`
- Use Android Studio's App Quality Insights to monitor crashes directly from the IDE
- Implement Material Design 3 (Material You) for dynamic theming on Android 12+
- Set up pre-launch reports in Play Console — Google runs your app on real devices and reports crashes automatically
Skip the hassle. Let us handle it.
Publishing a Kotlin app on the Google Play (Android) involves dozens of steps, certificates, and potential rejection pitfalls. Our team handles the entire process for you — from build configuration to store approval.