Автоматизируем рутину в Android разработке: плагин для создания шаблонного кода на примере создания -api -impl модулей

Привет, Хабр! Меня зовут Алексей, я ведущий разработчик платформенной команды и по совместительству лид архитектурной компетенции в проекте Альфа-Бизнес. Сегодня я расскажу, как можно автоматизировать повторяющуюся работу в андроид-разработке при помощи плагина для Android Studio.

34b06d2521cdeb9d25be4eeeb2ce7294.jpg

Для программиста основная часть работы — это автоматизация и упрощение процессов. Эта часть может быть направлена на решение потребности клиентов (покупателей и пользователей софта), например, упростить перевод денег, дать возможность сделать это с телефоном в руках, а не в отделении банка, или создать функционал, позволяющий пройти обучение дома за компьютером, а не ездить на курсы в другой город. 

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

В процессе написания кода тоже встречается много рутинной работы. Это может быть какой-то шаблонный код для написания тестов, например, создание моков и прокидывание в конструктор при создании экземпляра тестируемого класса или добавление нового экрана. Если вы используете подход MVI, что очень актуально для андроид-разработки, то сталкивались с тем, что для каждого экрана приходится создавать множество отдельных файлов с шаблонным кодом для редьюсера, экзекутора, стейта, экшены, сами файлы экрана, и это тоже хотелось бы делать «в один клик».

Если вы на проекте используете многомодульную архитектуру, и при этом написание кода у вас максимально формализовано, то часто сталкиваетесь с тем, что в самом начале разработки новой фичи нужно создать много шаблонного кода. В нашем случае — весь код связанный с di, хранением экземпляра компонента, навигацией, создание файлов интерфейса и реализации репозитория. На это разработчики тратят время, а хотелось бы об этом перестать думать и просто заниматься написанием функционала.

Задача

Сначала определимся со структурой файлов, которые мы хотим генерировать при создании модулей. Для проекта Альфа-Бизнес в каждой фиче нужно создавать два модуля с постфиксами -api и -impl. 

  • В api из дефолтного нам нужен класс-медиатор запуска флоуфрагмента фичи, реализация его будет в модуле impl.

  • Из основного и самого трудозатратно шаблонного кода нам нужно создать классы для di, они располагаются в отдельном пакете. 

  • На слое presentation у нас лежит два пакета view, в котором расположен FlowFragment — это фрагмент, который хостит все другие фрагменты фичи, а навигация лежит в пакете navigation. 

  • Можно также создать файлы для репозитория и api, так как они требуются практически в каждой фиче. 

У меня получилась такая структура модулей, которую мы хотим сгенерировать автоматически.

01e73defd3af1a4774ada53f69965c02.png

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

56381d21d0786b7ad37d1fc7d6ee609d.png

Настройка проекта

Для создания плагина нужно использовать IntelliJ IDEA, подойдет как enterprice так и community edition. Первое, что нам нужно сделать — это создать проект. Для этого выбираем new project → IDE plugin, вводим название и нажимаем create.

30c894eb362237019f7918e017d8c7b2.png

После того как IDE создаст необходимые файлы с зависимостями, мы увидим следующую структуру файлов.

e2c98918c1e78e94a4cd2a8eb3bb3255.png

Первое, на что тут стоит обратить внимание, — это файл plugin.xml. В нём содержится необходимая метаинформация о вашем плагине. Подробнее о том, что можно указать в plugin.xml можно прочитать в документации. 

После того как уберём лишние строки и заполним необходимые на данном этапе поля, в файле останется такая структура.


   com.example.plugin
   TestPlugin
   TestPluginVendor
   com.intellij.modules.platform
   org.jetbrains.android
   
   

После откроем файл build.gradle.kts и настроим его для создания плагина для Android Studio.

intellij {
   version.set("2022.3.1.22")
   type.set("AI") // Target IDE Platform

   plugins.set(listOf("org.jetbrains.android"))
}

Список актуальных версий можно взять по ссылке.

После всех настроек синхронизируем проект и можно приступать к написанию плагина.

Предоставление плагина в Android Studio

Первое, что нам нужно сделать, так это добавить класс, который будет наследником абстрактного класса WizardTemplateProvider. В нём нужно будет переопределить метод getTemplate и предоставить туда все наши шаблоны. В нашем случае это будет moduleTemplate, который мы напишем позже.

class MyWizardTemplateProvider : WizardTemplateProvider() {
   override fun getTemplates(): List