Vibeloy
إنشاء حساب

دليل نشر مجاني

Android (Google Play) Publishing Guide

يشرح هذا الدليل، في 12 خطوة، العملية الكاملة لنشر تطبيق Android الخاص بك المبني بـ Flutter أو React Native على Google Play من البداية إلى النهاية. اقرأ كل سطر دون الحاجة إلى حساب، ثم سجّل عندما تريد حفظ تقدمك.

الانتقال إلى دليل iOS

هذا الدليل متاح للجميع

يمكنك قراءة جميع الخطوات دون إنشاء حساب. سجّل مجانًا لحفظ تقدمك واستخدام أداتَي سياسة الخصوصية وapp-ads.txt بشكل كامل؛ يُفتح خزنة Keystore واستوديو لقطات الشاشة في الخطة المميزة.

سجّل مجانًا

الخطوة 1

Creating a Google Play Developer Account

Opening a developer account on Play Console requires a one-time 25 USD fee and identity verification; the personal vs. organization choice determines many restrictions later on.

Register at play.google.com/console with a Google account. A one-time 25 USD account fee is charged at signup; it does not recur annually and is non-refundable even if the account is later closed.

  • Personal account: for individual developers; requires ID + address verification. Personal accounts created after November 13, 2023 must satisfy a closed-testing requirement before production access.
  • Organization account: registered to a company; requires a D-U-N-S number or legal business registration, verification can take longer but there is no closed-testing requirement.
If identity verification is rejected, the account can be suspended; make sure documents (ID, proof of address, bank statement) are current and clearly scanned.
If you plan to publish as a team on Vibeloy, opening an organization account from the start avoids ownership transfer headaches later.

الخطوة 2

App Identity: applicationId, Versioning and Icon

The applicationId can never be changed once published; finalize versionCode/versionName and the icon at this stage.

The applicationId in android/app/build.gradle.kts is your app's permanent identity on the Play Store (e.g. com.vibeloy.myapp). It cannot be changed after publishing — changing it means creating a brand-new listing with zero reviews and installs.

  • Use reverse-domain notation (com.company.app), do not start with a digit, avoid special characters other than underscore.
  • versionCode is a monotonically increasing integer (each aab must be unique and higher than the previous one); versionName is the user-facing string like "1.2.0".
  • In pubspec.yaml, version: 1.0.0+1 carries versionName+versionCode together.

Generating the Android icon set with flutter_launcher_icons in one command

yaml
dev_dependencies:
  flutter_launcher_icons: ^0.14.1

flutter_launcher_icons:
  android: true
  image_path: "assets/icon/icon.png"
  min_sdk_android: 21
bash
dart run flutter_launcher_icons
Changing applicationId later also resets your existing publishing history in Vibeloy; choose carefully the first time.

الخطوة 3

Generating the Upload Keystore

Generate the upload keystore that will sign your app using keytool and store its passwords securely; losing it means you can never update the same app again.

Google Play requires every AAB you upload to be signed with an "upload key". You generate this key with the standard keytool command documented in Flutter's official docs.

Upload keystore generation command (Flutter official docs)

bash
keytool -genkey -v -keystore ~/upload-keystore.jks \
  -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 \
  -alias upload
  • The -storetype JKS flag matters: keytool defaults to PKCS12 since Java 9; without it, the file would have a .jks extension but actually contain PKCS12 data.
  • On Windows, run flutter doctor -v and find the "Java binary at:" line in its output to confirm which JDK is in use; keytool lives in that directory's bin folder. Adjust the -keystore path to your own user directory.
  • Store the requested store password and key password in a password manager; these same passwords will also go into key.properties.
Losing this file and its passwords is still a serious risk: because your first AAB upload automatically enrolls you in Play App Signing, losing the upload key later means you can request a key reset from Play Console; permanent loss only applies to (older) apps distributed without ever enrolling in Play App Signing — in that case you would have to start over with a new applicationId. Do not skip the backup.
The Vibeloy Vault tool (premium) stores your keystore file and passwords end-to-end encrypted, accessible securely from any device.

تتوفر أداة Vibeloy في هذه الخطوة

سجّل مجانًا لاستخدام أداة خزنة Keystore وحفظ تقدمك.

سجّل واستخدمها

الخطوة 4

Configuring Gradle Signing

Wire the keystore info into build.gradle.kts via key.properties using Kotlin DSL, and make the release build type signed.

Create a file named key.properties inside android/ (this file must never be committed to git — add it to .gitignore).

android/key.properties contents

properties
storePassword=<store-şifreniz>
keyPassword=<key-şifreniz>
keyAlias=upload
storeFile=/Users/kullanici/upload-keystore.jks

