Android-包名称约定


205

对于android.com中的“ Hello World”示例,包名称为
"package com.example.helloandroid;"

是否有任何指南/标准来命名该软件包?(引用会很好)

Answers:


229

Android遵循常规的Java包约定,这里是要阅读的重要文本片段(这对于在android上进行开发时广泛使用xml文件非常重要)。

反向排列的原因与存储介质上的布局有关。如果您将应用程序名称中的每个句点(。)视为路径分隔符,则来自发布者的所有应用程序将一起位于路径层次结构中。因此,例如,来自Adobe的软件包将具有以下形式:

com.adobe.reader(Adobe Reader)

com.adobe.photoshop(Adobe Photoshop)

com.adobe.ideas(Adobe Ideas)

[请注意,这只是一个示例,可能与包装名称不符。]

这些可以在内部(分别)映射为:

com / adobe / reader

com / adobe / photoshop

com / adobe / ideas

该概念来自Java中的程序包命名约定,有关更多信息,请参见:*

http://en.wikipedia.org/wiki/Java_package#Package_naming_conventions

来源:http//www.quora.com/Why-do-a-majority-of-Android-package-names-begin-with-com


2
这里是从Android的网站(简介)参考-看看“包名”段落在developer.android.com/resources/tutorials/hello-world.html
博扬Komazec

4
您的答案有误,可能会误导他人。它是com.adobe.ideas,而不是com.adobe.Ideas(首字母I)。在套件名称中使用大写字母是一个坏主意(某些Google服务对您不起作用)
阿米尔·乌瓦尔

4
对不起。看到您的回答后,我仔细看了一下,我的浏览器将i和它的圆点连接起来,使它看起来像是大写的I。多么令人尴尬:S
Amir Uval 2012年

7
@androiddeveloper-所有字母数字字符“。” 并允许使用“ _”。但是,程序包名称(或与此相关的“子程序包”名称,例如com.adobe.reader中的“ reader”)不能以数字开头,也不能为Java保留关键字(例如“ for”或“ while” ”)。为了克服这些限制,您可以在软件包名称的开头加上“ _”开头,这样3.cookies.for.you.com会转换为com.you._for.cookies._3)。有关详细信息,请参见相关的Oracle文档
Jimmy Huch 2015年

1
在Android中,“ com.appname”是否为有效的软件包名称?
Mark Buikema '16

65

软件包名称用于您的应用程序的唯一标识。
Android使用程序包名称来确定是否已安装该应用程序。
通用命名为:

com.companyname.applicationname

例如:

com.android.Camera


2
如果公司/组织的域名不同,则com可能会有所不同。即。org.wikipedia.wikipediaapp
Niels Abildgaard

6
如果有人将我的网站名称作为他的Android应用程序的软件包名称怎么办?我可以从商店取走这个应用程序吗?
Mohammad AlBanna '16

38

http://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html

公司使用其反向的Internet域名来开始其程序包名称,例如,由example.com的程序员创建的名为mypackage的程序包的com.example.mypackage。

单个公司内部发生的名称冲突需要按照该公司内部的约定进行处理,也许可以通过在公司名称之后添加区域或项目名称(例如com.example.region.mypackage)来解决。

如果您拥有公司域名www.example.com

然后,您应该使用:

com.example.region.projectname

如果您拥有example.co.uk这样的域名,则应该是:

uk.co.example.region.project名称

如果您不拥有域,则应使用您的电子邮件地址:

对于name@example.com,应为:

com.example.name.region.projectname


您能解释一下为什么要使用它吗?使用公司域名作为包名可以获得什么好处?
batmaci

请以这个StackOverflow问题为例:stackoverflow.com/questions/8381324/…–
JCasso

好的,我明白了这一点,以保持程序包名称唯一,但是我的问题是,当我们上传到Google Play时。Google Play不能确保套餐名称在商店上线之前是唯一的吗?因此,如果我们仅从Google Play安装,则我们不应该发生这种冲突
batmaci

Google Play确保应用程序ID是唯一的。它不会扫描软件包中的冲突。因此,如果开发人员不遵循此命名约定,则两个意图/服务可能具有相同的规范名称。请参阅:developer.android.com/studio/build/application-id.html
JCasso

如果更改域名会怎样?此外,有关电子邮件的建议似乎有些危险-如果我的电子邮件是foo@outlook.com,并且Microsoft想要为Outlook创建foo程序包怎么办?两者都在com.outlook.foo,对吗?
HappyDog

6
Com = commercial application (just like .com, most people register their app as a com app)
First level = always the publishing entity's' name
Second level (optional) = sub-devison, group, or project name
Final level = product name

例如,他的android启动器(主屏幕)是Com.Google.android.launcher


2

通常,前2个软件包的“单词”是您的反向网址。(如果您有子域,则此处约定为3)。

所以stackoverflow产生的东西很可能在com.stackoverflow.whatever.customname包中

asp.net产生的东西可能称为net.asp.whatever.customname.omg.srsly

来自mysubdomain.toplevel.com的内容将是com.toplevel.mysubdomain.whatever

除了这个简单的约定,天空就是极限。这是一个旧的Linux约定,用于某些我无法确切回忆的事情...


谢谢你的建议。但是,Android官方网站上有什么参考资料吗?
查尔斯杨

我能找到的最接近的东西是这里的内容:developer.android.com/guide/topics/manifest / ... 但是,如果您将所有存在的内容都视为包库,则会发现它们始终遵循相同的约定。http来自org.apache.http,Andengine是org.anddev.andengine等。–
Eric

关于Android包名称允许使用哪些字符的规则是什么?只是英文字母“。” 和允许的“ _”字符?
Android开发人员

感谢大家的有用评论。我遇到了相关的问题:我spectorsky在应用程序中的包calendar在Device File Explorer中被引用为com.tmp.spectorsky.calendar。我不明白为什么tmp水平会出现在这里?
Spectorsky

-1

但是,如果您的Android应用仅用于个人目的或由您自己创建,则可以使用:

me.app_name.app

10
您可以说,所发表的言论纯粹是您的意见:)
Rahul Reddy 2014年

@RahulReddy为什么被低估,我不明白。Google不限制任何人使用com。或组织。您可以使用任何想要的软件包名称
batmaci

1
@batmaci我认为这已经被否决了,因为它误导了人们使用任意软件包名称。即使从技术上来说这是可能的,并且Google不会验证该域是否属于您,但它会导致名称空间污染,因此应将其视为不良做法。
奥利弗·豪斯勒

3
@OliverHausler您的名字空间污染是什么意思?在哪里以及如何?为什么这么重要?我只知道,如果您有一个网站,并且想对应用程序进行深层链接,它会使事情变得更容易,但是即使没有,您仍然可以轻松地进行深层链接。上面的答案都没有解释为什么,但他们只是重复谷歌告诉他们的。
batmaci

1
@batmaci想象这种情况:Dev X创建应用程序(具有非创意名称),并在其中创建“ me.app_name.services.MyService”。开发者Y恰好与开发者X昵称(例如,sisisisi是在多个地方从我这里取来的),创建了一个应用程序,名称也没有创造力,与开发Xs的应用程序名称相同。开发人员Y为他的应用程序创建了“ me.app_name.services.MyService”。用户安装了两个应用程序,其中一个试图按名称启动其服务-哪个服务已启动?似乎不太可能,但请考虑那里的Android应用程序数量。在软件包名称中使用电子邮件可以消除这种可能性。
sisisisi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.