Ну да.
Библиотека поддержки предназначена для того, чтобы помочь разработчикам ориентироваться на более широкую аудиторию без ущерба для функциональности. @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 .