
Привет! Меня зовут Стефан, я занимаюсь Android-разработкой в KTS.
Android-разработчики каждый день сталкиваются с своим основным инструментом — Android Studio.
Это очень удобный инструмент с большим спектром возможностей, но зачастую разработчики не используют их все. В этой статье я попытаюсь это исправить и расскажу об интересных фишках этой IDE, которые сам использую каждый день. Не обо всех, но зато самых базовых, которые позволят увеличить вашу продуктивность.
❗️ Обратите внимание: большинство советов универсальны и не завязаны именно на AS. Их могут использовать бэкендеры в PyCharm, фронтендеры на WebStorm, иосеры на AppCode.
Опытные разработчики, скорее всего, знают о некоторых из этих возможностей:
Хоткеи
Они же горячие клавиши, которые облегчают жизнь разработчику и любому работающему за клавиатурой человеку. Хоткеев получилось довольно много, поэтому я разделил их по разделам.
Важно понимать, что хоткеи зависят от раскладки студии (keymap). Я просто покажу вам, как настроить каждый, а на любое сочетание клавиш найдётся свой любитель.
❗️ Обратите внимание: хоткеи различаются в зависимости от OS, поэтому важнее знать, где их посмотреть и настроить. Это делается в этом окне:

Общие действия
Скрытый текст

Скрытый текст

Скрытый текст

Скрытый текст

Скрытый текст

Удаляет неиспользуемые импорты, сортирует импорты в соответствии code-style проекта.
Установить его можно в настройках студии:
Preferences → Editor → Code Style → Выбираем конкретный язык → Шестерёнка ⚙️ возле поля Scheme → Import Scheme

Скрытый текст

Скрытый текст

Скрытый текст

Скрытый текст

Скрытый текст

Скрытый текст

Позволяет закрыть активное окно, аналогично клику на кнопку «свернуть» в окне. Я, к примеру, так закрываю Logcat:

Навигация
Скрытый текст


Позволяет навигироваться на те строчки кода, которые попали в индекс Git в рамках файла. Также помимо навигации показывает дифф:

Скрытый текст


Скрытый текст


Позволяет навигироваться по последним открытым файлам, как вперёд, так и назад. Так вам не приходится переключать одну руку на мышку/трекпад, руки остаются на клавиатуре
Скрытый текст

Позволяет искать по названиям файлов, классов, действиям, Git — по commit-хэшу, названиям веток, тэгам и commit message:

Навигация по вкладкам
Скрытый текст

Скрытый текст

Скрытый текст

Очень мощный шорткат, использую его в KMM/KMP проектах, позволяет:
Показать файл в:
ProjectView: в виде Project, Packages, Android и разных Scop проекта
Показать структуру файла
Navigation bar
Открыть в Finder/Проводнике
Показать структуру проекта

Работа с кодом
Скрытый текст

Скрытый текст

Почти тоже самое, что форматирование кода, только более гибкое, так как появляется контекстное меню, в котором можно задать параметры форматирования:

Скрытый текст


Меняет строчки кода местами. Удобно, когда нужно поменять параметры функции/метода/конструктора.
Скрытый текст


В отличие от свапа строчек местами, этот хоткей позволяет менять местами тела целых методов, объявления классов и top-lvl переменных и функций, параметров функции/метода/конструктора — но делает это умно и сам подставляет запятые в нужных местах. Также нельзя выйти за пределы сигнатуры метода, если меняете параметры метода местами.
Скрытый текст


Скрытый текст

Позволяет устанавливать несколько кареток текста, что бывает удобно при копировании параметров. Работает следующим образом: зажимаем хоткей и кликаем в нужное место в коде.
Скрытый текст


Скрытый текст


Скрытый текст


Скрытый текст


Скрытый текст

Скрытый текст

Позволяет клонировать каретку над строчками выше/ниже текущей каретки. Это тоже удобно при копировании/перемещении параметров.
Работа с GIT
Скрытый текст

Позволяет откатить изменения в индексе Git.
Можно использовать как в файлах исходного кода, так и целиком на файлах в индексе VCS, которые находятся во вкладке Git → LocalChanges

Скрытый текст

Скрытый текст

Скрытый текст

