App development

Publishing an app, from local stores to Google Play

Publishing an app means five things in a row: building the release version, signing it, listing it in a store, passing the review, and then releasing it to users. Of those five, signing is the stage that cannot be undone if it goes wrong, because without the signing key no new update for that same app is accepted.

  • Lesson 7 of 8
  • Intermediate
  • Free, no signup

The five stations of publishing, and the one with no way back

Four of these can be walked again. The second one cannot.

  1. 1

    Build the release version

    Logging off, debuggable off, version information set.

  2. 2

    Sign it

    The signing key is the identity of the app. Losing it ends updates for that app.

  3. 3

    List it in a store

    Title, description, screenshots and icon. Keep a copy of all of it yourself.

  4. 4

    The store review

    Each store rules are its own and they change without notice.

  5. 5

    Release to users

    From here on every change is a new version and the version code has to move forward.

The order is always this, the timing is not: a store review can take hours or days and we give no number for it.

Last checked: Facts and tool names in this lesson are re-checked against their sources on this date.

What does publishing an app actually involve?

The Android documentation splits the whole job into two halves, and that split is enough to plan with: preparing the app for release, and then getting it to users.

The first half is a set of mechanical tasks, none of them creative, each of them forgotten once. Logging has to be disabled and removed, the debuggable flag has to be off in the release variant, the version information has to be set, and then the release build is made and signed. The documentation separately insists that you test the release version on at least one real handset and one tablet before distributing, and that any servers and services the app depends on must be production ready.

The second half is choosing the distribution route. The Android documentation puts three side by side: through a marketplace, on your own website, or by sending the app straight to a user. And it writes plainly that you can distribute through any app marketplace and can use multiple marketplaces. For an Iranian product that sentence is not trivial, because it means the choice of store is reversible and additive, unlike the next decision.

One technical point that changes the order of work: since August 2021 Google accepts new apps only as an App Bundle rather than an APK file. The Android documentation explains that an App Bundle is a publishing format and cannot be installed on a device; the store builds the APKs from it. The difference between the two formats is opened up in how an app works. The Iranian stores still work with APKs, so if you want both routes you have to produce both outputs from one project from day one.

A sealed envelope with a white wax seal and a red key in front of two shop doors lit green and blue

Why is the signing key the most important file in the project?

Android installs or updates no app without a digital signature. That signature acts as the identity card of the app: the operating system uses it to know that the new version really came from whoever made the previous one.

And here is the one sentence worth memorising from this lesson. The Android documentation writes, about apps that have not opted into Play App Signing, that if you lose your app signing key you lose the ability to update your app. No backup, no recovery, no administrative process; the app stays on a thousand phones and forever after you can only publish a new app under a different package name.

Google Play separated two keys for exactly this reason. One is the app signing key, which Google itself holds and uses to sign the builds that reach users, and one is the upload key, which stays with you and is used only to send the file to the Console. If the upload key is lost, a reset can be requested. The same documentation warns that once this is configured you cannot retrieve a copy of your app signing key.

One decision that matters especially for an Iranian product and is usually understood too late: if you want the same signing key to work across several stores, the documentation says you must provide your own signing key when configuring Play App Signing instead of having Google generate one for you. Somebody who publishes on a local store first and goes to Google Play later will otherwise end up with two versions of one app carrying two different identities.

In practice: on day one, put the signing key and its password somewhere that survives the loss of the laptop, and that somewhere must not be the code repository. It is the only file in the project that money and time cannot replace.

Four rules that save the signing key

  • Outside the code repository

    The key and its password must not live where the code lives, even in a private repository.

  • Two copies in two different places

    One on the laptop is not enough. Laptops go missing and the key goes with them.

  • More than one person has access

    If only one person knows the password, the project is tied to that one person.

  • One key for every store

    If you want one key across stores, you must supply your own rather than a generated one.

These four do not replace a regular backup; they only close the most common ways a key is lost.

Google Play from Iran: what does Google own table say?

Instead of any analysis, this section is written off one official page, and we give you the reading method so you can do the same thing yourself.

Google has a page called supported locations for developer and merchant registration, which is a table with three columns: supports developer registration, supports merchant registration, and default currency. We read that page today and counted it. The table carries 214 country rows, and in the developer registration column all 214 of them are ticked.

What only counting reveals: the legend above that table defines both a tick and a cross for the first column, yet today version of the table contains not a single cross. Which means this is not a list of places whose status was assessed; it is the list of places that are supported. And Iran is not in it, neither ticked nor crossed. For comparison, Iraq, Afghanistan and Türkiye all have rows.

