Android - Convención de nombre de paquete

205

Para el ejemplo de "Hola mundo" en android.com , el nombre del paquete es
"package com.example.helloandroid;"

¿Hay alguna directriz / estándar para nombrar este paquete? (las referencias estarían bien)

Charles Yeung
fuente

Respuestas:

230

Android sigue las convenciones normales del paquete java, además de que aquí hay un fragmento importante de texto para leer (esto es importante con respecto al amplio uso de archivos xml mientras se desarrolla en Android).

La razón para tenerlo en orden inverso es hacer con el diseño en los medios de almacenamiento. Si considera cada punto ('.') En el nombre de la aplicación como un separador de ruta, todas las aplicaciones de un editor se unirían en la jerarquía de ruta. Entonces, por ejemplo, los paquetes de Adobe tendrían la forma:

com.adobe.reader (Adobe Reader)

com.adobe.photoshop (Adobe Photoshop)

com.adobe.ideas (Adobe Ideas)

[Tenga en cuenta que esto es solo una ilustración y es posible que estos no sean los nombres exactos del paquete.]

Estos podrían asignarse internamente (respectivamente) a:

com / adobe / reader

com / adobe / photoshop

com / adobe / ideas

El concepto proviene de Convenciones de nomenclatura de paquetes en Java, más sobre las cuales se pueden leer aquí: *

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

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

Jimmy Huch
fuente
2
aquí hay una referencia (breve) del sitio de Android: consulte el párrafo "Nombre del paquete" en developer.android.com/resources/tutorials/hello-world.html
Bojan Komazec
44
Tiene un error en su respuesta que podría inducir a error a las personas. es com.adobe.ideas, y no com.adobe.Ideas (capital I). usar mayúsculas en los nombres de los paquetes es una mala idea (algunos servicios de Google no funcionarán para usted)
Amir Uval
44
Lo siento. Después de ver su respuesta, eché un vistazo más de cerca, y mi navegador conectó la i con su punto, haciéndolo parecer una I mayúscula. Qué vergonzoso: S
Amir Uval
77
@androiddeveloper: todos los caracteres alfanuméricos, '.' y '_' está permitido. Sin embargo, un nombre de paquete (o un nombre de "subpaquete" para ese asunto, como "lector" en com.adobe.reader) no puede comenzar con un número o no puede ser una palabra clave reservada de Java (como "for" o "while "). Para combatir estas restricciones, comenzaría el nombre del paquete con una '_' inicial, de modo que 3.cookies.for.you.com se traduciría a com.you._for.cookies._3). Consulte la documentación relevante de Oracle para más detalles.
Jimmy Huch
1
¿"Com.appname" sería un nombre de paquete válido en Android?
Mark Buikema
65

El nombre del paquete se utiliza para una identificación única para su aplicación.
Android usa el nombre del paquete para determinar si la aplicación se ha instalado o no.
El nombre general es:

com.companyname.applicationname

p.ej:

com.android.Camera

ameyume
fuente
2
com puede variar si el nombre de dominio de la empresa / organización es diferente. es decir. org.wikipedia.wikipediaapp
Niels Abildgaard
77
¿Qué pasa si alguien tomó el nombre de mi sitio web como un nombre de paquete para su aplicación de Android? ¿Puedo eliminar esta aplicación de la tienda?
Mohammad AlBanna
38

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

Las empresas usan su nombre de dominio de Internet invertido para comenzar los nombres de sus paquetes, por ejemplo, com.example.mypackage para un paquete llamado mypackage creado por un programador en example.com.

Las colisiones de nombres que ocurren dentro de una sola compañía deben ser manejadas por convención dentro de esa compañía, quizás incluyendo la región o el nombre del proyecto después del nombre de la compañía (por ejemplo, com.example.region.mypackage).

Si tiene un dominio de empresa www.example.com

Entonces deberías usar:

com.example.region.projectname

Si posee un nombre de dominio como example.co.uk, entonces debería ser:

uk.co.example.region.projectname

Si no posee un dominio, debe usar su dirección de correo electrónico:

para nombre@ejemplo.com debería ser:

com.example.name.region.projectname

