Binder - как устроена работа с несколькими процессами в Android

YOUTUBE · 19.11.2025 10:04

Ключевые темы и таймкоды

Введение в межпроцессное взаимодействие в Android

0:05
  • В Android каждое приложение работает в изолированной песочнице.
  • Для передачи данных между приложениями существует специальный механизм.
  • Докладчик расскажет о роли ядра Linux и других аспектах IPC.

Поддержка и команда

0:46
  • Контент поддерживается командой инженеров Авито Тех.
  • Сергей Баштян показал высокие требования к разработчикам.
  • Подробности о проектах и вакансиях можно найти по ссылкам.

Представление спикера и темы доклада

1:11
  • Спикер Андрей Белоус, Android-разработчик с опытом работы в разных компаниях.
  • Тема доклада: межпроцессное взаимодействие IPC в Android.
  • Обсуждение процессов, передачи данных, ограничений и использования Binder.

Базовые понятия о процессах

2:24
  • Процесс - это инстанс программы или виртуальная среда.
  • Процесс имеет ресурсы, дочерние и родительские процессы, потоки.
  • Жизненный цикл процесса: создание, выполнение, завершение.

Создание процессов в Linux

5:08
  • Главный процесс создается ядром, остальные - командой fork.
  • В Android процессы создаются командой fork из системного процесса zygote.
  • Каждое приложение запускается в отдельном процессе по умолчанию.

Запуск нескольких приложений в одном процессе

6:45
  • Можно запустить несколько приложений в одном процессе, указав соответствующие свойства в манифесте.
  • Приложения будут обрабатываться как одно, с доступом к файлам и ресурсам друг друга.
  • Google рекомендует использовать правильные механизмы для межпроцессной коммуникации.

Параллельный запуск компонентов приложения

7:44
  • Можно запустить каждый компонент приложения в отдельном процессе.
  • Это позволяет выделить отдельную память и продолжить работу при кэшировании.
  • Пример: Spotify играл музыку из отдельного процесса.

Эксперимент с запуском компонентов в отдельных процессах

8:42
  • Добавление логирования для отслеживания запуска компонентов.
  • Каждый компонент запущен в указанном процессе.
  • Проблемы с доступом к ресурсам и кэшу при запуске компонентов в отдельных процессах.

Межпроцессная коммуникация IPC

10:28
  • Приложения должны общаться между собой для выполнения различных задач.
  • Примеры: получение картинки из галереи, набор номера в звонилке.
  • Общение с системными сервисами также является межпроцессной коммуникацией.

Передача данных между процессами в Android

11:57
  • Обсуждение типичной задачи передачи данных между процессами в Android.
  • Использование Intent и его экстра для передачи данных между Activity, Service и BroadcastReceiver.
  • Ограничения по размеру данных, передаваемых через Intent.

Контент-провайдер

14:15
  • Контент-провайдер как способ передачи данных между приложениями.
  • Примеры использования в системных приложениях, таких как календарь и телефонная книга.
  • Преимущества контент-провайдера: гибкость в настройке разрешений и возможность передачи различных типов данных.

Мессенджер

15:52
  • Мессенджер как механизм клиент-серверного взаимодействия.
  • Схема работы: биндинг к сервису, создание мессенджера и отправка сообщений.
  • Ограничения IPC-взаимодействия и реализация в коде.

Байндер фреймворк

19:13
  • Байндер как ключевой механизм передачи данных в Android.
  • История и развитие байндера, его роль в IPC.
  • Основные функции и схема работы байндера, включая идентификацию процессов и передачу данных через транзакции.

Безопасность и идентификация

23:17
  • Важность безопасности при межпроцессном взаимодействии.
  • Включение идентификаторов отправителя и получателя в сообщения.
  • Призыв подписаться на телеграм-канал для получения дополнительной информации и интересных находок.

Основные функции Binder

24:29
  • Binder позволяет подписываться на уведомления о смерти других процессов.
  • Взаимодействие с ремонт сервисом происходит через Binder Threads, которые могут обрабатывать до 16 запросов одновременно.
  • Binder Threads существуют независимо от того, работает ли приложение как сервер.

Особенности Binder

25:23
  • Binder автоматически регулирует количество потоков.
  • Клиент не знает, что делает IPC-запрос, так как Binder делает это за него.
  • Поддерживаются синхронные и асинхронные вызовы, а также рекурсивные вызовы.

