Android - Convenção de nome do pacote

205

Para o exemplo "Hello World" no android.com , o nome do pacote é
"package com.example.helloandroid;"

Existe alguma diretriz / padrão para nomear este pacote? (referências seria bom)

Charles Yeung
fonte

Respostas:

230

O Android segue as convenções normais de pacotes java, e aqui está um trecho de texto importante para ler (isso é importante em relação ao amplo uso de arquivos xml durante o desenvolvimento no Android).

O motivo para tê-lo na ordem inversa está relacionado ao layout na mídia de armazenamento. Se você considerar cada ponto ('.') No nome do aplicativo como um separador de caminhos, todos os aplicativos de um publicador permanecerão juntos na hierarquia de caminhos. Então, por exemplo, os pacotes da Adobe teriam o formato:

com.adobe.reader (Adobe Reader)

com.adobe.photoshop (Adobe Photoshop)

com.adobe.ideas (Adobe Ideas)

[Observe que isso é apenas uma ilustração e esses podem não ser os nomes exatos dos pacotes.]

Eles poderiam ser mapeados internamente (respectivamente) para:

com / adobe / reader

com / adobe / photoshop

com / adobe / ideas

O conceito vem das Convenções de Nomenclatura de Pacotes em Java, sobre o que pode ser lido aqui: *

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

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

Jimmy Huch
fonte
2
aqui está uma (breve) de referência a partir do site Android - ter um olhar "Nome do pacote" parágrafo no developer.android.com/resources/tutorials/hello-world.html
Bojan Komazec
4
Você tem um erro na sua resposta que pode enganar as pessoas. é com.adobe.ideas e não com.adobe.Ideas (maiúscula I). usando capitais em nomes de pacotes é uma má idéia (alguns serviços do Google não vai funcionar para você)
Amir Uval
4
Me desculpe, cara. Depois de ver a sua resposta eu dei uma olhada mais de perto, e meu navegador conectado a i com o seu ponto, fazendo com que pareça um I. Capital como embaraçoso: S
Amir Uval
7
@androiddeveloper - Todos os caracteres alfanuméricos, '.' e '_' é permitido. No entanto, um nome de pacote (ou um nome de "subpacote", por exemplo, "reader" em com.adobe.reader)) não pode começar com um número ou não pode ser uma palavra-chave reservada java (como "for" ou "while "). Para combater essas restrições, inicie o nome do pacote com um '_' inicial para que 3.cookies.for.you.com seja traduzido para com.you._for.cookies._3). Consulte a documentação relevante da Oracle para obter detalhes.
Jimmy Huch
1
"Com.appname" seria um nome de pacote válido no android?
Mark Buikema
65

O nome do pacote é usado para identificação exclusiva para seu aplicativo.
O Android usa o nome do pacote para determinar se o aplicativo foi instalado ou não.
A nomeação geral é:

com.companyname.applicationname

por exemplo:

com.android.Camera

ameyume
fonte
2
com pode variar, se o nome de domínio da empresa / organização for diferente. ie org.wikipedia.wikipediaapp
Niels Abildgaard
7
e se alguém usasse o nome do meu site como um nome de pacote para seu aplicativo Android? Posso remover este aplicativo da loja?
Mohammad AlBanna
38

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

As empresas usam seu nome de domínio de Internet reverso para iniciar seus nomes de pacotes - por exemplo, com.example.mypackage para um pacote chamado mypackage criado por um programador em example.com.

As colisões de nomes que ocorrem em uma única empresa precisam ser tratadas por convenção nessa empresa, talvez incluindo a região ou o nome do projeto após o nome da empresa (por exemplo, com.example.region.mypackage).

Se você possui um domínio da empresa, www.example.com

Então você deve usar:

com.example.region.projectname

Se você possui um nome de domínio como exemplo.com.br, deve ser:

uk.co.example.region.projectname

Se você não possui um domínio, deve usar seu endereço de email:

para [email protected], deve ser:

com.example.name.region.projectname

