Общие сведения об AIDL

Язык описания интерфейсов Android (AIDL) – это инструмент, который позволяет пользователям абстрагироваться от межпроцессного взаимодействия. Учитывая интерфейс (указанный в файле .aidl), различные системы сборки используют двоичный файл aidl для создания привязок C++ или Java, чтобы этот интерфейс можно было использовать в разных процессах независимо от среды выполнения или разрядности.

AIDL можно использовать для взаимодействия между любыми процессами в Android, например между компонентами платформы или между приложениями. Однако он никогда не используется в качестве API для приложений. Например, AIDL можно использовать для реализации SDK API на платформе, но SDK API никогда не содержит API AIDL напрямую. Документацию о том, как использовать AIDL для прямого взаимодействия между приложениями, можно найти на сайте для разработчиков Android. Если AIDL используется между компонентами платформы, которые обновляются отдельно, например APEX-пакетами (начиная с Android 10) или HAL (начиная с Android 11), необходимо использовать систему управления версиями, известную как Stable AIDL.

Пример

Вот пример интерфейса AIDL:

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz);
    }

Процесс сервера регистрирует интерфейс и обрабатывает вызовы к нему, а процесс клиента выполняет вызовы к этим интерфейсам. Во многих случаях процесс выступает и в роли клиента, и в роли сервера, поскольку может ссылаться на несколько интерфейсов. Подробнее о языке AIDL… Подробнее о различных средах выполнения, доступных для использования этих интерфейсов, можно узнать в статье AIDL backends (Внутренние компоненты AIDL). Эти объявления типов похожи на объявления классов в определенном языке, но работают в разных процессах.

Принцип работы

AIDL использует драйвер ядра связующего для совершения вызовов. Когда вы совершаете звонок, идентификатор метода и все объекты упаковываются в буфер и копируются в удаленный процесс, где поток связывания ожидает чтения данных. Когда поток Binder получает данные для транзакции, он ищет в локальном процессе объект-заглушку, а этот класс распаковывает данные и вызывает объект локального интерфейса. Этот локальный объект интерфейса создается и регистрируется серверным процессом. Если вызовы выполняются в одном процессе и на одном и том же сервере, объекты прокси не создаются, поэтому вызовы выполняются напрямую без упаковки и распаковки. Дополнительную информацию можно найти в разделе Обзор Binder.

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

В Android есть несколько команд для взаимодействия с сервисами на устройстве. Что можно сделать:

    adb shell dumpsys --help # listing and dumping services
    adb shell service --help # sending commands to services for testing