Key Promoter X
В предыдущей главе я рассказал только о незначительной части хоткеев, которые можно установить в студии. Кто-то может возразить: «Что-то слишком их много, тяжело выучить все и запомнить пальцами будет тяжело». На что я могу вам ответить: «Используйте Key Promoter X».
Это плагин, позволяющий выучить хоткеи постепенно. Пока вы будете выполнять то или иное действие в студии при помощи мыши, плагин будет давать подсказки с хоткеями для этих действий. А если хоткея под это действие нет, посоветует вам его завести.
Найти плагин легко. Нужно ввести Key Promoter X в Preferences → Plugins → Marketplace:

После установки перезапускаем студию и пользуемся!

Подсказки выглядят так:

В подсказке также будет написано, сколько раз вы вместо хоткея использовали мышку)
Подсказка появилась, когда я попытался навигировать в объявление метода через контекстное меню ПКМ-ом по методу:

Также можно посмотреть общую статистику пропущенных хоткеев:

Шаблоны кода
При разработке встречается много бойлерплейта/однотипного кода, например ViewModel-и или Fragment. Чтобы автоматизировать написание таких мест, ребята из hh.ru сделали очень приятный инструмент: набор плагинов для работы с Android Studio
Я использую Geminio, который позволяет по шаблону создавать целые модули. В команде это гарантирует, что все модули, которые разные разработчики создадут с этим плагином, будут иметь одну и ту же структуру. Тогда структура проекта будет выглядеть единообразно.
Перед использованием плагинов сначала их нужно собрать (ручками ?) и этими же ручками подключить к Android Studio.
В документации всё подробно описано.
Подсветка вложенных скобок
В коде порой могут встречаться сложные вложенные конструкции, которые обрамляются либо обычными ()-скобками, либо фигурными {}. То, что этих скобок на единицу текста стало очень много, означает две вещи:
Надо отрефакторить этот код
Использовать плагин Rainbow Brackets, хотя одно другому не мешает :)
Найти его очень просто, достаточно ввести Rainbow Brackets в Preferences → Plugins → Marketplace:

Плагин очень простой. Всё, что он делает — подсвечивает разными цветами скобочки, что делает код более читаемым.
Пример без Rainbow Brackets и с Rainbow Brackets:


Rainbow Brackets можно настроить под себя:

Лично я в настройках из коробки ничего не менял, но всегда можно попробовать.
Подсветка логов
Недавно Google представила в свежей версии Android Studio новый Logcat, который, на мой взгляд, удобней, чем старый.

Раз уж в предыдущей главе мы заговорили о подсветке — кроме скобок, в студии ещё можно подсвечивать и логи в Logcat! Студия поддерживает это из коробки.
Настраивается в Preferences → Editor → Color Scheme → Android Logcat:

Список настроек очень обширен, настраивать можно как:
стиль текста: жирный и курсив
цвет текста для каждого уровня логов
цвет фона
добавлять полоски в скролле сбоку, чтобы можно было видеть по скроллу где и с каким уровнем сообщения
даже добавлять эффекты, обводку текста определенным цветом:

ADB Idea
При работе с вашим приложением на устройстве AS под капотом использует ADB (Android Debug Bridge), от установки приложения и вплоть до вывода логов в Logcat.
При отладке приложения бывают случаи, когда его нужно несколько раз переустанавливать на устройстве, стирать его данные, перезапускать, убивать процесс приложения или отзывать permissions. Это можно делать и руками на устройстве, но для автоматизации этих действий уже существует решение — плагин ADB Idea.
Найти его можно, введя в ADB Idea в Preferences → Plugins → Marketplace.
Плагин позволяет:
Деинсталлировать приложение
Убивать процесс приложения
Запускать приложение
Перезапускать ранее запущенное приложение
Очищать данные приложения
Очищать данные приложения и затем перезапускать
Запускать приложение с дебаггером
Перезапускать приложение с дебаггером
Предоставлять/отзывать permissions
Включить/отключить WiFi
Включить/отключить мобильные данные
После установки открыть список команд можно двумя способами:
Через вкладку Tools сверху → ADB Idea.

Через хоткей
Через Touchbar на Mac, команды просто выводятся на него:


Multirun
При запуске приложения на устройстве мы обычно используем конфигурацию запуска:

По умолчанию конфигурация собирает проект из app-модуля и запускает на устройстве, но там также могут быть тесты, Compose Preview и т.п. Что, если нам понадобится запускать сразу несколько конфигураций? Для решения этой проблемы есть плагин Multirun, который позволяет сразу запускать множество конфигураций одним кликом, а также группировать конфигурации.

