Зачем выносить компоненты в отдельный процесс
Что проверяют
Понимаете ли вы, что процесс в Android это отдельный экземпляр рантайма со своей памятью, и знаете ли, чего стоит такое разделение. Следом почти всегда спрашивают, как компоненты в разных процессах обмениваются данными и что происходит с Application.
Как отвечать
Компонент выносят атрибутом android:process в манифесте у Activity, Service, BroadcastReceiver или ContentProvider. Имя с двоеточием в начале, например :player, делает процесс приватным для приложения. Зачем это нужно:
- отдельная куча: лимит памяти считается на процесс, поэтому тяжёлая работа с изображениями, картами или медиа не отнимает память у UI;
- изоляция падений: необработанное исключение или OOM в
:workerне убивает интерфейс, и наоборот; - независимая жизнь: система может выгрузить процесс с UI и оставить работать процесс с сервисом плеера;
- недоверенный код: сервис с
android:isolatedProcess="true"работает под отдельным uid без прав приложения, так обрабатывают чужой контент; - инструменты: у LeakCanary есть вариант, который анализирует дамп кучи в отдельном процессе, чтобы не мешать приложению.
Цену стоит назвать сразу:
Application.onCreateв каждом процессе: инициализацию аналитики, DI и SDK приходится ограничивать проверкой имени процесса,Application.getProcessName()доступен с API 28;- нет общей памяти: синглтоны, статические поля и кеши у каждого процесса свои;
- общение через Binder: AIDL,
Messenger,ContentProviderили бродкасты. Буфер транзакций около 1 МБ на процесс, крупные данные даютTransactionTooLargeException; - хранилища:
SharedPreferencesне рассчитаны на несколько процессов, Room требуетenableMultiInstanceInvalidation(); - ресурсы: каждый процесс это лишние мегабайты памяти и время на запуск.
Где спотыкаются
Говорят, что отдельный процесс нужен для фоновой работы. Для этого хватает потоков, корутин и WorkManager в том же процессе.
Выносят сервис в процесс и удивляются, что синглтон с настройками там пустой, а SDK проинициализирован дважды.
Приписывают процессу то, чего он не даёт, например другие версии библиотек. APK один, код и зависимости у процессов общие.