Skip to content
Menu
DevSecOps Now!!!
  • About
  • Certifications
  • Contact
  • Courses
  • DevSecOps Consulting
  • DevSecOps Tools
  • Training
  • Tutorials
DevSecOps Now!!!

Ship Open-Testing Build to Production on Google Play (Flutter)

Posted on August 29, 2025

Limited Time Offer!

For Less Than the Cost of a Starbucks Coffee, Access All DevOpsSchool Videos on YouTube Unlimitedly.
Master DevOps, SRE, DevSecOps Skills!

Enroll Now

What you’re doing (in one line)

You already uploaded 1.8.0 (versionCode 39) to Open testing. You want to publish the same build (or a minor update) to Production. You can’t “move” it; you reuse the same .aab (or upload a new one with a higher versionCode) to create a Production release.


Pre-flight Checklist (do these first)

Project files

  • android/app/src/main/AndroidManifest.xml is valid (see AD_ID note below).
  • android/app/build.gradle has correct applicationId, minSdkVersion, targetSdkVersion, and unique versionCode.

Play Console

  • App content → Data safety, Ads/Monetization, Privacy policy, Content rating are filled.
  • Store listing (title, short+full description, screenshots, icon, feature image) done.
  • App integrity: Play App Signing is set up (recommended).
  • Policy: no unresolved policy issues.

Tip: Take 2 minutes to open Policy → App content and ensure every section has a green check.


Fixing the common “Advertising ID (AD_ID)” error

What is Advertising ID?

A resettable device identifier that ad/analytics SDKs use for personalization, attribution, and fraud prevention.

Why Play Console complains

  • You declared “App uses Advertising ID” in App content, but your app manifest lacks the permission.
  • On Android 13+ (API 33), without the permission, the ID gets zeroed out.

Choose ONE path

A) Your app (or SDKs like AdMob, AppsFlyer, Adjust, some analytics) use Ad ID → Add permission

Copy-paste this outside <application> in AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Advertising ID permission (Android 13+) -->
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" />

    <application
        android:label="professional"
        android:name="${applicationName}"
        android:enableOnBackInvokedCallback="true"
        android:icon="@mipmap/ic_launcher">
        <!-- ... your existing activity/meta-data ... -->
    </application>

    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <data android:mimeType="text/plain"/>
        </intent>
    </queries>
</manifest>

Then rebuild and upload (you must bump versionCode, see Section 4).

B) Your app does NOT use Ad ID → Update declaration

  • Play Console → Policy → App content → Advertising ID
  • Select “No, my app does not use the Advertising ID.”
  • Save. No manifest change needed.

⚠️ If you claim “No” but an SDK reads Ad ID, review may fail. Be honest.


Other frequent Play Console blockers (and fixes)

  1. Duplicate versionCode / “You need to use a different version code”
    • Fix: Increment versionCode in android/app/build.gradle:
    defaultConfig { applicationId "com.professnow.professional" minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode 40 versionName "1.8.1" }
  2. Target API requirement (e.g., must target Android 14 / API 34)
    • Fix: In android/app/build.gradle or android/gradle.properties (Flutter 3.22+), set targetSdkVersion 34.
    • If you use a recent Flutter, flutter.targetSdkVersion usually aligns; otherwise set explicitly.
  3. Data safety form incomplete or mismatched
    • Fix: Fill exactly what SDKs collect/share. If you use Firebase/AdMob/Analytics, include them.
  4. Privacy policy missing (especially if you collect personal data or show ads)
    • Fix: Add a public URL (website/GitHub Pages) that clearly explains data usage.
  5. App signing mismatch
    • Fix: Enable Play App Signing and keep your upload key safe. Don’t change keystores mid-life.
  6. “Release without permission” warning for AD_ID
    • Fix: Either add AD_ID permission (if used) or declare “No” in App content (if not used). Don’t ignore.
  7. Policy rejections (Device/Network abuse, Deceptive behavior, etc.)
    • Fix: Read the rejection email, fix the exact APK behavior, and resubmit.

Build & Upload (Flutter)

# from your Flutter project root
flutter clean
flutter pub get

# (optional) verify Gradle/SDK versions if prompted
# Update versionCode/versionName in android/app/build.gradle FIRST

# Build Play App Bundle (.aab)
flutter build appbundle
# output: build/app/outputs/bundle/release/app-release.aab

Upload the .aab in Play Console during Production → Create new release.


Reusing the Open-Testing AAB for Production

You can reuse the same artifact:

  • Production → Create new release → Reuse app bundle from a previous release → pick 1.8.0 (39)
  • If you changed code/manifest, you must upload a new AAB with a higher versionCode (e.g., 40).