android/app/build.gradle.kts — current Kotlin DSL pattern

kotlin
import java.util.Properties
import java.io.FileInputStream

val keystoreProperties = Properties()
val keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
    // ... namespace, compileSdk, defaultConfig ...

    signingConfigs {
        create("release") {
            keyAlias = keystoreProperties["keyAlias"] as String
            keyPassword = keystoreProperties["keyPassword"] as String
            storeFile = keystoreProperties["storeFile"]?.let { file(it) }
            storePassword = keystoreProperties["storePassword"] as String
        }
    }

    buildTypes {
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
            isMinifyEnabled = true
            isShrinkResources = true
        }
    }
}
When isMinifyEnabled=true (R8) is on, packages relying on reflection (some plugins) may break; never upload a release APK/AAB to the store without testing on a real device first, and add keep rules to proguard-rules.pro if needed.

الخطوة 5

Building the App Bundle (AAB)

The Play Store now only accepts the .aab format; produce an optimized package with flutter build appbundle --release.

bash
flutter build appbundle --release

The output file is created at build/app/outputs/bundle/release/app-release.aab. You upload this file directly to Play Console; since Play App Signing is active, Google adds its own distribution signature on top.

Before every new upload, remember to increment the versionCode part after the + sign in pubspec.yaml's version field; otherwise Play Console rejects the upload.

Code obfuscation and splitting debug symbols (optional, recommended)

bash
flutter build appbundle --release \
  --obfuscate \
  --split-debug-info=build/app/outputs/symbols
