Обзор AIDL

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

AIDL может использоваться между любыми процессами в Android: между компонентами платформы или между приложениями. Однако он никогда не используется в качестве API для приложений. AIDL может использоваться, например, для реализации API SDK на платформе, но поверхность API SDK никогда не содержит 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» . Подробнее о различных средах выполнения, доступных для использования этих интерфейсов, см. в разделе «Бэкенды AIDL» . Эти объявления типов аналогичны объявлениям классов в данном языке, но работают между процессами.

Как это работает

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

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

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

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