Основы безопасности операционной системы Android. Безопасность на уровне Application Framework. Binder IPC
Вступление
После небольшого перерыва я продолжаю объяснять базовые принципы как обеспечивается безопасность в операционной системе Android. Сегодня я начну описывать безопасность на уровне Application Framework. Но чтобы понять данную тему, вначале необходимо рассмотреть как в Android реализован механизм межпроцессного взаимодействия (Inter-Process Communication (IPC)). Этот механизм называется Binder IPC, и сегодня мы будем рассматривать его особенности. Все, кому интересно, добро пожаловать!
Список статей
Зачем нужен Binder IPC?
Как я уже писал в первой статье цикла, каждое приложение в Android выполняется в своей собственной «песочнице» (Application Sandbox). Механизм «песочницы» в Android основан на присвоении каждому приложению уникального user ID (UID) и group ID (GID), таким образом каждому приложению (application или app) в этой операционной системе соответсвует свой уникальный непривилегированный пользователь. Мы рассматривали эту тему в первой статье цикла. В тоже время владельцами всех критических ресурсов системы являются более привилегированные пользователи, имена и идентификаторы которых жестко зашиты в систему (см. system/core/include/private/android_filesystem_config.h). Системные сервисы, которые запускаются от имени этих пользователей, имеют доступ к соответствующим критическим ресурсам системы (например, к GPS данным), в то время как процессы обычных приложений доступ к этим ресурсам получить не могут.
Однако приложения должны иметь возможность «попросить» системные сервисы предоставить им такую информацию, а последние, в свою очередь, должны иметь возможность предоставить такую информацию приложениям. Так как приложения и системные сервисы исполняются в разных процессах, то для организации такого обмена операционной системе необходимо предоставить механизм обмена информацией между процессами. Более того, даже обычные приложения иногда должны взаимодействовать друг с другом. Например, почтовый клиент может «попросить» просмотрщик изображений отобразить графическое приложение к письму.
Как работает Binder IPC?
Взаимодействие между процессами организовано по синхронной клиент-серверной модели. Клиент инициирует соединение и ждет ответа со стороны сервера. Таким образом, взаимодействие между клиентом и сервером происходит последовательно. Такой дизайн позволяет разработчику вызывать удаленные методы словно они находятся в том же самом процессе. Стоит отметить, что это не рассходится с тем, что я писал выше по поводу асинхронного вызова методов: в случае асинхронного вызова, сервер сразу же возвращает пустой ответ клиенту. Схема взаимодействия процессов через Binder представлена на следующем рисунке: приложение (клиент), которое выполняется в процессе Process A, получает доступ к функцианальности, реализованной в сервисе, который выполняется в процессе Process B.
Все взаимодействия между клиентом и сервером в рамках Binder происходят через специальный Linux device driver (драйвер устройства) /dev/binder. В статье «Основы безопасности операционной системы Android. Native user space, ч.1» мы рассматривали процесс загрузки системы. Один из первых демонов, запускаемых процессом init, является ueventd — менеджер внешних устройств в Android. Этот сервис во время старта читает конфигурационный файл ueventd.rc и проигрывает события добавления внешних устройств. Эти события выставляют для устройств разрешения (permissions), а также владельца (owner) и группу (owning group). В следующем примере можно увидеть какие разрешения выставлены для /dev/binder.
Как можно заметить, разрешения для этого устройства выставлены в 0666. Это означает, что любой пользователь системы (а мы помним, что разные приложения в Android — это уникальные пользователи) имеет право писать в и читать из данного устройства. Для взаимодействия с этим драйвером была создана библиотека libbinder. Эта библиотека позволяет сделать процесс взаимодействия с драйвером прозрачным для разработчика приложений. В частности, взаимодействие между клиентом и сервером происходит через proxy (прокси) на стороне клиента и stub на стороне сервера (см. рисунок выше). Proxies и Stubs отвечают за маршалинг данных и комманд передаваемых через драйвер. Т.е. Proxy выстраивает (marshalling) данные и команды, полученные со стороны клиента таким образом, что они могут быть корректно прочитаны (unmarshalling) и однозначно поняты Stub’ом. Вообще, разработчики приложений даже не пишут Stub’ы и Proxy’и для своих приложений. Вместо этого они используют интерфейс, описанный с помощью языка AIDL. Во время компиляции приложения, на основании этого интерфейса генерируется код для Stub’ов и Proxy’и (можете поискать в своих проектах, чтобы увидеть как они выглядят).
На стороне сервера для каждого клиентского запроса создается отдельный Binder поток (см. рисунок выше). Обычно эти потоки называются как Binder Thread #n. Кстати, если мне не изменяет память, то максимальное количество Binder потоков равно 255, а максимальный размер данных, которые могут быть переданы через Binder в рамках одной транзакции составляет 1Mb. Это следует иметь ввиду, когда разрабатываете приложения, передающие или получающие данные от других процессов.
Service Manager
Внимательные читатели должны были отметить для себя тот факт, что до этого я ничего не писал о том, как Android понимает, какому процессу нужно отсылать данные. Технически каждому сервису Binder присваивает 32 битный токен, являющимся уникальным в рамках всех процессов системы (за чем следит драйвер). Этот токен используется как указатель на сервис. Если у клиента есть этот указатель, то он может взаимодействовать с сервисом. Но сначала клиенту необходимо получить это уникальное значение.
Для этого клиент обращается к Binder context manager, который в случае Android называется Service Manager (servicemanager). Service Manager — специальный сервис, Binder токен которого известен всем заранее. Не удивительно, что значение токена для этого сервиса равно 0. Binder драйвер разрешает регистрацию только одного сервиса с таким токеном, поэтому servicemanager — один из первых сервисов, запускаемых в системе. Service Manager можно представить в виде справочника. Вы говорите, что хотите найти сервис с таким-то именем, а вам в ответ возвращают его уникальный токен-номер, который вы можете использовать после для взаимодействия с искомым сервисом. Естественно, сервис сперва должен зарегистрироваться в этом «справочнике».
Безопасность
Сам по себе Binder фреймворк не отвечает за безопасность в системе, но он предоставляет механизмы для её обеспечения. Во-первых, Binder драйвер в каждую транзакцию записывает PID и UID процесса, который инициирует транзакцию. Вызываемый сервис может использовать эту информацию чтобы решить, стоит ли выполнять запрос или нет. Вы можете получить эту информацию используя методы android.os.Binder.getCallingUid(), android.os.Binder.getCallingPid(). Во-вторых, так как Binder токен уникален в рамках системы и его значение не известно априори, то он сам может использоваться как маркер безопасности (смотрите, например, вот эту статью).
Заключение
В следующей части планирую написать о разрешениях (permissions). Материал уже есть, но надо его перевести и подработать. Как всегда буду благодарен за интересные вопросы и пояснения в комментариях, возможно некоторые моменты я неправильно для себя понял.
Основы безопасности операционной системы Android. Безопасность на уровне Application Framework. Binder IPC
Вступление
После небольшого перерыва я продолжаю объяснять базовые принципы как обеспечивается безопасность в операционной системе Android. Сегодня я начну описывать безопасность на уровне Application Framework. Но чтобы понять данную тему, вначале необходимо рассмотреть как в Android реализован механизм межпроцессного взаимодействия (Inter-Process Communication (IPC)). Этот механизм называется Binder IPC, и сегодня мы будем рассматривать его особенности. Все, кому интересно, добро пожаловать!
Список статей
Зачем нужен Binder IPC?
Как я уже писал в первой статье цикла, каждое приложение в Android выполняется в своей собственной «песочнице» (Application Sandbox). Механизм «песочницы» в Android основан на присвоении каждому приложению уникального user ID (UID) и group ID (GID), таким образом каждому приложению (application или app) в этой операционной системе соответсвует свой уникальный непривилегированный пользователь. Мы рассматривали эту тему в первой статье цикла. В тоже время владельцами всех критических ресурсов системы являются более привилегированные пользователи, имена и идентификаторы которых жестко зашиты в систему (см. system/core/include/private/android_filesystem_config.h). Системные сервисы, которые запускаются от имени этих пользователей, имеют доступ к соответствующим критическим ресурсам системы (например, к GPS данным), в то время как процессы обычных приложений доступ к этим ресурсам получить не могут.
Однако приложения должны иметь возможность «попросить» системные сервисы предоставить им такую информацию, а последние, в свою очередь, должны иметь возможность предоставить такую информацию приложениям. Так как приложения и системные сервисы исполняются в разных процессах, то для организации такого обмена операционной системе необходимо предоставить механизм обмена информацией между процессами. Более того, даже обычные приложения иногда должны взаимодействовать друг с другом. Например, почтовый клиент может «попросить» просмотрщик изображений отобразить графическое приложение к письму.
Как работает Binder IPC?
Взаимодействие между процессами организовано по синхронной клиент-серверной модели. Клиент инициирует соединение и ждет ответа со стороны сервера. Таким образом, взаимодействие между клиентом и сервером происходит последовательно. Такой дизайн позволяет разработчику вызывать удаленные методы словно они находятся в том же самом процессе. Стоит отметить, что это не рассходится с тем, что я писал выше по поводу асинхронного вызова методов: в случае асинхронного вызова, сервер сразу же возвращает пустой ответ клиенту. Схема взаимодействия процессов через Binder представлена на следующем рисунке: приложение (клиент), которое выполняется в процессе Process A, получает доступ к функцианальности, реализованной в сервисе, который выполняется в процессе Process B.
Все взаимодействия между клиентом и сервером в рамках Binder происходят через специальный Linux device driver (драйвер устройства) /dev/binder. В статье «Основы безопасности операционной системы Android. Native user space, ч.1» мы рассматривали процесс загрузки системы. Один из первых демонов, запускаемых процессом init, является ueventd — менеджер внешних устройств в Android. Этот сервис во время старта читает конфигурационный файл ueventd.rc и проигрывает события добавления внешних устройств. Эти события выставляют для устройств разрешения (permissions), а также владельца (owner) и группу (owning group). В следующем примере можно увидеть какие разрешения выставлены для /dev/binder.
Как можно заметить, разрешения для этого устройства выставлены в 0666. Это означает, что любой пользователь системы (а мы помним, что разные приложения в Android — это уникальные пользователи) имеет право писать в и читать из данного устройства. Для взаимодействия с этим драйвером была создана библиотека libbinder. Эта библиотека позволяет сделать процесс взаимодействия с драйвером прозрачным для разработчика приложений. В частности, взаимодействие между клиентом и сервером происходит через proxy (прокси) на стороне клиента и stub на стороне сервера (см. рисунок выше). Proxies и Stubs отвечают за маршалинг данных и комманд передаваемых через драйвер. Т.е. Proxy выстраивает (marshalling) данные и команды, полученные со стороны клиента таким образом, что они могут быть корректно прочитаны (unmarshalling) и однозначно поняты Stub’ом. Вообще, разработчики приложений даже не пишут Stub’ы и Proxy’и для своих приложений. Вместо этого они используют интерфейс, описанный с помощью языка AIDL. Во время компиляции приложения, на основании этого интерфейса генерируется код для Stub’ов и Proxy’и (можете поискать в своих проектах, чтобы увидеть как они выглядят).
На стороне сервера для каждого клиентского запроса создается отдельный Binder поток (см. рисунок выше). Обычно эти потоки называются как Binder Thread #n. Кстати, если мне не изменяет память, то максимальное количество Binder потоков равно 255, а максимальный размер данных, которые могут быть переданы через Binder в рамках одной транзакции составляет 1Mb. Это следует иметь ввиду, когда разрабатываете приложения, передающие или получающие данные от других процессов.
Service Manager
Внимательные читатели должны были отметить для себя тот факт, что до этого я ничего не писал о том, как Android понимает, какому процессу нужно отсылать данные. Технически каждому сервису Binder присваивает 32 битный токен, являющимся уникальным в рамках всех процессов системы (за чем следит драйвер). Этот токен используется как указатель на сервис. Если у клиента есть этот указатель, то он может взаимодействовать с сервисом. Но сначала клиенту необходимо получить это уникальное значение.
Для этого клиент обращается к Binder context manager, который в случае Android называется Service Manager (servicemanager). Service Manager — специальный сервис, Binder токен которого известен всем заранее. Не удивительно, что значение токена для этого сервиса равно 0. Binder драйвер разрешает регистрацию только одного сервиса с таким токеном, поэтому servicemanager — один из первых сервисов, запускаемых в системе. Service Manager можно представить в виде справочника. Вы говорите, что хотите найти сервис с таким-то именем, а вам в ответ возвращают его уникальный токен-номер, который вы можете использовать после для взаимодействия с искомым сервисом. Естественно, сервис сперва должен зарегистрироваться в этом «справочнике».
Безопасность
Сам по себе Binder фреймворк не отвечает за безопасность в системе, но он предоставляет механизмы для её обеспечения. Во-первых, Binder драйвер в каждую транзакцию записывает PID и UID процесса, который инициирует транзакцию. Вызываемый сервис может использовать эту информацию чтобы решить, стоит ли выполнять запрос или нет. Вы можете получить эту информацию используя методы android.os.Binder.getCallingUid(), android.os.Binder.getCallingPid(). Во-вторых, так как Binder токен уникален в рамках системы и его значение не известно априори, то он сам может использоваться как маркер безопасности (смотрите, например, вот эту статью).
Заключение
В следующей части планирую написать о разрешениях (permissions). Материал уже есть, но надо его перевести и подработать. Как всегда буду благодарен за интересные вопросы и пояснения в комментариях, возможно некоторые моменты я неправильно для себя понял.
Binder ipc что это
Администратор
Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