Keep the symbol files produced by --split-debug-info; you need them to de-obfuscate stack traces in crash reports (e.g. Play Console's Android vitals).

تابع تقدمك، وأنشئ سياسة الخصوصية وملف app-ads.txt الخاصين بك

سجّل في Vibeloy مجانًا وأدر عملية إطلاق تطبيقك بالكامل على Android وiOS من مكان واحد. الاستضافة، واستوديو لقطات الشاشة، وخزنة Keystore بانتظارك في الخطة المميزة.

ابدأ مجانًا

الخطوة 6

Creating the App in Play Console

Open a new app record in Play Console and enroll in Play App Signing so Google securely stores your signing key.

  • Play Console > Create app: choose app name, default language, app vs. game, free vs. paid (paid can later be switched to free, but not the reverse).
  • When you upload the first AAB (usually to the closed testing track), Play App Signing kicks in automatically; Google takes the package signed with your upload key and re-signs it with its own secure key for distribution.
  • Declarations (export compliance, whether the app contains ads, target audience, etc.) begin at this stage and are completed in subsequent steps.
Do not try to opt out of Play App Signing or distribute directly with your own signature; Google has required it for new apps since 2021 and the opt-out option no longer exists.

الخطوة 7

Store Listing: Text and Graphics

Respect title/description character limits; prepare a 512x512 icon, a 1024x500 feature graphic, and at least 2 phone screenshots.

  • App name: max 30 characters. Short description: max 80 characters (shown in search results). Full description: max 4000 characters.
  • High-res icon: 512x512 px, 32-bit PNG (with alpha channel/transparency).
  • Feature graphic: exactly 1024x500 px, JPEG or 24-bit PNG, NO alpha channel; avoid text near edges since Google may crop it in promotional placements.
  • Phone screenshots: at least 2, up to 8; short side at least 320px, long side at most 3840px, aspect ratio between 1:2 and 2:1. The most common size is 1080x1920 px (portrait).
  • 7" and 10" tablet screenshots are not mandatory but strongly recommended for better placement in tablet-specific searches.
Vibeloy's screenshot tool automatically crops and frames raw captures from your Flutter app to match these size and ratio rules.
Upload raw captures to the Vibeloy Screenshot Studio to add captions, choose Canva-style backgrounds and decorative shapes, apply a phone frame, and export a single design split into 2-3 panels that sit side by side in the store gallery.

تتوفر أداة Vibeloy في هذه الخطوة

سجّل مجانًا لاستخدام أداة لقطات الشاشة وحفظ تقدمك.

سجّل واستخدمها

الخطوة 8

Data Safety Form and Privacy Policy

Declare every data type your app collects in the Data safety form and provide a publicly accessible privacy policy URL; using AdMob/Analytics requires additional declarations.

In Play Console > Policy > App content, fill out the Data safety survey: which data (location, email, device identifiers, advertising ID, etc.) is collected, for what purpose, whether it is shared with third parties, whether it is encrypted in transit, and whether there is a deletion request mechanism.

A privacy policy URL is mandatory and must point to a real, up-to-date, publicly reachable page; an empty or placeholder URL causes app rejection.
  • If you use AdMob: you must declare that the Advertising ID is collected and used for ad personalization purposes.
  • If you use Firebase Analytics/Crashlytics: you must declare that usage data (app interactions), crash logs, and device identifiers are collected.
Vibeloy's policy tool scans the packages you use (AdMob, Firebase, etc.) and generates a ready draft for the data safety form.

تتوفر أداة Vibeloy في هذه الخطوة

سجّل مجانًا لاستخدام أداة سياسة الخصوصية وحفظ تقدمك.

سجّل واستخدمها

الخطوة 9

Content Rating Questionnaire

Fill out the IARC questionnaire accurately and completely; false statements can lead to app removal or rating revocation.

Fill out the IARC (International Age Rating Coalition) questionnaire in Play Console > Policy > App content > Content ratings. Based on your answers about violence, sexual content, gambling-like mechanics, user-generated content, and in-app chat, region-specific age ratings (PEGI, ESRB, etc.) are calculated automatically.

Filling the questionnaire incompletely or incorrectly (e.g. not declaring ads or user-generated content when present) can, if detected later, leave your app unrated and result in removal from the store.

If your content changes (e.g. you add a chat feature), you must resubmit the questionnaire.

الخطوة 10

Closed Testing: 12 Testers, 14 Days

Personal accounts created after November 13, 2023 must complete an uninterrupted 14-day closed test with at least 12 active testers before gaining production access.

In Play Console > Testing > Closed testing, create a track, upload your AAB, and invite testers via an email list or Google Group. The rule applies to personal (individual) accounts created after November 13, 2023; personal accounts opened before that date and organization accounts are exempt.

  • At least 12 testers must accept the invite and open the app on a real Android device with a genuine Google account; emulators, bots, or duplicate accounts do not count.
  • The 14-day countdown starts only after your release is approved by Google AND at least 12 people have opted in; if the participant count drops below 12, the streak can reset.
  • After the period completes, you must go through the "Apply for production access" flow in Play Console and answer questions about your app, your testing process, and production readiness.
This rule changes frequently (e.g. the old 20-tester requirement was lowered to 12); always check the current requirement in Play Console before applying.

الخطوة 11

Production Release and Staged Rollout

Upload to the production track, wait for Google's review, and use staged rollout to reduce risk.

Once closed testing and required declarations are complete, create a new release in Play Console > Production and upload your AAB. Google's review typically takes anywhere from a few hours to a few days; it can take longer for new developer accounts or apps using sensitive permissions (location, SMS, accessibility).

  • Staged rollout: release to a small percentage of users (e.g. 5-20%) first, monitor crash rates and ANR (app not responding) data, then gradually increase to 100%.
  • If you detect a problem you can pause or halt the rollout; pausing prevents new users from getting the update without affecting the previous version.
Starting your first rollout at 20% and monitoring Android vitals (crashes, ANRs, latency) for 48-72 hours lets you catch a major bug before it reaches millions of users.

الخطوة 12

AdMob Integration and app-ads.txt

Add the AdMob app ID to AndroidManifest.xml and publish an app-ads.txt file on your developer website to protect your ad revenue from spoofed inventory.

AdMob application ID inside android/app/src/main/AndroidManifest.xml

xml
<manifest ...>
  <application ...>
    <meta-data
        android:name="com.google.android.gms.ads.APPLICATION_ID"
        android:value="ca-app-pub-XXXXXXXXXXXXXXXX~YYYYYYYYYY"/>
  </application>
</manifest>

If this meta-data tag is missing, the app crashes; use the real app ID from your AdMob console, do not leave the sample/test ID in production.

As of 2025, new AdMob apps MUST be verified with app-ads.txt; unverified apps can face restricted ad serving or revenue loss. Confirm the current 2026 scope of this requirement via the warnings in your AdMob console.
  • Enter a domain you control in the "Developer website" field in Play Console — AdMob verifies this by matching it to your Play Store listing.
  • Add the line AdMob console gives you to that domain's root (https://yoursite.com/app-ads.txt), e.g.: google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0
Vibeloy's app-ads.txt tool generates the correct line for your domain and periodically checks whether the file is reachable.

تتوفر أداة Vibeloy في هذه الخطوة

سجّل مجانًا لاستخدام أداة app-ads.txt وحفظ تقدمك.

سجّل واستخدمها

تابع تقدمك، وأنشئ سياسة الخصوصية وملف app-ads.txt الخاصين بك

سجّل في Vibeloy مجانًا وأدر عملية إطلاق تطبيقك بالكامل على Android وiOS من مكان واحد. الاستضافة، واستوديو لقطات الشاشة، وخزنة Keystore بانتظارك في الخطة المميزة.

ابدأ مجانًا