AI
prepair.app
Пройти интервью →
EnglishУкраїнськаРусский
🤖

Senior Android (Kotlin)Вопросы на собеседовании Android разработчика

Senior · 5+ лет опыта

Собеседование Android-разработчика крутится вокруг идиом Kotlin, корутин и жизненного цикла платформы — большинство senior-вопросов на самом деле проверяют, понимаете ли вы, что процесс могут убить в любой момент. Ниже — вопросы, которые задают чаще всего, каждый с эталонным ответом. Senior: архитектуру, трейд-оффы, менторство и принятие решений.

Темы для подготовки

Возможности языка Kotlin
Корутины и Flow
Жизненный цикл Android
Jetpack Compose
Архитектура и DI
Room, Retrofit и тесты

9 вопросов уровня Senior с ответами

1

Объясните диспетчеры и что для чего используется.

Ответ

Dispatchers.Main работает на UI-потоке, там трогают вью. Dispatchers.IO — большой эластичный пул для блокирующей работы: диск, сеть, база, — потому что такие потоки в основном ждут. Dispatchers.Default размером с число ядер и предназначен для настоящих вычислений вроде парсинга или сортировки. Блокирующий вызов на Default выедает пул — это самая частая ошибка с диспетчерами.

2

В чём разница между Flow, StateFlow и LiveData?

Ответ

Flow — холодный асинхронный поток: он начинает производить значения при подписке, и у каждого подписчика своё выполнение. StateFlow горячий и всегда хранит ровно одно текущее значение, что делает его естественным для состояния UI — новый подписчик сразу получает актуальное состояние. LiveData — более старый lifecycle-aware держатель; StateFlow вместе с repeatOnLifecycle закрывает ту же задачу остальным инструментарием корутин, поэтому новый код обычно выбирает его.

3

Почему смена конфигурации пересоздаёт Activity и как это пережить?

Ответ

Поворот, тёмная тема, смена языка и размера окна уничтожают и пересоздают Activity, чтобы она подгрузила ресурсы под новую конфигурацию. Состояние, которое должно выжить, живёт во ViewModel — она переживает пересоздание. Состояние, которое должно пережить ещё и смерть процесса, идёт в SavedStateHandle, потому что систему никто не обязывает держать ваш процесс в фоне. Проверка этого пути через «Не сохранять активности» отличает надёжное приложение от того, что теряет введённые пользователем данные.

4

Что вызывает рекомпозицию в Jetpack Compose и из-за чего она тормозит?

Ответ

Compose перезапускает composable, когда меняется прочитанный им State, и пропускает те, у кого параметры равны и стабильны. Тормоза идут от нестабильных параметров — обычный List или лямбда, захватившая меняющееся значение, — они ломают пропуск и перезапускают большие поддеревья. Лечится подъёмом состояния к ближайшему общему владельцу, неизменяемыми коллекциями или аннотацией @Immutable, а также отложенным чтением через лямбды, чтобы перезапускалась только фаза layout или draw.

5

Зачем внедрение зависимостей через Hilt вместо прямого создания объектов?

Ответ

DI избавляет класс от знания о том, как собрать свои зависимости, что делает его тестируемым и держит проводку в одном месте вместо разбросанных синглтонов. Hilt генерирует граф Dagger и привязывает время жизни компонентов к андроидным: @Singleton живёт с приложением, @ViewModelScoped — с ViewModel. Практическая выгода — подменить настоящий репозиторий фейком в тестах, не трогая продакшен-код.

6

Как устроен экран с точки зрения чистой архитектуры?

Ответ

Слой UI держит Compose или View плюс ViewModel, которая отдаёт неизменяемое состояние и принимает события. Слой домена держит юзкейсы и чистые бизнес-правила без импортов Android — именно поэтому он тестируется обычным JUnit. Слой данных держит репозитории, которые выбирают между Room и Retrofit и мапят DTO в доменные модели. Важно тут направление зависимостей: домен ничего не знает ни о данных, ни об UI.

7

Из-за чего возникает ANR и как найти его уже после релиза?

Ответ

ANR срабатывает, когда главный поток заблокирован примерно на пять секунд на вводе, а для бродкастов и сервисов лимиты жёстче. Типичные причины — обращение к базе или сети на главном потоке, огромный синхронный разбор JSON, конкуренция за блокировку с фоновым потоком. После релиза отчёты ANR в Play Console вместе со снятым стеком главного потока указывают на блокирующий кадр; StrictMode в debug-сборках ловит большую часть этого задолго до релиза.

8

Как избегать утечек памяти в Android?

Ответ

Повторяющаяся причина — что-то долгоживущее держит Activity или View: статическая ссылка, неотписанный слушатель, внутренний класс с неявной ссылкой на внешний, корутина на GlobalScope. Защита — привязывать работу к lifecycle-aware скоупу, обнулять ссылку на binding в onDestroyView у фрагментов и использовать Context приложения там, где не нужен Context активности. Остальное ловит LeakCanary в debug-сборке, показывая цепочку удержания.

9

Что такое scope-функции и когда какая читается лучше?

Ответ

let принимает получателя аргументом и возвращает результат лямбды — подходит для проверки на null и преобразования. run делает то же, но через this, удобен для блока вызовов, возвращающего значение. apply возвращает самого получателя и нужен для настройки объекта. also тоже возвращает получателя, но передаёт его как it, поэтому годится для побочных эффектов вроде логирования. with — не расширение и просто группирует вызовы. Выбор по возвращаемому значению и форме получателя как раз и держит их читаемыми, а не хитрыми.

🦎

Прочитать ответы недостаточно

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

Пройти интервью Senior Android (Kotlin) →
Бесплатно · 3 интервью в месяц

Другие уровни — Android (Kotlin)

Junior Android (Kotlin)Middle Android (Kotlin)Все вопросы Android (Kotlin)

Другие специализации

🔍Senior QA Manual🤖Senior QA AutomationSenior Java Backend🐍Senior Python Backend🐘Senior PHP Backend🦫Senior Go Backend🟢Senior Node.js Backend⚛️Senior React Frontend💚Senior Vue Frontend🅰️Senior Angular Frontend