AppDockStore deployment guides

This guide is reference only — AppDock does not automate Play Console, signing bundles, or device QA. Wide tables scroll horizontally on narrow viewports.

🤖 Google Play Store Deployment Checklist

Flutter / React Native / Native Android — 2026 Edition

Last updated: April 2026 | Reflects Google Play's latest API requirements (Target SDK 35 mandatory; Android 16 / API 36 required from August 31, 2026)


Legend

TagMeaning
🔴 [BLOCKER]App will be rejected / removed without this
🟠 [MANDATORY]Required by policy — violation leads to enforcement
🟡 [RECOMMENDED]Best practice; impacts ranking, discoverability, or UX
🟢 [OPTIONAL]Nice to have

Phase 1 — Developer Account & Identity

1.1 Google Play Console Account

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
1.1.1Google Play Developer Account registered[ ]🔴 BLOCKERAccount enrollment at play.google.com/console$25 one-time fee. Payment via credit/debit card. Account verification requires valid Google account + payment profile. Takes 48–72h for new accounts to activate.✅ Yes
1.1.2Identity verification completed[ ]🔴 BLOCKERID upload + formGoogle may require identity verification (government ID). Required for new accounts and some policy-sensitive categories.✅ Yes
1.1.3Two-Factor Authentication enabled[ ]🔴 BLOCKERAccount security settingMust be enabled on the Google account used for Play Console.✅ Yes
1.1.4Google Play payment profile linked[ ]🟠 MANDATORYGoogle Payments ConsoleRequired even for free apps. Must be completed before submitting any app to production.✅ Yes
1.1.5Tax information submitted[ ]🟠 MANDATORY (if paid)Tax forms in Payments profileRequired before collecting any revenue. Country-specific forms (W-8, W-9, etc.).Conditional
1.1.6Banking / payout details added[ ]🟠 MANDATORY (if paid)Bank account form in PaymentsRequired to receive revenue payouts. Verification can take 3–5 business days.Conditional

1.2 App Identity

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
1.2.1App name (Play Console)[ ]🔴 BLOCKERText inputMax 50 characters (Play Console store listing name — differs from launcher icon name). No excessive punctuation. No promotional phrases ("Best!", "#1"). No keyword-stuffing.✅ Yes
1.2.2App launcher name (home screen)[ ]🔴 BLOCKERapp_name string resource / AndroidManifestMax 30 characters. Shown under app icon on device. Keep short and recognizable.✅ Yes
1.2.3Application ID / Package Name[ ]🔴 BLOCKERapplicationId in build.gradleReverse-domain format: com.company.appname. Lowercase, alphanumeric + .. Cannot be changed after first submission.✅ Yes
1.2.4App Type (App or Game)[ ]🔴 BLOCKERRadio select in Play ConsoleSet at app creation. Cannot be changed easily later. Affects category options and review process.✅ Yes
1.2.5Primary App Category[ ]🔴 BLOCKERDropdownSelect from Google's category list. Affects discoverability.✅ Yes
1.2.6Free or Paid[ ]🔴 BLOCKERRadio selectSet at creation. Cannot convert free app to paid after publishing. Paid → free conversion is allowed.✅ Yes
1.2.7Default language[ ]🔴 BLOCKERDropdownPrimary language for store listing. Additional locales can be added.✅ Yes

1.3 Team & Access

#ItemStatusSeverityNotesMandatory?
1.3.1User roles / permissions configured[ ]🟡 RECOMMENDEDPlay Console supports Admin, Release Manager, Developer roles. Invite team with least-privilege access.Recommended
1.3.2Emergency contact for review questions[ ]🟡 RECOMMENDEDGoogle may email during review. Monitor the account owner's Gmail closely.Recommended

Phase 2 — Technical Build Requirements

2.1 Target API Level (Critical 2026 Deadlines)

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.1.1targetSdkVersion = 35 (Android 15) for current submissions[ ]🔴 BLOCKERbuild.gradletargetSdk 35From August 31, 2025: all new apps and updates must target API 35. Apps below API 34 become invisible to users on newer Android versions.✅ Yes
2.1.2targetSdkVersion = 36 (Android 16) from August 31, 2026[ ]🔴 BLOCKERbuild.gradletargetSdk 36From August 31, 2026: new apps and updates must target Android 16 (API 36). Plan migration now.✅ Yes (Aug 2026)
2.1.3compileSdk matches or exceeds targetSdk[ ]🔴 BLOCKERbuild.gradlecompileSdk must be ≥ targetSdk. Use same value or higher.✅ Yes
2.1.4minSdkVersion set appropriately[ ]🟠 MANDATORYbuild.gradleminSdkMin recommended: API 26 (Android 8.0). Lower = more devices but more maintenance. Cannot be higher than targetSdk.✅ Yes
2.1.564-bit architecture (ARM64) supported[ ]🔴 BLOCKERABI split configARM64-v8a required. Flutter handles this automatically. No 32-bit-only apps.✅ Yes
2.1.616KB memory page size support (Android 15+)[ ]🟠 MANDATORYNative library compilationRequired for Android 15 compatibility. NDK apps must recompile native libraries. Flutter apps: check plugins that use native code.✅ Yes

2.2 App Bundle & Build Format

#ItemStatusSeverityField TypeNotesMandatory?
2.2.1Android App Bundle (.aab) format used[ ]🔴 BLOCKERBuild artifactAPK NOT accepted for new apps since August 2021. Must be .aab file. Flutter: flutter build appbundle --release/build/app/outputs/bundle/release/app-release.aab✅ Yes
2.2.2Release build tested on real device[ ]🔴 BLOCKERQA testingDebug builds behave differently. Always test the release AAB via internal testing track on real physical device.✅ Yes
2.2.3App does not crash on launch[ ]🔴 BLOCKERQA / Pre-launch reportGoogle runs automated launch tests. Crash on startup = immediate rejection.✅ Yes