JCasso
fuente
¿puedes explicar por qué debería usarlo? ¿Qué beneficios obtengo al usar el nombre de dominio de mi empresa como nombre de paquete?
batmaci
Consulte esta pregunta de StackOverflow como ejemplo: stackoverflow.com/questions/8381324/…
JCasso el
ok, entiendo esto para mantener el nombre del paquete único, pero mi pregunta es cuando subimos a google play. ¿Google Play no garantiza que el nombre del paquete sea único en la tienda antes de que entre en línea? así que si solo instalamos desde Google Play, no deberíamos tener este conflicto
batmaci
Google Play garantiza que los ID de las aplicaciones sean únicos. No escanea los paquetes en busca de conflictos. Por lo tanto, es posible que dos intentos / servicios tengan el mismo nombre canónico si los desarrolladores no siguen esta convención de nomenclatura. Consulte: developer.android.com/studio/build/application-id.html
JCasso el
¿Qué sucede si cambias tu nombre de dominio? Además, la sugerencia de correo electrónico parece un poco peligrosa: ¿qué pasaría si mi correo electrónico fuera foo@outlook.com y Microsoft quisiera crear un paquete foo para Outlook? Ambos estarían en com.outlook.foo, ¿verdad?
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 ejemplo, el lanzador de Android (pantalla de inicio) es Com.Google.android.launcher

Charles
fuente
2

En general, las primeras "palabras" del paquete 2 son su dirección web a la inversa. (Tendrías 3 aquí como convención, si tuvieras un subdominio).

Entonces, algo que stackoverflow produce probablemente estaría en el paquete com.stackoverflow.whatever.customname

algo que asp.net produce podría llamarse net.asp.whatever.customname.omg.srsly

algo de mysubdomain.toplevel.com sería com.toplevel.mysubdomain.whatever

Más allá de esa simple convención, el cielo es el límite. Esta es una antigua convención de Linux para algo que no puedo recordar exactamente ...

Eric
fuente
Gracias por la sugerencia. Pero, ¿hay alguna referencia del sitio oficial de Android?
Charles Yeung
Lo más cercano que pude encontrar fue una propaganda aquí: developer.android.com/guide/topics/manifest/… Pero si toma todo lo que existe como bibliotecas de paquetes, verá que siempre siguen la misma convención. http es de org.apache.http, andengine es org.anddev.andengine, etc, etc
Eric
¿Cuáles son las reglas sobre qué caracteres están permitidos para el nombre del paquete en Android? son solo letras inglesas, el "." y los caracteres "_" que están permitidos?
desarrollador de Android
Gracias a todos por sus útiles comentarios. Estoy enfrentando un problema relacionado: mi paquete spectorskyen la aplicación calendarse referencia en el Explorador de archivos del dispositivo como com.tmp.spectorsky.calendar. No puedo entender por qué aparece el tmpnivel aquí.
Spectorsky
-1

Pero si su aplicación de Android es solo para fines personales o creada solo por usted, puede usar:

me.app_name.app
ajdeguzman
fuente
10
Puedes decir que la declaración hecha es puramente tu opinión :)
Rahul Reddy
@RahulReddy, ¿por qué es eso rechazado? No entiendo. google no restringe a nadie para usar com. u org.! puedes usar lo que quieras como nombre de
paquete
1
@batmaci Creo que esto se ha rechazado porque engaña a las personas para que usen nombres de paquetes arbitrarios. Si bien esto puede ser técnicamente posible y Google no verifica si el dominio es suyo, conduciría a la contaminación del espacio de nombres y, por lo tanto, debería considerarse una mala práctica.
Oliver Hausler
3
@OliverHausler, ¿qué quieres decir con contaminación del espacio de nombres? ¿Dónde y cómo? ¿Por qué es tan importante? Solo sé que si tiene un sitio web y desea hacer un enlace profundo a su aplicación, esto facilita las cosas, pero incluso sin usted puede hacerlo fácilmente. las respuestas anteriores no explican por qué, pero solo repiten lo que Google les dijo.
batmaci el
1
@batmaci Imagine esta situación: Dev X crea una aplicación (con un nombre no creativo) y en ella "me.app_name.services.MyService". Dev Y, que tiene el mismo apodo que dev X (por ejemplo, me quitaron sisisisi en varios lugares), crea una aplicación, cuyo nombre tampoco es creativo, igual que el nombre de la aplicación Dev Xs. Dev Y crea un "me.app_name.services.MyService" para su aplicación. El usuario instala ambas aplicaciones, una de ellas intenta iniciar su servicio por nombre: ¿qué servicio se inicia? Parece poco probable, pero considere la cantidad de aplicaciones de Android que existen. El uso de su correo electrónico en el nombre del paquete elimina esta posibilidad.
sisisisi