Отключаем Jetifier и ускоряем сборку: опыт Тинькофф.Бизнес

Привет, Хабр!

Уже пять лет наша команда разрабатывает Тинькофф.Бизнес – мобильный банк для юридических лиц и ИП. За это время наше android-приложение успело набрать целых 200 модулей и 400 тысяч строк компилируемого кода.

Модуляризация приложения не всегда идет ему на пользу. Нам приходится решать большое количество задач и проблем, связанных со скоростью сборки.

В этой статье я расскажу и покажу, как мы ускорили билд, отключив Jetifier.

Преамбула

Jetifier был представлен еще в далеком 2018 году вместе с AndroidX – классной заменой support библиотекам, компоненты которой могут поддерживаться и обновляться независимо друг от друга.

Сам по себе Jetifier довольно сложен, но принцип его работы прост как три копейки: он проходится по всем библиотекам, которые есть у вас в проекте и заменяет в них android.support зависимости на их androidx аналог.

В результате мы получаем еще один шаг сборки, который может занять довольно много времени, а до появления AGP 4.1.0 еще и никак не кэшировал результат своего выполнения и замедлял даже инкрементальный билд.

Конечно же нам хотелось бы избавиться от него. Как?

Отключаем Jetifier

На самом деле все может быть довольно просто. Попробуйте зайти в gradle.properties

и проставить там заветный android.enableJetifier=false, а затем выполнить Gradle sync и build. Получилось? Если нет – вы увидите примерно следующую ошибку:

Это связано с тем, что в classpath есть легаси android.support зависимость, и она конфликтует с ее androidx-аналогом. Для отключения Jetifier’а нужно сделать так, чтобы в графе зависимостей не было ни одной саппорт-библиотеки. Давайте посмотрим на полный список зависимостей в нашем проекте. Открываем терминал и запускаем следующую команду:

./gradlew :app:dependencies --configuration=releaseRuntimeClasspath

Здесь можно видеть, что модуль app использует mosby-mvp, который тянет за собой support-библиотеки.

В случае, если ваш проект довольно большой и имеет много зависимостей, :app:dependencies может быть не совсем удобным способом отлавливать легаси-зависимости, на этот случай можно использовать плагин Can I Drop Jetifier: он анализирует граф зависимостей проекта и смотрит, есть ли среди них те, что ссылаются на android.support библиотеки, агрегируя их в один список.

Давайте применим плагин и вызовем ./gradlew -Pandroid.enableJetifier=false canIDropJetifier

Теперь вместо большого лога зависимостей мы можем видеть только те, что мешают нам выключить Jetifier.

Отлично! Давайте теперь на примере mosby.mvp рассмотрим способ миграции библиотеки на androidx.

Для этого нам нужно выполнить несколько шагов:

  1. Проверить версию библиотеки – если есть более новая, в которой нет support зависимостей – обновляемся. Если нет – переходим на следующий шаг.

  2. Найти библиотеку в репозиториях. Например, mosby.mvp лежит на maven

  3. Скачиваем .pom и .aar файлы.

  4. Открываем .pom файл и меняем <groupId> – добавляем в него префикс jetified., чтобы ничего не перепутать

  5. Вручную заменяем все android.support зависимости на их androidx аналог, воспользовавшись этими маппингами.

  6. Если зависимости содержат другие артефакты из этой группы, использующие android.support – с ними придется провести такую же процедуру.

  7. Скачиваем jetifier-standalone и прогоняем через него скачанный .aar файл с зависимостью.

    ./jetifier-standalone -i <source-library> -o <output-library>

  8. Загружаем .pom и .aar файлы в любой доступный вам менеджер репозиториев. У нас это Nexus, если же у вас его нет – можете просто положить .aar к себе в проект.

Готово! Выполнив эти шаги, мы получаем jetified-артефакт, который можем использовать у себя в проекте.

Давайте посмотрим, какой выигрыш мы от этого получили.

Метрики

Для сбора метрик отлично подойдет Gradle Profiler. Для его запуска мы написали простой .sh скрипт и положили его в корневую папку проекта.

#!/bin/bash
echo "Cloning gradle-profiler repository..."

git clone https://github.com/gradle/gradle-profiler.git
cd gradle-profiler
./gradlew installDist
cd ..
./gradle-profiler/build/install/gradle-profiler/bin/gradle-profiler --benchmark --iterations 4 --warmups 3 --project-dir ./ :rko:assembleDebug

echo "searching for statistics..."

medians=$(grep "median" profile-out/benchmark.csv)
IFS=', ' read -r -a array <<< "$medians"

echo "configurationTime = ${array[1]}"
echo "syncTime = ${array[2]}"
 ...

Далее после прогона мы получили следующие метрики:

Метрика

Jetified

Non-Jetified

Mean

23,5 sec

28,5 sec

Min

22 sec

26 sec

Max

25 sec

31 sec

У нас было не так много легаси-зависимостей, которые пришлось перевести на androidx руками, но тем не менее, прогнав на них Jetifier, нам удалось отнять целых 5 секунд из среднего времени сборки. При большом количестве зависимостей эта цифра будет только расти.

Еще больше метрик и самых разных новостей о Тинькофф.Бизнес можно увидеть у нас в Телеграм-канале Tinkoffhere!

Let’s block ads! (Why?)

Read More

Recent Posts

Apple возобновила переговоры с OpenAI и Google для интеграции ИИ в iPhone

Apple возобновила переговоры с OpenAI о возможности внедрения ИИ-технологий в iOS 18, на основе данной операционной системы будут работать новые…

9 часов ago

Российская «дочка» Google подготовила 23 иска к крупнейшим игрокам рекламного рынка

Конкурсный управляющий российской «дочки» Google подготовил 23 иска к участникам рекламного рынка. Общая сумма исков составляет 16 млрд рублей –…

16 часов ago

Google завершил обновление основного алгоритма March 2024 Core Update

Google завершил обновление основного алгоритма March 2024 Core Update. Раскатка обновлений была завершена 19 апреля, но сообщил об этом поисковик…

19 часов ago

Нейросети будут писать тексты объявления за продавцов на Авито

У частных продавцов на Авито появилась возможность составлять текст объявлений с помощью нейросети. Новый функционал доступен в категории «Обувь, одежда,…

20 часов ago

Объявлены победители международной премии Workspace Digital Awards-2024

24 апреля 2024 года в Москве состоялась церемония вручения наград международного конкурса Workspace Digital Awards. В этом году участниками стали…

1 день ago

Яндекс проведет гик-фестиваль Young Con

27 июня Яндекс проведет гик-фестиваль Young Con для студентов и молодых специалистов, которые интересуются технологиями и хотят работать в IT.…

2 дня ago