Эта статья не предназначена для ознакомления читателя с межпроцессным взаимодействием (IPC) или с тем, как IPC можно использовать в ОС Android. Но это только должно служить мотивацией, которая приводит к некоторым работам, представленным в статье здесь. Кроме того, посетите мой другой пост здесь об использовании IPC для разработки распределенных приложений для Android.

Что такое ИПК?

Механизмы межпроцессного взаимодействия предоставляются операционными системами, чтобы позволить процессам обмениваться информацией, например, для сигнализации или для управления данными между процессами. Приложения часто распределяют свои задачи по нескольким процессам (например, для повышения производительности, модульности) и используют механизмы IPC, предлагаемые ОС для обмена данными приложений между своими процессами, в зависимости от их требований.

Операционная система может предоставлять более одного типа IPC, разработанного специально для различных требований к процессу связи или программного обеспечения. Такие требования включают любую комбинацию; количество коммуникационных объектов (один-к-одному или один-ко-многим), производительность, модульность, тип/модель связи (например, синхронный или асинхронный).

Android IPC

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

Как и большинство операционных систем, Android предлагает ряд механизмов IPC. Каждый из них предназначен для удовлетворения различных требований (Intent, язык определения интерфейса Android [AIDL], Binder). Несмотря на то, что разработчики могут использовать обычные linux IPC в Android (такие как сетевые сокеты и общие файлы), Android рекомендует использовать собственные механизмы Android IPC, разработанные специально для мобильных приложений и управления ресурсами/процессами и безопасностью Android (см. документация").

Ограничения

В основе Android IPC лежит драйвер Binder, механизм удаленного вызова процедур (RPC), который упрощает механизмы Android IPC. Binder предоставляет дополнительные функции, которых нет в традиционных IPC Linux/POSIX (например, ссылки на данные, передача файлов). Как видно на рисунке 1 ниже, связующее является основным компонентом Android IPC, драйвером ядра, используемым всеми другими типами IPC (например, Intent, AIDL), включая интерфейс IBinder, который можно использовать для использования Binder IPC.

Таким образом, по замыслу Binder становится узким местом для всех коммуникаций IPC. В частности, ограничения пропускной способности и задержки, налагаемые связующим, становятся еще более заметными по мере увеличения уровня абстракции. Хотя Android не раскрывает конкретные ограничения ресурсов Binder и Android IPC, общеизвестно и рекомендуется не использовать их для передачи больших полезных нагрузок.

Кроме того, как видно на рисунке 2, объем памяти, использование ЦП и задержка передачи сообщений Android IPC значительно увеличиваются для больших полезных нагрузок, что делает их непригодными для чего-либо, кроме передачи сигналов или простой передачи текстовых сообщений между компонентами приложений Android, и не подходит. для полезной нагрузки полезных размеров.

На рис. 3 показано, как непрерывная передача относительно больших полезных данных через Android IPC (Intent) быстро увеличивает объем памяти, пока приложение не использует всю память, выделенную для его процесса, что приводит к замедлению работы и сбою приложений (если соответствующие исключения не обрабатываются). ). Такая высокоскоростная связь не считается требованием для Android IPC, и в настоящее время они довольно широко и эффективно используются в ОС Android. Однако с ростом популярности более сложных приложений с различными новыми компонентами обработки, часто ресурсоемкими (ML, аналитика данных), возможность более гибкой модульности компонентов (несмотря на степень зависимости от данных) и более эффективного их распределения становится решающей. Распределение их нагрузки (например, в нескольких процессах) и предоставление им возможности эффективно взаимодействовать (с использованием IPC для обмена [часто данными, которые могут быть относительно большими по размеру]) между ними (например, следуя модели структурирования приложений микросервисов) может не только улучшить общее производительности приложений, но может также позволить разработчикам приложений использовать новые и более гибкие средства структурирования/модульизации/распределения рабочей нагрузки приложений, поддерживаемые эффективными и гибкими механизмами связи между приложениями и внутри приложений.

Вывод

Android предоставляет различные механизмы IPC для обмена сообщениями и управления данными между компонентами приложения. Механизмы Android IPC используют драйвер Binder в качестве основного компонента связи, а различные IPC предоставляют разработчикам различные абстракции в дополнение к возможностям Binder. Binder не предназначен для передачи больших полезных данных, поэтому ограничивает все другие взаимодействия Android IPC сообщениями IPC с гораздо меньшими полезными нагрузками. Таким образом, если механизмы IPC будут использоваться для более сложных и сложных сценариев приложений (тех, которые используют IPC не только для передачи сигналов, но и для передачи данных приложений), например, для непрерывного сбора данных, анализа данных, приложений обработки ML (которые требуют передачи больших полезной нагрузки между компонентами/процессами приложения), текущие механизмы Android IPC должны быть улучшены или должны быть введены новые механизмы, обеспечивающие передачу данных с высокой пропускной способностью и малой задержкой между компонентами приложения.

Посетите мой другой пост здесь об использовании IPC для разработки распределенных приложений для Android.