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.