Как выгружается приложение(процесс) в Android-е?

Android не выгружает приложение вручную по finish()
Он убивает процесс (process-level cleanup) по следующим причинам:

ПричинаЧто происходит
Нехватка памятиAndroid убивает least important process
Приложение в фоне долго не используетсяМожет быть выгружено «тихо» через LMK
Пользователь смахнул в RecentsAndroid убивает task + процесс
Приложение само вызвало System.exit(0) или killProcess()Принудительное завершение
Force stop через SettingsУбивается процесс + запрещается автозапуск

Кто именно убивает процесс?

Android использует два механизма:

  1. ActivityManagerService (AMS)

Решает, какие процессы можно убить => вызывает Process.killProcess(pid)

2. Low Memory Killer (LMK)

(на старых версиях Android < Q) Это ядреный механизм: ядро убивает процесс, основываясь на приоритетах и OOM score

Что происходит при убийстве?

  1. onDestroy() НЕ вызывается!
    Android не успевает вызвать lifecycle-методы при принудительном убийстве
  2. ViewModel, Activity, Application — всё уничтожается
    Только что было в памяти — пропадает
  3. savedInstanceState может быть использован при пересоздании, если ты его сохранил

Под капотом — что делает AMS

  • PID => SIGKILL (через Zygote)
  • Удаляется ProcessRecord из AMS
  • Удаляется таск из Recent Tasks, если это task.removeTask = true
  • Очистка всех IBinder-связей

Опубликовано

в

от

Метки: