Как устроен процесс в Android приложении
Что проверяют
Знаете ли вы, что происходит под капотом, когда пользователь нажимает на иконку: откуда берётся процесс, кто им управляет и когда система его убьёт. Следом почти всегда спрашивают про смерть процесса: что переживёт ViewModel, а что нет.
Как отвечать
Начните с того, что каждое приложение по умолчанию живёт в отдельном Linux-процессе со своим UID, и от этого разворачивайте детали:
- Zygote: заранее прогретый процесс с загруженными классами фреймворка и ресурсами. Процесс приложения получается его форком, поэтому холодный старт не грузит всё с нуля;
- ART и главный поток: в процессе своя виртуальная машина, точка входа
ActivityThread.main()запускаетLooperглавного потока. Через егоMessageQueueидут колбэки жизненного цикла и отрисовка; - порядок старта: сначала
Application.attachBaseContext(), затемonCreate()всехContentProvider, и только потомApplication.onCreate(). На этом держится инициализация библиотек через провайдеры и App Startup; - компоненты:
Activity,Service,BroadcastReceiver,ContentProviderпо умолчанию крутятся в одном процессе. Атрибутandroid:processвыносит компонент в отдельный, и тогдаApplicationсоздаётся в каждом процессе заново; - связь с системой: всё общение с
system_serverидёт через Binder IPC.
Дальше расскажите про приоритеты. Система делит процессы на foreground, visible, service и cached, а при нехватке памяти lmkd убивает их с конца списка. Приложение в фоне может быть убито без единого колбэка, а при возврате система пересоздаст последнюю Activity и отдаст ей сохранённый Bundle.
Где спотыкаются
Отвечают про MVVM, Room и Retrofit. Это архитектура кода, а вопрос про устройство процесса в операционной системе.
Считают, что ViewModel переживает всё. Она переживает смену конфигурации, но не смерть процесса: для этого нужен SavedStateHandle или onSaveInstanceState(). Статические синглтоны после восстановления тоже окажутся пустыми.
Проверяют смерть процесса флажком «Не сохранять действия». Он уничтожает Activity, но процесс оставляет живым. Честная проверка: свернуть приложение и выполнить adb shell am kill <package>.