JCasso
fonte
você pode explicar por que devo usá-lo? que benefícios eu recebo usando o nome de domínio da minha empresa como um nome de pacote?
batmaci
Por favor, consulte esta pergunta StackOverflow como um exemplo: stackoverflow.com/questions/8381324/...
JCasso
ok eu entendo isso para manter o nome do pacote único, mas minha pergunta é quando fazemos o upload para o google play. o Google Play não garante que o nome do pacote seja exclusivo na loja antes de ficar on-line? por isso, se nós só instalar a partir do Google Play, não deveríamos ter este conflito
batmaci
O Google play garante que os IDs dos aplicativos sejam únicos. Ele não verifica os pacotes em busca de conflitos. Portanto, é possível que duas intenções / serviços tenham o mesmo nome canônico se os desenvolvedores não seguirem essa convenção de nomenclatura. Consulte: developer.android.com/studio/build/application-id.html
JCasso 7/17/17
O que acontece se você alterar seu nome de domínio? Além disso, a sugestão de email parece um pouco perigosa - e se meu email fosse [email protected] e a Microsoft quisesse criar um pacote foo para o Outlook? Ambos estariam em com.outlook.foo, certo?
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

Por exemplo, o iniciador do Android (tela inicial) é Com.Google.android.launcher

Charles
fonte
2

Geralmente, as 2 primeiras "palavras" do pacote são o seu endereço da Web ao contrário. (Você teria três aqui como convenção, se tivesse um subdomínio.)

Portanto, algo que o stackoverflow produz provavelmente estaria no pacote com.stackoverflow.whatever.customname

algo que o asp.net produz pode ser chamado de net.asp.whatever.customname.omg.srsly

algo do mysubdomain.toplevel.com seria com.toplevel.mysubdomain.whatever

Além dessa convenção simples, o céu é o limite. Esta é uma antiga convenção linux para algo que não me lembro exatamente ...

Eric
fonte
Obrigado pela sugestão. Mas, existe alguma referência do site oficial do Android?
Charles Yeung
A coisa mais próxima que pude encontrar foi uma sinopse aqui: developer.android.com/guide/topics/manifest/… Mas se você usar tudo o que existe como bibliotecas de pacotes, verá que elas sempre seguem a mesma convenção. http é de org.apache.http, AndEngine é org.anddev.andengine, etc etc
Eric
Quais são as regras sobre quais caracteres são permitidos para o nome do pacote no Android? são apenas letras em inglês, o "." e os caracteres "_" permitidos?
desenvolvedor android
Obrigado a todos por comentários úteis. Estou enfrentando um problema relacionado: meu pacote spectorskyno aplicativo calendaré referido no Device File Explorer como com.tmp.spectorsky.calendar. Não consigo entender por que o tmpnível aparece aqui?
Spectorsky
-1

Mas se o seu Android App for apenas para fins pessoais ou criado por você sozinho, você poderá usar:

me.app_name.app
ajdeguzman
fonte
10
Você pode dizer, que a declaração feita é puramente opinião você'r :)
Rahul Reddy
@RahulReddy, por que isso é prejudicado, eu não entendo. O Google não restringe ninguém a usar o COM. ou org.! você pode usar o que quiser como um packagename
batmaci
1
@batmaci Acredito que isso tenha diminuído o voto porque desencoraja as pessoas a usar nomes de pacotes arbitrários. Mesmo que isso seja tecnicamente possível e o Google não verifique se o domínio é seu, isso levaria à poluição do espaço para nome e, portanto, deve ser considerado uma má prática.
Oliver Hausler
3
@OliverHausler, o que você quer dizer com poluição no namespace? onde e como? por que isso importa tanto? Eu sei apenas que, se você tem um site e deseja fazer um aprofundamento no seu aplicativo, isso facilita as coisas, mas mesmo sem você você ainda pode aprofundar. respostas acima, nenhuma delas explica o motivo, mas apenas repete o que o Google lhes disse.
batmaci
1
@batmaci Imagine esta situação: o Dev X cria um aplicativo (com um nome não criativo) e nele "me.app_name.services.MyService". O Dev Y, que tem o mesmo apelido que o dev X (o sisisisi foi tirado de mim em vários lugares, por exemplo), cria um aplicativo, nome também não criativo, igual ao nome do aplicativo Dev Xs. O desenvolvedor Y cria um "me.app_name.services.MyService" para seu aplicativo. O usuário instala os dois aplicativos, um deles tenta iniciar seu serviço pelo nome - qual serviço é iniciado? Parece improvável, mas considere o número de aplicativos para Android por aí. Usar seu email no nome do pacote elimina essa possibilidade.
Sisisisi 7/11