Что такое AndroidX и зачем он?
В окне создания нового проекта появился чекбокс «Use AndroidX artefacts». Почитав об этом в интернете, я в целом так и не понял, что такое AndroidX. Объясните доступным языком, пожалуйста. И нужно ли включать его в новых проектах?
Отслеживать
Сергей Гуков
задан 7 фев 2019 в 19:30
Сергей Гуков Сергей Гуков
800 6 6 серебряных знаков 21 21 бронзовый знак
это то же, что и support library, но с новым названием и немного пересортированный по пакетам. проект еще местами в бете и переходить сейчас на использование вместо старых библиотек поддержки нет никакой острой необходимости
7 фев 2019 в 22:13
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
AndroidX — это новая либа с новым пространством имён на замену support library API.
android.support 28.0.0 будет последним. Все что выше будет доступно только через androidx. Поэтому я бы советовал новые проекты сразу переносить или делать на androidX, а вот то что на продакшн как минимум выделить время и потестить.
Есть хорошие статьи по этому поводу, как крупные проекты мигрировали и допилвали своими скриптами.
Отслеживать
ответ дан 8 фев 2019 в 14:28
Shwarz Andrei Shwarz Andrei
12k 1 1 золотой знак 20 20 серебряных знаков 40 40 бронзовых знаков
- android
- android-studio
- androidx
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Android X: знакомимся с изменениями в новой библиотеке поддержки
AndoidX — новая библиотека поддержки от Google, которая добавляет новые функции и изменяет некоторые старые. Разбираемся с нововведениями.
Google перенесла разработку проекта AndroidX на AOSP. AndroidX — новая библиотека поддержки, которая добавляет новые функции и изменяет некоторые старые. Поговорим об этих изменениях.
Пространства имён android.* против androidx.*
Android-приложения зависят от двух типов классов:
- Классы вроде PackageManager , которые идут в комплекте с операционной системой и могут иметь разные API и поведение на разных версиях Android;
- Классы вроде AppCompatActivity или ViewModel , которые отделены от операционной системы и включаются в ваш apk. Эти библиотеки пишутся для предоставления API, поведение которого будет неизменным на как можно большем количестве версий Android.
Зачастую библиотеки, не идущие в комплекте, будут лучшим выбором, так как они предоставляют API для многих версий Android. Теперь все такие библиотеки, включая оные из Support Library и Architecture Components, будут включены в пространство имён androidx.* , чтобы вы понимали, какие зависимости нужно подключать.
Изменение в именовании пакетов и артефактов Maven
Также была переработана структура пакетов, чтобы поощрить создание небольших, более сфокусированных библиотек, которые уменьшат давление на приложения и тесты, не использующие ProGuard и Multidex. Были обновлены groupId и artifactId Maven, чтобы лучше отражать содержимое библиотеки. Кроме того, теперь к пакетам библиотеки добавляется префикс в виде их groupId , чтобы создать очевидную связь между используемым классом и артефактом Maven, из которого он берётся.
Сейчас вы можете ожидать следующее сопоставление старых пакетов с новыми:
android.support.** → androidx.@
android.databinding.** → androidx.databinding.@
android.design.** → com.google.android.material.@
android.support.test.** → (в будущем релизе) androidx.test.@
Так как библиотеки Architecture Components теперь включены в пакет AndroidX, их имена были упрощены, чтобы отразить их интеграцию с основными библиотеками. Примеры изменений:
android.arch.** → androidx.@
android.arch.persistence.room.** → androidx.room.@
android.arch.persistence.** → androidx.sqlite.@
Кроме того, поскольку в версии 28.0.0-alpha1 Material Components станут заменой Design Library, был обновлён пакет дизайна, чтобы отразить его новое направление.
Для получения полного списка сопоставлений от 28.0.0-alpha1 ( android.support ) к 1.0.0-alpha1 ( androidx ) посетите эту страницу. Учтите, что в течение альфа-стадии в этот список могут быть внесены небольшие изменения.
Строгое версионирование для каждой библиотеки
Начиная с рефакторинга AndroidX, версии библиотек были сброшены с 28.0.0 до 1.0.0. Будущие обновления будут версионироваться отдельно для каждой библиотеки, следуя строгим правилам, согласно которым основная версия будет указывать на бинарную совместимость. Это значит, например, что вы можете добавить и использовать новую функцию в RecyclerView без обновления всех остальных библиотек, используемых вашим приложением. Также это значит, что библиотеки, зависящие от androidx , могут предоставить гарантии приемлемой совместимости с будущими релизами AndroidX — так, зависимость от версии 1.5.0 может работать с версией 1.7.0, но, скорее всего, не будет работать с версией 2.0.0.
Миграция с 28.0.0-alpha1
Переход приложения от зависимостей android.support к зависимостям androidx проходит в два основных этапа: рефакторинг исходного кода и перевод зависимостей.
Рефакторинг исходного кода обновляет Java-код, XML-ресурсы и конфигурацию Gradle таким образом, чтобы ссылаться на отрефакторенные классы и артефакты Maven. Эта функция доступна в Android Studio Canary 14 для приложений, ориентированных на Android P.
Если вы зависите от библиотеки, которая ссылается на более старую версию Support Library, Android Studio обновит эту библиотеку с помощью перевода зависимостей так, чтобы она ссылалась на androidx . Перевод зависимостей автоматически применяется Android Gradle Plugin 3.2.0-alpha14, который переписывает байт-код и ресурсы зависимостей JAR и AAR (а также транзитивных зависимостей) таким образом, чтобы они ссылались на новые androidx классы и артефакты. Также будет доступен отдельный инструмент для перевода в формате JAR.
Что дальше?
Разумеется, этот переход — не минутное дело, и потому не все успеют его совершить. Поэтому android.support -библиотеки будут получать параллельные обновления на время превью P SDK. Эти обновления будут следовать схеме версионирования 28.0.0, которая появилась в 28.0.0-alpha1 в марте 2018 и будут совместимы с существующими проектами, зависящими от пакета android.support .
Стабильный релиз 28.0.0 будет последним android.support -релизом. Все последующие будут доступны только как androidx -артефакты.
Патчим AndroidX
Изначально, support-библиотеки разрабатывались для обратной совместимости новых API-интерфейсов и были тесно связаны с операционной системой. Разработка support-библиотек велась во внутренних ветках, которые периодически вливались в Android Open Source Project (AOSP). Такой подход ограничивал мерж пулл-реквестов от сообщества небольшими отрезками времени когда код AOSP и внутренний код гугла были синхронизированы. Кроме того, для работы с support библиотеками необходимо было выкачивать весь код платформы, а это более 40ГБ исходного кода. Для моего диска объемом 250 ГБ это достаточно много.
Текущий функционал support-библиотек гораздо шире изначальной задумки. Например, там реализован компонент для упрощения разработки пользовательского интерфейса AppCompat, компонент для работы с базами данных Room, компонент для фоновых задач WorkManager. Многие из этих библиотек изначально имеют обратную совместимость и слабо привязаны к Android API. Цифра в номере support-библиотеки означает минимальный уровень API, который она поддерживает. Например, support-v7 поддерживает Android API версии 7 и выше. Однако, начиная с версии 26.0.0 support-библиотеки поддерживают Android API 14 и выше. Отдельную боль доставляет необходимость одновременного обновления всех support-библиотек. Все это указывает на то, что support-библиотеки изжили себя и нуждаются в переосмыслении.
Команда разработчиков потратила несколько лет на выделение support-библиотек в отдельный небольшой проект, с которым можно работать используя Android Studio и Gradle. Разработка была перенесена в отдельную ветку, которая на днях стала публичной. Обновленные библиотеки получили название AndroidX. Еще одно важное отличие новых библиотек состоит в возможности независимого обновления. Гугл обещает бинарную совместимость в рамках одной мажорной версии, что позволит использовать в проекте recyclerview версии 1.0 и AppCompat версии 1.9 в одном проекте.
На мой взгляд, это правильный и логичный шаг в развитии support-библиотек. Мне приходилось несколько раз сильно кастомизировать компоненты из support-библиотек, что приводило к необходимости создавать в моем проекте пакет com.android.support… для доступа к package-private классам/методам/полям.
Сейчас я предлагаю вместе со мной “хакнуть” какую-нибудь библиотеку из семейства AndroidX. В качестве учебного пособия я выбрал CardView. Я собираюсь повлиять на поведение CardView не внося изменений в код, использующий его.
Нам потребуется: Компьютер под управлением Linux или MacOS (Windows не поддерживается), Android SDK, опционально — Android Studio ( я использовал версию 3.1.3)
Как же Windows?
Для скачивания исходников рекомендуется использовать утилиту repo, которая недоступна для Windows. Исходники можно скачать и с использованием git’а, например, так: git clone —single-branch -b androidx-master-dev https://android.googlesource.com/platform/frameworks/support Однако, в данном случае не будут скачаны утилиты и скомпилированные зависимости. Я не проверял насколько это критично для сборки
Для начала, я подготовил небольшой пример с использованием AndroidX.
def cardViewVer = '1.0.0-beta01' dependencies
public class MainActivity extends Activity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >>
В итоге получаем следующее приложение:
Приступим к AndroidX
Сперва, необходимо установить утилиту repo, созданную для упрощения работы с гитом в контексте андроида.
Создадаем рабочую папку для наших манипуляций, хотя можно использовать и домашнюю директорию.
mkdir androidX
сd androidX mkdir bin curl https://storage.googleapis.com/git-repo-downloads/repo > ./bin/repo chmod a+x ./bin/repo PATH=/androidX/bin/:$PATH
Поясню, что мы сейчас сделали:
В папке androidX создали папку repo, куда скачали файл по ссылке https://storage.googleapis.com/git-repo-downloads/repo, сделали файл исполняемым и добавили папку bin в PATH в рамках текущей сессии терминала.
В моем случае последняя команда выглядела так: PATH=~/Work/projects/androidX/bin/:$PATH
Качаем исходники AndroidX:
Создаем в папку androidX/androidX-source и делаем ее текущей
mkdir androidX-source cd androidX-source
Инициализируем локальный репозиторий. Скачается примерно 16 мегабайт данных о существующих ветках в репозитории.
repo init -u https://android.googlesource.com/platform/manifest -b androidx-master-dev
В процессе имя и почта пользователя подтянется из глобального конфига гита, в моем случае, это выглядело так:
Your identity is: Andrew If you want to change this, please re-run 'repo init' with --config-name Если в конфиге нет этой информации, то имя и почта будут запрошены. Далее идет проверка форматированного вывода и запрос на его включение. Testing colorized output (for 'repo diff', 'repo status'): black red green yellow blue magenta cyan white bold dim ul reverse Enable color display in this user account (y/N)?
На последний вопрос я ответил утвердительно.
В конце получаем сообщение
repo has been initialized in /Users//Work/projects/androidX/androidX-source
Далее скачиваем непосредственно исходники (примерно 3 гигабайта)
repo sync -j8 -c
Скачанные исходники мы можем открыть в Android Studio или любом другом редакторе. Корневая папка gradle-проекта находится по адресу: androidX/androidX-source/frameworks/support/
Там множество модулей с разными фичами и несколько тестовых приложений. Можем их собрать и установить для проверки работоспособности.
Открываем класс androidx.cardview.widget.RoundRectDrawable в модуле cardview
Добавим безобидную шутку в метод onDraw
canvas.drawText(“Hacked!”, 100, 100, paint);
Для проекте описана gradle-таска createArchive, которая соберет библиотеки androidX и разместит их в локальном мавен-репозитории. Адрес репозитория: androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo
Для его использования необходимо указать путь в корневом билд-файле.
Обратите внимание, что собранная версия может быть новее чем в репозитории гугла. На момент написания статьи я собрал androidX библиотеку версии 1.0.0-rc01. Посмотреть версию собранной библиотеки можно в локальном мавен репозитории: androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo/androidx/cardview/cardview/maven-metadata.xml
Пересоберем наше приложение и увидим следующую картину:
AndroidX успешно пропатчен!
Что это нам дает:
- Мы можем фиксить критичные проблемы не ожидая апдейта от гугла. Кстати, команда AndroidX принимает пулл-реквесты.
- Сильно кастомизировать androidX библиотеку.
Androidx и Support Library
При разработке приложений для нескольких версий Android наверняка потребуется способ, который позволит использовать новые функции в более ранних версиях. Можно писать код, который будет обрабатывать ранние версии, а можно воспользоваться библиотекой поддержки (support library), которая обеспечивает обратную совместимость. Помимо этого библиотека поддержки предоставляет удобные классы и функции, которые не только упрощают разработку, но и поддерживаются на большом количестве устройств.
Библиотека поддержки была создана достаточно давно (более 9 лет назад). Всё это время она росла, развивалась и в результате стала немного запутанной, в основном из-за имён компонентов и пакетов. Поэтому Google пересмотрели свой подход и решили разграничить библиотеки, которые идут вместе с операционной системой, от библиотек, которые идут отдельно от неё. Таким образом появилось новое пространство имён — androidx, куда были включены библиотеки, не идущие в комплекте с платформой Android, в том числе подобные библиотеки из библиотеки поддержки, а также из архитектурных компонентов.
AndroidX — это значительное улучшение первоначальной библиотеки поддержки, которая больше не поддерживается (последней версией была 28.0.0).
Полезные ссылки
AndroidX Overview — общая информация об androidx в документации.
Support Library — общая информация о библиотеке поддержки. Она устарела и больше не поддерживается, добавлено ради информации.
AndroidX releases — обновления библиотек androidx.
Hello World, AndroidX — анонс библиотеки androidx в блоге Google.
Перечень пакетов и классов, которые включены в пространсво имён androidx.