Play Console: Step-by-step to Production

  1. Open app → left nav Release → Production.
  2. Click Create new release.
  3. App bundles:
    • Reuse previous (select 39) or click Upload a new .aab (with versionCode 40+).
  4. Release details:
    • Name (e.g., 1.8.1)
    • Release notes (see template below)
  5. Review release:
    • Fix errors/warnings (AD_ID, Data safety, Target API, etc.).
  6. Start rollout to Production:
    • Choose staged rollout (e.g., 10%) or 100% if confident.
  7. Submit and wait for review.

Copy-paste snippets you’ll likely need

AndroidManifest.xml (with AD_ID)

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" />

    <application
        android:label="professional"
        android:name="${applicationName}"
        android:enableOnBackInvokedCallback="true"
        android:icon="@mipmap/ic_launcher">

        <activity
            android:name="com.professnow.professional.MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:taskAffinity=""
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
                android:name="io.flutter.embedding.android.NormalTheme"
                android:resource="@style/NormalTheme" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>

    <queries>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT"/>
            <data android:mimeType="text/plain"/>
        </intent>
    </queries>
</manifest>

build.gradle (app) – bump version

android {
    defaultConfig {
        applicationId "com.professnow.professional"
        minSdkVersion 21          // match your project needs
        targetSdkVersion 34       // meet Play requirement
        versionCode 40            // increment every upload
        versionName "1.8.1"
    }
    // ...
}

Release notes template (paste in Play Console)

What’s new in 1.8.1
• Stability improvements and minor bug fixes
• Polished onboarding and performance on low-memory devices
• Updated dependencies and compliance (Android 13/14)

Troubleshooting table (quick fixes)

Symptom / ErrorCauseFix
“App uses Advertising ID but permission missing”Declared AD_ID usage but no manifest permissionAdd <uses-permission android:name="com.google.android.gms.permission.AD_ID" /> or declare “No” in App content
“Use a different version code”Same versionCode already usedIncrease versionCode (e.g., 39 → 40)
“Target API level too low”targetSdkVersion < requiredSet targetSdkVersion 34
“Data safety incomplete”Forms not filled accuratelyComplete Data safety with actual SDK usage
“Privacy policy required”Collects data / shows adsProvide a hosted privacy policy URL
“App signing error”Keystore mismatchUse Play App Signing; keep upload key consistent
“Review rejected (policy violation)”Behavior or metadata issuesRead email reason, fix code/content, resubmit
“App not visible to everyone after release”Staged rolloutIncrease rollout % after verifying metrics

Best practices before you click “Submit”

  • Test release build locally: flutter build appbundle then install an APK split or test via Internal testing.
  • Verify deep links, Google Sign-In, in-app updates/billing if used.
  • Keep changelogs short & clear; avoid mentioning internal IDs or sensitive info.
  • Consider staged rollout 10–20% first. Watch ANRs/crashes in Android vitals.

FAQ (fast answers)

Q: Can I move Open testing release to Production directly?
A: No “move” button. Create a new Production release and reuse the same AAB or upload a new one.

Q: Do I need to rebuild if I just add the AD_ID permission?
A: Yes—manifest changes require building a new AAB with a higher versionCode.

Q: I don’t show ads—do I still need AD_ID?
A: No. If no SDK reads Ad ID, set App content → Advertising ID = No and don’t add the permission.

Q: How long does review take?
A: Varies (hours to a few days). First releases or policy-sensitive apps may take longer.


One-page “Do it now” checklist

  • Decide AD_ID path (add permission or declare “No”).
  • Update AndroidManifest.xml (if needed).
  • Bump versionCode (and versionName).
  • flutter clean && flutter pub get && flutter build appbundle.
  • Play Console → Production → Create new release → Upload or Reuse AAB.
  • Fill release notes → Review → Fix errors/warnings.
  • Start staged rollout (10–20%) → Monitor → Rollout to 100%.

