Как стать автором
Обновить

Комментарии 6

ЗакрепленныеЗакреплённые комментарии

Добрый вечер. Решил спустя несколько месяцев сделать небольшой апдейт по теме статьи. Возможно кому-то это окажется полезным.

В общем, я решил придать лоска, шарма и благородства данному велосипеду, и запилил плагин для андроид студии, который делает, по сути, всё то же самое что и скрипты приведённые в статье, только лучше - красиво и удобно, одной кнопкой через гуй и самое главное - единообразно на всех операционных системах, включая windows. Были также поправлены некоторые баги оригинального плагина сборки, например невозможность передать apk с сервера на локальный компьютер на версии AGP > 7.0.2, невозможность нормально передавать файлы на сервер с локального компьютера на винде и т.д.

Плагин уже готов и опубликован в маркетплейсе JetBrains. Можете установить его прямо из настроек андроид студии. Заходите в настройки, раздел Plugins, вбивайте в поиске название "SkyForge" и тыкайте "Установить".

На тулбаре запуска рядом с кнопками Run и Debug появляется три новых кнопки:

  • Открытие окна настроек удалённой сборки для IDE. По сути - конфиг для ssh + несколько дополнительных опциональных параметров

  • Подготовка зависимостей для сборки проекта на удалённом сервере. После того как настроен ssh доступ, ткните её один раз, она проверит наличие на машине нужных версий JDK, Android SDK, cmdline-tools, platform-tools, build-tools и т.д, установит их в систему если чего-то не хватает (пока поддерживается только Ubuntu 20+)

  • Тоггл-кнопка, переключатель, показывает какой режим сборки в данный момент активирован (сборка на локальной машине / сборка на сервере) и позволяет в один тык переключиться в другой режим

Теперь достаточно один раз в настройках прописать параметры подключения к серверу по ssh, и далее просто кнопочкой включать и выключать этот режим когда требуется. Нажали один раз - все команды gradle начинают выполняться на сервере вместо локальной машины, нажали второй раз - всё возвращается в исходный режим и все gradle команды выполняются локально (это может быть полезно в случае, например, потери связи с сервером, чтобы не блокировать себе работу).

Теперь нет необходимости никакие дополнительные файлы класть в корень проекта, добавлять какие-то плагины в проект и т.д. Не будет ни одной строчки в git diff. Не потребуется также не забывать "отключать" режим сборки на сервере чтобы gradle на локальном компьютере мог нормально работать с другими проектами (init-script сборки на удалённом сервере теперь не блокирует их работу). Также добавлены некоторые неудобства и исправлены некоторые ошибки по мелочи.

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

Если вдруг вы воспользовались этим плагином, то я буду очень благодарен если в ответ на этот комментарий или в пм вы закинете обратную связь и/или какие-то идеи по фичам. У меня самого имеются кое-какие планы на улучшения, но хотелось бы понимать, что вообще ожидает пользователь. 

Спасибо!

Привет, я автор Mirakle) Действительно, проект начался как форк от Mainframer специально для Gradle лет 5 назад. Я решил поэкспериментировать, можно ли улучшить работу этой утилиты засчет тесной интеграции с Gradle. И лично для себя нашел кучу плюсов, которые вы и упомянули в статье, с того времени развиваю проект.

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

Интересно, а у какого провайдера вы берете инстанс для сборок и какое железо у этого инстанса? 

Добавлю вашу статью и скрипты в README на гитхабе для желающих разобраться. Спасибо за разбор!

Добрый день. Ого, здорово получить от вас сообщение! Удивительно тесен мир. Спасибо вам большое ещё раз за ваш проект.

Меня тоже заинтересовала, в первую очередь, возможность практически бесшовной интеграции с инструментами сборки. Ни Gradle, ни IDE не требуют специальной доработки конфигов на уровне проекта и это, на самом деле, очень круто, хоть пока и приходится кое-какие вещи произвести руками чтобы всё заработало. Мне очень понравился проект. Планирую, как будет возможность по свободному времени и должный порыв души, всё таки попробовать обернуть это в полноценный плагин для андроид студии, а серверную часть, кажется, можно без больших проблем оформить в docker контейнер и сделать коробочным решением. Мне кажется, что потенциал Mirakle очень большой.

Что касается использования - я сам активно пользовался Mirakle как раз на предыдущем рабочем месте из-за гигантского размера проекта и очень долгой сборки, сейчас работаю в немного другой сфере и собирать такого рода проекты уже не приходится.

Кажется, что на хабре эта тема не вызвала интереса, что для меня немного странно, потому что это, как минимум, очень интересно - никаких других подобных решений именно для андроид я ни разу не видел, и ещё и полезно - для работы с жирными проектами на слабом железе это действительно настоящее спасение. В компании где я работал, например, долгая сборка была достаточно больной и общеизвестной проблемой. Я пробовал продвигать идею взять Mirakle, поставить его на более менее промышленные рельсы, и выделить мощности на оборудовании компании чтобы удалёнщики со слабым железом могли без проблем собирать проект, но, к сожалению, дальше обсуждений дело не пошло.