Я в основном использую сценарий с запуском приложения под разные конфигурации в KMM — Android, iOS, Desktop:

Как настроить Multirun конфигурацию:
Run → Edit Configurations...
Найдите и добавьте новую конфигурацию Multirun
Добавьте другие конфигурации запуска в конфигурацию Multirun
Выбираем нужные нам варианты
Можно запускать!
Git Hooks
Скорее всего, свои задачи вы делаете в отдельных ветках, и вам приходится добавлять к commit message название ветки. Это тоже можно автоматизировать! Для этого потребуется Git hooks.
Git Hook — это скрипт, который выполняется до или после различных событий Git: commit, push и receive.
Git Hook могут лежать в двух местах:
под Git: мы можем сами настраивать директорию с Git Hook в нашем проекте. Как это можно сделать:
при помощи команды в терминале:
git config core.hooksPath .githooks
при помощи Gradle Task
Скрытый текст
val changeGitHooksDir by tasks.registering(Exec::class) {
group = "git"
description = "Changing githooks dir to .githooks"
fun ExecSpec.executeStringCommand(command: String) {
val splitted = command.split(" ")
commandLine(*splitted.toTypedArray())
}
fun execute(command: String) {
exec { executeStringCommand(command) }
}
executeStringCommand("git config core.hooksPath .githooks")
}
tasks.getByPath(“<build>”).dependsOn(changeGitHooksDir)
В данном случае мы расположим Git Hook в корне директории/.githooks. Вариант с Gradle Task более предпочтителен, потому что нет гарантии, что разработчики будут выполнять команду в терминале:git config core.hooksPath .githooks
вне Git: корень директории/.git/hooks (там же еще лежат и примеры от Git
Git Hook, добавляющий название ветки к commit message в квадратных скобках []:
Скрытый текст
#!/bin/sh
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3
BRANCHES_TO_SKIP=(main dev)
BRANCH_NAME=$(git symbolic-ref --short HEAD)
BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$")
TRIMMED=$(echo $BRANCH_NAME | sed -e 's:^\([^-]*-[^-]*\)-.*:\1:' -e \
'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/')
PREFIX="[$TRIMMED]"
COMMIT_MSG=$(cat $COMMIT_MSG_FILE)
if [ -n "$BRANCH_NAME" ] && ! [[ $COMMIT_MSG == "$PREFIX"* ]] && ! [[ $BRANCH_EXCLUDED -eq 1 ]]; then
sed -i.bak -e "1s/^/$PREFIX /" $COMMIT_MSG_FILE
fi
Так вы выполните commit на MYFEATURE-10 с сообщением "My commit". На выходе получите: [MYFEATURE-10] My commit
Ещё в Git Hook можно прогонять перед коммитом, например, Detekt с автоисправлением и проверкой кода на соответствие code-style.
Чтобы студия использовала Git Hook, в окне Commit Changes при коммите в разделе Before Commit нужно поставить галочку Run Git Hooks:

Заключение
Всеми этими фишками я сам пользуюсь каждый день. Порой я вижу разработчиков, которые делают руками какие-то вещи руками, и от этого страдает скорость даже самых базовых операций. А если это операция, которую вы за день делаете сто или тысячу раз — на выходе получаете серьёзную потерю в скорости.
Этой статьёй я хотел сделать жизнь разработчиков продуктивнее. Надеюсь, вы тоже смогли почерпнуть для себя что-то новое в вашем основном инструменте.
❗️ Хотел бы обратить внимание, что не нужно выполнять все пункты разом. Главное, применяйте эти рекомендации периодически, возвращаясь к статье — и со временем увидите прогресс. Особенно в сравнении с теми, кто не автоматизирует свою работу… Вы, кстати, можете посоветовать им эту статью ?
Тема автоматизации — весьма обширная, и улучшать работу, внезапно, можно не только в Android Studio. Если статья вам понравится, в следующий раз я постараюсь разобрать более глубокие и общие фишки, которые подходят не только пользователями AS.
Другие статьи по Android-разработке для начинающих:
Статья про OAuth, из которой узнаете, на какие моменты стоит обратить внимание, какие способы реализации выбрать
Но это (не)точно: чего ждать мобильным разработчикам в 2023-м году
Другие статьи по Android-разработке для продвинутых:
Этапы работы во фреймворке Jetpack Compose, который упрощает написание и обновление визуального интерфейса приложения