2.3 Signing & Keystores

#ItemStatusSeverityField TypeNotesMandatory?
2.3.1Upload keystore (.jks / .keystore) generated[ ]🔴 BLOCKERFile generated via keytoolRSA key, 2048 bits minimum. Command: keytool -genkey -v -keystore upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload✅ Yes
2.3.2Keystore alias, store password, key password recorded[ ]🔴 BLOCKERkey.properties file (gitignored)All three values required for every release build. Store in password manager. Never commit to Git.✅ Yes
2.3.3Keystore backed up securely in multiple locations[ ]🔴 BLOCKERFile backupLosing keystore = can never update app. Must publish as new app with new package name. Store in: password manager + encrypted cloud backup + offline secure location.✅ Yes
2.3.4Play App Signing enrolled[ ]🟡 RECOMMENDEDPlay Console → App Integrity → Play App SigningStrongly recommended for new apps. Google manages the app signing key. Your upload key is separate. If you lose upload key, Google can reset it. Opt in during first release.Recommended
2.3.5Signing config in build.gradle (not hardcoded)[ ]🔴 BLOCKERkey.properties + build.gradle referenceReference key.properties file. Never hardcode passwords in build.gradle. key.properties must be in .gitignore.✅ Yes
2.3.6Release build signed (not debug keystore)[ ]🔴 BLOCKERBuild validationUploading a debug-signed AAB = instant rejection: "You uploaded an APK or app bundle that was signed in debug mode."✅ Yes

2.4 AndroidManifest & Permissions

#ItemStatusSeverityField TypeNotesMandatory?
2.4.1Only required permissions declared[ ]🔴 BLOCKERAndroidManifest.xmlReviewers compare declared permissions vs actual app functionality. Extra permissions = rejection.✅ Yes
2.4.2INTERNET permission[ ]🟠 MANDATORY (if networking)<uses-permission android:name="android.permission.INTERNET"/>Required for any network calls.Conditional
2.4.3ACCESS_NETWORK_STATE[ ]🟢 OPTIONALAndroidManifest.xmlFor checking connectivity before network requests.No
2.4.4CAMERA permission[ ]🔴 BLOCKER (if used)<uses-permission android:name="android.permission.CAMERA"/>Must justify use. Core functionality only.Conditional
2.4.5ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION[ ]🔴 BLOCKER (if used)AndroidManifest.xmlBackground location (ACCESS_BACKGROUND_LOCATION) requires separate Declaration Form submission in Play Console.Conditional
2.4.6READ_CONTACTS / WRITE_CONTACTS[ ]🔴 BLOCKER (if used)AndroidManifest.xmlSensitive permission — requires Declaration Form in Play Console. Must be essential to core functionality.Conditional
2.4.7READ_SMS / RECEIVE_SMS / SEND_SMS[ ]🔴 BLOCKER (if used)AndroidManifest.xmlRestricted permission. Requires Declaration Form + explicit approval from Google Play policy team.Conditional
2.4.8CALL_LOG / READ_CALL_LOG[ ]🔴 BLOCKER (if used)AndroidManifest.xmlRestricted permission. Requires Declaration Form. Very rarely approved.Conditional
2.4.9USE_BIOMETRIC / USE_FINGERPRINT[ ]🟠 MANDATORY (if used)AndroidManifest.xmlStandard biometric permission. No special declaration needed.Conditional
2.4.10POST_NOTIFICATIONS (Android 13+)[ ]🟠 MANDATORY (if push)<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>Required to show notifications on Android 13+. Must request at runtime.Conditional
2.4.11Health permissions (Android 16 granular)[ ]🟠 MANDATORY (if health)New granular android.permission.health.* permissionsNew 2026 (Android 16): Granular health permissions replacing old BODY_SENSORS. Use new specific permissions (heart rate, SpO₂, skin temperature etc.).Conditional
2.4.12Runtime permission requests implemented[ ]🟠 MANDATORYCode + UIDangerous permissions must be requested at runtime with clear rationale. Never request on app start without context.✅ Yes
2.4.13android:usesCleartextTraffic="false"[ ]🟡 RECOMMENDEDAndroidManifest.xmlSet false to block plain HTTP. Use Network Security Config for any exceptions.Recommended

