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 (Module: 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 — критичное решение для каждого проекта разработчика.
Reverse domain notation — это стандарт именования, в котором доменное имя компании записывается в обратном порядке: 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 одного модуля может затронуть импорты в других модулях. Если модуль data имеет пакет com.example.data, а модуль domain использует его классы, после смены идентификатора обновите импорты во всех зависимых модулях. Gradle-плагин Android версии 8.0+ упрощает этот процесс за счёт автоматической генерации namespace из build.gradle.
Получить текущий Application ID можно через класс BuildConfig: BuildConfig.APPLICATION_ID. Это удобно для условной логики в коде, привязки к окружению или отображения идентификатора в debug-экранах. BuildConfig генерируется автоматически на основе build.gradle.
// Получение Application ID в runtime
val packageName = BuildConfig.APPLICATION_ID
val packageManager = packageManager
val appInfo = packageManager.getPackageInfo(packageName, 0)
println("App version: ${appInfo.versionName} (${appInfo.versionCode})")
println("Package: $packageName")
Изменение Package Name после публикации приложения в Google Play — операция, которая означает создание совершенно нового продукта. Система не позволяет обновить существующее приложение с другим Package Name, поэтому решение о смене идентификатора равносильно перезапуску проекта в магазине.
При смене Package Name теряются: все рейтинги и отзывы, статистика установок, интеграция с Google Services (если не перенесена), ссылки на Firebase-проект (требует создания нового google-services.json). Пользователи не получат автоматическое обновление — они увидят новое приложение в магазине.
Смена Package Name может быть оправдана при ребрендинге компании, переносе приложения под другой аккаунт разработчика или при создании отдельной версии для другого региона. В любом случае, перед сменой рекомендуется уведомить пользователей через старое приложение и подготовить миграционный план с переносом данных. Без миграционного плана пользователи потеряют доступ к purchased-контенту, подпискам и сохранённым данным приложения. Миграция включает перенос базы данных и файлов через 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.
Используйте reverse domain notation вашей компании или никнейма: com.domain.appname. Убедитесь, что идентификатор уникален в Google Play. Избегайте общих слов (todo, test, app) и проверьте, не занят ли идентификатор другим разработчиком через поиск в Google Play.
Да, до публикации в Google Play Package Name можно изменить без последствий. После изменения потребуется перегенерировать google-services.json, обновить структуру директорий и проверить все импорты. Android Studio предоставляет инструменты Refactor -> Move для автоматизации процесса.
Package Name вместе с сертификатом подписи образует уникальную связку, которая идентифицирует приложение в Google Play. Даже если два приложения имеют разный Package Name, они могут быть подписаны одним ключом. Смена сертификата подписи возможна через Key Rotation в Play Console без потери идентификатора.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также