I want to create apps under my company's name and Android Studio recommends using your domain, eg:
domain: example.com
App: myApp
gives a package name of com.example.myApp
That's all fine, but my company name begins with a number and Android Studio informs me I can't have numbers, eg:
com.1example.myApp
Now I could try "oneexample" and hopefully no-one from oneexample.com starts developing Android apps, but given how many devs appear to have a number at the start of their name, presumably this has come up before. So if I can please ask:
1) How should I tackle naming my packages?
2) Out of curiosity, why can't you have package names beginning with a number?
Thanks heaps!
Quentin.
1) How should I tackle naming my packages?
Short Answer: Android package/subpackage names must begin with an ASCII Latin letter. Since there seems to be no guidance from Google on package naming in cases where domain names begin with a number, developers are left to resolve this themselves.
Here are some real-world examples of domain names starting with a number, and the package names the developers decided to use for Android:
http://www.11bitstudios.com/
https://play.google.com/store/apps/details?id=com.elevenbitstudios.AnomalyWarzoneEarthHD
http://www.23snaps.com/
https://play.google.com/store/apps/details?id=com.snaps23.android
http://www.36you.com/
https://play.google.com/store/apps/details?id=com.thirtysixyougames.google.slotanddragons
Further Background
Java allows package names to begin with an ASCII Latin letter or an underscore character. From Naming a Package (The Java™ Tutorials > Learning the Java Language > Packages):
In some cases, the internet domain name may not be a valid package name. This can occur if the domain name contains a hyphen or other special character, if the package name begins with a digit or other character that is illegal to use as the beginning of a Java name, or if the package name contains a reserved Java keyword, such as "int". In this event, the suggested convention is to add an underscore.
The following examples of "Legalizing Package Names" are also shown:
Domain Name Package Name Prefix
--------------------------- ---------------------------
hyphenated-name.example.org org.example.hyphenated_name
example.int int_.example
123name.example.com com.example._123name
However, Android is more restrictive than Java, and package/subpackage names may NOT begin with an underscore. From Issue 65570 - Android Open Source Project - Issue Tracker - Google Project Hosting:
While Java allows package names that start with underscores, Android application packages (which have additional restrictions) do not. When you try to install an app whose package starts with _, the device PackageManager will reject it. For that reason we tightened the package name validation in Studio when you create the app such that you don't end up creating these packages up front and then suffering later.
Unfortunately, there doesn't seem to be any suggested convention from Google on legalizing package names for domains that begin with a number for Android.
2) Out of curiosity, why can't you have package names beginning with a number?
From Chapter 3. Lexical Structure (The Java® Language Specification - Java SE 7 Edition):
An identifier is an unlimited-length sequence of Java letters and Java digits, the first of which must be a Java letter.
<snip>
The "Java letters" include uppercase and lowercase ASCII Latin letters A-Z (\u0041-\u005a), and a-z (\u0061-\u007a), and, for historical reasons, the ASCII underscore (_, or \u005f) and dollar sign ($, or \u0024). The $ character should be used only in mechanically generated source code or, rarely, to access pre-existing names on legacy systems.
Again, this is further restricted in Android package names. From <manifest> | Android Developers:
package
A full Java-language-style package name for the application. The name should be unique. The name may contain uppercase or lowercase letters ('A' through 'Z'), numbers, and underscores ('_'). However, individual package name parts may only start with letters.
Thanks, @Quentin, for providing info on Android's additional restrictions over Java.