What the Play Store process looks like
An honest, unglamorous walk through everything that stands between a signed build and a page on Google Play — the account, the one-off fee, the identity check, the graphics, the four forms, the testing period and the wait. Nothing here is instant and nothing here is free.
The bit nobody puts in the tutorial
You have a signed . Getting it onto Google Play is not one step. It is roughly fifteen, spread over days, and about four of them have nothing to do with code at all.
This lesson is the honest version. Not to put you off — thousands of people do this every week — but because the single most demoralising thing in software is discovering a requirement you were never told about, three hours after you thought you had finished.
Think about two ways of selling jam.
A table on the pavement. You put the table out, you put the jars on it, and you are open. Total setup: two minutes. Anyone walking past can buy one. Nobody checked who you are, nobody inspected the jam, and nobody is going to send anyone past your table.
A stall in the covered market. You apply. You pay for the pitch. They want your name and address, checked against a document. They want a photograph of how the stall will look, a printed sign, and a card listing the ingredients — a real one, because people will read it. An inspector walks through before opening day. Then you wait, because the market committee only meets on Thursdays.
Both sell jam. One takes two minutes and reaches whoever walks past. The other takes a fortnight and puts you in front of everyone who comes to the market on purpose.
Sending someone an APK is the pavement table. is the market.
The checklist, in full
Every item below is required before a first app can go live. None of them can be skipped.
1. A . A one-off registration fee of about 25 US dollars, paid once, ever — not per app and not per year.
2. . For a personal account, Google checks you are a real named person, with an identity document and an address. This takes time and it happens before you can publish anything.
3. A signed release . Not an APK. Play stopped accepting APKs for new apps some years ago. The Gradle task is bundleRelease.
4. An app icon. 512 by 512 pixels, PNG, with no transparency. Note that this is a separate file from the inside your app — Play does not extract one from your APK, you upload it.
5. A . 1024 by 500 pixels. The banner across the top of your listing. Required even if you think it is ugly.
6. Screenshots. At least a couple of phone screenshots, and Play has minimum sizes. Take them on your own phone, running your own app.
7. A . App name, a short description capped at 80 characters, and a full description up to 4,000. The short one is what people actually read.
8. A URL. A real, public, permanently reachable web page. This catches almost everybody, because it is the one item that is not about the app at all. Even an app that collects nothing needs a page saying it collects nothing.
9. A questionnaire. You answer questions about violence, language, gambling and so on, and Play issues the official rating from your answers.
10. A . What your app collects, whether it leaves the device, whether it is shared. "No data collected" is a completely valid answer, and for all three apps in this course it is the true one — but you still have to fill the form in.
11. Meeting the target API level rule. Play requires new apps to target a recent Android version, and that bar rises every year. See Lesson 2.7 for what actually does; the point here is that an old value will simply block the upload.
12. A period of . New personal developer accounts have been required to run a closed test — a set number of testers, opted in for a continuous run of days — before a first public release is allowed.
13. . Partly automatic, partly a human being. Hours if you are lucky. Commonly a few days. A first app from a brand-new account can take considerably longer.
Google adjusts these rules regularly: the tester count, the number of days, the target API level, what the data safety form asks. Every number above was true when this was written and some of them will not be by the time you read it.
The Play Console is the source of truth, and helpfully it tells you: a new app has a checklist page that lists exactly what is still outstanding, and it will not let you publish until every line is ticked. Trust that page over any tutorial, including this one.
Why an AAB and not an APK
You spent Lesson 2.8 learning what an contains. Here is the twist: you do not upload one.
An APK has to contain everything for every phone — every screen density of every picture, every of every native library, every translation. Most of that is dead weight on any one device.
An is a package of everything needed to make APKs. You upload it once, and Play generates a tailored APK per device: that phone's screen density, that phone's chip, that phone's language. Users download less. You do nothing extra.
1:app:assembleRelease
2 -> app/build/outputs/apk/release/app-release.apk
3
4:app:bundleRelease
5 -> app/build/outputs/bundle/release/app-release.aabAn AAB is not installable. You cannot tap it on a phone and get an app. It is a shipping crate, not a product.
This is also why is not optional for new apps: Play has to build those per-device APKs itself, and something has to sign them. You sign the bundle with your ; Play signs each generated APK with the it holds.
The four numbers that matter at upload time
Everything Play cares about in your build file lives in one block.
The tracks, and why you should not start at the end
releases go down one of four . A build is promoted between them; you do not re-upload.
| Track | Who gets it | Speed |
|---|---|---|
| Internal testing | A small named list of testers | Minutes, minimal review |
| Closed testing | An invited group, by email list or link | Reviewed, hours to days |
| Open testing | Anyone who opts in from your store page | Reviewed, public |
| Production | Everybody | Full review |
Start on internal testing. Always. It costs nothing, arrives in minutes, and catches the embarrassing category of problem — the wrong icon, a crash on first launch, a screen that only worked because your phone had test data on it.
When you do reach production, use a : release to a small percentage first, watch the crash reports for a day, then widen. It converts "my app is broken for everyone" into "my app was briefly broken for a few people", which is an entirely different kind of morning.
What it actually feels like
A realistic first run, assuming nothing goes wrong:
| Stage | Typical time |
|---|---|
| Create the account and pay | Under an hour |
| Identity verification | Days |
| Build, sign and upload an AAB | An hour, once the keystore exists |
| Write the listing and make the graphics | An afternoon, honestly |
| Content rating and data safety forms | Half an hour |
| Closed testing period | Days to weeks |
| Review of the production release | Hours to over a week |
The graphics and the writing take longer than the code. Everyone is surprised by that once.
You do not have to publish anything
Worth saying clearly, because Part 6 can read as though Play is the finish line. It is not.
An APK you build is a real app. You can send it to someone in a message, they can after allowing , and it will run exactly as it runs on your phone. No account, no fee, no forms, no waiting. That is how every app you have built in this course already works.
Play is for reaching strangers. If the people you want to reach are your family, your class or your football team, the pavement table is genuinely the right answer.
Get a project into a state where publishing would be possible. All of this works on any tier.
- Open Pocket Studio, tap Projects, open Focus Flow.
- Tap Editor and open
app/build.gradle.kts. - Find
applicationId. Read it out loud:com.nativeworks.focusflow. Decide now what yours would be if you published — reverse-domain, something obviously yours. Do not change it in this project; changing it makes the next Run install a second, separate app. - Change
versionCodefrom1to2, andversionNamefrom"1.0"to"1.0.1". - Tap Build and press Run. The app installs and looks completely unchanged. That is correct — you just did the thing Play cares about most and the user cares about least.
- Back in Editor, open
app/src/main/AndroidManifest.xml. Confirm there is noandroid:debuggableattribute written there. Gradle adds it to debug builds and leaves it out of release builds; if you ever see it typed by hand in a manifest, delete it. - Confirm
targetSdk = 35is still in the build file, and remind yourself that this is the number Play will one day reject. - Now leave Pocket Studio, open Focus Flow from your home screen, and take three screenshots with your phone's normal screenshot buttons: the timer, the stats screen, the settings screen. Those are Play listing assets, and you have just made them.
- Open a notes app and write a privacy policy for Focus Flow. Three sentences is enough: what it stores, that it never leaves the phone, and how to contact you. That page has to exist at a public URL before Play will publish — writing it is the hard part, hosting it is not.
./gradlew :app:signingReport. If the original is genuinely gone, request an upload key reset in the Play Console; unlike the app signing key, this one is recoverable.android:debuggable="true" into the manifest.bundleRelease, not bundleDebug, and check the file you are dragging in is from outputs/bundle/release/. Then search your AndroidManifest.xml for debuggable and remove the line if it is there — the build type is supposed to decide this, not you.versionCode before on this app. It counts every upload ever, including builds you deleted and releases that failed review. Numbers are never recycled.app/build.gradle.kts, add one to versionCode, and rebuild the bundle. Get into the habit of bumping it as the first thing you do before any upload, not the thing you fix after being told off.targetSdk for new apps and updates. The two numbers in this message both go up roughly once a year, so the exact wording you see will differ from this one.compileSdk and targetSdk together in app/build.gradle.kts, then test the app properly — raising targetSdk opts you into new platform behaviour, which is exactly what Lesson 2.7 warned about. Do not raise it blind the night before a release.applicationId has been claimed. It is worldwide and permanent — including by you, if you created a listing with it once and abandoned it.applicationId in app/build.gradle.kts to something you control, then rebuild. Note that namespace on the line above can stay as it is: it names your generated code, not your app's identity on Play.- Publishing on needs a with a one-off fee of about 25 US dollars, plus for a personal account.
- You upload a signed from
bundleRelease, not an APK. Play generates the per-device APKs and signs them under . - The listing needs a 512-pixel icon, a 1024 by 500 , screenshots, descriptions, and a public URL.
- Two forms are compulsory: the questionnaire and the declaration.
versionCodemust rise with every upload, andtargetSdkmust meet Play's floor, which climbs every year.- New personal accounts have had to run a before a first public release. takes hours to well over a week. Play's exact requirements change — the Console is the source of truth.
- Start on , reach production through a , and remember that is a completely legitimate way to ship.
- Next: the last lesson. What you have actually learned, what to build with it, and where to go when this course runs out.