После небольшого перерыва я продолжаю объяснять базовые принципы как обеспечивается безопасность в операционной системе Android. Сегодня я начну описывать безопасность на уровне Application Framework. Но чтобы понять данную тему, вначале необходимо рассмотреть как в Android реализован механизм межпроцессного взаимодействия (Inter-Process Communication (IPC)). Этот механизм называется Binder IPC, и сегодня мы будем рассматривать его особенности. Все, кому интересно, добро пожаловать!
Список статей
Ниже приведены ссылки на мои статьи из этой серии:
Зачем нужен Binder IPC?
Как я уже писал в первой статье цикла, каждое приложение в Android выполняется в своей собственной «песочнице» (Application Sandbox). Механизм «песочницы» в Android основан на присвоении каждому приложению уникального user ID (UID) и group ID (GID), таким образом каждому приложению (application или app) в этой операционной системе соответсвует свой уникальный непривилегированный пользователь. Мы рассматривали эту тему в первой статье цикла. В тоже время владельцами всех критических ресурсов системы являются более привилегированные пользователи, имена и идентификаторы которых жестко зашиты в систему (см. system/core/include/private/android_filesystem_config.h). Системные сервисы, которые запускаются от имени этих пользователей, имеют доступ к соответствующим критическим ресурсам системы (например, к GPS данным), в то время как процессы обычных приложений доступ к этим ресурсам получить не могут.
Однако приложения должны иметь возможность «попросить» системные сервисы предоставить им такую информацию, а последние, в свою очередь, должны иметь возможность предоставить такую информацию приложениям. Так как приложения и системные сервисы исполняются в разных процессах, то для организации такого обмена операционной системе необходимо предоставить механизм обмена информацией между процессами. Более того, даже обычные приложения иногда должны взаимодействовать друг с другом. Например, почтовый клиент может «попросить» просмотрщик изображений отобразить графическое приложение к письму.
Как работает Binder IPC?
Взаимодействие между процессами организовано по синхронной клиент-серверной модели. Клиент инициирует соединение и ждет ответа со стороны сервера. Таким образом, взаимодействие между клиентом и сервером происходит последовательно. Такой дизайн позволяет разработчику вызывать удаленные методы словно они находятся в том же самом процессе. Стоит отметить, что это не рассходится с тем, что я писал выше по поводу асинхронного вызова методов: в случае асинхронного вызова, сервер сразу же возвращает пустой ответ клиенту. Схема взаимодействия процессов через Binder представлена на следующем рисунке: приложение (клиент), которое выполняется в процессе Process A, получает доступ к функцианальности, реализованной в сервисе, который выполняется в процессе Process B.
Все взаимодействия между клиентом и сервером в рамках Binder происходят через специальный Linux device driver (драйвер устройства) /dev/binder. В статье «Основы безопасности операционной системы Android. Native user space, ч.1» мы рассматривали процесс загрузки системы. Один из первых демонов, запускаемых процессом init, является ueventd — менеджер внешних устройств в Android. Этот сервис во время старта читает конфигурационный файл ueventd.rc и проигрывает события добавления внешних устройств. Эти события выставляют для устройств разрешения (permissions), а также владельца (owner) и группу (owning group). В следующем примере можно увидеть какие разрешения выставлены для /dev/binder.
.
/dev/ashmem 0666 root root
/dev/binder 0666 root root
.
Как можно заметить, разрешения для этого устройства выставлены в 0666. Это означает, что любой пользователь системы (а мы помним, что разные приложения в Android — это уникальные пользователи) имеет право писать в и читать из данного устройства. Для взаимодействия с этим драйвером была создана библиотека libbinder. Эта библиотека позволяет сделать процесс взаимодействия с драйвером прозрачным для разработчика приложений. В частности, взаимодействие между клиентом и сервером происходит через proxy (прокси) на стороне клиента и stub на стороне сервера (см. рисунок выше). Proxies и Stubs отвечают за маршалинг данных и комманд передаваемых через драйвер. Т.е. Proxy выстраивает (marshalling) данные и команды, полученные со стороны клиента таким образом, что они могут быть корректно прочитаны (unmarshalling) и однозначно поняты Stub’ом. Вообще, разработчики приложений даже не пишут Stub’ы и Proxy’и для своих приложений. Вместо этого они используют интерфейс, описанный с помощью языка AIDL. Во время компиляции приложения, на основании этого интерфейса генерируется код для Stub’ов и Proxy’и (можете поискать в своих проектах, чтобы увидеть как они выглядят).
На стороне сервера для каждого клиентского запроса создается отдельный Binder поток (см. рисунок выше). Обычно эти потоки называются как Binder Thread #n. Кстати, если мне не изменяет память, то максимальное количество Binder потоков равно 255, а максимальный размер данных, которые могут быть переданы через Binder в рамках одной транзакции составляет 1Mb. Это следует иметь ввиду, когда разрабатываете приложения, передающие или получающие данные от других процессов.
Внимательные читатели должны были отметить для себя тот факт, что до этого я ничего не писал о том, как Android понимает, какому процессу нужно отсылать данные. Технически каждому сервису Binder присваивает 32 битный токен, являющимся уникальным в рамках всех процессов системы (за чем следит драйвер). Этот токен используется как указатель на сервис. Если у клиента есть этот указатель, то он может взаимодействовать с сервисом. Но сначала клиенту необходимо получить это уникальное значение.
Для этого клиент обращается к Binder context manager, который в случае Android называется Service Manager (servicemanager). Service Manager — специальный сервис, Binder токен которого известен всем заранее. Не удивительно, что значение токена для этого сервиса равно 0. Binder драйвер разрешает регистрацию только одного сервиса с таким токеном, поэтому servicemanager — один из первых сервисов, запускаемых в системе. Service Manager можно представить в виде справочника. Вы говорите, что хотите найти сервис с таким-то именем, а вам в ответ возвращают его уникальный токен-номер, который вы можете использовать после для взаимодействия с искомым сервисом. Естественно, сервис сперва должен зарегистрироваться в этом «справочнике».
Сам по себе Binder фреймворк не отвечает за безопасность в системе, но он предоставляет механизмы для её обеспечения. Во-первых, Binder драйвер в каждую транзакцию записывает PID и UID процесса, который инициирует транзакцию. Вызываемый сервис может использовать эту информацию чтобы решить, стоит ли выполнять запрос или нет. Вы можете получить эту информацию используя методы android.os.Binder.getCallingUid(), android.os.Binder.getCallingPid(). Во-вторых, так как Binder токен уникален в рамках системы и его значение не известно априори, то он сам может использоваться как маркер безопасности (смотрите, например, вот эту статью).
В следующей части планирую написать о разрешениях (permissions). Материал уже есть, но надо его перевести и подработать. Как всегда буду благодарен за интересные вопросы и пояснения в комментариях, возможно некоторые моменты я неправильно для себя понял.
Русские Блоги
1. Введение
IPC (межпроцессное взаимодействие) означает связь между процессами. Различные процессы операционной системы имеют свое собственное пространство памяти процессов, и данные в них не используются совместно, поэтому для взаимодействия между процессами необходим определенный механизм. Традиционные методы взаимодействия процессов включают в себя сокеты, каналы, совместное использование памяти и очереди сообщений. Эти методы также существуют в системе Linux. Система Android основана на системе Linux, но система Android использует другой механизм связи процессов Binder, главным образом по следующим двум причинам:
— производительность, традиционный способ связи, либо дорогой и эффективный, такой как Socket, либо данные необходимо копировать несколько раз, а производительность низкая.
-Безопасно. В системе Android легко получить работу системы, такую как подключение к беспроводной сети, доступ к файлам и т. д. Если вы не определили процесс, некоторые программы могут легко выполнять операции низкого уровня часто. Традиционный IPC не имеет никаких мер безопасности и не может распознавать пользовательские процессы, такие как Socket. Пользователи могут указать свои собственные порты.
С Binder вы можете скопировать данные только один раз и попросить каждый пользовательский процесс добавлять идентификатор во время каждого сеанса связи. Следовательно, производительность и безопасность традиционного механизма IPC относительно высоки.
2. Основные понятия
1.Parcel/Serializable/Parcelable
2.IBinder/Binder
2. Binder реализует интерфейс Binder, который является средой связи механизма Binder.Процесс A вызывает метод процесса B, в частности, этим Binder.
3. Связыватель
(1). Рабочее пространство (пространство ядра / пространство пользователя)
В системе Android именно пространство ядра Linux отвечает за вызов всех системных ресурсов, а пространство выполнения пользовательской программы является пользовательским пространством. Каждый процесс имеет свое собственное пользовательское пространство. Когда пользовательское пространство должно вызывать системные ресурсы, он может проходить только через ядро. Системный вызов, предоставляемый пространством для доступа к пространству ядра.
(2). Связыватель водитель
Традиционный механизм IPC поддерживается ядром Linux, но Binder не поддерживается Linux, но Linux может динамически добавлять модуль ядра.Этот модуль имеет свое собственное пространство ядра в ядре, поэтому Android добавляет модуль в систему. Называется драйвер Binder. Драйвер Binder автоматически завершит преобразование объектов Binder процесса A и процесса B, а соответствующие параметры метода вызовут методы в драйвере Binder через mmap, ioctl, open и т. Д. В пространстве пользователя, а затем два таких разных процесса. Пространство пользователя может взаимодействовать через пространство ядра этого драйвера Binder.
4. Связующий каркас
1. Клиент, клиентский процесс, это относительный оператор, если сторона, инициировавшая запрос процесса, может быть клиентским процессом.
2.Сервер, сервисный процесс, это тоже относительный оператор, процесс, запрашиваемый для выполнения определенного сервиса, можно назвать серверным процессом
3. ServiceManager, SM, для управления сервисными процессами, каждый сервисный процесс должен зарегистрировать свой собственный межпроцессный Binder и сохранить соответствующую ссылку Binder, клиент может запросить здесь имя нужной услуги по имени И, наконец, SM вернет ссылку на Binder сервера. SM также является процессом, но каждый процесс, который должен взаимодействовать с SM, знает ссылку на SM, которая фиксируется заранее.
4. Драйвер Binder, передача в конкретном процессе связи, таком как данные, которые необходимо передать, преобразование объекта Binder между двумя процессами и т. Д.
5. Связующий слой Java
1.AIDL
AIDL (язык определения интерфейса Android) используется для межпроцессного взаимодействия.При определении ADIL AS автоматически сгенерирует класс Binder. Например, определите интерфейс следующим образом
Типы данных, поддерживаемые aidl, следующие:
— основной тип данных
-String и CharSequence
-List, поддерживает только ArrayList, каждый элемент поддерживает AIDL
-Map, поддерживает только карту, каждый ключ, значение, AIDL
-Parcelable, все реализуют интерфейс Parcelable
-AIDL, все интерфейсы, определенные как AIDL, такие как IBookManager выше, также могут использоваться в качестве объекта интерфейса
Сгенерированный файл aidl:
Внутренняя структура этого интерфейса должна иметь внутренний класс Stub, и этот внутренний класс Stub также имеет внутренний класс Proxy. Сначала рассмотрим класс Stub. Уровень Java Binder использует прокси-режим. Класс Stub представляет локальный объект Binder, а Proxy является прокси-объектом Binder в другом процессе. Сначала посмотрите на заглушку
Это абстрактный класс, поэтому конкретная реализация находится в Сервисе, а конкретная реализация возвращается через метод onBinder.
Тогда посмотрите на Прокси
Объект, полученный клиентским процессом, обычно является экземпляром этого класса, _data является параметром, _reply является соответствующим возвращаемым значением и здесь инкапсулирует базовую реализацию конкретной записи данных, которая прозрачна для клиентского процесса.
3. Рабочий процесс
1. Общий процесс
1. Когда процесс приложения предоставляет сервис, к которому можно обращаться через процессы, он регистрирует соответствующий поток сервиса в ServiceManager через адрес связи по умолчанию и вводит ожидание, затем ServiceManager пропускает драйвер Binder в ядре через метод ioctl. В пространстве содержится соответствующая информация, и затем ServiceManager активирует поток, чтобы уведомить процесс приложения об успешной регистрации.
2. Клиентский процесс запрашивает службу. SM будет взаимодействовать с драйвером Binder для запроса зарегистрированной службы. Когда запрос будет выполнен, будет возвращен соответствующий объект. В это время будет возвращен прокси-объект.
3. Вызвав метод прокси-объекта, этот поток клиентского процесса переходит в состояние ожидания.В соответствии с реализацией предыдущего метода Proxy, клиентский процесс просто оборачивает некоторые данные и затем записывает их в общую память драйвера Binder и SM. Это копия и только одна, и адрес пользовательского пространства сервисного процесса и этой памяти был сопоставлен, поэтому сервисный процесс может напрямую получать данные в памяти. Для объекта Binder Proxy он преобразуется в заглушку Binder. Конкретная реализация должна возвращаться после завершения выполнения, что также является связью, и, наконец, поток клиентского процесса будет разбужен.
2. Межпроцессный интерфейс
Точно так же, определив интерфейс, чтобы позволить клиентскому процессу реализовать соответствующий метод, можно отозвать все клиентские процессы в сервисном процессе.
В переписанном методе
Конкретное использование обратного вызова можно увидеть в следующем примере
Просто используйте его на клиенте
4. Другие способы
1.Intent/Bundle
И Intent, и Bundle реализуют интерфейс Parcelable, поскольку Intent часто используется для связи компонентов, поэтому в межпроцессном режиме это подходит только для межпроцессного взаимодействия между компонентами, а нижний уровень также является механизмом Binder.
2. Обмен файлами
Два прикладных процесса используют один и тот же общий файл и объединяют сериализацию для достижения передачи данных, но чтение и запись файлов в системе Linux не обрабатывают параллелизм, поэтому в случае высокого одновременного доступа могут возникнуть некоторые проблемы.
3.Messenger
Он используется вместе с Messege, но обработка службы для Messege является последовательной, поэтому он не подходит для ситуаций с высоким параллелизмом и не может получить возвращенные результаты. Он не подходит для удаленного вызова процедуры (перекрестный вызов RPC). Это использование AIDL после инкапсуляции, то есть внутреннего механизма Binder.
4.ContentProvider
Используется для обмена данными между процессами один-ко-многим, поддерживая параллельные операции, потому что внутренняя база данных фактически может быть синхронизирована, а механизм Binder все еще находится внизу
5.Socket
Обычно используется для связи между процессами в разных сетях, поэтому он не подходит для RPC.