Наверное мне повезло с тем, что у меня было подходящее железо которым удобно было воспользоваться. Мой провайдер - домашний компьютер с Ryzen 5950, на котором можно взять и поднять виртуалку с парой десятков ядер и кучей памяти :)

В моём случае пользоваться услугами провайдеров всё равно было нельзя, но я для интереса смотрел рынок, и находил предложения по аналогичным по мощностям машинкам. Например, у Selectel практически аналогичная конфигурация стоила, в то время когда я интересовался этим, около 20 рублей в час. Сейчас вот, кстати, зашёл посмотрел, ценник уже стал очень сильно кусаться - 45 рублей в час - уже не такая народная цена

А какие диски на домашней машине и какие настройки виртуалки?
Просто если я правильно подозреваю что за проект — там сборка сильно упирается в том числе в производительность диска и single-core производительность при сборке того крупного легаси модуля в котором раньше все жило.
Спасибо за статью и скрипты!

Добрый вечер. Спасибо за интерес к статье.

Диски — SSD, и на ноутбуке и на компьютере. По скорости чтения и записи сопоставимы. Честно говоря, я не мерял точную нагрузку на IO, но она должна быть довольно значительной, файлов в кэшах и промежуточных результатах сборки очень много.

Single core производительность однозначно важна. В процессе сборки проекта есть несколько мест, «бутылочных горлышек», когда вся работа производится исключительно на одном потоке, а остальные gradle таски не могут начать выполнение пока не окончится предыдущая. В первую очередь это compile и annotation processing основного модуля. Кодогенерации было много, и kapt занимал ну очень большую часть общего времени. Уверен, что ребята ждут не дождутся полноценно работающего со всеми основными популярными библиотеками ksp.

Тем не менее, все остальные модули и большая часть тасков gradle отлично выполянялись параллельно. Я пробовал делать большее и меньшее количество ядер и обнаружил что это самым серьёзным образом влияет на скорость сборки. Изменение количества RAM, как ни странно, влияло намного меньше.

Добрый вечер. Решил спустя несколько месяцев сделать небольшой апдейт по теме статьи. Возможно кому-то это окажется полезным.

Пользователь @nublikaska, огромное ему спасибо, связался со мной, дал полезную обратную связь и указал на некоторое количество недочётов в моей работе. 

  • Во-первых, разработчики android-gradle-plugin в определённом обновлении, без объявления войны, реализовали достаточно необычное дополнение - теперь в build директории результат сборки - apk файлы складывается не только в build/outputs (специальная директория для результатов сборки), но ещё и в build/intermediates (директория для промежуточных результатов сборки, которая для оптимизации передачи данных по сети была полностью исключена для передачи rsync-ом с сервера на локальный компьютер). Логика в этом примерно следующая: если пользователь ввёл полноценную команду сборки, например вызвал assemble таску в gradle, или через гуй вызвал build release apk, то результат положится в build/outputs, а вот если он нажал кнопку Run или Debug на тулбаре в UI андроид студии, то вроде как это теперь не "результат сборки", а "промежуточный результат сборки", т.к. это скорее всего будет прогон кода на устройстве и его отладка. Получается что апк теперь лежат в двух разных местах, в зависимости от обстоятельств, одно из которых - совершенно неочевидное.

    Исправление этой проблемы требует небольшой доработки самого плагина, которая сделана и протестирована у меня локально, но, к сожалению, в настоящее время не влита, поэтому с определённой версии gradle плагина андроида, при нажатии на кнопку Run на тулбаре в андроид студии сборка на сервере у вас выполнится, а вот апк передан на локальный компьютер не будет, и на устройстве не запустится, при этом студия сообщит "build success". Постараюсь исправить это как можно скорее.

  • Во-вторых, к сожалению, не совсем корректно работает заложенный в плагин механизм breakOnTask. Блокирующих проблем в работе это не создаёт, однако есть ряд мелких неудобств, наибольшая из которых для меня, чисто идеоологическая - невозможность собрать релизный билд на сервере, передать на локальную машину и подписать уже здесь на локальном компьютере, таким образом на удалённую машину не будет лишний раз передаваться файл с приватным ключом для подписи релизных сборок. Также мелкий момент - даже если вы не вносили никаких изменений в код и ваш отладочный апк актуален, при нажатии Run или Debug gradle всё равно запустит rsync, тот сверит код на локальной машине с кодом на сервере, потом там на сервере убедится что пересборка апк не треубется, потом также rsync-ом сверит что апк на сервере и локальной машины одинаковые и загрузка нового с сервера не требуется. Это мелочь, занимает 3-4 секунды, но всё равно неприятно - необходимо сделать правильно. К сожалению, я пока не особо разбирался в работе breakOnTask, планирую доделать это, т.к. штука важная. 


Самое важное:


Решение приведённое в статье использует шеллскрипты, выглядит немного по кустрно-самоделкински, к тому же было сделано на макоси и работает только на макоси и линуксе, а огромное количество разработчиков использует виндовс. Возможно там это можно запустить как-то на баше через wsl, но я не пробовал и не могу гарантировать что оно взлетит. Для винды, по идее, необходимо бы написать свою реализацию под виндовый терминал. 

В общем, я решил придать лоска, шарма и благородства данному велосипеду, и запилил плагин для андроид студии, который делает, по сути, всё то же самое что и скрипты приведённые в статье, однако делает это красиво и удобно, через гуй и самое главное - единообразно на всех операционных системах, включая windows.

Первая, простенькая и сырая версия плагина уже готова (но не опубликована на момент написания этого комментария). Вот так это выглядит:

Плагин для Android Studio:
Новые кнопки на тулбаре
Новые кнопки на тулбаре
Настройки сборки на удалённом сервере
Настройки сборки на удалённом сервере
Переключение режимов сборки
Переключение режимов сборки

На тулбаре запуска рядом с кнопками Run и Debug появляется две новых кнопки:

  • открытие окна настроек удалённой сборки для IDE. По сути - конфиг для ssh + несколько дополнительных параметров

  • тоггл-кнопка, переключатель режима, показывает какой режим активирован (локальная сборка / сборка на сервере) и позволяет переключиться в другой режим


Теперь достаточно один раз в настройках прописать параметры подключения к серверу по ssh, и далее просто кнопочкой включать и выключать этот режим когда требуется. Теперь нет необходимости никакие дополнительные файлы класть в корень проекта, добавлять какие-то плагины в проект и т.д. Не будет ни одной строчки в git diff. Не потребуется также не забывать "отключать" режим сборки на сервере чтобы gradle на локальном компьютере мог нормально работать с другими проектами (init-script сборки на удалённом сервере теперь не блокирует их работу). Также добавлены некоторые неудобства и исправлены некоторые ошибки по мелочи. 

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

Если вы воспользовались приведёнными в статье скриптами, то я буду очень благодарен если в ответ на этот комментарий или в пм вы закинете обратную связь и/или какие-то идеи по фичам. У меня самого имеются кое-какие планы на мелкие улучшения, но хотелось бы понимать, что вообще ожидает пользователь. 

Спасибо!

Добрый вечер. Решил спустя несколько месяцев сделать небольшой апдейт по теме статьи. Возможно кому-то это окажется полезным.

В общем, я решил придать лоска, шарма и благородства данному велосипеду, и запилил плагин для андроид студии, который делает, по сути, всё то же самое что и скрипты приведённые в статье, только лучше - красиво и удобно, одной кнопкой через гуй и самое главное - единообразно на всех операционных системах, включая windows. Были также поправлены некоторые баги оригинального плагина сборки, например невозможность передать apk с сервера на локальный компьютер на версии AGP > 7.0.2, невозможность нормально передавать файлы на сервер с локального компьютера на винде и т.д.

Плагин уже готов и опубликован в маркетплейсе JetBrains. Можете установить его прямо из настроек андроид студии. Заходите в настройки, раздел Plugins, вбивайте в поиске название "SkyForge" и тыкайте "Установить".

На тулбаре запуска рядом с кнопками Run и Debug появляется три новых кнопки:

  • Открытие окна настроек удалённой сборки для IDE. По сути - конфиг для ssh + несколько дополнительных опциональных параметров

  • Подготовка зависимостей для сборки проекта на удалённом сервере. После того как настроен ssh доступ, ткните её один раз, она проверит наличие на машине нужных версий JDK, Android SDK, cmdline-tools, platform-tools, build-tools и т.д, установит их в систему если чего-то не хватает (пока поддерживается только Ubuntu 20+)

  • Тоггл-кнопка, переключатель, показывает какой режим сборки в данный момент активирован (сборка на локальной машине / сборка на сервере) и позволяет в один тык переключиться в другой режим

Теперь достаточно один раз в настройках прописать параметры подключения к серверу по ssh, и далее просто кнопочкой включать и выключать этот режим когда требуется. Нажали один раз - все команды gradle начинают выполняться на сервере вместо локальной машины, нажали второй раз - всё возвращается в исходный режим и все gradle команды выполняются локально (это может быть полезно в случае, например, потери связи с сервером, чтобы не блокировать себе работу).

Теперь нет необходимости никакие дополнительные файлы класть в корень проекта, добавлять какие-то плагины в проект и т.д. Не будет ни одной строчки в git diff. Не потребуется также не забывать "отключать" режим сборки на сервере чтобы gradle на локальном компьютере мог нормально работать с другими проектами (init-script сборки на удалённом сервере теперь не блокирует их работу). Также добавлены некоторые неудобства и исправлены некоторые ошибки по мелочи.

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

Если вдруг вы воспользовались этим плагином, то я буду очень благодарен если в ответ на этот комментарий или в пм вы закинете обратную связь и/или какие-то идеи по фичам. У меня самого имеются кое-какие планы на улучшения, но хотелось бы понимать, что вообще ожидает пользователь. 

Спасибо!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории