Когда я использую «идентификатор приложения» или «пакет»?
(или это «имя пакета»?)
Моя путаница в практической ситуации:
Один из способов переключения с одного приложения на другое состоит в том, чтобы получить намерение запуска приложения, которое можно сделать, используя (учитывая некоторые context
):
PackageManager manager = context.getPackageManager();
Intent intent = manager.getLaunchIntentForPackage(packageName);
Обратите внимание, что имя параметра называется packageName
и что даже имя метода упоминает «пакет».Однако это , а не имя пакета!Это идентификатор приложения, который мы должны использовать здесь!
Например, если у меня есть тип сборки отладки, который вместо идентификатора приложения выпуска com.example
имеет суффикс отладки, например, это com.example.debug
, ядолжен использовать "com.example.debug"
в качестве параметра getLaunchIntentForPackage
.Но пространство имен пакета приложения остается неизменным ( по умолчанию ): оно все равно com.example
!Если у меня не установлено не отладочное приложение, метод getLaunchIntentForPackage
возвращает null
, поскольку идентификатор приложения com.example
не установлен.
Так что же я здесь смотрю?Я думаю, что com.example
- это имя моего пакета, а com.example.debug
- это идентификатор моего приложения.Но почему метод PackageManager # getLaunchIntentForPackage упоминает «пакет» и «имя пакета», тогда как он считает, что вместо него следует указать «идентификатор приложения»?
Это просто метод с неправильным именемв Android SDK, или я что-то неправильно понимаю?
Я основываю свой вопрос на следующей информации.
Каждое приложение Android имеет уникальный идентификатор приложения, который выглядит как имя пакета Java, например com.example.myapp .Этот идентификатор уникально идентифицирует ваше приложение на устройстве и в Google Play Store.Если вы хотите загрузить новую версию своего приложения, идентификатор приложения (и сертификат , подписанный им ) должен совпадать с исходным APK - если вы измените идентификатор приложения, Google Play Store будет обрабатыватьAPK как совершенно другое приложение.Поэтому, когда вы публикуете свое приложение, , вы никогда не должны изменять идентификатор приложения .
[...]
Когда вы создаете новый проект в Android Studio, applicationId
точно соответствует имени пакета в стиле Java, которое вы выбрали во время установки.Однако идентификатор приложения и имя пакета не зависят друг от друга за пределами этой точки.Вы можете изменить имя пакета вашего кода (пространство имен вашего кода), и оно не повлияет на идентификатор приложения, и наоборот (хотя, опять же, вы не должны изменять идентификатор приложения после публикации приложения).Однако изменение имени пакета имеет другие последствия, о которых вам следует знать, поэтому см. Раздел о изменении имени пакета .
Таким образом, идентификатор приложения однозначно идентифицирует ваше приложение наМагазин игр.Имя пакета - это пространство имен подпакетов и классов в базе кода вашего приложения.Пока все хорошо, я понимаю это.
Однако, в конце этой страницы документации у нас есть еще более запутанный момент:
Еще одна вещь, которую нужно знать: Хотя у вас может быть другое имя для манифеста package
и Gradle applicationId
, инструменты сборки копируют идентификатор приложения в окончательный файл манифеста APK в конце сборки.Поэтому, если вы проверяете файл AndroidManifest.xml
после сборки, не удивляйтесь, что атрибут package
изменился.Атрибут package
- это место, где Google Play Store и платформа Android действительно ищут ваше приложение;поэтому, когда сборка использует исходное значение (для пространства имен класса R
и разрешения имен классов манифеста), она отбрасывает это значение и заменяет его идентификатором приложения.
Итак, здесь мыиметь несколько противоречий на одной странице!
- Google Play идентифицирует приложение по идентификатору приложения в сравнении с пакетом.
- Имя пакета манифеста может отличаться от идентификатора приложения во время компиляции пакетаперезаписывается идентификатором приложения инструментами сборки.
Из этого выделения, по крайней мере, утверждение о средствах сборки, перезаписывающих имя пакета приложением, кажется неправильным, поскольку:
При создании намерения для действия com.example.MainActivity
в приложении com.example.debug
У меня естьуказать com.example.debug
в качестве идентификатора приложения и com.example.MainActivity
в качестве имени компонента.Во время выполнения имя компонента не изменило имя своего пакета на идентификатор приложения, поэтому кажется, что пространство имен пакета не изменилось инструментами сборки?
Надеюсь, что ...
... кто-то может придумать хороший ответ, используя различные примеры, которые показывают, когда идентификатор приложения и пакет (имя) совпадают или когда они не совпадают, и где фактически используются система Android и Google Play.Пожалуйста, рассмотрите также пример с зависимостью библиотеки: насколько я понимаю, пространство имен пакета библиотеки не меняется, но оно работает с вашим идентификатором приложения, я прав?