Я столкнулся с @SuppressLint("InlinedApi")
в некотором коде, который я просматривал, и не мог найти его описания в Интернете. Я понимаю, что @SuppressLint("NewApi")
используется, чтобы скрыть предупреждения, когда мы пишем код, который выше, чем minsdk, упомянутый в манифесте. Но я не могу понять, когда следует использовать "InlinedApi". Любые идеи?
Что такое использование @SuppressLint ( "InlinedApi" )
Ответ 1
Выполняя lint --list
(инструмент lint находится в каталоге sdk/tools
), вы можете увидеть список допустимых идентификаторов проблем. Вы можете найти объяснение InlinedApi
там:
"InlinedApi": находит вложенные поля, которые могут работать или не работать более старыми платформы
Ответ 2
Я нашел это.. @SuppressLint ( "InlinedApi" ) Указывает, что Lint должен игнорировать указанные предупреждения для аннотированного элемента.
Exp:
SuppressLint
implements from Annotation Class.
android.annotation.SuppressLint like this..
Built-In Annotations
Java определяет набор аннотаций, встроенных в язык Аннотации к Java-коду: @Override - проверяет, что метод является переопределением. Вызывает ошибку компиляции, если метод не найден в одном из родительских классов или реализованных интерфейсов. @Deprecated - маркирует метод как устаревший. Вызывает предупреждение компиляции, если этот метод используется. @SuppressWarnings - инструктирует компилятор подавлять предупреждения времени компиляции, указанные в параметрах аннотации
http://developer.android.com/reference/java/lang/annotation/Annotation.html
http://developer.android.com/reference/android/annotation/SuppressLint.html
Ответ 3
Вот пример из Google codelab:
@SuppressLint("InlinedApi")
private void hideSystemUi() {
mPlayerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
Если вы закомментируете @SuppressLint("InlinedApi")
, вы получите это предупреждение:
Поле требует уровня API 19 (текущий мин - 16): android.view.View # SYSTEM_UI_FLAG_IMMERSIVE_STICKY
Итак, вы получаете доступ к полю, который может отсутствовать в API некоторых из устройств, которые, как вы сказали, вы хотите, чтобы запустить устройство. В этом случае, почему это просто предупреждение lint вместо фатальной ошибки компиляции?
Более полное описание предупреждения является приятным и информативным. Вы можете увидеть его в Android Studio, если вы нажмете комбинацию клавиш "Дополнительно" (например, Cmd + F1), когда всплывающее сообщение lint будет открыто. Вы также можете получить его через lint в командной строке, аналогично тому, что сказал @stan0, но более подробно:
lint --show InlinedApi
Вот подробное объяснение:
InlinedApi
Сводка: использование встроенных констант в старых версиях
Приоритет: 6/10
Уровень важности: предупреждение
Категория: Правильность
Эта проверка проверяет все ссылки на поля API Android в приложение и флаги, определенные константы, такие как статические конечные целые числа и Strings, которые были представлены в более поздних версиях. Они будут фактически копируются в файлы классов, а не ссылаются на них, что означает, что значение доступно даже при работе на устройства. В некоторых случаях это хорошо, и в других случаях это может привести к во время сбоя или неправильного поведения. Это зависит от контекста, поэтому внимательно изучите код и убедитесь, что он безопасен и может быть подавляется или код нуждается в [sic]. [выделено мной]
Если вы действительно хотите использовать этот API и не нуждаетесь в поддержке более старых устройства просто устанавливают minSdkVersion в файле build.gradle или Файлы AndroidManifest.xml. Если ваш код намеренно обращается к новых API, и вы обеспечили (например, с условным исполнением) что этот код будет когда-либо вызываться на поддерживаемой платформе, тогда вы можете аннотировать свой класс или метод с помощью аннотации @TargetApi указав локальный минимальный SDK для применения, например @TargetApi (11), так что эта проверка рассматривает 11, а не файл вашего манифеста минимальный SDK как необходимый уровень API.
Надеюсь, что с этим объяснением ясно, почему это не является фатальной ошибкой (потому что значение константы копируется в файл класса вместо ссылки), почему это все еще потенциально опасно и когда подавлять предупреждение. В приведенном выше примере codelab автор, по-видимому, решил, что добавление флага, который не будет распознаваться на более старых устройствах, будет безопасным. Возможно, у него была информация о том, что нераспознанные флаги будут игнорироваться, но я не вижу этого в документации .