Post Views: 710
  • Build to Production on Google Play
  • flutter
  • Google Play Store
  • Open-Testing Build to Production
  • Open-Testing Build to Production on Google Play
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
  • Linux Server Diagnostic Commands: Complete Guide for Performance, Network & System Troubleshooting
  • The Ultimate Guide to CDOM – Certified DataOps Manager Certification
  • The Practical Path to AI Reliability: A Guide to the Certified MLOps Manager
  • Master the Machine Learning Lifecycle:Guide to Becoming a Certified MLOps Architect
  • How to Build a Project-Level AI Memory System That Works Across Codex, Claude, and Other AI Coding Tools
  • Certified MLOps Professional: A Deep Dive into the Certified MLOps Professional Certification
  • Certified MLOps Engineer : The Comprehensive Guide to Mastering Machine Learning Operations
  • Codex vs Claude: A Complete Practical Guide for Modern Developers (2026)
  • Certified AIOps Professional Program A Guide to Career Growth
  • Keycloak Multi-Client Architecture with Project-Based Email Validation (Student, Trainer, Company, Consulting)
  • Incorrect definition of table mysql.column_stats
  • Mautic and PHP 8.3 Compatibility Guide (2026)
  • Certified AIOps Engineer: The Complete Career Path and Certification Guide
  • How to Rename Apache Virtual Host Files Safely (Step-by-Step Guide for Linux)
  • AIOps Foundation Certification: Everything You Need to Know to Get Certified
  • DevOps to Certified Site Reliability Professional: A Senior Mentor’s Guide
  • Certified Site Reliability Manager Training, Preparation, and Career Mapping
  • Certified Site Reliability Architect: The Complete Career Guide
  • What Is a VPN? A Complete Beginner-to-Advanced Tutorial
  • How to Install, Secure, and Tune MySQL 8.4 on Ubuntu 24.04 for Apache Event MPM and PHP-FPM
  • Complete Guide to Certified Site Reliability Engineer Career
  • Certified DevSecOps Professional Step by Step
  • Certified DevSecOps Manager: Complete Career Guide
  • Certified DevSecOps Engineer: Skills, Career Path and Certification Guide
  • Step-by-Step: Become a Certified DevSecOps Architect
  • Tuning PHP 8.3 for Apache Event MPM and PHP-FPM on Ubuntu: A Complete Step-by-Step Production Guide
  • Complete Step-by-Step Guide to Configure Apache Event MPM, Create index.php, Set Up VirtualHost, and Fix Ubuntu Default Page
  • Convert XAMPP Apache to Event MPM + System PHP-FPM
  • The Gateway to System Observability Engineering (MOE)
  • How to Finetune Apache and Prove It Works: A Real-World Guide to Testing Performance, Concurrency, HTTP/2, Memory, CPU, and Security

Recent Comments

  1. emmy day on SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘provider’ in ‘field list’
  2. digital banking on Complete Tutorial: Setting Up Laravel Telescope Correctly (Windows + XAMPP + Custom Domain)
  3. SAHIL DHINGRA on How to Uninstall Xampp from your machine when it is not visible in Control panel programs & Feature ?
  4. Abhishek on MySQL: List of Comprehensive List of approach to secure MySQL servers.
  5. Kristina on Best practices to followed in .httacess to avoid DDOS attack?

Archives

  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • May 2023
  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022

Categories

  • Ai
  • AI Blogging
  • AiOps
  • ajax
  • Android Studio
  • Antimalware
  • Antivirus
  • Apache
  • Api
  • API Security
  • Api Testing
  • APK
  • Aws
  • Bike Rental Services
  • ChatGPT
  • Code Linting
  • Composer
  • cPanel
  • Cyber Threat Intelligence
  • Cybersecurity
  • Data Loss Prevention
  • Database
  • dataops
  • Deception Technology
  • DeepSeek
  • Devops
  • DevSecOps
  • DevTools
  • Digital Asset Management
  • Digital Certificates
  • Docker
  • Drupal
  • emulator
  • Encryption Tools
  • Endpoint Security Tools
  • Error
  • facebook
  • Firewalls
  • Flutter
  • git
  • GITHUB
  • Google Antigravity
  • Google play console
  • Google reCAPTCHA
  • Gradle
  • Guest posting
  • health and fitness
  • IDE
  • Identity and Access Management
  • Incident Response
  • Instagram
  • Intrusion Detection and Prevention Systems
  • jobs
  • Joomla
  • Keycloak
  • Laravel
  • Law News
  • Lawyer Discussion
  • Legal Advice
  • Linkedin
  • Linkedin Api
  • Linux
  • Livewire
  • Mautic
  • Medical Tourism
  • MlOps
  • MobaXterm
  • Mobile Device Management
  • Multi-Factor Authentication
  • MySql
  • Network Traffic Analysis tools
  • Paytm
  • Penetration Testing
  • php
  • PHPMyAdmin
  • Pinterest Api
  • Quora
  • SAST
  • SecOps
  • Secure File Transfer Protocol
  • Security Analytics Tools
  • Security Auditing Tools
  • Security Information and Event Management
  • Seo
  • Server Management Tools
  • Single Sign-On
  • Site Reliability Engineering
  • soft 404
  • software
  • SuiteCRM
  • SysOps
  • Threat Model
  • Twitter
  • Twitter Api
  • ubuntu
  • Uncategorized
  • Virtual Host
  • Virtual Private Networks
  • VPNs
  • Vulnerability Assessment Tools
  • Web Application Firewalls
  • Windows Processor
  • Wordpress
  • WSL (Windows Subsystem for Linux)
  • X.com
  • Xampp
  • Youtube
©2026 DevSecOps Now!!! | WordPress Theme: EcoCoded
wpDiscuz