2.5 Versioning

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.5.1versionCode set and incremented[ ]🔴 BLOCKERbuild.gradleversionCodeInteger. Must increment with EVERY upload. Cannot reuse a version code. Start at 1. Cannot be 0 or negative.✅ Yes
2.5.2versionName set[ ]🟠 MANDATORYbuild.gradleversionNameHuman-readable string, e.g. "1.0.0". Shown in Play Console. Not used for ordering (that's versionCode).✅ Yes
2.5.3pubspec.yaml version matches (Flutter)[ ]🔴 BLOCKERversion: 1.0.0+1+1 maps to versionCode. Must match build.gradle values.✅ Yes (Flutter)

2.6 Flutter-Specific Requirements

#ItemStatusSeverityNotesMandatory?
2.6.1Flutter 3.38+ (or latest stable)[ ]🟡 RECOMMENDEDEnsure latest stable Flutter SDK for best compatibility and bug fixes. Run flutter upgrade.Recommended
2.6.2flutter_launcher_icons configured[ ]🟠 MANDATORYRun flutter pub run flutter_launcher_icons. All icon variants generated including adaptive icon.✅ Yes
2.6.3Adaptive icon foreground + background layers[ ]🟠 MANDATORYRequired for Android 8.0+. Foreground: 108×108dp. Background: solid color or image. Configured in flutter_launcher_icons config.✅ Yes
2.6.4flutter_native_splash configured[ ]🟡 RECOMMENDEDConsistent launch experience. Prevents white/black flash on startup.Recommended
2.6.5Production flavor/scheme configured[ ]🟡 RECOMMENDEDSeparate prod flavor with production API URLs, Firebase project, RevenueCat keys. Prevents dev config leaking into production.Recommended
2.6.6flutter build appbundle --release tested[ ]🔴 BLOCKERMust test the actual release artifact. Debug differs significantly.✅ Yes
2.6.7Flutter obfuscation enabled[ ]🟡 RECOMMENDEDflutter build appbundle --release --obfuscate --split-debug-info=build/app/outputs/symbols. Save symbols for crash symbolication.Recommended
2.6.8ProGuard/R8 rules configured (if code shrinking)[ ]🟡 RECOMMENDEDPrevents crashes from minification. Keep rules for Gson, Retrofit, etc.Recommended
2.6.9Platform channels tested on release build[ ]🟠 MANDATORYNative method channels behave differently in release mode. Test all MethodChannel calls.✅ Yes
2.6.10All dependencies on stable channel[ ]🟡 RECOMMENDEDAvoid pre-release packages in production builds.Recommended

Phase 3 — Store Listing Assets

3.1 App Icons

#ItemStatusSeverityDimensionsFile SpecsMandatory?
3.1.1Store listing icon[ ]🔴 BLOCKER512 × 512 pxPNG. No alpha/transparency. No rounded corners (Google applies mask). ≤ 1024 KB.✅ Yes
3.1.2Adaptive icon — foreground layer[ ]🟠 MANDATORY108 × 108 dp (432 × 432 px @4x)PNG with transparency allowed. Subject matter in center 72dp safe zone.✅ Yes
3.1.3Adaptive icon — background layer[ ]🟠 MANDATORY108 × 108 dpSolid color or image. No transparency.✅ Yes
3.1.4Monochrome / themed icon (Android 13+)[ ]🟢 OPTIONALSame as foregroundSingle-color silhouette. Used for themed icon support on Android 13+.No

3.2 Screenshots

#ItemStatusSeverityDimensionsFile SpecsMandatory?
3.2.1Phone screenshots[ ]🔴 BLOCKERMin: 320px shortest side. Max: 3840px on any side. Recommended: 1080 × 1920 px or 1080 × 2160 pxJPEG or PNG. Max 8MB per image. 16:9 or 9:16 aspect ratio. Minimum 2, maximum 8.✅ Yes
3.2.27-inch tablet screenshots[ ]🟡 RECOMMENDED1024 × 600 px minimumRequired to show tablet UI if app targets tablets. Same file specs as phone.Recommended
3.2.310-inch tablet screenshots[ ]🟡 RECOMMENDED1280 × 800 px minimumAdditional tablet size. Same file specs.Recommended
3.2.4Chromebook screenshots[ ]🟢 OPTIONAL1280 × 800 pxOnly if targeting Chromebook / large-screen optimization.No
3.2.5Wear OS screenshots[ ]🟢 OPTIONAL384 × 384 px (round)Only if app has a Wear OS component.Conditional
3.2.6Android TV screenshots[ ]🟢 OPTIONAL1280 × 720 pxOnly if app supports Android TV.Conditional

Screenshot Content Rules:

  • Must show actual app functionality — no fictitious/mockup screenshots
  • No pricing information or promotional language
  • No user testimonials or fabricated reviews
  • No misleading imagery that implies features not present
  • Screenshots from actual device or emulator (not design tool mockups)
  • First 2–3 screenshots are the most critical for conversion

3.3 Feature Graphic & Promo Video

#ItemStatusSeveritySpecsNotesMandatory?
3.3.1Feature graphic[ ]🟠 MANDATORY1024 × 500 px, JPEG or PNG, max 1MBRequired when promo video is present. Shown as banner in store. Even without video, highly recommended for promotional placement eligibility.Recommended
3.3.2Promo video[ ]🟢 OPTIONALYouTube URL. Public or unlisted. 30 seconds – 2 minutes. Up to 3 videos.Must demonstrate actual app functionality. Cannot be a generic company ad.No

3.4 Text Metadata

#ItemStatusSeverityCharacter LimitNotesMandatory?
3.4.1App Title (Store listing name)[ ]🔴 BLOCKERMax 50 charactersShown in Play Store search results and listing page. Include primary keyword naturally. No ALL CAPS titles. No excessive punctuation. No promotional superlatives ("Best", "Free", "#1").✅ Yes
3.4.2Short Description[ ]🔴 BLOCKERMax 80 charactersShown in search results under app name. First impression copy. Must accurately describe app. No keyword spam.✅ Yes
3.4.3Full Description[ ]🔴 BLOCKERMax 4000 charactersHTML-like formatting supported (bold: <b>, italic: <i>, line break: <br>). Keyword-rich. Must match actual app functionality. No references to competitor apps or platforms (e.g. "also on iOS").✅ Yes
3.4.4What's New / Release Notes[ ]🟠 MANDATORYMax 500 charactersRequired for every update submission. Describe what changed. Plain text only.✅ Yes (updates)
3.4.5Tags[ ]🟢 OPTIONALMax 5 tagsHelps discoverability. Select from Google's predefined tag list.No
3.4.6Contact Email[ ]🔴 BLOCKERValid email addressPublicly displayed on store listing. Must be monitored. Required for all apps.✅ Yes
3.4.7Privacy Policy URL[ ]🔴 BLOCKER (required if sensitive data)Valid URLMust be a live web page (not PDF, not geofenced). Must match Data Safety declarations.✅ Yes
3.4.8Website URL[ ]🟢 OPTIONALValid URLOptional but builds trust.No
3.4.9Phone Number[ ]🟢 OPTIONALValid phoneOptional support contact.No

Note: Google Play has no dedicated keywords field. Keyword optimization depends entirely on placement within Title, Short Description, and Full Description.


Phase 4 — App Content Section (Policy Declarations)

All items in the App Content section must be completed before publishing. Located in Play Console → Policy → App Content.

4.1 Privacy Policy

#ItemStatusSeverityNotesMandatory?
4.1.1Privacy policy URL entered in Play Console[ ]🔴 BLOCKERRequired for all apps that access sensitive permissions OR any personal/device data. Strongly recommended for ALL apps.✅ Yes
4.1.2Privacy policy hosted on accessible, non-geofenced HTTPS URL[ ]🔴 BLOCKERMust load in all regions. No PDF. No login walls. No geographic blocks.✅ Yes
4.1.3Privacy policy accessible from within the app[ ]🟠 MANDATORYIn-app link (Settings → Privacy Policy or footer). Both Play Console link AND in-app link required.✅ Yes
4.1.4Privacy policy non-editable / stable URL[ ]🟠 MANDATORYGoogle warns against editable documents (Google Docs). Use a hosted webpage or service like Termly/iubenda.✅ Yes
4.1.5Privacy policy includes: data collected[ ]🔴 BLOCKERAll data types collected (name, email, location, device ID, usage data, etc.)✅ Yes
4.1.6Privacy policy includes: third-party data sharing[ ]🔴 BLOCKERAll third parties (Firebase, Crashlytics, RevenueCat, ads SDKs, etc.)✅ Yes
4.1.7Privacy policy includes: data retention + deletion[ ]🟠 MANDATORYHow long data is kept and how users can request deletion.✅ Yes
4.1.8Privacy policy includes: user rights[ ]🟠 MANDATORYAccess, correction, deletion rights (GDPR/CCPA). Contact info for privacy inquiries.✅ Yes
4.1.9Privacy policy includes: security practices[ ]🟠 MANDATORYEncryption in transit, storage security.✅ Yes
4.1.10Privacy policy labeled clearly[ ]🟠 MANDATORYTitle must include "Privacy Policy" — not "Terms" or "Legal".✅ Yes

4.2 Data Safety Section

#ItemStatusSeverityInput TypeNotesMandatory?
4.2.1Data Safety form completed[ ]🔴 BLOCKERMulti-step questionnaire in Play Console → App Content → Data safetyRequired for ALL apps since July 2022. Incomplete = blocked from publishing. Takes 30–60 minutes to complete properly.✅ Yes
4.2.2Data collection types declared[ ]🔴 BLOCKERChecklist (location, personal info, financial, health, contacts, photos, files, app activity, device info, etc.)Declare EVERY data type your app AND its SDKs collect. Google audits for inconsistencies.✅ Yes
4.2.3Data sharing with third parties declared[ ]🔴 BLOCKERCheckbox per data typeAny data passed to third-party SDKs counts as "sharing" — even if just analytics.✅ Yes
4.2.4Data usage purposes declared[ ]🟠 MANDATORYCheckbox (app functionality, analytics, advertising, fraud prevention, etc.)Must justify why each data type is collected.✅ Yes
4.2.5Data encryption in transit declared[ ]🟠 MANDATORYYes/No toggleStandard HTTPS = "Yes".✅ Yes
4.2.6Data deletion on request declared[ ]🟠 MANDATORYYes/No toggle + URLMust state whether users can request data deletion. Link to account deletion page.✅ Yes
4.2.7Data Safety consistent with privacy policy[ ]🔴 BLOCKERCross-checkInconsistency between Data Safety form and privacy policy or actual app behavior = enforcement action / suspension.✅ Yes
4.2.8Third-party SDK data practices included[ ]🟠 MANDATORYPer-SDK auditYou are responsible for disclosing data collected by ALL SDKs (Firebase, Crashlytics, AdMob, RevenueCat, etc.). Check each SDK's Data Safety documentation.✅ Yes

4.3 App Access (Login Requirements)

#ItemStatusSeverityInput TypeNotesMandatory?
4.3.1App access declaration completed[ ]🔴 BLOCKERRadio: "All functionality available" vs "Some functionality is restricted"If login required, must provide demo credentials or instructions for reviewer.✅ Yes
4.3.2Demo login credentials provided[ ]🔴 BLOCKER (if login required)Username + Password fieldsReviewer must access all app features. Account cannot be restricted. Must be a working account at time of review.Conditional
4.3.3Demo account instructions provided[ ]🟡 RECOMMENDEDText notesStep-by-step access instructions if app flow is non-obvious.Recommended

4.4 Content Rating (IARC)

#ItemStatusSeverityInput TypeNotesMandatory?
4.4.1Content rating questionnaire completed[ ]🔴 BLOCKERIARC multi-question formGoogle requires IARC rating. Cannot publish without it. Questionnaire asks about: violence, sexual content, profanity, controlled substances, gambling, user interaction. Takes ~5 minutes. Ratings issued within minutes of completion.✅ Yes
4.4.2Questionnaire answered accurately[ ]🔴 BLOCKERAccuracy checkMisrepresentation can result in app removal or account suspension. When in doubt, err on the side of disclosure.✅ Yes
4.4.3Rating applies to app content only[ ]🟠 MANDATORYPolicy noteThe questionnaire covers only app content — not ads, not privacy practices. Ads content must not be more mature than app content.✅ Yes

4.5 Target Audience & Content

#ItemStatusSeverityInput TypeNotesMandatory?
4.5.1Target age group declared[ ]🔴 BLOCKERCheckboxes: Under 13 / 13–17 / 18+ / MixedCritical. Apps targeting under-13 face strict Families Policy requirements. Cannot have behavioral advertising.✅ Yes
4.5.2"Store presence" age group appeal set[ ]🟠 MANDATORYDetermines icon/screenshot appeal rulesIf audience includes under-13, store listing assets must be appropriate for children.✅ Yes
4.5.3Families Policy compliance (if targeting children)[ ]🔴 BLOCKERPolicy checklistNo third-party behavioral advertising. No tracking. Limited data collection. No social features allowing child-to-stranger contact. Families Program approval required.Conditional

4.6 Ads Declaration

#ItemStatusSeverityInput TypeNotesMandatory?
4.6.1Ads declaration answered[ ]🔴 BLOCKERYes/No toggleMust declare whether app contains ads. Store badge "Contains ads" shown. Required.✅ Yes
4.6.2Ad placement policy compliant[ ]🟠 MANDATORYPolicy reviewNo ads on launch/splash screens. No interstitials on app start. No ads interfering with navigation. No ads in apps targeting children.✅ Yes (if ads)
4.6.3GDPR consent for ads (EU)[ ]🟠 MANDATORYUMP / CMP implementationUse Google's User Messaging Platform or equivalent Consent Management Platform.✅ Yes (EU + ads)
4.6.4ATT equivalent for ads (if applicable)[ ]🟠 MANDATORYGDPR consent + contextual fallbackAndroid doesn't have ATT but requires GDPR consent for personalized ads in EU.Conditional

4.7 Account Deletion

#ItemStatusSeverityNotesMandatory?
4.7.1In-app account deletion implemented[ ]🔴 BLOCKERRequired for all apps that support account creation. Must be in-app — not "email us." Must delete account + all associated data.✅ Yes (if accounts)
4.7.2Account deletion URL submitted in Play Console[ ]🔴 BLOCKERURL field in App ContentLink to deletion page (web or in-app deep link). Required in Play Console.
4.7.3Temporary deactivation ≠ deletion[ ]🟠 MANDATORYPolicy noteDisabling or "freezing" account does not satisfy the policy. Full permanent deletion required.
4.7.4Data retention exceptions documented[ ]🟠 MANDATORYPrivacy policy clauseIf retaining some data post-deletion (fraud prevention, legal), must disclose this in privacy policy.

4.8 Special Declarations (Conditional)

#ItemStatusSeverityNotesMandatory?
4.8.1Background location declaration[ ]🔴 BLOCKER (if used)Separate Declaration Form + justificationBackground location permission requires strong justification. Most use cases rejected. Submit via Play Console Declaration Form.
4.8.2SMS / Call log permission Declaration Form[ ]🔴 BLOCKER (if used)Declaration Form + approvalRequires explicit approval from Google. Very limited to specific app types (SMS/dialer defaults).
4.8.3Financial services declaration[ ]🔴 BLOCKER (if applicable)Declaration + documentationPersonal loans, investment, crypto, insurance apps — special requirements per region. Pakistan: limited exceptions for short-term loans.
4.8.4Health app declaration[ ]🔴 BLOCKER (if applicable)Declaration formHealth & Fitness apps — special requirements for medical apps.
4.8.5News & Magazines declaration[ ]🔴 BLOCKER (if applicable)Declaration formNews category apps must complete News & Magazines declaration. Deadline: August 27, 2025 for existing apps.
4.8.6Government app declaration[ ]🔴 BLOCKER (if applicable)Declaration formApps created by or for government entities.
4.8.7AI-Generated Content policy compliance[ ]🟠 MANDATORY (if AI)Policy reviewApps using generative AI must follow Google's AI-Generated Content policy. Best practices for safeguarding genAI apps. AI misuse under increased review scrutiny in 2026.

Phase 5 — Legal & Compliance

5.1 Google Play Policies

#ItemStatusSeverityNotesMandatory?
5.1.1Developer Program Policy reviewed (Jan 28, 2026 version)[ ]🟠 MANDATORYReview full policy at support.google.com/googleplay/android-developer.✅ Yes
5.1.2No deceptive behavior[ ]🔴 BLOCKERNo misleading descriptions, fake reviews, artificial ratings, impersonation of other apps.✅ Yes
5.1.3No malware / unauthorized data access[ ]🔴 BLOCKERApp must not transmit user data without knowledge. No background data exfiltration.✅ Yes
5.1.4Intellectual property rights respected[ ]🔴 BLOCKERDo not use third-party trademarks, logos, copyrighted assets without permission. If you have permission, document it and contact Play team in advance.✅ Yes
5.1.5User-generated content moderation (if UGC)[ ]🟠 MANDATORYReporting, blocking, and moderation features required for apps with user-generated content.Conditional
5.1.6Google Play Billing for all digital goods[ ]🔴 BLOCKERAll digital in-app purchases MUST use Google Play Billing. Cannot bypass with third-party payment for in-app digital content. Physical goods/services are exempt.✅ Yes (if IAP)
5.1.7Sensitive events policy[ ]🟠 MANDATORYCannot exploit natural disasters, crises, pandemics for profit.✅ Yes

5.2 Regulatory Compliance

#ItemStatusSeverityNotesMandatory?
5.2.1GDPR compliance (EU users)[ ]🟠 MANDATORYConsent management, data subject rights (access, deletion, portability), DPA contact.✅ Yes
5.2.2CCPA compliance (California users)[ ]🟠 MANDATORY"Do Not Sell My Personal Information" option if applicable.Conditional
5.2.3COPPA compliance (under-13 users)[ ]🔴 BLOCKERNo behavioral advertising. Parental consent. Limited data collection.Conditional
5.2.4HIPAA compliance (US health data)[ ]🔴 BLOCKER (if health)If handling US protected health information.Conditional
5.2.5Country availability configured[ ]🟡 RECOMMENDEDReview Play Console → Setup → Countries/Regions. Default may not include all desired markets. Check for restricted countries.Recommended

Phase 6 — Monetization Setup

6.1 Google Play Billing (In-App Purchases)

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
6.1.1Products created in Play Console[ ]🔴 BLOCKERPlay Console → Monetize → Products → In-app productsProduct ID (alphanumeric + _ + .), Product name, Description, Price. Must be published before app goes live.✅ Yes (if IAP)
6.1.2Product IDs match app code exactly[ ]🔴 BLOCKERText stringCase-sensitive. Cannot be changed after creation. Cannot be deleted once used (only deactivated). Max 150 chars.✅ Yes (if IAP)
6.1.3Consumable vs non-consumable type set[ ]🔴 BLOCKERDropdown at product creationAffects purchase logic. Managed product (non-consumable) vs consumable. Cannot be changed.✅ Yes (if IAP)
6.1.4Google Play Billing Library (latest version) integrated[ ]🔴 BLOCKERGradle dependencyMust use latest Play Billing Library. Old versions deprecated.✅ Yes (if IAP)
6.1.5new monetization.subscriptions API used (new apps)[ ]🟠 MANDATORYPlay Billing Library v5+New apps should use the new subscriptions API. Old subscriptions API being phased out.✅ Yes (if subscriptions)
6.1.6License testing configured[ ]🟡 RECOMMENDEDPlay Console → License TestingTest accounts for testing IAP without real charges. Add Gmail address of tester.Recommended

6.2 Subscriptions

#ItemStatusSeverityNotesMandatory?
6.2.1Subscription products created in Play Console[ ]🔴 BLOCKERUnder Monetize → Subscriptions. Product ID, Base plans, Offers.✅ Yes (if sub)
6.2.2Base plans configured[ ]🔴 BLOCKERMonthly / Annual / Weekly. Price, billing period, trial period.✅ Yes (if sub)
6.2.3Free trial configured (if offered)[ ]🟠 MANDATORYDuration: 3 days, 1 week, 2 weeks, 1 month, etc. Grace period.Conditional
6.2.4Subscription terms clearly shown in-app[ ]🔴 BLOCKERPrice, duration, and auto-renewal must be shown before purchase. No hidden renewal terms.✅ Yes (if sub)
6.2.5Cancellation instructions accessible[ ]🟠 MANDATORYLink to Google Play subscription management or in-app instructions.✅ Yes (if sub)
6.2.6Grace period enabled[ ]🟡 RECOMMENDEDKeeps user access during failed payment retry window.Recommended
6.2.7Subscription status checked on app launch[ ]🟠 MANDATORYCheck entitlement via Play Billing / RevenueCat on every launch. Don't cache indefinitely.✅ Yes (if sub)
6.2.8RevenueCat integration tested (if using)[ ]🟠 MANDATORYFull purchase → entitlement unlock → restore flow tested.Conditional

6.3 Pricing

#ItemStatusSeverityNotesMandatory?
6.3.1App price set (if paid)[ ]🟠 MANDATORYPlay Console price tiers. Auto-converts to local currencies.Conditional
6.3.2Regional pricing reviewed[ ]🟡 RECOMMENDEDConsider lower prices for emerging markets (Pakistan, India, etc.).Recommended
6.3.3Google's 15–30% commission factored in[ ]🟡 RECOMMENDED30% standard. 15% for subscriptions after year 1. Certain categories may have different rates.Recommended

Phase 7 — Testing & QA Gates

7.1 Functional Testing

#ItemStatusSeverityNotesMandatory?
7.1.1App launches without crash[ ]🔴 BLOCKERCold start on multiple real devices. Google runs automated launch tests.✅ Yes
7.1.2Core user flows tested end-to-end[ ]🔴 BLOCKERAll primary screens, happy paths.✅ Yes
7.1.3Offline behavior handled gracefully[ ]🟠 MANDATORYNo unhandled exceptions. Clear error messages.✅ Yes
7.1.4Permission denial handled[ ]🟠 MANDATORYApp must not crash when any permission is denied. Show rationale UI.✅ Yes
7.1.5Background / foreground transitions[ ]🟠 MANDATORYNo state loss or crashes when app is backgrounded.✅ Yes
7.1.6Push notifications tested (FCM)[ ]🟠 MANDATORY (if used)Foreground, background, and killed-state notification handling.Conditional
7.1.7Deep links / App Links tested[ ]🟠 MANDATORY (if used)Test from browser, messaging apps. Test /.well-known/assetlinks.json for verified App Links.Conditional
7.1.8Logout / login cycle[ ]🟠 MANDATORY (if auth)All cached data and session tokens cleared properly.Conditional
7.1.9Account deletion flow tested[ ]🔴 BLOCKER (if accounts)Full flow: in-app delete → backend purge → confirmation.Conditional
7.1.10IAP sandbox purchase tested[ ]🔴 BLOCKER (if IAP)Full purchase → receipt → entitlement → restore flow with test account.Conditional
7.1.11Back navigation follows Android conventions[ ]🟠 MANDATORYSystem back button / gesture must work correctly. No crash on back press.✅ Yes
7.1.12Edge-to-edge display handling (Android 15+)[ ]🟠 MANDATORYAndroid 15 enforces edge-to-edge by default. App must handle system bar insets. Use WindowInsetsController.✅ Yes

7.2 Device Coverage

#ItemStatusSeverityNotesMandatory?
7.2.1Tested on min SDK device[ ]🟠 MANDATORYReal device or emulator at minSdkVersion.✅ Yes
7.2.2Tested on latest Android version (15/16)[ ]🟠 MANDATORYCatch API changes and deprecated behavior.✅ Yes
7.2.3Tested on small screen (5")[ ]🟡 RECOMMENDEDLayout must not overflow or clip.Recommended
7.2.4Tested on large screen / tablet[ ]🟡 RECOMMENDEDRequired if app declares tablet support or targets large screens.Conditional
7.2.5Tested on foldable (Android 16 orientation policy)[ ]🟡 RECOMMENDEDAndroid 16 enforces app resizability. Apps targeting API 36 cannot opt out of adaptive layout.Recommended
7.2.6Tested on low-end device[ ]🟡 RECOMMENDEDPerformance on entry-level Android (1–2GB RAM).Recommended
7.2.7Dark mode tested[ ]🟡 RECOMMENDEDApp should not break in dark mode.Recommended

7.3 Performance

#ItemStatusSeverityNotesMandatory?
7.3.1Release build profiled (not debug)[ ]🟠 MANDATORYAlways profile release build. Debug is significantly slower. Use Android Profiler.✅ Yes
7.3.2App startup time < 3 seconds (cold start)[ ]🟡 RECOMMENDEDMeasure cold start. Over 3s risks user abandonment and Android Vitals penalties.Recommended
7.3.3ANR (Application Not Responding) rate monitored[ ]🟠 MANDATORYNo blocking operations on main thread. ANR rate monitored in Android Vitals.✅ Yes
7.3.4App size optimized[ ]🟡 RECOMMENDEDAAB + Dynamic Delivery handles this automatically. Flutter: use --split-per-abi for APKs. Target < 50MB download size.Recommended
7.3.5Memory leaks checked[ ]🟡 RECOMMENDEDUse Android Studio Memory Profiler or LeakCanary.Recommended

7.4 Security

#ItemStatusSeverityNotesMandatory?
7.4.1API keys not hardcoded in code[ ]🔴 BLOCKERUse local.properties / environment variables / remote config. Never commit to Git.✅ Yes
7.4.2HTTPS enforced for all network calls[ ]🟠 MANDATORYandroid:usesCleartextTraffic="false" in manifest. Network Security Config for exceptions.✅ Yes
7.4.3Auth tokens stored in EncryptedSharedPreferences / Keystore[ ]🟠 MANDATORYUse Android Keystore API or flutter_secure_storage. Not plain SharedPreferences.✅ Yes (if auth)
7.4.4Play Integrity API integrated[ ]🟡 RECOMMENDEDReplacing deprecated SafetyNet. Use Play Integrity API for device integrity checks. Important for financial/auth apps.Recommended
7.4.5Sensitive data not logged in release[ ]🟠 MANDATORYRemove all Log.d() / print() statements that output PII or tokens in release builds.✅ Yes
7.4.6SQL injection protection[ ]🟠 MANDATORY (if local DB)Use parameterized queries. Never concatenate user input into SQL.Conditional
7.4.7Obfuscation / ProGuard enabled[ ]🟡 RECOMMENDEDHarder to reverse-engineer. Keep mapping files for crash symbolication.Recommended

7.5 Testing Tracks

#ItemStatusSeverityNotesMandatory?
7.5.1Internal testing track used first[ ]🟠 MANDATORYUpload AAB to internal testing track FIRST. Reviews complete in hours (not days). Catches issues before production.✅ Yes
7.5.2Closed testing (alpha) track[ ]🟡 RECOMMENDEDReal user feedback before public launch. Requires email list or Google Group of testers.Recommended
7.5.3Open testing (beta) track[ ]🟡 RECOMMENDEDPublic beta. Gather feedback at scale before full launch.Recommended
7.5.4Pre-launch report reviewed[ ]🟡 RECOMMENDEDGoogle runs automated tests on Firebase Test Lab devices. Shows crashes, ANRs, accessibility issues. Review before promoting to production.Recommended
7.5.5Firebase Crashlytics active during testing[ ]🟠 MANDATORYKnow about crashes before users report them. Configure before internal testing.✅ Yes

Phase 8 — Submission & Review

8.1 Play Console — Pre-Submission Checklist

#ItemStatusSeverityNotesMandatory?
8.1.1AAB uploaded to correct track[ ]🔴 BLOCKERInternal → Closed → Open → Production. Don't skip straight to production.✅ Yes
8.1.2All store listing fields completed[ ]🔴 BLOCKERPlay Console will block publishing if any required field is missing. Check Dashboard checklist.✅ Yes
8.1.3All App Content sections completed[ ]🔴 BLOCKERData Safety, Content Rating, Target Audience, Ads, App Access must all be in "Completed" state.✅ Yes
8.1.4Countries / regions selected[ ]🔴 BLOCKERDefault may be limited. Explicitly select all target countries.✅ Yes
8.1.5Release notes (What's New) written[ ]🟠 MANDATORYRequired for every release. Max 500 chars.✅ Yes
8.1.6Staged rollout configured[ ]🟡 RECOMMENDEDRoll out 10% → 20% → 50% → 100%. Can halt rollout if crash spike detected. Applies to production releases.Recommended
8.1.7Android Vitals baseline noted[ ]🟡 RECOMMENDEDNote pre-launch crash rate / ANR rate targets so you have a baseline for comparison after launch.Recommended

8.2 Review Timeline

PhaseTypical Duration
Internal testing trackHours (usually < 2h)
Closed / Open testing tracks1–3 days
New app — production review3–7 days (stricter scrutiny for new accounts)
App update — production review1–3 days (established accounts)
Policy violation appeal3–7 days
Staged rollout completeUp to 7 days at your discretion

8.3 Common Rejection Reasons (2026)

#ReasonHow to Avoid
R1App crashes on launchTest release AAB on real device via internal track first. Check Pre-Launch Report.
R2Targeting outdated SDK (below API 35)Update targetSdk to 35 in build.gradle. Plan migration to API 36 before Aug 31, 2026.
R3APK uploaded instead of AABAlways use flutter build appbundle. Check file extension is .aab.
R4Privacy policy missing or URL brokenHost policy on live webpage. Test URL from different network / incognito.
R5Data Safety inconsistent with actual behaviorAudit all SDKs. Cross-check form answers vs code behavior.
R6Permissions not justified / excessiveRemove all unused permissions. Add justification in-app for each.
R7Using third-party billing for digital goodsDigital in-app purchases must use Google Play Billing.
R8App targets children but has behavioral adsEither remove ads or apply for Families Policy approval.
R9Subscription terms not disclosed before purchaseShow price + duration + auto-renewal before purchase confirmation.
R10No account deletion for apps with accountsImplement in-app deletion + submit URL in Play Console App Content.
R11Misleading store listing (screenshots/description)Screenshots must match actual app. Description must match actual functionality.
R12AI-generated content not disclosedFollow Google's AI-Generated Content policy. Disclose AI usage.
R13Demo account not provided for restricted appAlways add working demo credentials in App Access section.
R14New health permissions not implemented (Android 16)Update to granular android.permission.health.* permissions for body sensor data.

8.4 Post-Rejection Process

#ItemStatusNotes
P1Read rejection notice carefullyUsually specific. Address exactly what's stated in the Policy Status page.
P2Respond via Play Console Policy StatusCan submit an appeal or provide context before resubmitting.
P3Fix all mentioned issues + full auditFix explicit issue AND audit for similar problems.
P4Do not resubmit unchangedWastes review time, signals disregard for policy.

Phase 9 — Post-Launch

9.1 Monitoring

#ItemStatusSeverityNotesMandatory?
9.1.1Crashlytics / Sentry active and receiving events[ ]🟠 MANDATORYMonitor from day 1. Set crash rate alert thresholds.✅ Yes
9.1.2Android Vitals monitored in Play Console[ ]🟠 MANDATORYCrash rate, ANR rate, battery usage, startup time. Google uses these for store ranking. Apps with poor vitals may be penalized in search.✅ Yes
9.1.3Firebase Analytics / Mixpanel configured[ ]🟡 RECOMMENDEDTrack key user events, funnel metrics, retention.Recommended
9.1.4Alerts for crash rate spikes[ ]🟡 RECOMMENDEDKnow before users flood your reviews. Integrate with Slack/PagerDuty if critical app.Recommended

9.2 Support Infrastructure

#ItemStatusSeverityNotesMandatory?
9.2.1Support email actively monitored[ ]🟠 MANDATORYPublicly listed on store. Google may contact here during policy issues.✅ Yes
9.2.2Support / website URL live[ ]🟠 MANDATORYMust remain live. Dead URLs can trigger policy enforcement.✅ Yes
9.2.3In-app review prompt implemented[ ]🟡 RECOMMENDEDGoogle Play In-App Review API (in_app_review Flutter package). Prompt after positive user action. Never on app launch. Never in exchange for rewards.Recommended
9.2.4Respond to Play Store reviews[ ]🟡 RECOMMENDEDEspecially negative reviews. Shows care. Can improve ratings. Never offer incentives for reviews.Recommended

9.3 Legal Ongoing

#ItemStatusSeverityNotesMandatory?
9.3.1Privacy policy kept up to date[ ]🟠 MANDATORYUpdate whenever data practices change.✅ Yes
9.3.2Data Safety form kept accurate[ ]🟠 MANDATORYUpdate when app adds new data collection. Inconsistency = enforcement.✅ Yes
9.3.3GDPR data deletion requests handled[ ]🟠 MANDATORYProcess within 30 days of request.✅ Yes
9.3.4Developer Program Policy changes tracked[ ]🟡 RECOMMENDEDGoogle updates policies regularly. Subscribe to Play Console email notifications.Recommended

9.4 Update Cadence

#ItemStatusSeverityNotesMandatory?
9.4.1versionCode incremented for every upload[ ]🔴 BLOCKERCannot reuse version codes. Even test uploads consume a version code.✅ Yes
9.4.2Target SDK deadline tracked[ ]🔴 BLOCKERAugust 31, 2026: all submissions must target Android 16 (API 36). Mark calendar now.✅ Yes
9.4.3Force update mechanism[ ]🟢 OPTIONALFirebase Remote Config can enforce minimum app version for breaking API changes.No
9.4.4Store Listing Experiments (A/B testing)[ ]🟢 OPTIONALPlay Console → Grow → Store listing experiments. Test different icons, screenshots, descriptions.No

Quick Summary — Top 10 Android Blockers in 2026

1.  Target API 35 now; plan migration to API 36 before August 31, 2026
2.  AAB format ONLY — no APK for new apps or updates
3.  Data Safety form completed accurately (matches ALL SDK behavior)
4.  Privacy policy on live HTTPS webpage — not PDF, not Google Doc
5.  All App Content sections completed (Content Rating, Target Audience, Ads, App Access)
6.  Upload keystore backed up in 3+ locations — losing it = losing the app
7.  Play App Signing enrolled for new apps
8.  In-app account deletion + URL submitted in Play Console (if accounts exist)
9.  Google Play Billing for all digital goods — no third-party payment bypass
10. Demo credentials provided for any login-required app

Flutter Android Build Commands Reference

# Build release AAB (required for Play Store)
flutter build appbundle --release

# Build with obfuscation (recommended)
flutter build appbundle --release --obfuscate --split-debug-info=build/app/outputs/symbols

# Check target SDK in build.gradle
android {
  compileSdk 35
  defaultConfig {
    targetSdk 35
    minSdk 26
    versionCode 1
    versionName "1.0.0"
  }
}

# key.properties (gitignored)
storePassword=YOUR_STORE_PASSWORD
keyPassword=YOUR_KEY_PASSWORD
keyAlias=upload
storeFile=/path/to/upload-keystore.jks

Reference sources: Google Play Developer Program Policy (effective Jan 28, 2026), Google Play Console Help Center, Android Developers Documentation, Google Play Target API Level Policy, Play App Signing Documentation — April 2026