setContentView использует интерфейс не SDK - PullRequest
0 голосов
/ 17 сентября 2018

Когда я запускаю свое приложение в эмуляторе с API 28, консоль выдает мне следующее предупреждение:

W / oaristachimene: Доступ к скрытому методу Landroid / view / View; -> computeFitSystemWindows (Landroid / graphics / Rect; Landroid / graphics / Rect;) Z (легкий серый список, отражение) W / oaristachimene: Доступ к скрытому методу Landroid / view / ViewGroup; -> makeOptionalFitsSystemWindows () V (легкий серый список, отражение)

Я отлаживал его и обнаружил, что он исходит из вызова: setContentView(R.layout.activity_main), есть ли другой способ установить макет действия или этот метод будет обновлен, чтобы он невыдает это предупреждение при запуске на устройстве с Android API 28?.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Скорее всего, идентификатор макета, который вы передаете setContentView(), содержит некоторое представление из сторонней библиотеки, которая использует интерфейсы не SDK. Это предупреждение говорит вам, что это происходит, но все, что вы можете сделать, это

  • Подождите, пока третьи лица исправят свою библиотеку
  • Удалите сторонние виды из вашего макета

Пока это только предупреждение; ничего плохого на самом деле не произойдет. Но в будущих версиях Android это может стать реальной проблемой. Система просто дает вам время разобраться.

0 голосов
/ 12 декабря 2018

Для предупреждений в вопросе computeFitSystemWindows и makeOptionalFitsSystemWindows фактически используются библиотекой поддержки или библиотекой androidx через отражение.Вы можете проверить это, просто выполнив поиск этих двух методов в AppCompatDelegateImpl.

Да, они нарушают некоторые правила, которые они устанавливают.Надеюсь, это можно исправить позже.

0 голосов
/ 17 сентября 2018

Это просто warning.

Вы должны прочитать документацию Ограничения для интерфейсов не SDK .

Android 9 (уровень API 28) вводит новые ограничения на использование не-SDK-интерфейсов, будь то напрямую, через отражение или через JNI. Эти ограничения применяются всякий раз, когда приложение ссылается на интерфейс не SDK или пытается получить его дескриптор, используя отражение или JNI. Для получения дополнительной информации об этом решении см. Улучшение стабильности за счет сокращения использования интерфейсов не-SDK .

Как правило, приложения должны использовать только официально документированные части классов в SDK. В частности, это означает, что вы не должны планировать доступ к методам или полям, которые не перечислены в SDK, когда вы взаимодействуете с классом с помощью семантики, например отражения.

...