That is what we say and no more. We do not say no route exists, because this table said nothing about routes not existing; and we do not suggest a way around it, because that is neither teaching nor something we do. If somebody tells you there is a path, this is the test: is that path consistent with the rules of the Google account, or does it merely work until it is noticed.

There is also a technical constraint that has nothing to do with country, catches everybody, and carries a date. The Android documentation says that starting August 31 2026, new apps and app updates must target Android 16, meaning API level 36 or higher, to be submitted to Google Play, and that existing apps must target Android 15 or higher to remain available to new users. The same page says that if you need more time to update, you will be able to request an extension to November 1, 2026. These numbers change every year, so check the verified date on this page, and if it has passed, open that page yourself.

Cafe Bazaar and Myket: what we could check and what we could not

For an Android app whose audience is inside Iran, Cafe Bazaar and Myket are the two places a user actually installs from. That we have written nothing here about their rules is a decision rather than an omission, and the reason is our own measurement today.

We called both developer sites from this server. The result was that neither one hands over the text of its rules to a plain HTTP request. Both send an empty page whose content JavaScript builds later in the browser. Which means those rules effectively do not exist for any reader without a graphical browser, archives and checking tools included.

So we quote not one line of their rules, because we cannot claim to have read it at its source. What we can say with confidence is two things: both stores accept an Android app as an APK, and, exactly as the Android documentation itself writes, publishing to several stores at once is a normal and unobstructed thing to do. The rest you have to see yourself on those two sites with a browser, and our advice is to note the date you looked, because store rules change without notice.

One practical point that follows from this and depends on no store: everything you send to a store, from the title and description to the images, should be kept somewhere of your own. The second store asks for the same things and you will not feel like rewriting them that day.

Store or web?

Does the product need phone hardware or notifications to work?

No, it is lists, forms and orders

A progressive web app

  • No signing, no store review, no waiting for approval
  • One codebase for phone and desktop
  • Installs to the home screen without a store
  • Is not found by searching a store
Yes, sensors or notifications or in app payment

A store app

  • The same five stations above, with signing at the second
  • Full access to the device capabilities
  • Is seen and searched inside the store
  • Every update goes through review again

This question is not about quality, it is about where your user goes looking for you. Both columns build serious products.

The route that skips the store entirely

If your product is lists, forms, orders and a panel, and has no particular business with the phone hardware, there is a fourth route that skips this whole lesson: publish the same product as a progressive web app.

The Mozilla documentation defines it simply: an app built with web platform technologies that provides an experience like a platform specific app, runs on many platforms from a single codebase, is installable, and can work offline and in the background. For the user that means an icon on the phone home screen, and for you it means no signing, no store review, no waiting for approval.

Our position here is blunt, because saying it does not benefit somebody who sells apps: a large share of the projects that start as "an app" actually need a well built website rather than a store app. If everything the product does can be done from a browser, the store has only added a layer of cost and delay. Site builder or custom build looks at the same question from the web side.

And let us say honestly where this answer is wrong. If you need reliable, always on notifications, if you work with Bluetooth or particular sensors, if you want in app payment, or if your audience finds the app by searching a store, a web app is not enough and you have to walk the five stages above. The decision between the two routes is not technical; it depends on where your user goes looking for you. If that decision is heavy for your team, the RGB app service page says on what basis we recommend one over the other.

Pre upload sheetevery time, not only the first

Before you press upload

  • The version code is higher than the previous release
  • The debuggable flag is off in this build
  • This exact file was tested on a real handset and a real tablet
  • The servers and services the app talks to are production ready
  • The target API level matches that store requirement today

These mean do not upload yet

  • The signing key exists on one machine only
  • The key password is written in the code repository
  • The store text and images exist only inside the store panel
  • You took the store requirement from memory or from an article

The fast path, with AI

The stage that actually eats time is neither the build nor the signing, it is what the store asks of you: the description, the release notes, and in several languages. Models are good at exactly this, on one condition stated below, and that condition is the difference between this recipe and an ordinary prompt.

  1. Take the list of changes in this version exactly as it is, even if it is raw and technical. That is the input and you are not meant to tidy it yourself.
  2. Open the store requirements page yourself today and put its text beside that list. It is the only source the recipe below is allowed to quote a requirement from.
  3. Run the recipe with a fast, cheap model from the compact family. This is translation and summarising, not judgement; an expensive model here is only cost. Our current pick is on the AI section of the site.
  4. Check the output against the change list and delete any sentence saying something the list does not contain. A release note promising a capability that is not in that build is the worst kind of bug, because it is not in the code.

Copy-ready recipe

This is the change list for the new version of my app, raw and technical:
{change list, exactly as it is}

