- PVSM.RU - https://www.pvsm.ru -
На Google I/O 2018 была представлена замена существующим support-библиотекам — AndroidX [1]
Изначально, 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)
Для скачивания исходников рекомендуется использовать утилиту repo [2], которая недоступна для Windows. Исходники можно скачать и с использованием git'а, например, так: git clone --single-branch -b androidx-master-dev https://android.googlesource.com/platform/frameworks/support
Однако, в данном случае не будут скачаны утилиты и скомпилированные зависимости. Я не проверял насколько это критично для сборки
Для начала, я подготовил небольшой пример [3] с использованием AndroidX.
Основные моменты:
Используем AndroidX
def cardViewVer = '1.0.0-beta01'
dependencies {
implementation "androidx.cardview:cardview:$cardViewVer"
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="32dp"
android:layout_marginEnd="32dp"
android:layout_marginLeft="32dp"
android:layout_marginRight="32dp"
android:layout_marginStart="32dp"
android:layout_marginTop="32dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</androidx.cardview.widget.CardView>
</FrameLayout>
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={some_path}/androidX/bin/:$PATH
Поясню, что мы сейчас сделали:
В папке androidX создали папку repo, куда скачали файл по ссылке https://storage.googleapis.com/git-repo-downloads/repo [4], сделали файл исполняемым и добавили папку 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 <me@example.com>
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/{user}/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);
Полный патч [5]
Для проекте описана gradle-таска createArchive, которая соберет библиотеки androidX и разместит их в локальном мавен-репозитории. Адрес репозитория: androidX/androidX-source/out/host/gradle/frameworks/support/build/support_repo
Для его использования необходимо указать путь в корневом билд-файле.
maven { url '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 успешно пропатчен!
Что это нам дает:
Ссылки по теме:
Документация по support-библиотекам [7]
Пост в блоге разработчиков [8]
Инструкция по контрибьюции в AndroidX [9]
Трекер задач по AndroidX [10]
Исходники AndroidX [11]
Автор: Андрей
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android-development/291572
Ссылки в тексте:
[1] AndroidX: https://android-developers.googleblog.com/2018/05/hello-world-androidx.html
[2] repo: https://source.android.com/setup/develop/
[3] пример: https://github.com/devindi/androidX-demo/tree/148db3568460693be600bdb32582621829214eaa
[4] https://storage.googleapis.com/git-repo-downloads/repo: https://storage.googleapis.com/git-repo-downloads/repo
[5] патч: https://github.com/devindi/androidX-demo/blob/master/files/hack.patch
[6] Обновленный пример: https://github.com/devindi/androidX-demo/tree/9639b7abd021dd1fd4882d876c7472323bccd7ab
[7] Документация по support-библиотекам: https://developer.android.com/topic/libraries/support-library/
[8] Пост в блоге разработчиков: https://android-developers.googleblog.com/2018/07/androidx-development-is-now-even-better.html?m=1
[9] Инструкция по контрибьюции в AndroidX: https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/README.md
[10] Трекер задач по AndroidX: https://android-review.googlesource.com/q/project:platform/frameworks/support+status:open
[11] Исходники AndroidX: https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev
[12] Источник: https://habr.com/post/418723/?utm_source=habrahabr&utm_medium=rss&utm_campaign=418723
Нажмите здесь для печати.