Android - konwencja nazwy pakietu

205

W przykładzie „Hello World” w witrynie android.com nazwa pakietu to
"package com.example.helloandroid;"

Czy istnieją jakieś wytyczne / standardy nazywania tego pakietu? (referencje byłyby fajne)

Charles Yeung
źródło

Odpowiedzi:

230

Android przestrzega normalnych konwencji pakietów java, a tutaj jest ważny fragment tekstu do przeczytania (jest to ważne w związku z szerokim użyciem plików xml podczas programowania na Androidzie).

Powodem tego jest odwrócenie kolejności układu na nośniku pamięci. Jeśli weźmiesz pod uwagę każdy kropkę („.”) W nazwie aplikacji za separator ścieżki, wszystkie aplikacje wydawcy będą siedzieć razem w hierarchii ścieżek. Na przykład pakiety od Adobe miałyby postać:

com.adobe.reader (Adobe Reader)

com.adobe.photoshop (Adobe Photoshop)

com.adobe.ideas (Adobe Ideas)

[Uwaga: to tylko ilustracja i mogą to nie być dokładne nazwy pakietów.]

Można je wewnętrznie zamapować (odpowiednio) na:

com / adobe / reader

com / adobe / photoshop

com / adobe / ideas

Koncepcja pochodzi z konwencji nazewnictwa pakietów w Javie, o której więcej można przeczytać tutaj: *

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

Źródło: http://www.quora.com/Why-do-a-majority-of-Android-package-names-begin-with-com

Jimmy Huch
źródło
2
oto (krótkie) odniesienie ze strony Androida - zobacz akapit „Nazwa pakietu” na developer.android.com/resources/tutorials/hello-world.html
Bojan Komazec
4
W odpowiedzi masz błąd, który może wprowadzać ludzi w błąd. to com.adobe.ideas, a nie com.adobe.Ideas (stolica I). używanie wielkich liter w nazwach pakietów to zły pomysł (niektóre usługi Google nie będą dla ciebie działać)
Amir Uval
4
Przepraszam stary. Po zobaczeniu twojej odpowiedzi przyjrzałem się bliżej, a moja przeglądarka połączyła kropkę i, dzięki czemu wygląda jak wielka
litera
7
@androiddeveloper - Wszystkie znaki alfanumeryczne, „.” i „_” jest dozwolone. Jednak nazwa pakietu (lub nazwa „pod-pakietu” w tym przypadku, na przykład „czytnik” w com.adobe.reader) nie może zaczynać się od cyfry lub nie może być słowem kluczowym zarezerwowanym dla języka Java (jak „for” lub „while” „). Aby zwalczyć te ograniczenia, należy rozpocząć nazwę pakietu od wiodącego „_”, aby 3.cookies.for.you.com przetłumaczyłoby na com.you._for.cookies._3). Szczegółowe informacje można znaleźć w odpowiedniej dokumentacji Oracle .
Jimmy Huch,
1
Czy „com.appname” będzie prawidłową nazwą pakietu w Androidzie?
Mark Buikema,
65

Nazwa pakietu służy do unikalnej identyfikacji Twojej aplikacji.
Android używa nazwy pakietu do ustalenia, czy aplikacja została zainstalowana, czy nie.
Ogólne nazewnictwo to:

com.companyname.applicationname

na przykład:

com.android.Camera

ameyume
źródło
2
com może się różnić, jeśli nazwa domeny firmy / organizacji jest inna. to znaczy. org.wikipedia.wikipediaapp
Niels Abildgaard
6
co jeśli ktoś wziął nazwę mojej witryny jako nazwę pakietu swojej aplikacji na Androida? Czy mogę usunąć tę aplikację ze sklepu?
Mohammad AlBanna
38

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

Firmy używają swojej odwróconej nazwy domeny internetowej, aby rozpocząć nazwy pakietów - na przykład com.example.mypackage dla pakietu o nazwie mypackage utworzonego przez programistę w example.com.

Kolizje nazw, które występują w obrębie jednej firmy, muszą być obsługiwane przez konwencję w tej firmie, być może poprzez dołączenie regionu lub nazwy projektu po nazwie firmy (na przykład com.example.region.mypackage).

Jeśli masz domenę firmową www.example.com

Następnie powinieneś użyć:

com.example.region.projectname

Jeśli masz nazwę domeny taką jak example.co.uk, powinna ona być:

uk.co.example.region.projectname

Jeśli nie jesteś właścicielem domeny, powinieneś użyć swojego adresu e-mail:

dla [email protected] powinno to być:

com.example.name.region.projectname

