Обзор AIDL

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

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

Пример

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

    package my.package;

    import my.package.Baz; // defined elsewhere

    interface IFoo {
        void doFoo(Baz baz); // synchronous method
        oneway void doFoo(int a); // async method
    }

Android 10 и выше поддерживает отправку деклараций. Например:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

Android 11 и выше поддерживают объявления перечислений. Например:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

Android 12 и более поздних версий поддерживают декларации профсоюзов. Например:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

Android T (экспериментальный AOSP) и более поздние версии поддерживают объявления вложенных типов. Например:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // union/enum types can be nested, while
                                        // an interface can't.
    }

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

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

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

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

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

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