The one field you can never edit
Every Android app carries an applicationId — commonly called the package name — and it is permanent from the first Play upload onward. The store uses it as the listing's identity, Android uses it to decide whether an APK is an update or a new app, and the filesystem uses it to fence off the app's private data. Publish as com.acme.shop and that string is yours until the listing dies. Choose badly and the only remedy is a fresh listing with no installs and no reviews.
What Gradle refuses
- Fewer than two dot-separated segments —
shopfails,com.shoppasses, three segments is conventional. - A segment starting with a digit —
com.24seven.appfails;com.twentyfourseven.apppasses. - Uppercase letters — legal in Java, but rejected by convention and unreliable on case-insensitive filesystems.
- Hyphens, spaces or accented characters —
my-shopmust becomemyshop. - Java keywords as a segment —
com.new.app,com.class.appandcom.int.appwill not compile.
The checker above applies every one of these, which takes a second instead of a failed five-minute build.
What Google Play refuses on top
Anything starting with com.example — reserved for sample code, and the most frequent first-upload rejection. android as a segment is reserved too. And a package name used once on Play is spent forever: deleting the app, unpublishing it or closing the account does not release it for anyone, including you.
Reverse-domain naming without a domain
The convention flips your domain and appends the app: acme.com + a shop app = com.acme.shop. Its only purpose is uniqueness — you own the domain, so nobody else can honestly claim the prefix. No DNS lookup happens and the app is not hosted there.
Without a domain, use io.github.yourhandle.appname, which borrows the uniqueness of a GitHub account. Do not invent a plausible company domain: if someone registers it and publishes later, you lose.
Picking one that ages well
- Room for a second app —
com.acme.appis awkward once there are two;com.acme.shopandcom.acme.trackerare not. - No years or versions —
com.acme.shop2026is permanent in a way you will not enjoy. - No platform —
com.acme.androidappsays nothing the store does not already say. - Short and typeable — it appears in crash reports, deep links and support threads.
- Brand over current domain — domains change hands; this cannot follow.
applicationId and namespace
Older projects treated them as one setting. Modern Gradle separates the namespace (the Kotlin/Java package your code lives in) from the applicationId (the identity Android and Play see). They normally match, and the split exists mainly so a debug build can add a .debug suffix and install beside the release build. When anyone asks for the "package name", they mean the applicationId.