1)我应该如何处理命名我的包?
简短回答: Android 包/子包名称必须以 ASCII 拉丁字母开头。由于在域名以数字开头的情况下,谷歌似乎没有关于包命名的指导,因此开发人员只能自己解决这个问题。
以下是一些以数字开头的域名的真实示例,以及开发人员决定用于 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
进一步的背景
Java 允许包名称以 ASCII 拉丁字母或下划线字符开头。从命名包(Java™ 教程 > 学习 Java 语言 > 包):
在某些情况下,互联网域名可能不是有效的软件包名称。如果域名包含连字符或其他特殊字符,如果包名以数字或其他非法用作 Java 名称开头的字符开头,或者如果包名包含保留的 Java 关键字,则会发生这种情况,比如“int”。在这种情况下,建议的约定是添加下划线。
还显示了以下“使包名称合法化”的示例:
Domain Name Package Name Prefix
--------------------------- ---------------------------
hyphenated-name.example.org org.example.hyphenated_name
example.int int_.example
123name.example.com com.example._123name
但是,Android 比 Java 限制更多,包/子包名称不能以下划线开头。来自问题 65570 - Android 开源项目 - 问题跟踪器 - Google 项目托管:
虽然 Java 允许包名称以下划线开头,但 Android 应用程序包(有附加限制)则不允许。当您尝试安装包以 _ 开头的应用程序时,设备 PackageManager 将拒绝它。出于这个原因,当您创建应用程序时,我们在 Studio 中加强了包名称验证,这样您最终不会先创建这些包,然后再受苦。
不幸的是,谷歌似乎没有任何建议的约定来使以 Android 数字开头的域的包名称合法化。
2)出于好奇,为什么你不能有以数字开头的包名?
来自第 3 章词汇结构(Java® 语言规范 - Java SE 7 版):
标识符是 Java 字母和 Java 数字的无限长度序列,其中第一个必须是 Java 字母。
<剪辑>
“Java 字母”包括大写和小写ASCII 拉丁字母AZ (\u0041-\u005a) 和 az (\u0061-\u007a),以及由于历史原因,ASCII 下划线(_ 或 \u005f)和美元符号($,或 \u0024)。$ 字符应仅用于机械生成的源代码中,或者很少用于访问遗留系统上预先存在的名称。
同样,这在 Android 包名称中受到进一步限制。来自<清单> | 安卓开发者:
package
应用程序的完整 Java 语言样式的包名称。名称应该是唯一的。名称可以包含大写或小写字母(“A”到“Z”)、数字和下划线(“_”)。但是,单独的包名称部分只能以字母开头。
感谢@Quentin,提供有关 Android 对 Java 的额外限制的信息。