Когда использовать идентификатор приложения или имя пакета a.k.a. Неверно ли имя метода PackageManager # getLaunchIntentForPackage? - PullRequest
1 голос
/ 18 марта 2019

Когда я использую «идентификатор приложения» или «пакет»?

(или это «имя пакета»?)

Моя путаница в практической ситуации:

Один из способов переключения с одного приложения на другое состоит в том, чтобы получить намерение запуска приложения, которое можно сделать, используя (учитывая некоторые 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 и разрешения имен классов манифеста), она отбрасывает это значение и заменяет его идентификатором приложения.

Итак, здесь мыиметь несколько противоречий на одной странице!

  1. Google Play идентифицирует приложение по идентификатору приложения в сравнении с пакетом.
  2. Имя пакета манифеста может отличаться от идентификатора приложения во время компиляции пакетаперезаписывается идентификатором приложения инструментами сборки.

Из этого выделения, по крайней мере, утверждение о средствах сборки, перезаписывающих имя пакета приложением, кажется неправильным, поскольку:

При создании намерения для действия com.example.MainActivity в приложении com.example.debug У меня естьуказать com.example.debug в качестве идентификатора приложения и com.example.MainActivity в качестве имени компонента.Во время выполнения имя компонента не изменило имя своего пакета на идентификатор приложения, поэтому кажется, что пространство имен пакета не изменилось инструментами сборки?

Надеюсь, что ...

... кто-то может придумать хороший ответ, используя различные примеры, которые показывают, когда идентификатор приложения и пакет (имя) совпадают или когда они не совпадают, и где фактически используются система Android и Google Play.Пожалуйста, рассмотрите также пример с зависимостью библиотеки: насколько я понимаю, пространство имен пакета библиотеки не меняется, но оно работает с вашим идентификатором приложения, я прав?

1 Ответ

2 голосов
/ 18 марта 2019

Атрибут android:package в <manifest> - это то, о чем мы здесь говорим.Раньше его называли «имя пакета», а в некоторых старых документах он все еще называется «имя пакета».Это НЕ является именем пакета Java , хотя оно выглядит как единое целое и не имеет ничего общего с именами пакетов Java в вашем исходном коде.

В последнее время этот атрибут упоминается как«Идентификатор приложения», особенно в документации, связанной с Firebase, Play store и т. Д.

Это то же самое.«имя пакета» - это «идентификатор приложения».

См. https://developer.android.com/guide/topics/manifest/manifest-element.html#package

ПРИМЕЧАНИЕ:

Есть одно место, где вещи могут запутатьсяи это сокращенная запись имен компонентов в манифесте.Например:

    <activity
            android:name=".ui.activities.MainActivity">
    </activity>

, в этом случае атрибут android:name указывает «полное имя класса Java для Activity».Однако, если имя начинается с точки (как в этом примере), «имя пакета» приложения (из атрибута android:package тега <manifest>) добавляется к имени класса для формирования полностью квалифицированной Javaимя класса Activity.

Если у вас есть ситуация, когда атрибут android:package изменяется для разных вариантов сборки (как в вашем примере с использованием debug в имени пакета), выНЕ следует использовать сокращенную запись для имен компонентов в манифесте! Вы всегда должны использовать полное имя, например:

    <activity
            android:name="com.mycompany.mypackage.ui.activities.MainActivity">
    </activity>
...