Package Name — је јединствени идентификатор Android апликације, заснован на обрнутом запису имена домена (reverse domain notation). Користи га систем за разграничење апликација на уређају корисника, у Google Play-у за идентификацију производа и у Firebase услугама за повезивање свих конфигурација пројекта. Према Android Developer Documentation, Package Name остаје непромењен током целог животног циклуса апликације након објављивања.
Главно
Package Name — је јединствени низ који Android користи за идентификацију апликације на нивоу оперативног система. Он одговара пољу package у датотеци AndroidManifest.xml и пољу applicationId у датотеци build.gradle модула апликације. Без јединственог Package Name-а, инсталација апликације на уређај корисника није могућа.
На уређају, Package Name служи као кључ за управљање апликацијама: систем чува податке, подешавања и кеш сваке апликације у директоријуму /data/data/[packageName]. Две апликације са истим идентификатором не могу коегзистирати — при покушају инсталације дупликата, систем предлаже уклањање постојеће.
У Android Gradle Plugin верзији 0.11+ појавило се раздвајање између Package Name (у манифесту) и Application ID (у build.gradle). Application ID је стварни идентификатор апликације за систем и Google Play. Package Name у манифесту се користи за разрешавање ресурса и генерисање R класе. Препоручује се да их држите истим ради једноставности.
// build.gradle (Модул: app)
android {
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 24
targetSdkVersion 34
versionCode 1
versionName "1.0"
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
Поље applicationIdSuffix омогућава додавање суфикса Application ID-у за различите конфигурације израде. Debug верзија може имати идентификатор com.example.app.debug, што омогућава инсталацију поред производне верзије за паралелно тестирање.
Google Play поставља строга правила за Package Name која се морају поштовати при објављивању. Идентификатор мора бити јединствен у размери целог магазина, задовољавати синтаксичке захтеве и не кршити политику коришћења трговачких марки.
Package Name може садржати само латинична слова (A-Z, a-z), бројеве (0-9), тачку (.) и знак доње црте (_). Максимална дужина — 150 знакова. Сваки сегмент између тачака мора почети словом. Цртице, размаци и специјални знаци су забрањени правилима Google Play-а.
| Захтев | Вредност | Пример |
|---|---|---|
| Дозвољени знаци | Латиница, бројеви, тачка, доња црта | com.example.my_app |
| Максимална дужина | 150 знакова | com.example.verylongappname |
| Почетак сегмента | Само слово | com — не 3com |
| Забрањено | Цртице, размаци, ћирилица | com.мој-домен — грешка |
| Јединственост | Глобална у Google Play-у | Провера при креирању |
Јединственост Package Name-а — апсолутни је захтев Google Play Store-а. Ако друга апликација већ користи изабрани идентификатор, објављивање ће бити одбијено. Google не ослобађа идентификаторе обрисаних апликација, зато је избор првог Package Name-а критична одлука за сваки пројекат програмера.
Реверзна доменска нотација — је стандард именовања у којем се име домена компаније записује обрнутим редоследом: com.example уместо example.com. Такав систем гарантује глобалну јединственост идентификатора, јер је свако име домена по дефиницији јединствено.
Програмери обично користе префикс који одговара TLD-у њиховог домена: com за комерцијалне организације, org за непрофитне, io за технолошке пројекте, net за мрежне услуге и решења. За личне пројекте дозвољено је коришћење com.github.username или com.email.
За апликације које се објављују на iOS и Android-у, препоручује се коришћење истог идентификатора на обе платформе. То поједностављује интеграцију са Firebase, AppsFlyer, Adjust и другим аналитичким системима који се везују за идентификатор пројекта. На пример, com.mycompany.myapp ће бити Bundle ID на iOS-у и Package Name на Android-у.
Подешавање Package Name-а у Android пројекту укључује промену applicationId у build.gradle и одговарајуће структуре директоријума Java/Kotlin кода. Android Studio пружа алате за рефакторисање Package Name-а, али се за сложене пројекте препоручује миграција корак по корак.
// Путања датотеке одговара Package Name-у
// com/example/myapp/MainActivity.kt
package com.example.myapp
import android.os.Bundle
import androidx.activity.ComponentActivity
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
У Kotlin и Java, Package Name у изворним датотекама мора одговарати структури директоријума. При промени Package Name-а у build.gradle, потребно је преместити датотеке у одговарајуће директоријуме и ажурирати све декларације package и import. Android Studio то може учинити аутоматски кроз Refactor -> Move, али се за велике пројекте са десетинама датотека препоручује провера резултата након рефакторисања.
Ако пројекат користи Data Binding, View Binding или Hilt, промена Package Name-а ће такође утицати на генерисане класе. Binding класе се стварају на основу Package Name-а модула и директоријума layout. Након промене идентификатора, биће потребно поново изградити пројекат да би се ажурирале све генерисане референце. Препоручује се извршавање clean build након промене Package Name-а да би се елиминисале грешке због кешираних старих референци.
У Gradle 7.0+ појавила се подршка за namespace у build.gradle, који је заменио package у AndroidManifest.xml за потребе генерисања R класе и ресурса. Притом applicationId остаје стварни идентификатор апликације за систем и Google Play. Ово омогућава различите applicationId и namespace, што је корисно за библиотечке модуле, где је namespace фиксан, а јавни идентификатор се може мењати при изради.
За пројекте са модуларном архитектуром, промена Package Name-а једног модула може утицати на importе у другим модулима. Ако модул data има пакет com.example.data, а модул domain користи његове класе, након промене идентификатора ажурирајте importе у свим зависним модулима. Gradle прикључак за Android верзије 8.0+ поједностављује овај процес аутоматским генерисањем namespace-а из build.gradle.
Тренутни Application ID се може добити кроз класу BuildConfig: BuildConfig.APPLICATION_ID. Ово је згодно за условну логику у коду, везивање за окружење или приказ идентификатора на debug екранима. BuildConfig се аутоматски генерише на основу build.gradle.
// Добијање Application ID у току извршавања
val packageName = BuildConfig.APPLICATION_ID
val packageManager = packageManager
val appInfo = packageManager.getPackageInfo(packageName, 0)
println("Верзија апликације: ${appInfo.versionName} (${appInfo.versionCode})")
println("Пакет: $packageName")
Промена Package Name-а након објављивања апликације у Google Play-у — операција која значи стварање потпуно новог производа. Систем не дозвољава ажурирање постојеће апликације са другим Package Name-ом, зато је одлука о промени идентификатора једнака поновном покретању пројекта у продавници.
При промени Package Name-а губе се: све оцене и рецензије, статистика инсталација, интеграција са Google Services (ако није пренета), референце на Firebase пројекат (захтева креирање новог google-services.json). Корисници неће добити аутоматско ажурирање — видеће нову апликацију у продавници.
Промена Package Name-а може бити оправдана при ребрендирању компаније, преносу апликације на други налог програмера или при стварању засебне верзије за други регион. У сваком случају, пре промене се препоручује обавештавање корисника кроз стару апликацију и припрема плана миграције са преносом података. Без плана миграције, корисници ће изгубити приступ купљеном садржају, претплатама и сачуваним подацима апликације. Миграција укључује пренос базе података и датотека путем SharedPreferences или Room.
Пре промене Package Name-а, уверите се да је нови идентификатор јединствен и да одговара правилима именовања. Направите нову апликацију у Google Play-у са новим Package Name-ом и објавите је као засебан производ. У опису старе апликације додајте линк ка новој. Размотрите коришћење Google Play Custom Store Listing за преусмеравање корисника.
Често постављана питања
У Package Name-у је дозвољен знак доње црте (_), али не и цртица (-). Доња црта се ретко користи, али је прихватљива: com.example.my_app. Цртица је забрањена правилима Google Play-а и довешће до грешке при објављивању. Препоручује се коришћење само тачке као раздвајача сегмената.
Package Name — је идентификатор у AndroidManifest.xml, који се користи за разрешавање ресурса и генерисање R класе. Application ID — поље у build.gradle које одређује идентификатор апликације за систем и Google Play Store. Препоручује се да их држите истим, али је разлика дозвољена при коришћењу applicationIdSuffix.
Користите реверзну доменску нотацију ваше компаније или надимак: com.domen.imeaplikacije. Уверите се да је идентификатор јединствен у Google Play-у. Избегавајте опште речи (todo, test, app) и проверите да ли идентификатор није заузет од стране другог програмера претрагом у Google Play-у.
Да, пре објављивања у Google Play-у, Package Name се може променити без последица. Након промене биће потребно поново генерисати google-services.json, ажурирати структуру директоријума и проверити све importе. Android Studio пружа алате Refactor -> Move за аутоматизацију процеса.
Package Name заједно са сертификатом потписа чини јединствену везу која идентификује апликацију у Google Play-у. Чак и ако две апликације имају различит Package Name, могу бити потписане истим кључем. Промена сертификата потписа је могућа кроз Key Rotation у Play Console-и без губитка идентификатора.
Завршни преглед
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође