دليل نشر مجاني
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.
الخطوة 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
dev_dependencies:
flutter_launcher_icons: ^0.14.1
flutter_launcher_icons:
android: true
image_path: "assets/icon/icon.png"
min_sdk_android: 21dart run flutter_launcher_iconsالخطوة 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)
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.
تتوفر أداة 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
storePassword=<store-şifreniz>
keyPassword=<key-şifreniz>
keyAlias=upload
storeFile=/Users/kullanici/upload-keystore.jksandroid/app/build.gradle.kts — current Kotlin DSL pattern
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
}
}
}الخطوة 5
Building the App Bundle (AAB)
The Play Store now only accepts the .aab format; produce an optimized package with flutter build appbundle --release.
flutter build appbundle --releaseThe 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)
flutter build appbundle --release \
--obfuscate \
--split-debug-info=build/app/outputs/symbolsتابع تقدمك، وأنشئ سياسة الخصوصية وملف 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.
الخطوة 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 في هذه الخطوة
سجّل مجانًا لاستخدام أداة لقطات الشاشة وحفظ تقدمك.
الخطوة 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.
- 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 في هذه الخطوة
سجّل مجانًا لاستخدام أداة سياسة الخصوصية وحفظ تقدمك.
الخطوة 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.
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.
الخطوة 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.
الخطوة 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
<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.
- 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 في هذه الخطوة
سجّل مجانًا لاستخدام أداة app-ads.txt وحفظ تقدمك.
تابع تقدمك، وأنشئ سياسة الخصوصية وملف app-ads.txt الخاصين بك
سجّل في Vibeloy مجانًا وأدر عملية إطلاق تطبيقك بالكامل على Android وiOS من مكان واحد. الاستضافة، واستوديو لقطات الشاشة، وخزنة Keystore بانتظارك في الخطة المميزة.
ابدأ مجانًا