How to Publish a .NET MAUI App on Google Play
.NET MAUI simplifies cross-platform development with C# and XAML, and its Android publishing workflow leverages the standard Android build toolchain under the hood. MAUI generates an Android project that compiles to a native app with the .NET runtime embedded. This guide covers the MAUI-specific steps for building a signed Android App Bundle and publishing it on Google Play.
Prerequisites
- Visual Studio 2022 17.8+ with .NET MAUI and Android workloads
- .NET 8+ SDK installed
- A Google Play Developer account ($25 one-time fee)
- Android SDK 33+ installed via Visual Studio
- Your MAUI app tested on Android emulators and devices
Step-by-Step Build Process
Configure project for Android release
In your .csproj file, set ApplicationId, ApplicationDisplayVersion, and ApplicationVersion. Add Android-specific properties: `<AndroidPackageFormat>aab</AndroidPackageFormat>` for App Bundle format required by Google Play.
Create a signing keystore
Use `keytool` to create a keystore: `keytool -genkeypair -v -storetype PKCS12 -keystore myapp.keystore -alias myapp -keyalg RSA -keysize 2048 -validity 10000`. Reference it in your .csproj with `<AndroidSigningKeyStore>`, `<AndroidSigningKeyAlias>`, and password properties.
Publish the release build
Run `dotnet publish -f net8.0-android -c Release`. This compiles C# to native code, processes resources, and generates a signed .aab file. Alternatively, use Visual Studio's Publish wizard (right-click project > Publish > Google Play).
Verify the AAB
Check the output at bin/Release/net8.0-android/publish/. Use bundletool to test locally. The .aab file should be signed with your keystore. Verify with `jarsigner -verify -verbose`.
Code Signing & Certificates
Configure signing in .csproj
Add signing properties inside a Release condition: `<AndroidKeyStore>true</AndroidKeyStore>`, `<AndroidSigningKeyStore>path/to/keystore</AndroidSigningKeyStore>`, along with key alias and passwords. For CI, use environment variables.
Play App Signing enrollment
Enroll during first upload. MAUI apps benefit from Play App Signing just like any Android app. The upload key in your keystore is separate from the app signing key Google manages.
Store Submission Steps
Create app in Play Console
Create a new app with appropriate details. MAUI apps are standard Android apps — no special disclosure about the framework is needed.
Complete store listing
Add descriptions, screenshots from Android devices, and graphics. MAUI apps use native Android controls by default, so screenshots should look natural on Android.
Upload AAB and configure release
Upload to internal testing first. Complete all policy forms: content rating, data safety, target audience. Verify the MAUI runtime doesn't trigger false positives in Google's automated scanning.
Roll out to production
Promote from testing to production. Add release notes. Consider staged rollout for the initial launch.
Common Rejection Reasons & Fixes
Target SDK version too low
Update `<SupportedOSPlatformVersion>` and ensure the Android target framework targets API 34+. MAUI's Android SDK version is configured in the project file, not directly in build.gradle.
Large APK/AAB size
MAUI includes the .NET runtime, increasing app size. Enable linking/trimming: `<PublishTrimmed>true</PublishTrimmed>` and `<AndroidLinkMode>Full</AndroidLinkMode>`. Use R8 code shrinking via `<AndroidEnableR8>true</AndroidEnableR8>`.
Crashes on specific devices
MAUI apps with custom renderers may crash on devices with different Android skins (Samsung One UI, Xiaomi MIUI). Test on the Google Play Console's pre-launch report with real device testing.
Data Safety Form incomplete
MAUI apps using HttpClient, Preferences, or SecureStorage collect/store data. The .NET runtime may phone home for telemetry — check your NuGet packages for data collection behavior.
Pro Tips
- Enable R8 and linking together for maximum APK size reduction — this can reduce size by 40-60%
- Use Android-specific styling with OnPlatform in XAML for a Material Design look
- Test startup performance — the .NET runtime adds cold start overhead on Android
- Consider using Mono AOT instead of JIT for release builds: `<AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>` for better startup time
- Use the Android manifest merger to remove unused permissions added by NuGet packages
Skip the hassle. Let us handle it.
Publishing a .NET MAUI 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.