JCasso
źródło
czy możesz wyjaśnić, dlaczego powinienem go użyć? jakie korzyści mogę uzyskać, używając nazwy domeny mojej firmy jako nazwy pakietu?
batmaci,
Zobacz to pytanie StackOverflow jako przykład: stackoverflow.com/questions/8381324/…
JCasso,
ok, rozumiem to, aby nazwa pakietu była unikalna, ale moje pytanie brzmi, kiedy przesyłamy do Google Play. czy Google Play nie upewnia się, że nazwa pakietu jest unikalna w sklepie, zanim przejdzie do trybu online? więc jeśli instalujemy tylko z Google Play, nie powinniśmy mieć tego konfliktu
batmaci,
Google Play zapewnia, że ​​identyfikatory aplikacji są unikalne. Nie skanuje pakietów w poszukiwaniu konfliktów. Możliwe jest więc, że dwie intencje / usługi o tej samej kanonicznej nazwie, jeśli programiści nie zastosują się do tej konwencji nazewnictwa. Zobacz: developer.android.com/studio/build/application-id.html
JCasso
Co się stanie, jeśli zmienisz nazwę domeny? Ponadto sugestia dotycząca poczty e-mail wydaje się nieco niebezpieczna - a jeśli mój adres e-mail to [email protected], a Microsoft chce utworzyć pakiet foo dla programu Outlook? Oba będą na com.outlook.foo, prawda?
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

Na przykład program uruchamiający Androida (ekran główny) to Com.Google.android.launcher

Charles
źródło
2

Zasadniczo pierwsze 2 słowa „pakiet” to adres internetowy w odwrotnej kolejności. (Miałbyś 3 tutaj jako konwencję, gdybyś miał subdomenę.)

Tak więc coś, co tworzy stackoverflow, prawdopodobnie znajdowałoby się w pakiecie com.stackoverflow.whthing.customname

coś, co produkuje asp.net, może nazywać się net.asp.whokolwiek.nazwa niestandardowa

coś z mysubdomain.toplevel.com byłoby com.toplevel.mysubdomain.whokolwiek

Poza tą prostą konwencją niebo jest granicą. To stara konwencja linuksowa dla czegoś, czego nie pamiętam dokładnie ...

Eric
źródło
Dzieki za sugestie. Ale czy jest jakaś wzmianka z oficjalnej strony Androida?
Charles Yeung
Najbliższą rzeczą, jaką mogłem znaleźć, był blurb tutaj: developer.android.com/guide/topics/manifest/… Ale jeśli weźmiesz wszystko, co istnieje jako biblioteki pakietów, zobaczysz, że zawsze przestrzegają tej samej konwencji. http pochodzi z org.apache.http, Andengine to org.anddev.andengine itp.
Eric
Jakie są zasady dotyczące dozwolonych znaków w nazwie pakietu w systemie Android? czy to tylko angielskie litery, „.” i dozwolone znaki „_”?
programista Androida
Dziękujemy wszystkim za pomocne komentarze. Mam do czynienia z pokrewnym problemem: mój pakiet spectorskyw aplikacji calendarjest polecany w Eksploratorze plików urządzenia jako com.tmp.spectorsky.calendar. Nie rozumiem, dlaczego tmppojawia się tutaj poziom?
Spectorsky
-1

Ale jeśli Twoja aplikacja na Androida jest przeznaczona wyłącznie do celów osobistych lub została stworzona tylko przez Ciebie, możesz użyć:

me.app_name.app
ajdeguzman
źródło
10
Można powiedzieć, że wypowiedź jest wyłącznie twoją opinią :)
Rahul Reddy
@RahulReddy, dlaczego to jest przegłosowane, nie rozumiem. Google nie ogranicza nikogo do używania com. lub org.! możesz użyć, co chcesz, jako
nazwy pakietu
1
@batmaci Uważam, że zostało to odrzucone, ponieważ wprowadza w błąd ludzi, którzy używają dowolnych nazw pakietów. Chociaż technicznie może to być możliwe, a Google nie sprawdza, czy domena należy do Ciebie, prowadziłoby to do zanieczyszczenia przestrzeni nazw i dlatego powinno być uważane za złą praktykę.
Oliver Hausler,
3
@OliverHausler co rozumiesz przez zanieczyszczenie przestrzeni nazw? gdzie i jak? dlaczego to tak ważne? Wiem tylko, że jeśli masz witrynę internetową i chcesz przeprowadzić głębokie linkowanie do swojej aplikacji, ułatwia to, ale nawet bez Ciebie nadal nie możesz łatwo wykonać głębokiego łącza. powyższe odpowiedzi żaden z nich nie wyjaśnia dlaczego, ale po prostu powtarzają to, co powiedział im Google.
batmaci,
1
@batmaci Wyobraź sobie tę sytuację: Dev X tworzy aplikację (o nieokreślonej nazwie), aw niej „me.app_name.services.MyService”. Dev Y, który akurat ma ten sam pseudonim co dev X (na przykład sisisisi zostało mi zabrane w wielu miejscach), tworzy aplikację, której nazwa również nie jest kreatywna, taka sama jak nazwa aplikacji Dev Xs. Dev Y tworzy dla swojej aplikacji „me.app_name.services.MyService”. Użytkownik instaluje obie aplikacje, jedna z nich próbuje uruchomić usługę według nazwy - która usługa jest uruchomiona? Wydaje się to mało prawdopodobne, ale weź pod uwagę liczbę dostępnych aplikacji na Androida. Użycie adresu e-mail w nazwie paczki eliminuje tę możliwość.
sisisisi,