Context.getPackageName() vs BuildConfig.APPLICATION_ID

Я могу получить имя пакета, используя:

Context.getPackageName()

или

BuildConfig.APPLICATION_ID

Есть ли разница между этими двумя способами? В некоторых случаях предпочтительнее другого? Можно ли предположить, что они всегда дают тот же результат?

В принципе, , который лучше?

Ответ 1

BuildConfig предоставляется Gradle. Если вы не строите с помощью Gradle, вы не можете получить доступ к имени пакета с помощью BuildConfig.

Использование Context для получения имени пакета может иногда не применяться, если контекст или контекст не имеют значения null, поэтому вы можете использовать BuildConfig.APPLICATION_ID.

Я бы использовал Context.getPackageName(), потому что результат предоставляется из операционной системы, а не константа в параметрах сборки.

Ответ 2

Раньше я использовал getPackageName(), но только использовал BuildConfig.APPLICATION_ID, так как он стал доступен. Должна быть быстрее, поскольку это только переменная и не звонит - но это не имеет большого значения. Также в библиотеках, использующих getPackageName(), может понадобиться.

Ответ 3

Возможно использование обоих элементов в качестве основной меры против фальсификации пакетов. В вашем приложении вы можете вставить код, например:

if (!BuildConfig.APPLICATION_ID.equals(getPackageName())) {
  insert code to report information about tampering to remote server
}

Когда-то я получаю странные отчеты, исходящие из некоторого варианта моего приложения, которое было изменено добавлением префикса или суффикса в исходное имя_пакета

Ответ 4

Начиная с Android Studio 3.5, BuildConfig.APPLICATION_ID устарела и заменена на BuildConfig.LIBRARY_PACKAGE_NAME.

Из Android-источника Google:

BuildConfig: Deprecate APPLICATION_ID in libraries.

В лучшем случае вводит в заблуждение, поэтому помечается как устаревшее и заменяется LIBRARY_PACKAGE_NAME.