Что такое использование @SuppressLint ( "InlinedApi" )

Я столкнулся с @SuppressLint("InlinedApi") в некотором коде, который я просматривал, и не мог найти его описания в Интернете. Я понимаю, что @SuppressLint("NewApi") используется, чтобы скрыть предупреждения, когда мы пишем код, который выше, чем minsdk, упомянутый в манифесте. Но я не могу понять, когда следует использовать "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 автор, по-видимому, решил, что добавление флага, который не будет распознаваться на более старых устройствах, будет безопасным. Возможно, у него была информация о том, что нераспознанные флаги будут игнорироваться, но я не вижу этого в документации .