And this is the text of the store requirements page that I opened myself today:
{text of the requirements page}

Give me three things:

1) Release notes, in {list of languages}, at most {number} characters per language. Plain tone, no self praise. Every line must trace back to a line in the list above.

2) The store description, in the same languages, in two versions: one short paragraph and one longer text.

3) A list of the mechanical things to check before uploading, based only and strictly on the requirements text I gave above.

Strict rules:
- Write no capability that is not in the change list. Where a line is ambiguous, do not guess, put it in a separate list called "ambiguous".
- Write no store requirement from your own knowledge. Quote only from the text I gave above, and where something is not in that text, write "not in the text provided".
- Add no date, no operating system version number, no percentage and no price of your own.
- Make no claim about speed, security or quality unless its matching line is in the change list.

Before you trust the output: Two things you must check yourself before uploading, and no model can do them for you. First, read the "ambiguous" list; if it comes back empty, the model probably guessed instead of flagging, and you should send the same recipe again. Second, compare every requirement in the output against the store page you opened yourself, not against your memory. Store rules change without notice, and this is exactly where a model will state with confidence something that was true last year.

AI in this kind of work

In publishing, AI help is useful in exactly one place and dangerous in one, and the two sit next to each other. Useful in the text: the store description, the release notes and their translations. Dangerous in the rules: any sentence a model says about a store policy is a guess, unless you put the text of that page in front of it yourself.

Tools that actually help

  • Gemini Cost effective for the text and multilingual translation pass above, where an expensive model is only cost. Google own page says the Gemini web app runs in over 230 countries and territories, and Iran is not on that list.
  • Claude When you put the requirements page text in front of it and ask it to quote only from that, it holds to the restriction better. Iran is on neither of Anthropic two supported-countries lists. We read that on Anthropic own page rather than measuring it.
  • Claude Code Useful for the mechanical pre upload pass on the project itself: reading the build configuration and finding where the debuggable flag is still on. It runs on the same Anthropic account, and Iran is not on the list.

Where it backfires

The risk here is a specific kind of hallucination that slips through easily, because it looks like knowing. Store policies change often and a model will state last year version of them with complete confidence, from the target API level to which format is accepted. The Android documentation itself carries the example: the API level requirement carries a date and it changed this very year. So the rule is simple and has no exception; take no store requirement from a model output. Open the page, put its text in front of the model, and ask it only to organise that text.
The second risk is smaller but more expensive: let no tool ever see the signing key or its password. A signing key is not like an ordinary password you can change; if it leaks or is lost, updates for that app are over for good and no service can make it right for you.

Sources: Android Developers: sign your app and Play App Signing Android Developers: target API level requirements for Google Play Anthropic: supported countries Google: where Gemini Apps are available

Where this advice stops

We have not published an app to Google Play from inside Iran and this lesson makes no such claim. Everything said about the store side is a reading of their own pages: we read and counted the Android and Google Play pages today, and we read the two Iranian store pages and could not retrieve their text, which we said as well. Three things are deliberately absent: the registration cost of any store, how long a review takes, and the Apple App Store route, which has its own rules and tooling. And one thing that will never be here: a way around any store restriction.

From our own work

The two things this lesson says about stores were measured from this server today, and both repeat with one command. First, the Google Play supported locations page: we took its table and counted it, 214 country rows, all 214 of them ticked in the developer registration column, and the string Iran appears zero times on the whole page while Iraq appears. Second, the two Iranian developer sites: developers.cafebazaar.ir returned exactly the same 4243 byte page for every path we asked for, from the home page to /fa/guidelines and /docs, whose only readable text is the word Loading, and its robots.txt is zero bytes; developer.myket.ir returns a 17703 byte page whose only readable text is the title of the Myket developer panel, and it serves that same page for a robots.txt request too. That is why not one line of their rules is quoted in this lesson: not because we did not want to, but because it was not readable at the source.

Real follow-up questions

Do we need two separate apps to publish on a local store and on Google Play?

No, it is one project with two outputs. Google Play wants an App Bundle for new apps and the local stores take an APK, and both are built from one codebase. The thing that has to stay the same is the signing key, and only if you supplied your own from the start.

If we lose the signing key, is there really no way back?

It depends which key. The Android documentation says that for apps not opted into Play App Signing, losing the app signing key means losing the ability to update. If Play App Signing is on and only the upload key is lost, a reset can be requested. For other stores, each has its own terms and you have to ask them.

Can a progressive web app be listed in stores as well?

The conditions differ from store to store and we have not checked them for the Iranian stores, so we make no claim about it. What we are sure of is that a web app needs no store at all to reach a user: they install it onto the phone home screen from the site itself.