Java-часть Binder

27:12
  • Основной метод интерфейса IBinder - транзак, который вызывается клиентом и сервером.
  • Используются Parcel для передачи данных между процессами.
  • Интерфейс Parcelable используется для упаковки и распаковки данных в Parcel.

Реализация клиент-серверного взаимодействия

29:00
  • Клиент получает ссылку на ремонт процесс и передает данные через метод транзак.
  • Используется утилита AIDL для описания интерфейса взаимодействия между процессами.
  • Пример: создание интерфейса калькулятора и генерация Java-кода с помощью AIDL.

Работа с прокси-классом

32:47
  • Клиент вызывает метод у инстанса прокси-класса.
  • Для этого клиент получает ссылку на инстанс через сервис коннекшн.
  • Создается инстанс класса прокси через метод класса стаб.

Маршалинг данных

33:45
  • Создаются два парселла: дейта и реплай.
  • Данные записываются в парселл дейта в порядке, объявленном в методе эд.
  • Вызывается метод транзакт с кодом транзакции и парселлами.

Анмаршалинг данных

34:46
  • На сервере вызывается метод он транзакт.
  • Проверяется код транзакции и данные достаются из парселла дейта.
  • Метод кол выполняется на сервере, передавая два слагаемых.

Взаимодействие с ремонт сервисом

35:24
  • Ремонт сервис работает в другом процессе.
  • В методе эд возвращается результат сложения и записывается в парселл реплай.
  • Данные проходят через границу процессов и возвращаются в клиентский процесс.

Проверка успешности транзакции

36:24
  • Проверяется успешность транзакции.
  • В случае неудачи вызывается дефолтная реализация.
  • Данные анмаршалируются на клиентской стороне.

Нативная реализация парселла

37:22
  • Парселл проксирует вызовы в натив.
  • Запись данных происходит через буфер байт.
  • Чтение данных происходит в обратном порядке.

Взаимодействие с бандер драйвером

39:30
  • Клиентский процесс инициализирует драйвер через систем кол.
  • Проверяется совместимость версий и устанавливается размер тред пула.
  • Создается буфер данных для обмена.

Команды бандер драйвером

41:26
  • Команда бандер райт рит используется для одновременной передачи и чтения данных.
  • Структура бандер райт рит заполняется перед взаимодействием.
  • Данные копируются из юзер спейса в структуру и обратно.

Класс ipc тред-стейт

43:21
  • Класс содержит методы клиента и сервера.
  • Используются два буфера: эм-ин для получения данных и эм-аут для отправки данных.
  • Команды бандер драйвером включают би-си и бир-команды.

Передача данных между процессами

45:39
  • Данные из клиентского процесса передаются в серверный через метод транзакт.
  • Данные записываются в буфер м-аут и передаются через а-вызовы.
  • Для получения ответа используется метод ут респонс и вайлд ру цикл.

Взаимодействие с пайдер-драйвером

48:10
  • Взаимодействие происходит через низкоуровневые а-вызовы.
  • Коды команд помогают понять, какое действие нужно совершить.
  • Есть три уровня кодов команд: клиентские, на уровне кернел драйвера и на уровне нативного кода.

Введение в байндер

48:48
  • Байндер - мощный и быстрый механизм для RPC.
  • Передача данных происходит через транзакции с лимитом на все транзакции.
  • Парселл - контейнер для байндера, работающий быстро и с порядком чтения и записи.

Примеры использования байндера в Android

49:57
  • Системные сервисы живут вне лайф скла приложения и запускаются при старте системы.
  • Пример взаимодействия с аларм-менеджером через гет систем сервис.
  • Системные сервисы регистрируются через байндер и используются клиентским процессом.

Вызов системного сервиса через ADB

53:11
  • Команда сервис кол в ADB позволяет вызвать системный сервис.
  • Пример вызова сервиса фаун через ADB для открытия звонилки.
  • Байндер используется практически везде в Android для межпроцессного взаимодействия.

Заключение и рекомендации

55:26
  • Байндер - ядро Android IPC и мощный механизм для RPC.
  • Все сервисы, с которыми сталкиваются разработчики, используют байндер под капотом.
  • Рекомендации по дальнейшему изучению темы и приглашение к участию в Android Cloudcast.