Ограничения применимости интерфейса Android P без SDK к android.support и / или androidx - PullRequest
0 голосов
/ 04 ноября 2018

Мы все знаем и любим "Ограничения для интерфейсов не SDK" . На этой странице есть, что сказать об определении термина:

Вообще говоря, интерфейсы SDK - это те интерфейсы, которые описаны в Индексе пакетов платформы Android.

Меню пакета в левой части этого индекса пакета содержит первый раздел под названием «Платформа Android», а затем отдельный раздел «Библиотека поддержки Android». И черный список здесь не имеет никаких символов в android.support.

Итак, есть ли абсолютная уверенность в том, что политика интерфейса без SDK применяется только к классам в «Платформе Android»? И никогда не будет по дизайну включать Androidx?

1 Ответ

0 голосов
/ 04 ноября 2018

Ну да.

Библиотека поддержки предназначена для того, чтобы помочь разработчикам ориентироваться на более широкую аудиторию без ущерба для функциональности. @hide API существуют на собственной платформе, потому что они не должны использоваться приложениями. Единственная причина существования библиотеки поддержки заключается в использовании приложениями.

Нативный SDK является SDK. Он должен сообщить Android Studio, какие классы, методы и константы уже существуют в Android, в framework.jar. Ничего из этого не встроено в ваш APK. Думайте о собственном SDK (и любом SDK) как о «обещании» Android Studio, что то, что вы делаете, будет работать, когда оно будет запущено. SDK также зависит от того, что на самом деле существует на устройстве. Если в SDK есть метод, которого нет у устройства, Android Studio скомпилирует, но приложение будет аварийно завершать работу на этом устройстве при попытке вызвать этот метод.

Когда класс, метод или переменная имеют флаг @hide в AOSP, компилятор SDK, который использует Google, просто удаляет этот класс, метод или переменную из JAR SDK, который он создает. Это означает, что у Android Studio нет «обещания», что эти вещи существуют (насколько они знают, они не существуют), поэтому они не будут создаваться. Однако эти методы все еще существуют на устройстве. Вот почему до Pie вы могли просто использовать отражение для доступа к этим скрытым частям Android.

В Pie появилась «функция безопасности», которая проверяет, занесен ли метод, класс или переменная в приложение в черный список. Если это так, когда приложение пытается получить доступ, Android генерирует исключение SecurityException, если приложение не является системным приложением. Между вашим приложением и фреймворком есть своего рода привратник.

Однако AndroidX не является SDK. Это библиотека. Библиотеки скомпилированы в ваш APK, так как их компоненты еще не существуют на целевом устройстве (ах). Я видел несколько методов в AndroidX, помеченных @hide, но я почти уверен, что это ошибка. Компилятор Gradle, по крайней мере по умолчанию, ничего не удаляет с @hide, и это не имеет смысла, так как внутри вашего APK существует библиотека only .

...